From bb26dcf317d58dddb6845ffc4f2985d7a9a07070 Mon Sep 17 00:00:00 2001 From: Valentin Noel Date: Wed, 7 Aug 2013 16:18:13 +0200 Subject: [PATCH] add clean and modifications to Comparator library (basic element support) issue #31 --- libraries/comparator/SConscript | 4 +- libraries/comparator/src/Comparator.cpp | 123 ------------- libraries/comparator/src/Comparator.hpp | 15 +- libraries/comparator/src/Comparator.tcc | 165 ++++++++++++++++++ .../comparator/tests/comparatorTests.cpp | 132 +++++++------- 5 files changed, 237 insertions(+), 202 deletions(-) delete mode 100644 libraries/comparator/src/Comparator.cpp create mode 100644 libraries/comparator/src/Comparator.tcc diff --git a/libraries/comparator/SConscript b/libraries/comparator/SConscript index b0fddaa..92f39ed 100644 --- a/libraries/comparator/SConscript +++ b/libraries/comparator/SConscript @@ -1,8 +1,7 @@ Import( 'project', 'libs' ) -project.StaticLibrary( +project.ObjectLibrary( 'comparator', - dirs = ['src'], includes = ['src'], libraries = [ libs.common, @@ -11,5 +10,4 @@ project.StaticLibrary( libs.basicelement, libs.report, ], - shared = True ) diff --git a/libraries/comparator/src/Comparator.cpp b/libraries/comparator/src/Comparator.cpp deleted file mode 100644 index 19f22bf..0000000 --- a/libraries/comparator/src/Comparator.cpp +++ /dev/null @@ -1,123 +0,0 @@ -#include "Comparator.hpp" - -// #include -#include -#include -#include - -namespace sr = spec_reader; -namespace be = basic_element; -namespace rg = report_generator; -namespace fr = filereader; - -namespace comparator -{ - -Comparator::Comparator( fr::FileReader* file, const sr::SpecList& specs ) - : _file( file ) - , _specs( specs ) -{ -} - -Comparator::~Comparator() -{ -} - -void Comparator::compare( const std::string& specId, rg::Report& report ) -{ - // @todo: init ExpressionParser variable map with first pass! - - _report = &report; - sr::Specification spec = _specs.getSpec( specId ); - sr::SpecNode node = spec.getFirstNode(); - - LOG_TRACE( "\ncompare: Specification ID: " << spec.getId() ); - LOG_TRACE( "compare: First node ID: " << node.getId() ); - LOG_TRACE( "compare: Report size: " << _report->getSize() ); - - checkNode( node ); -} - -void Comparator::checkNode( const spec_reader::SpecNode& node, const bool& isFirstChild ) -{ - LOG_TRACE( "\nCheck: " << node.getId() ); - - checkElementFromNode( node, isFirstChild ); - if( node.hasGroup() ) - checkNode( node.firstChild(), true ); - if( ! node.isLastNode() ) - checkNode( node.next() ); -} - -void Comparator::checkElementFromNode( const spec_reader::SpecNode& node, const bool& isFirstChild ) -{ - EDataType subtype = getNodeSubType< EDataType >( node.getType() ); - std::shared_ptr< be::data_element::Data > element( new be::data_element::Data( subtype ) ); - - LOG_TRACE( "element type: " << (int) element->getDataSubType() ); - element->setId( node.getId() ); - element->setLabel( node.getLabel() ); - element->setBigEndianness( node.isBigEndian() ); - element->setSpecData( node.getValues() ); - - size_t size = element->getSize(); - // if( size == 0 && ! node.getCount().empty() ) // @todo: when variables map is got! - // { - // be::expression_parser::ExpressionParser< size_t > sizeParser( /*variablesMap*/ ); - // size = sizeParser.getExpressionResult< size_t >( node.getCount() ); - // } - - // element->setData( /*fromFileData*/, size ); // @todo: when file reading supported! - - element->checkData(); - addElementToReport( node, element, isFirstChild ); -} - -void Comparator::addElementToReport( const spec_reader::SpecNode& node, const std::shared_ptr< be::Element >& element, const bool& isFirstChild ) -{ - LOG_TRACE( "parent ? " << node.parent() ); - LOG_TRACE( "lastNode? " << node.isLastNode() ); - if( node.parent() == NULL ) - { - _currentReportNode = _report->addRootElement( element ); - } - else if( isFirstChild ) - { - _currentReportNode = _currentReportNode.appendChild( element ); - } - else if( node.isLastNode() ) - { - _currentReportNode = *_currentReportNode.parent(); - } - else - { - _currentReportNode = _currentReportNode.appendNext( element ); - } - LOG_TRACE( "==> report size: " << _report->getSize() ); -} - -} - - - -// be::Element Comparator::getBasicElement( const sr::SpecNode& node ) -// { -// std::string type = node.getType(); - -// - -// if( type == kInt8 ) return be::number_element::Number< be::number_element::int8 >( eNumberTypeInt8 ); -// if( type == kUInt8 ) return be::number_element::Number< be::number_element::uint8 >( eNumberTypeUInt8 ); -// if( type == kInt16 ) return be::number_element::Number< be::number_element::int16 >( eNumberTypeInt16 ); -// if( type == kUInt16 ) return be::number_element::Number< be::number_element::uint16 >( eNumberTypeUInt16 ); -// if( type == kInt32 ) return be::number_element::Number< be::number_element::int32 >( eNumberTypeInt32 ); -// if( type == kUInt32 ) return be::number_element::Number< be::number_element::uint32 >( eNumberTypeUInt32 ); -// if( type == kInt64 ) return be::number_element::Number< be::number_element::int64 >( eNumberTypeInt64 ); -// if( type == kUInt64 ) return be::number_element::Number< be::number_element::uint64 >( eNumberTypeUInt64 ); -// if( type == kFloat ) return be::number_element::Number< float >( eNumberTypeFloat ); -// if( type == kDouble ) return be::number_element::Number< double >( eNumberTypeDouble ); -// if( type == kIeeeExtended ) return be::number_element::Number< be::number_element::ieeeExtended >( eNumberTypeIeeeExtended ); - -// throw std::runtime_error( "getBasicElement: Unknown type"); -// return be::data_element::Data( eDataTypeUnknown ); -// } diff --git a/libraries/comparator/src/Comparator.hpp b/libraries/comparator/src/Comparator.hpp index 271908a..98aec03 100644 --- a/libraries/comparator/src/Comparator.hpp +++ b/libraries/comparator/src/Comparator.hpp @@ -25,6 +25,9 @@ class Comparator template < typename SubType > SubType getNodeSubType( const std::string& nodeType ); + template< typename ElementType > + std::shared_ptr< ElementType > getElement( const spec_reader::SpecNode& node ); + void checkNode ( const spec_reader::SpecNode& node, const bool& isFirstChild = false ); void checkElementFromNode( const spec_reader::SpecNode& node, const bool& isFirstChild ); void addElementToReport ( const spec_reader::SpecNode& node, const std::shared_ptr< be::Element >& element, const bool& isFirstChild ); @@ -36,18 +39,8 @@ class Comparator report_generator::ReportNode _currentReportNode; }; - -template < typename SubType > -SubType Comparator::getNodeSubType( const std::string& nodeType ) -{ - if( nodeType == kAscii ) return eDataTypeAscii; - if( nodeType == kHexa ) return eDataTypeHexa; - if( nodeType == kRaw ) return eDataTypeRaw; - throw std::runtime_error( "getNodeSubType: Unknown type"); - return eDataTypeUnknown; } - -} +#include "Comparator.tcc" #endif diff --git a/libraries/comparator/src/Comparator.tcc b/libraries/comparator/src/Comparator.tcc new file mode 100644 index 0000000..5913946 --- /dev/null +++ b/libraries/comparator/src/Comparator.tcc @@ -0,0 +1,165 @@ +#include +#include +#include +#include + +namespace rg = report_generator; +namespace sr = spec_reader; +namespace be = basic_element; +namespace fr = filereader; + +namespace comparator +{ + +Comparator::Comparator( fr::FileReader* file, const sr::SpecList& specs ) + : _file( file ) + , _specs( specs ) +{ +} + +Comparator::~Comparator() +{ +} + + +void Comparator::compare( const std::string& specId, rg::Report& report ) +{ + // @todo: init ExpressionParser variable map with first pass! or not... + + _report = &report; + sr::Specification spec = _specs.getSpec( specId ); + sr::SpecNode node = spec.getFirstNode(); + + LOG_TRACE( "\ncompare: Specification ID: " << spec.getId() ); + LOG_TRACE( "compare: First node ID: " << node.getId() ); + LOG_TRACE( "compare: Report size: " << _report->getSize() ); + + checkNode( node ); +} + + +template< > +EDataType Comparator::getNodeSubType< EDataType >( const std::string& nodeType ) +{ + LOG_INFO( "EDataType" ); + if( nodeType == kAscii ) return eDataTypeAscii; + if( nodeType == kHexa ) return eDataTypeHexa; + if( nodeType == kRaw ) return eDataTypeRaw; + return eDataTypeUnknown; +} + +template< > +ENumberType Comparator::getNodeSubType< ENumberType >( const std::string& nodeType ) +{ + LOG_INFO( "ENumberType" ); + if( nodeType == kInt8 ) return eNumberTypeInt8; + if( nodeType == kUInt8 ) return eNumberTypeUInt8; + if( nodeType == kInt16 ) return eNumberTypeInt16; + if( nodeType == kUInt16 ) return eNumberTypeUInt16; + if( nodeType == kInt32 ) return eNumberTypeInt32; + if( nodeType == kUInt32 ) return eNumberTypeUInt32; + if( nodeType == kInt64 ) return eNumberTypeInt64; + if( nodeType == kUInt64 ) return eNumberTypeUInt64; + if( nodeType == kFloat ) return eNumberTypeFloat; + if( nodeType == kDouble ) return eNumberTypeDouble; + if( nodeType == kIeeeExtended ) return eNumberTypeIeeeExtended; + return eNumberTypeUnknown; +} + +template< typename ElementType > +std::shared_ptr< ElementType > Comparator::getElement( const sr::SpecNode& node ) +{ + LOG_INFO( "°°° NUMBER ! °°°" ); + std::shared_ptr< ElementType > element( new ElementType() ); + element->setId( node.getId() ); + element->setLabel( node.getLabel() ); + element->setBigEndianness( node.isBigEndian() ); + // element->setData( /*fromFileData*/, element->getSize() ); // @todo: when file reading supported! + element->checkData(); + return element; +} + +template< > +std::shared_ptr< be::data_element::Data > Comparator::getElement< be::data_element::Data >( const sr::SpecNode& node ) +{ + LOG_INFO( "°°° DATA ! °°°" ); + EDataType subtype = getNodeSubType< EDataType >( node.getType() ); + std::shared_ptr< be::data_element::Data > element( new be::data_element::Data( subtype ) ); + element->setId( node.getId() ); + element->setLabel( node.getLabel() ); + element->setBigEndianness( node.isBigEndian() ); + element->setSpecData( node.getValues() ); + + // size_t size = element->getSize(); + // if( size == 0 && ! node.getCount().empty() ) // @todo: when variables map is got! + // { + // be::expression_parser::ExpressionParser< size_t > sizeParser( /*variablesMap*/ ); + // size = sizeParser.getExpressionResult< size_t >( node.getCount() ); + // } + // element->setData( /*fromFileData*/, size ); // @todo: when file reading supported! + + element->checkData(); + return element; +} + + +void Comparator::checkNode( const sr::SpecNode& node, const bool& isFirstChild ) +{ + LOG_TRACE( "\nCheck: " << node.getId() ); + + checkElementFromNode( node, isFirstChild ); + if( node.hasGroup() ) + checkNode( node.firstChild(), true ); + if( ! node.isLastNode() ) + checkNode( node.next() ); +} + +void Comparator::checkElementFromNode( const sr::SpecNode& node, const bool& isFirstChild ) +{ + if( getNodeSubType< EDataType >( node.getType() ) != eDataTypeUnknown ) + addElementToReport( node, getElement< be::data_element::Data >( node ), isFirstChild ); + + switch( getNodeSubType< ENumberType >( node.getType() ) ) + { + case eNumberTypeUnknown : break; + case eNumberTypeInt8 : addElementToReport( node, getElement< be::number_element::Number< be::number_element::int8 > >( node ), isFirstChild ); break; + case eNumberTypeUInt8 : addElementToReport( node, getElement< be::number_element::Number< be::number_element::uint8 > >( node ), isFirstChild ); break; + case eNumberTypeInt16 : addElementToReport( node, getElement< be::number_element::Number< be::number_element::int16 > >( node ), isFirstChild ); break; + case eNumberTypeUInt16 : addElementToReport( node, getElement< be::number_element::Number< be::number_element::uint16 > >( node ), isFirstChild ); break; + case eNumberTypeInt32 : addElementToReport( node, getElement< be::number_element::Number< be::number_element::int32 > >( node ), isFirstChild ); break; + case eNumberTypeUInt32 : addElementToReport( node, getElement< be::number_element::Number< be::number_element::uint32 > >( node ), isFirstChild ); break; + case eNumberTypeInt64 : addElementToReport( node, getElement< be::number_element::Number< be::number_element::int64 > >( node ), isFirstChild ); break; + case eNumberTypeUInt64 : addElementToReport( node, getElement< be::number_element::Number< be::number_element::uint64 > >( node ), isFirstChild ); break; + case eNumberTypeFloat : addElementToReport( node, getElement< be::number_element::Number< float > >( node ), isFirstChild ); break; + case eNumberTypeDouble : addElementToReport( node, getElement< be::number_element::Number< double > >( node ), isFirstChild ); break; + case eNumberTypeIeeeExtended : addElementToReport( node, getElement< be::number_element::Number< be::number_element::ieeeExtended > >( node ), isFirstChild ); break; + } +} + +void Comparator::addElementToReport( const sr::SpecNode& node, const std::shared_ptr< be::Element >& element, const bool& isFirstChild ) +{ + LOG_TRACE( "parent ? " << node.parent() ); + LOG_TRACE( "lastNode? " << node.isLastNode() ); + if( node.parent() == NULL ) + { + _currentReportNode = _report->addRootElement( element ); + } + else if( isFirstChild ) + { + _currentReportNode = _currentReportNode.appendChild( element ); + } + else if( node.isLastNode() ) + { + _currentReportNode = *_currentReportNode.parent(); + } + else + { + _currentReportNode = _currentReportNode.appendNext( element ); + } + LOG_TRACE( "==> report size: " << _report->getSize() ); +} + + + +} + diff --git a/libraries/comparator/tests/comparatorTests.cpp b/libraries/comparator/tests/comparatorTests.cpp index 99118b4..f706594 100644 --- a/libraries/comparator/tests/comparatorTests.cpp +++ b/libraries/comparator/tests/comparatorTests.cpp @@ -46,24 +46,24 @@ BOOST_AUTO_TEST_CASE( comparator_comparator ) // comp.compare( "test", report ); // } { - std::string jsonString = " { "; - jsonString += " \"standard\": "; - jsonString += " { "; - jsonString += " \"id\": \"test\","; - jsonString += " \"extension\": [ "; - jsonString += " \"ext1\","; - jsonString += " \"ext2\","; - jsonString += " \"ext3\"]"; - jsonString += " }, "; - jsonString += " \"header\": [ "; - jsonString += " { "; - jsonString += " \"id\": \"test1\","; - jsonString += " \"label\": \"Test 1\","; - jsonString += " \"type\": \"unknown\""; - jsonString += " }"; - jsonString += " ]"; - jsonString += "}"; - + std::string jsonString = + "{ \ + \"standard\": \ + { \ + \"id\": \"test\", \ + \"extension\": [ \ + \"ext1\", \ + \"ext2\", \ + \"ext3\"] \ + }, \ + \"header\": [ \ + { \ + \"id\": \"test1\", \ + \"label\": \"Test 1\", \ + \"type\": \"unknown\" \ + } \ + ] \ + }"; sr::Specification spec; sr::SpecList specList; @@ -77,55 +77,57 @@ BOOST_AUTO_TEST_CASE( comparator_comparator ) Comparator comp( &file, specList ); rg::Report report; - BOOST_CHECK_THROW( comp.compare( "test", report ), std::runtime_error ); + // BOOST_CHECK_THROW( comp.compare( "test", report ), std::runtime_error ); } { - std::string jsonString = " { "; - jsonString += " \"standard\": "; - jsonString += " { "; - jsonString += " \"id\": \"test\","; - jsonString += " \"extension\": [ "; - jsonString += " \"ext1\","; - jsonString += " \"ext2\","; - jsonString += " \"ext3\"]"; - jsonString += " }, "; - jsonString += " \"header\": [ "; - jsonString += " { "; - jsonString += " \"id\": \"test1\","; - jsonString += " \"label\": \"Test 1\","; - jsonString += " \"type\": \"hexa\""; - jsonString += " },"; - jsonString += " { "; - jsonString += " \"id\": \"test2\","; - jsonString += " \"label\": \"Test 2\","; - jsonString += " \"type\": \"ascii\","; - jsonString += " \"group\": [ "; - jsonString += " { "; - jsonString += " \"id\": \"child1\","; - jsonString += " \"label\": \"Child 1\","; - jsonString += " \"type\": \"hexa\","; - jsonString += " \"values\": \"ff00\""; - jsonString += " },"; - jsonString += " { "; - jsonString += " \"id\": \"child2\","; - jsonString += " \"label\": \"Child 2\","; - jsonString += " \"type\": \"ascii\","; - jsonString += " \"group\": [ "; - jsonString += " { "; - jsonString += " \"id\": \"child21\","; - jsonString += " \"label\": \"Child 2-1\","; - jsonString += " \"type\": \"raw\""; - jsonString += " } ]"; - jsonString += " }"; - jsonString += " ]"; - jsonString += " },"; - jsonString += " { "; - jsonString += " \"id\": \"test3\","; - jsonString += " \"label\": \"Test 3\","; - jsonString += " \"type\": \"raw\""; - jsonString += " }"; - jsonString += " ]"; - jsonString += " }"; + std::string jsonString = + "{ \ + \"standard\": \ + { \ + \"id\": \"test\",\ + \"extension\": [ \ + \"ext1\",\ + \"ext2\",\ + \"ext3\"]\ + }, \ + \"header\": [ \ + { \ + \"id\": \"test1\",\ + \"label\": \"Test 1\",\ + \"type\": \"hexa\"\ + },\ + { \ + \"id\": \"test2\",\ + \"label\": \"Test 2\",\ + \"type\": \"ascii\",\ + \"group\": [ \ + { \ + \"id\": \"child1\",\ + \"label\": \"Child 1\",\ + \"type\": \"hexa\",\ + \"values\": \"ff00\"\ + },\ + { \ + \"id\": \"child2\",\ + \"label\": \"Child 2\",\ + \"type\": \"ascii\",\ + \"group\": [ \ + { \ + \"id\": \"child21\",\ + \"label\": \"Child 2-1\",\ + \"type\": \"raw\"\ + } \ + ]\ + }\ + ]\ + },\ + { \ + \"id\": \"test3\",\ + \"label\": \"Test 3\",\ + \"type\": \"raw\"\ + }\ + ]\ + }"; sr::Specification spec; sr::SpecList specList;