SIS
Symmetric Index Structures
/Users/dbr/ma/src/lmu/cis/sis/adapter/VoidSequenceAdapter.hpp
Go to the documentation of this file.
00001 #ifndef VOIDSEQUENCEADAPTER_HPP
00002 #define VOIDSEQUENCEADAPTER_HPP
00003 
00004 #include "../cppbase.hpp"
00005 
00006 #include <cassert>
00007 #include <iostream>
00008 #include <fstream>
00009 #include <istream>
00010 #include <string>
00011 
00012 #include "VoidSequenceAdapterBase.hpp"
00013 
00014 #define ENCODING_PLAIN (0)
00015 #define ENCODING_UTF8 (1)
00016 
00017 #define mVoidSequenceElement( voidseq, position ) ((voidseq)->seq + ((position)*(voidseq)->elementSize))
00018 
00019 namespace lmu { namespace cis { namespace sis {
00020 
00021 
00032 
00033 class VoidSequenceAdapter : public virtual VoidSequenceAdapterBase {
00034 
00035     UINT            elementSize_;
00036     VoidSequence*   C_VoidSequence;
00037     UINT            symbolSize_       = 1;
00038     UINT            bitsPerSymbol_    = 8;
00039     UINT            encoding_         = ENCODING_PLAIN;
00040 public:
00053     VoidSequenceAdapter()
00054         : VoidSequenceAdapter(1) {
00055             if (DEBUG_LEVEL > 5) std::cerr << "VoidSequenceAdapter()" << std::endl;
00056     }
00057 
00067     VoidSequenceAdapter(UINT elementSize)
00068         : elementSize_(elementSize)
00069         , C_VoidSequence(VoidSequenceInit(elementSize)) {
00070             if (DEBUG_LEVEL > 5) std::cerr << "VoidSequenceAdapter(UINT elementSize)" << std::endl;
00071     }
00072 
00074     VoidSequenceAdapter(const std::string& input)
00075         : VoidSequenceAdapter(1, input.c_str()) {
00076             if (DEBUG_LEVEL > 5) std::cerr << "VoidSequenceAdapter(const std::string& input)" << std::endl;
00077     }
00078 
00080     // VoidSequenceAdapter(const S8* input)
00081     //     : VoidSequenceAdapter(1, input) {
00082     //         if (DEBUG_LEVEL > 5) std::cerr << "VoidSequenceAdapter(const S8* input)" << std::endl;
00083     // }
00084 
00090     VoidSequenceAdapter(UINT elementSize, const S8* input)
00091         : VoidSequenceAdapter(1)  {
00092             if (DEBUG_LEVEL > 5) std::cerr << "VoidSequenceAdapter(UINT elementSize, const S8* input)" << std::endl;
00093             Add(input);
00094     }
00095 
00097     VoidSequenceAdapter(const VoidSequenceAdapter&) = delete;
00098 
00100     VoidSequenceAdapter(VoidSequenceAdapter&&) = delete;
00101 
00103     VoidSequenceAdapter& operator=(const VoidSequenceAdapter&) = delete;
00104 
00111     virtual ~VoidSequenceAdapter() {
00112         if (DEBUG_LEVEL > 5) std::cerr << "virtual ~VoidSequenceAdapter()" << std::endl;
00113         VoidSequenceFree(C_VoidSequence);
00114     }
00115 
00123     virtual void Add(const S8* input);
00125     virtual inline void Add(const std::string& input) { Add(input.c_str()); } 
00126     
00128     virtual void Add(const void* elementToAdd);
00129     
00131     virtual void Set( UINT position, const void * element );
00132     virtual void Write( FILE * fp, UINT * sizes, UINT numberOfSizes );
00133     virtual VoidSequence * Read( FILE * fp ); 
00134     virtual VoidSequence * Read( const S8* fn ); 
00135     virtual inline VoidSequence * Read( const std::string& fn ) { return Read(fn.c_str()); } 
00136     virtual void Shrink();
00137     virtual void Append( const VoidSequence * s );
00138     virtual void Append( const VoidSequenceAdapter& s );
00139     virtual void Cpy( VoidSequence * dest, const VoidSequence * src );
00140 
00141     virtual VoidSequence* get() const;
00142     // VoidSequence&& get() { return std::move(C_VoidSequence); }
00143     virtual VoidSequence* dollarize(VoidSequence * line);
00144     virtual VoidSequenceAdapter& dollarizer();
00145     virtual VoidSequence* dollarize() const;
00146 
00147     virtual const S8* print() const;
00148     virtual void clear();
00149     virtual void* at(UINT position = 0);
00150     virtual UINT length();
00151 private:
00152     virtual void Print( std::ostream& os ) const { os << print(); }
00153     virtual void ReadAll( std::istream& is) {   //TODO
00154 
00155         // prepare to add document to structure
00156         // do a super fast read
00157         // std::ifstream is(doc, std::ios::binary);
00158         //
00159 
00160         if (!is)
00161             std::cerr << "Error with stream " << std::endl;
00162         assert(is.good());
00163 
00164         is.seekg (0, std::ios::end);
00165         UINT length = is.tellg();
00166         is.seekg (0, std::ios::beg);
00167 
00168         // allocate memory:
00169         char* buffer = new char [length];
00170         is.read(buffer,length);
00171         // is.close();
00172         this->Add(buffer);
00173     }
00174     virtual void ReadOne( std::ifstream& is) {}
00175 
00176 
00177 };
00178 
00179 class VoidSequenceAdapterDollarized
00180     : public virtual VoidSequenceAdapter
00181     // , public virtual VoidSequenceAdapterBase
00182 {
00183 public:
00184     //TODO Add assertion for dollarization
00185     VoidSequenceAdapterDollarized() : VoidSequenceAdapterDollarized(1) {}
00186     VoidSequenceAdapterDollarized(UINT elementSize)
00187         : VoidSequenceAdapter(elementSize) {
00188             if (DEBUG_LEVEL > 5) std::cerr << "VoidSequenceAdapterDollarized()" << std::endl;
00189     }
00190 
00192     // VoidSequenceAdapterDollarized(const S8* input)
00193     //     : VoidSequenceAdapter(input) {
00194     //         if (DEBUG_LEVEL > 5) std::cerr << "VoidSequenceAdapterDollarized::VoidSequenceAdapterDollarized(const S8* input)" << std::endl;
00195     //         dollarizer();
00196     // }
00197     VoidSequenceAdapterDollarized(const std::string& input)
00198         : VoidSequenceAdapter(input) {
00199             if (DEBUG_LEVEL > 5) std::cerr << "VoidSequenceAdapterDollarized::VoidSequenceAdapterDollarized(const std::string& input)" << std::endl;
00200             dollarizer();
00201     }
00202     virtual ~VoidSequenceAdapterDollarized() {
00203         if (DEBUG_LEVEL > 5) std::cerr << "virtual ~VoidSequenceAdapterDollarized()" << std::endl;
00204     }
00205     virtual void Add(const S8* input) {
00206         if (DEBUG_LEVEL > 5) std::cerr << "virtual void VoidSequenceAdapterDollarized::Add(const S8* input)" << std::endl;
00207         VoidSequenceAdapter::Add(input);
00208         dollarizer();
00209     }
00210 };
00211 
00212 }}} /* End of namespace lmu::cis::sis */
00213 
00214 #endif /* end of include guard: VOIDSEQUENCEADAPTER_HPP */