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