1 module cstring; 2 import std.string; 3 4 struct Cstring 5 { 6 private string data; 7 private size_t index; 8 9 alias toCharPtr this; 10 11 char* toCharPtr() const 12 { 13 return cast(char*) data.toStringz; 14 } 15 16 this(char* p) 17 { 18 data = fromStringz(p).idup; 19 } 20 21 this(string p) 22 { 23 data = p; 24 } 25 26 size_t toHash() const 27 { 28 return data.hashOf; 29 } 30 31 bool opEquals(Cstring other) const 32 { 33 return data == other.data; 34 } 35 36 bool opEquals(string other) const 37 { 38 return data == other; 39 } 40 41 void opAssign(string s) 42 { 43 data = s; 44 index = 0; 45 } 46 47 void opAssign(char* s) 48 { 49 data = fromStringz(s).idup; 50 index = 0; 51 } 52 53 bool empty() const 54 { 55 return index >= data.length; 56 } 57 58 char front() const 59 { 60 return data[index]; 61 } 62 63 void popFront() 64 { 65 if (index < data.length) 66 index++; 67 } 68 } 69 70 unittest 71 { 72 import std.stdio; 73 import core.stdc.stdlib; 74 import core.internal.hash; 75 76 string t1 = "Hello"; 77 char* t2 = cast(char*) "Hello".toStringz; 78 79 Cstring s3 = "Hello"; 80 81 Cstring s1 = t1; 82 Cstring s2 = t2; 83 84 assert(s1 == s2, "Strings are not equal"); 85 assert(s2 == s3, "Strings are not equal"); 86 87 string r; 88 89 foreach (s; s3) 90 r ~= s; 91 92 assert(r == s3, "String are not equal"); 93 }