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:

    ftp://ftp.cuj.com/pub/2005/cujjun2005.zip



  • 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.zip

    danke.


Anmelden zum Antworten