#ifndef OPIE_TEMPLATE_BASE_H #define OPIE_TEMPLATE_BASE_H #include #include /** * Templates do not have a base class, This is why * we've this class * this is here to give us the possibility * to have a common base class * You may not want to use that interface internaly * POOR mans interface */ class OPimBasePrivate; struct OPimBase { /** * return the rtti */ virtual int rtti()= 0; virtual OPimRecord* record()const = 0; virtual OPimRecord* record(int uid)const = 0; virtual bool add( const OPimRecord& ) = 0; virtual bool remove( int uid ) = 0; virtual bool remove( const OPimRecord& ) = 0; virtual void clear() = 0; virtual bool load() = 0; virtual bool save() = 0; virtual QArray records()const = 0; /* * ADD editing here? * -zecke */ private: OPimBasePrivate* d; }; /** * internal template base * T needs to implement the copy c'tor!!! */ class OTemplateBasePrivate; template class OTemplateBase : public OPimBase { public: enum CacheDirection { Forward=0, Reverse }; OTemplateBase() { }; virtual ~OTemplateBase() { } virtual T find( int uid )const = 0; /** * read ahead find */ virtual T find( int uid, const QArray& items, uint current, CacheDirection dir = Forward )const = 0; virtual void cache( const T& )const = 0; virtual void setSaneCacheSize( int ) = 0; /* reimplement of OPimBase */ int rtti(); OPimRecord* record()const; OPimRecord* record(int uid )const; static T* rec(); private: OTemplateBasePrivate *d; }; /* * implementation */ template int OTemplateBase::rtti() { return T::rtti(); } template OPimRecord* OTemplateBase::record()const { T* t = new T; return t; } template OPimRecord* OTemplateBase::record(int uid )const { T t2 = find(uid ); T* t1 = new T(t2); return t1; }; template T* OTemplateBase::rec() { return new T; } #endif