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 }