vorstellung: strings mit expression templates
-
hab gerade wiedermal http://osl.iu.edu/~tveldhui/papers/Expression-Templates/exprtmpl.html ausgegraben und mich an strings versucht.
bisher ist das dabei rausgekommen:
(ist teil meiner vlib, daher heißt ostream Writer und size_t Size)#include "iostream.hpp" template<typename A,typename B> struct OpPlus { typedef OpPlus StringPart; A const& a; B const& b; OpPlus(A const& _a,B const& _b): a(_a), b(_b) { } Size getSize() const{ return a.getSize()+b.getSize(); } char* writeAt(char* dst) const{ char* tmp=a.writeAt(dst); return b.writeAt(tmp); } }; class SubString{ private: char const* begin; char const* end; public: typedef SubString StringPart; SubString(char* _begin,char* _end) : begin(_begin), end(_end) {} Size getSize() const { return end-begin; } char* writeAt(char* b) const { __builtin_memcpy(b,begin,end-begin); return b+(end-begin); } }; template<Size size> class StringLiteral { private: char const* begin; public: typedef StringLiteral StringPart; StringLiteral(char const* _begin): begin(_begin) {} Size getSize() const{ return size; } char* writeAt(char* dst) const{ __builtin_memcpy(dst,begin,size); return dst+size; } void printAt(Writer& out) const{ out.write(begin,begin+size); } }; #define SL(x) (StringLiteral<sizeof(x)-1>(x)) class String { private: char* begin; char* end; public: typedef String StringPart; template<Size size> String(StringLiteral<size> const& sl){ cout<<"::new\n"; begin=new char[size]; end=sl.writeAt(begin); } template<typename A,typename B> String(OpPlus<A,B> const& op) { Size size=op.getSize(); cout<<"::new\n"; begin=new char[size]; end=op.writeAt(begin); } char* writeAt(char* b) const { __builtin_memcpy(b,begin,end-begin); return b+(end-begin); } Size getSize() const{ return end-begin; } void printAt(Writer& out) const{ out.write(begin,end); } SubString substr(Size _begin,Size _end){ return SubString(begin+_begin,begin+_end); } }; //edit: hier ist wohl ein kommentar nötig: //SFINAE template<typename A,typename B> OpPlus<typename A::StringPart,typename B::StringPart> operator+(A const& a,B const& b){ return OpPlus<A,B>(a,b); } int main() { String a=SL("hallo"); cout<<a<<endl; StringLiteral<1> b="+"; cout<<b<<endl; String c=SL("welt"); cout<<c<<endl; String x=a+b+c+a.substr(2,4)+b+c; cout<<x<<endl; }ausgabe:
::new hallo + ::new welt ::new hallo+weltll+welt
-
Hi Volkard,
zumindest zum Thema String Konkatenation mittels Expression Templates gab es im CUJ schonmal einen Artikel (Juni 2005 - "String Concatenation & Expression Templates"). Den Code gibt es hier:
-
HumeSikkins schrieb:
Hi Volkard,
zumindest zum Thema String Konkatenation mittels Expression Templates gab es im CUJ schonmal einen Artikel (Juni 2005 - "String Concatenation & Expression Templates"). Den Code gibt es hier:
ftp://ftp.cuj.com/pub/2005/cujjun2005.zipdanke.