libGDF
ChannelData.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 __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
 All Data Structures Functions Variables Friends