libGDF
RecordBuffer.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 __RECORDBUFFER_H_INCLUDED__
00020 #define __RECORDBUFFER_H_INCLUDED__
00021 
00022 #include "GDF/Channel.h"
00023 #include "GDF/pointerpool.h"
00024 
00025 #include <list>
00026 #include <vector>
00027 
00028 namespace gdf
00029 {
00030     class Record;
00031     class GDFHeaderAccess;
00032 
00034 
00037     class RecordBuffer
00038     {
00039     public:
00040 
00041         class RecordFullHandler
00042         {
00043         public:
00044             virtual void triggerRecordFull( Record *rec ) = 0;
00045         };
00046 
00048         RecordBuffer( const GDFHeaderAccess *gdfh );
00049 
00051         virtual ~RecordBuffer( );
00052 
00054         void clearBuffers( );
00055 
00057         void reset( );
00058 
00060 
00063         void handleChannelFull( const size_t channel_idx );
00064 
00066 
00067         void handleRecordFull( );
00068 
00070         void registerRecordFullCallback( RecordFullHandler *h );
00071 
00073         void unregisterRecordFullCallback( RecordFullHandler *h );
00074 
00076         void addSamplePhys( const size_t channel_idx, const double value );
00077 
00079         template<typename T> void addSampleRaw( const size_t channel_idx, const T rawval )
00080         {
00081             Channel *ch = getValidChannel( channel_idx );
00082             ch->addSampleRaw<T>( rawval );
00083             if( ch->getFree( ) == 0 )
00084                 handleChannelFull( channel_idx );
00085         }
00086 
00088         void blitSamplesPhys( const size_t channel_idx, const double *values, size_t num );
00089 
00091         template<typename T> void blitSamplesRaw( const size_t channel_idx, const T *values, size_t num )
00092         {
00093             size_t i = 0;
00094             while( i<num )
00095             {
00096                 Channel *ch = getValidChannel( channel_idx );
00097                 size_t n = std::min( num-i, ch->getFree( ) );
00098                 ch->blitSamplesRaw( &values[i], n );
00099                 if( ch->getFree( ) == 0 )
00100                     handleChannelFull( channel_idx );
00101                 i += n;
00102             }
00103         }
00104 
00106         void fillPhys( const size_t channel_idx, const double value, size_t num );
00107 
00109         template<typename T> void fillRaw( const size_t channel_idx, const T value, size_t num );
00110 
00112 
00113         void addRecord( Record *r );
00114 
00116 
00117         Record *acquireRecord( );
00118 
00120         std::list< Record* >::iterator createNewRecord( );
00121 
00123         Record *getFirstFullRecord( );
00124 
00126         void removeFirstFullRecord( );
00127 
00129         inline size_t getNumFullRecords( ) const { return m_num_full; }
00130 
00132         inline size_t getNumPartialRecords( ) const { return m_records.size( ); }
00133 
00135 
00137         Channel *getValidChannel( const size_t channel_idx );
00138 
00140         size_t getNumFreeAlloc( const size_t channel_idx );
00141 
00143         void flood( );
00144 
00145     protected:
00146 
00147     private:
00148         const GDFHeaderAccess *m_gdfh;
00149         PointerPool<Record> *m_pool;
00150         std::list< Record* > m_records;
00151         std::list< Record* > m_records_full;
00152         size_t m_num_full;
00153         std::vector< std::list< Record* >::iterator > m_channelhead;
00154         std::list<RecordFullHandler*> m_recfull_callbacks;
00155     };
00156 }
00157 
00158 #endif
 All Data Structures Functions Variables Friends