libGDF
HeaderItem.h
00001 //
00002 // This file is part of libGDF.
00003 //
00004 // libGDF is free software: you can redistribute it and/or modify
00005 // it under the terms of the GNU Lesser General Public License as
00006 // published by the Free Software Foundation, either version 3 of
00007 // the License, or (at your option) any later version.
00008 //
00009 // libGDF is distributed in the hope that it will be useful,
00010 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012 // GNU Lesser General Public License for more details.
00013 //
00014 // You should have received a copy of the GNU Lesser General Public License
00015 // along with libGDF.  If not, see <http://www.gnu.org/licenses/>.
00016 //
00017 // Copyright 2010 Martin Billinger
00018 
00019 #ifndef __HEADERITEM_H_INCLUDED__
00020 #define __HEADERITEM_H_INCLUDED__
00021 
00022 #include "GDF/Types.h"
00023 #include "GDF/Exceptions.h"
00024 #include <iostream>
00025 #include <stddef.h>
00026 #include <map>
00027 #include <algorithm>
00028 
00029 #define GDF_DECLARE_HEADERITEM( NAME, TYPE, POS ) \
00030         public: \
00031         const TYPE &get_##NAME( ) const { return NAME.item; }; \
00032         void set_##NAME( const TYPE &val ) { NAME.item = val; }; \
00033         private: \
00034         HeaderItem<TYPE,POS> NAME;
00035 
00036 #define GDF_DECLARE_HEADERITEM_PRIVATE( NAME, TYPE, POS ) \
00037         public: \
00038         const TYPE &get_##NAME( ) const { return NAME.item; }; \
00039         private: \
00040         void set_##NAME( const TYPE &val ) { NAME.item = val; }; \
00041         HeaderItem<TYPE,POS> NAME;
00042 
00043 #define GDF_DECLARE_HEADERARRAY( NAME, TYPE, POS, LEN ) \
00044         public: \
00045         const TYPE *get_##NAME( ) const { return NAME.item; } \
00046         TYPE *get_##NAME( ) { return NAME.item; } \
00047         TYPE get_##NAME( size_t i ) const { return NAME.item[i]; } \
00048         void set_##NAME( const TYPE val, size_t i ) { NAME.item[i] = val; } \
00049         void set_##NAME( const TYPE *val, const size_t len=LEN ) { for( size_t i=0; i<std::min(len,NAME.len); i++ ) NAME.item[i] = val[i]; }; \
00050         private: \
00051         HeaderArray<TYPE,POS,LEN> NAME;
00052 
00053 #define GDF_DECLARE_HEADERSTRING( NAME, POS, LEN ) \
00054         public: \
00055         const std::string get_##NAME( ) const { return std::string( NAME.item, LEN ); }; \
00056         void set_##NAME( const std::string str ) { for( size_t i=0; i<std::min(str.size(),NAME.len); i++ ) NAME.item[i] = str[i]; }; \
00057         size_t getLength_##NAME( ) const { return LEN; } \
00058         private: \
00059         HeaderArray<char,POS,LEN> NAME;
00060 
00061 #define GDF_DECLARE_RESERVED( NAME, POS, LEN ) \
00062         public: \
00063         const char *get_##NAME( ) const { return NAME.item; }; \
00064         private: \
00065         void set_##NAME( const char *val, const size_t len ) { for( size_t i=0; i<len; i++ ) NAME.item[i] = val[i]; }; \
00066         void set_##NAME( const char *val ) { for( size_t i=0; i<NAME.len; i++ ) NAME.item[i] = val[i]; }; \
00067         HeaderArray<char,POS,LEN> NAME;
00068 
00069 #define GDF_BEGIN_HEADERMAP( ) \
00070         public: \
00071             const std::map< size_t, HeaderRef > &getposmap() const {return posmap;} \
00072             const std::map< std::string, HeaderRef > &getstrmap() const {return strmap;} \
00073         private:    \
00074             std::map< size_t, HeaderRef > posmap; \
00075             std::map< std::string, HeaderRef > strmap; \
00076             void initHeaderMap( ) {
00077 
00078 #define GDF_END_HEADERMAP( ) \
00079             }
00080 
00081 #define GDF_ASSIGN_HEADERARRAY( NAME ) \
00082             posmap[NAME.pos] = HeaderRef( #NAME, NAME.item, NAME.pos, sizeof(NAME.item) ); \
00083             strmap[#NAME] = HeaderRef( #NAME, NAME.item, NAME.pos, sizeof(NAME.item) );
00084 
00085 #define GDF_ASSIGN_RESERVED( NAME ) \
00086             posmap[NAME.pos] = HeaderRef( #NAME, NAME.item, NAME.pos, sizeof(NAME.item) ); \
00087             strmap[#NAME] = HeaderRef( #NAME, NAME.item, NAME.pos, sizeof(NAME.item) );
00088 
00089 #define GDF_ASSIGN_HEADERITEM( NAME ) \
00090             posmap[NAME.pos] = HeaderRef( #NAME, &NAME.item, NAME.pos, sizeof(NAME.item) ); \
00091             strmap[#NAME] = HeaderRef( #NAME, &NAME.item, NAME.pos, sizeof(NAME.item) );
00092 
00093 namespace gdf {
00094     struct HeaderItemBase
00095     {
00096         virtual void tostream( std::ostream &out ) const = 0;
00097     };
00098 
00100     template<typename T, size_t P>
00101     struct HeaderItem : public HeaderItemBase
00102     {
00103         HeaderItem( ) : item(), pos(P) { }
00104         //void tostream( std::ostream & out ) const { out.write( reinterpret_cast<const char*>(&item), sizeof(item) ); }
00105         //void fromstream( std::istream &in ) { in.read( reinterpret_cast<char*>(&item), sizeof(item) ); }
00106         void tostream( std::ostream & out ) const { writeLittleEndian( out, item ); }
00107         void fromstream( std::istream &in ) { readLittleEndian( in, item ); }
00108         T item;
00109         size_t pos;
00110     };
00111 
00113     template<typename T, size_t P, size_t L>
00114     struct HeaderArray : public HeaderItemBase
00115     {
00116         HeaderArray( ) : pos(P), len(L) { }
00117         T &operator[]( size_t idx ) { return item[idx]; }
00118         const T &operator[]( size_t idx ) const { return item[idx]; }
00119 
00120         //void tostream( std::ostream & out ) const { out.write( reinterpret_cast<const char*>(item), sizeof(item) ); }
00121         //void fromstream( std::istream &in ) { in.read( reinterpret_cast<char*>(item), sizeof(item) ); }
00122 
00123         void tostream( std::ostream & out ) const
00124         {
00125             for(size_t i=0; i<L; i++)
00126                 writeLittleEndian( out, item[i] );
00127         }
00128 
00129         void fromstream( std::istream &in )
00130         {
00131             for(size_t i=0; i<L; i++)
00132                 readLittleEndian( in, item[i] );
00133         }
00134 
00135         T item[L];
00136         size_t pos, len;
00137     };
00138 
00139     struct HeaderRef
00140     {
00141         HeaderRef( std::string n="", void *r = NULL, size_t o = 0, size_t l = 0) : name(n), ref(r), ofs(o), len(l) { }
00142         std::string name;
00143         void *ref;
00144         size_t ofs;
00145         size_t len;
00146     };
00147 }
00148 
00149 #endif
 All Data Structures Functions Variables Friends