|
libGDF
|
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