From eb2c49549afa085082705c6196f95fb05508e371 Mon Sep 17 00:00:00 2001 From: Mario Fink Date: Wed, 10 Feb 2021 11:08:08 +0100 Subject: [PATCH] integrate imc::object into parsing workflow --- lib/imc_block.hpp | 29 ++++++++-- lib/imc_key.hpp | 4 +- lib/imc_object.hpp | 131 +++++++++++++++++++++++++++++++++++++-------- lib/imc_raw.hpp | 20 +------ src/main.cpp | 2 +- 5 files changed, 138 insertions(+), 48 deletions(-) diff --git a/lib/imc_block.hpp b/lib/imc_block.hpp index eeae1e5..968656d 100644 --- a/lib/imc_block.hpp +++ b/lib/imc_block.hpp @@ -37,14 +37,14 @@ namespace imc // w.r.t. to first byte of block (=0) std::vector parameters_; - // particular imc object + // particular imc object represented by this block imc::rawobject imc_object_; public: // constructor block(key thekey, unsigned long int begin, unsigned long int end, - std::string raw_file, std::vector* buffer): + std::string raw_file, const std::vector* buffer): thekey_(thekey) { if ( keys.count(thekey.name_) != 1 ) throw std::logic_error("unknown key"); @@ -68,11 +68,14 @@ namespace imc try { parse_parameters(); + parse_object(); } catch (const std::exception& e) { throw std::runtime_error("block: failed to parse parameters"); } } + private: + // identify/parse parameters in block void parse_parameters() { @@ -94,6 +97,14 @@ namespace imc parameters_.back().end( this->end_ - 1 ); } + // pass buffer and parameters associated to block to generate corres. object + void parse_object() + { + imc_object_.parse(thekey_,buffer_,parameters_); + } + + public: + // access members imc::key get_key() { return thekey_; } unsigned long int get_begin() { return begin_; } @@ -119,7 +130,7 @@ namespace imc } // get info string - std::string get_info(int width = 20) + std::string get_info(bool include_object = true, int width = 20) { // summarize parameters in single string std::string prsstr("{"); @@ -129,12 +140,22 @@ namespace imc // construct block info string std::stringstream ss; - ss<size()<<"\n" <* buffer, const std::vector parameters) + { + + } + + format(): fileformat_(-1), processor_(-1) {} + + // get info string + std::string get_info(int width = 20) + { + std::stringstream ss; + ss<* buffer, - const std::vector parameters) + const std::vector& parameters) { - if ( key.name_ == std::string("CK") ) + if ( key.name_ == std::string("CF") ) + { + fmt_.parse(buffer,parameters); + objidx_ = 0; + } + else if ( key.name_ == std::string("CK") ) { kyg_.parse(buffer,parameters); + objidx_ = 1; } else if ( key.name_ == std::string("CB") ) { grp_.parse(buffer,parameters); + objidx_ = 2; } else if ( key.name_ == std::string("CT") ) { txt_.parse(buffer,parameters); + objidx_ = 3; } else if ( key.name_ == std::string("CG") ) { dtf_.parse(buffer,parameters); + objidx_ = 4; } else if ( key.name_ == std::string("CD") && key.version_ == 1 ) { abs_.parse(buffer,parameters); + objidx_ = 5; } else if ( key.name_ == std::string("CC") ) { cmt_.parse(buffer,parameters); + objidx_ = 6; } else if ( key.name_ == std::string("CP") ) { cmt_.parse(buffer,parameters); + objidx_ = 7; } else if ( key.name_ == std::string("Cb") ) { bfr_.parse(buffer,parameters); + objidx_ = 8; } else if ( key.name_ == std::string("CR") ) { rng_.parse(buffer,parameters); + objidx_ = 9; } else if ( key.name_ == std::string("CN") ) { chn_.parse(buffer,parameters); + objidx_ = 10; } else if ( key.name_ == std::string("CS") ) { dat_.parse(buffer,parameters); + objidx_ = 11; } else if ( key.name_ == std::string("NO") ) { org_.parse(buffer,parameters); + objidx_ = 12; } else if ( key.name_ == std::string("NT") ) { trt_.parse(buffer,parameters); + objidx_ = 13; + } + else + { + throw std::logic_error( + std::string("unsupported block associated to key ") + key.name_ + ); } } // provide info string std::string get_info(int width = 20) { - return kyg_.get_info(); + switch (objidx_) { + case 0: + return fmt_.get_info(); + case 1: + return kyg_.get_info(); + case 2: + return grp_.get_info(); + case 3: + return txt_.get_info(); + case 4: + return dtf_.get_info(); + case 5: + return abs_.get_info(); + case 6: + return cmt_.get_info(); + case 7: + return pkg_.get_info(); + case 8: + return bfr_.get_info(); + case 9: + return rng_.get_info(); + case 10: + return chn_.get_info(); + case 11: + return dat_.get_info(); + case 12: + return org_.get_info(); + case 13: + return trt_.get_info(); + default: + return std::string(""); + } } - }; + }; } diff --git a/lib/imc_raw.hpp b/lib/imc_raw.hpp index 682bb54..14eb990 100644 --- a/lib/imc_raw.hpp +++ b/lib/imc_raw.hpp @@ -114,7 +114,7 @@ namespace imc } unsigned long length = std::stoul(leng); - // declare corresponding key and block + // declare and initialize corresponding key and block imc::key bkey( *(it+1)==imc::key_crit_ , newkey, imc::keys.at(newkey).description_, version ); imc::block blk(bkey,it-buffer_.begin(), @@ -165,14 +165,7 @@ namespace imc } } - // // extract imc objects - // void list_keygroup() - // { - // for ( auto &blk: this->rawblocks_ ) - // { - // if ( blk.get_key().name_ == std::string("CK") ) - // } - // } + // parse channel's raw data public: @@ -194,15 +187,6 @@ namespace imc return cplxcnt_; } - // collect meta data - void parse_meta() - { - - - } - - // parse channel's raw data - }; } diff --git a/src/main.cpp b/src/main.cpp index 8de9ab4..238ef30 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -173,7 +173,7 @@ int main(int argc, char* argv[]) // list blocks for ( imc::block blk: imcraw.blocks() ) { - std::cout<