|
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 __CHANNELDATA_H_INCLUDED 00020 #define __CHANNELDATA_H_INCLUDED 00021 00022 #include "ChannelDataBase.h" 00023 #include <vector> 00024 #include <stddef.h> 00025 #include <assert.h> 00026 //#include <iostream> 00027 00028 namespace gdf 00029 { 00030 00032 00035 template<typename T> 00036 class ChannelData : public ChannelDataBase 00037 { 00038 public: 00040 ChannelData( size_t length ) 00041 { 00042 m_data.resize( length ); 00043 m_writepos = 0; 00044 } 00045 00047 ChannelData( ChannelDataBase *base ) 00048 { 00049 ChannelData<T>* other = reinterpret_cast<ChannelData<T>*>( base ); 00050 m_data.resize( other->m_data.size( ) ); 00051 size_t N = m_data.size(); 00052 for( size_t i=0; i<N; i++) 00053 m_data[i] = other->m_data[i]; 00054 m_writepos = other->m_writepos; 00055 } 00056 00058 virtual ~ChannelData( ) 00059 { 00060 //std::cout << "~ChannelData( )" << std::endl; 00061 } 00062 00064 void addSample( const T value ) 00065 { 00066 assert( getFree( ) > 0 ); 00067 m_data[m_writepos++] = value; 00068 } 00069 00071 void blitSamples( const T *values, const size_t num ) 00072 { 00073 assert( getFree( ) >= num ); 00074 for( size_t i=0; i<num; i++ ) 00075 m_data[m_writepos++] = values[i]; 00076 } 00077 00079 void fill( const T value, const size_t num ) 00080 { 00081 assert( getFree( ) >= num ); 00082 for( size_t i=0; i<num; i++ ) 00083 m_data[m_writepos++] = value; 00084 } 00085 00087 void setSample( size_t pos, T rawval ) 00088 { 00089 m_data[pos] = rawval; 00090 } 00091 00093 T getSample( size_t pos, T /*dummy*/ ) 00094 { 00095 return m_data[pos]; 00096 } 00097 00099 virtual void clear( ) 00100 { 00101 m_writepos = 0; 00102 } 00103 00105 size_t getFree( ) 00106 { 00107 return m_data.size( ) - m_writepos; 00108 } 00109 00111 virtual size_t getWritten( ) 00112 { 00113 return m_writepos; 00114 } 00115 00117 void tostream( std::ostream &out ) 00118 { 00119 //std::cout << "Channel -> Stream" << std::endl; 00120 //out.write( reinterpret_cast<char*>(&m_data[0]), sizeof(T)*m_data.size() ); 00121 for( size_t i=0; i<m_data.size(); i++ ) 00122 { 00123 writeLittleEndian( out, m_data[i] ); 00124 } 00125 } 00126 00128 void fromstream( std::istream &in ) 00129 { 00130 //std::cout << "Stream -> Channel" << std::endl; 00131 //in.read( reinterpret_cast<char*>(&m_data[0]), sizeof(T)*m_data.size() ); 00132 00133 for( size_t i=0; i<m_data.size(); i++ ) 00134 { 00135 readLittleEndian( in, m_data[i] ); 00136 } 00137 00138 //char *charbuf = new char[sizeof(T)*m_data.size()]; 00139 00140 /*in.read( charbuf, sizeof(T)*m_data.size() ); 00141 00142 for( size_t i=0; i<m_data.size(); i++ ) 00143 std::cout << ((T*)charbuf)[i] << " ";*/ 00144 00145 /*for( size_t i=0; i<m_data.size(); i++ ) 00146 std::cout << m_data[i] << " ";*/ 00147 } 00148 00149 protected: 00151 std::vector<T> &getData( ) { return m_data; } 00152 00154 std::vector<T> *getDataPtr( ) { return &m_data; } 00155 00156 private: 00157 std::vector<T> m_data; 00158 size_t m_writepos; 00159 }; 00160 00161 } 00162 00163 #endif