libGDF
Channel.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 __CHANNEL_H_INCLUDED__
00020 #define __CHANNEL_H_INCLUDED__
00021 
00022 #include "GDF/SignalHeader.h"
00023 #include "ChannelDataBase.h"
00024 #include "GDF/Types.h"
00025 #include <boost/numeric/conversion/cast.hpp>
00026 #include <boost/lexical_cast.hpp>
00027 
00028 namespace gdf
00029 {
00030     class SignalHeader;
00031 
00033 
00035     class Channel
00036     {
00037     public:
00039         Channel( const SignalHeader *sig_hdr, const size_t length );
00040 
00042 
00043         Channel( const SignalHeader *sig_hdr );
00044 
00046         Channel( const Channel &other );
00047 
00049         virtual ~Channel( );
00050 
00052         void clear( );
00053 
00055 
00056         void addSamplePhys( const double value );
00057 
00059 
00060         template<typename T> void addSampleRaw( const T rawval );
00061 
00063 
00064         void blitSamplesPhys( const double *values, size_t num );
00065 
00067 
00068         template<typename T> void blitSamplesRaw( const T *values, size_t num );
00069 
00071 
00072         void fillPhys( const double value, size_t num );
00073 
00075 
00076         template<typename T> void fillRaw( const T value, size_t num );
00077 
00079         void setSamplePhys( size_t pos, double value );
00080 
00082         double getSamplePhys( size_t pos );
00083 
00085 
00086         void deblitSamplesPhys( double *values, size_t start, size_t num );
00087 
00089         template<typename T> void deblitSamplesRaw( T *values, size_t start, size_t num );
00090 
00092         size_t getFree( );
00093 
00095         size_t getWritten( );
00096 
00098         uint32 getTypeID( );
00099 
00100         friend std::ostream &operator<<( std::ostream &out, const Channel &c );
00101         friend std::istream &operator>>( std::istream &in, Channel &c );
00102 
00103     private:
00104         const SignalHeader *m_signalheader;
00105         ChannelDataBase *m_data;
00106     };
00107 
00109     std::ostream &operator<<( std::ostream &out, const Channel &c );
00110 
00112     std::istream &operator>>( std::istream &in, Channel &c );
00113 
00114 
00115 
00116     //===================================================================================================
00117     //===================================================================================================
00118 
00119     template<typename T> void Channel::addSampleRaw( const T rawval )
00120     {
00121         using boost::numeric_cast;
00122 
00123         switch( m_signalheader->get_datatype( ) )
00124         {
00125         case INT8: m_data->addSample( numeric_cast<int8>(rawval) ); break;
00126         case UINT8: m_data->addSample( numeric_cast<uint8>(rawval) ); break;
00127         case INT16: m_data->addSample( numeric_cast<int16>(rawval) ); break;
00128         case UINT16: m_data->addSample( numeric_cast<uint16>(rawval) ); break;
00129         case INT32: m_data->addSample( numeric_cast<int32>(rawval) ); break;
00130         case UINT32: m_data->addSample( numeric_cast<uint32>(rawval) ); break;
00131         case INT64: m_data->addSample( numeric_cast<int64>(rawval) ); break;
00132         case UINT64: m_data->addSample( numeric_cast<uint64>(rawval) ); break;
00133         case FLOAT32: m_data->addSample( numeric_cast<float32>(rawval) ); break;
00134         case FLOAT64: m_data->addSample( numeric_cast<float64>(rawval) ); break;
00135         default: throw exception::invalid_type_id( boost::lexical_cast<std::string>(m_signalheader->get_datatype( )) ); break;
00136         };
00137     }
00138 
00139     //===================================================================================================
00140     //===================================================================================================
00141 
00142     template<typename T> void Channel::blitSamplesRaw( const T *values, size_t num )
00143     {
00144         for( size_t i=0; i<num; i++ )
00145             addSampleRaw( values[i] );
00146     }
00147 
00148 }
00149 
00150 #endif
 All Data Structures Functions Variables Friends