diff --git a/alib2std/src/extensions/forward_tree.hpp b/alib2std/src/extensions/forward_tree.hpp index 0a7dabf5368b7f7e3b66320a83da65129ecbfcbf..1960275517f4f9f2a32e45672edd707df5c9d4fb 100644 --- a/alib2std/src/extensions/forward_tree.hpp +++ b/alib2std/src/extensions/forward_tree.hpp @@ -178,6 +178,7 @@ public: const tree_node * parent = parents.back ( ); if ( node == parent->getChildren ( ).end ( ) ) { + parents.pop_back(); --level; node = typename std::vector < tree_node >::const_iterator ( parent ); } else { @@ -193,9 +194,9 @@ public: if ( newIter != node->getChildren ( ).end ( ) ) { ++level; - node = newIter; parents.push_back ( & * node ); + node = newIter; } else { virtual_node = true; } @@ -221,10 +222,10 @@ public: if ( newIter != node->getChildren ( ).begin ( ) ) { ++level; - node = newIter; - --node; parents.push_back ( & * node ); + node = newIter; + --node; } else { virtual_node = false; } @@ -233,6 +234,7 @@ public: const tree_node * parent = parents.back ( ); if ( node == parent->getChildren ( ).begin ( ) ) { + parents.pop_back(); --level; node = typename std::vector < tree_node >::const_iterator ( parent ); } else { @@ -584,7 +586,7 @@ public: return res; } - // -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- template < class ... Indexes > const T & operator ()( Indexes ... indexes ) const { @@ -655,6 +657,7 @@ public: } // ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + int compare ( const forward_tree & other ) const { std::compare < typename std::decay < T >::type > comp; auto iterF = this->prefix_begin ( ); diff --git a/alib2std/src/extensions/tree.hpp b/alib2std/src/extensions/tree.hpp index f94023e637601cd01cda00d56375f01b571d0465..0489c92cfc98f4cc136a9b62dae3172327077163 100644 --- a/alib2std/src/extensions/tree.hpp +++ b/alib2std/src/extensions/tree.hpp @@ -611,7 +611,7 @@ public: return res; } - // -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- template < class ... Indexes > const T & operator ()( Indexes ... indexes ) const { @@ -697,6 +697,7 @@ public: } // ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + int compare ( const tree & other ) const { std::compare < typename std::decay < T >::type > comp; auto iterF = this->prefix_begin ( ); diff --git a/alib2std/test-src/extensions/ForwardTreeTest.cpp b/alib2std/test-src/extensions/ForwardTreeTest.cpp index 445ddf2655e4c19b367b2dc30e4d0fbb28a48023..f039c6a89aef4a185d7980d95d59453186bab78f 100644 --- a/alib2std/test-src/extensions/ForwardTreeTest.cpp +++ b/alib2std/test-src/extensions/ForwardTreeTest.cpp @@ -9,37 +9,29 @@ void ForwardTreeTest::setUp ( ) { void ForwardTreeTest::tearDown ( ) { } -void ForwardTreeTest::print_tree ( std::tree < char >::const_children_iterator biter, std::tree < char >::const_children_iterator eiter, std::string indent ) { - for ( std::tree < char >::const_children_iterator iter = biter; iter != eiter; iter++ ) { +void ForwardTreeTest::print_tree ( std::forward_tree < char >::const_children_iterator biter, std::forward_tree < char >::const_children_iterator eiter, std::string indent ) { + for ( std::forward_tree < char >::const_children_iterator iter = biter; iter != eiter; iter++ ) { std::cout << indent << * iter << std::endl; print_tree ( iter.begin ( ), iter.end ( ), indent + " " ); } } void ForwardTreeTest::testTreeStdStructure ( ) { - std::tree < char > t ( 'a', std::tree < char > ( 'a' ), std::tree < char > ( 'b', std::tree < char > ( 'a' ), std::tree < char > ( 'b' ) ) ); + std::forward_tree < char > t ( 'a', std::forward_tree < char > ( 'a' ), std::forward_tree < char > ( 'b', std::forward_tree < char > ( 'a' ), std::forward_tree < char > ( 'b' ) ) ); - // std::cout << "structure t " << std::boolalpha << t.checkStructure() << std::endl; + std::forward_tree < char > t2 ( 'c' ); - std::tree < char > t2 ( 'c' ); - - // std::cout << "structure t2 " << std::boolalpha << t2.checkStructure() << std::endl; - t2.insert ( t2.begin ( ), t2.begin ( ).begin ( ), { 'c', std::tree < char > ( 'b' ) } ); - CPPUNIT_ASSERT ( t2.checkStructure ( ) ); + t2.insert ( t2.begin ( ), t2.begin ( ).begin ( ), { 'c', std::forward_tree < char > ( 'b' ) } ); t2.insert ( t2.begin ( ), t2.begin ( ).end ( ), t.begin ( ), t.end ( ) ); - CPPUNIT_ASSERT ( t2.checkStructure ( ) ); std::vector < char > data = { 'd', 'e' }; t2.insert ( t2.begin ( ), t2.begin ( ).end ( ), data.begin ( ), data.end ( ) ); - CPPUNIT_ASSERT ( t2.checkStructure ( ) ); // print_tree ( t.begin(), t.end(), ""); t2.erase ( t2.begin ( ), std::prev ( t2.begin ( ).end ( ) ) ); - CPPUNIT_ASSERT ( t2.checkStructure ( ) ); t2.push_back ( t2.begin ( ), 'f' ); - CPPUNIT_ASSERT ( t2.checkStructure ( ) ); // print_tree ( t2.begin(), t2.end(), ""); @@ -47,8 +39,7 @@ void ForwardTreeTest::testTreeStdStructure ( ) { t2 ( 1, 1 ) = 'c'; CPPUNIT_ASSERT_EQUAL ( ( char ) t2 ( 1, 1 ), 'c' ); - CPPUNIT_ASSERT ( t2.checkStructure ( ) ); - std::tree < char >::const_prefix_iterator beg = t2.prefix_begin ( ); + std::forward_tree < char >::const_prefix_iterator beg = t2.prefix_begin ( ); beg++; beg++; beg++; @@ -73,7 +64,7 @@ void ForwardTreeTest::testTreeStdStructure ( ) { std::vector < std::pair < unsigned, char > > expectedPrefix = { { 0, 'c' }, { 1, 'c' }, { 2, 'b' }, { 1, 'a' }, { 2, 'a' }, { 2, 'c' }, { 3, 'a' }, { 3, 'b' }, { 1, 'd' }, { 1, 'f' } }; std::vector < std::pair < unsigned, char > >::const_iterator ref = expectedPrefix.begin ( ); - for ( std::tree < char >::const_prefix_iterator iter = t2.prefix_begin ( ); iter != t2.prefix_end ( ); ++iter ) { + for ( std::forward_tree < char >::const_prefix_iterator iter = t2.prefix_begin ( ); iter != t2.prefix_end ( ); ++iter ) { CPPUNIT_ASSERT ( iter.getLevel ( ) == ref->first ); CPPUNIT_ASSERT ( * iter == ref->second ); ++iter; @@ -84,7 +75,7 @@ void ForwardTreeTest::testTreeStdStructure ( ) { std::vector < std::tuple < unsigned, char, bool > > expectedStructure = { std::make_tuple ( 0u, 'c', false ), std::make_tuple ( 1u, 'c', false ), std::make_tuple ( 2u, 'b', false ), std::make_tuple ( 2u, 'b', true ), std::make_tuple ( 1u, 'c', true ), std::make_tuple ( 1u, 'a', false ), std::make_tuple ( 2u, 'a', false ), std::make_tuple ( 2u, 'a', true ), std::make_tuple ( 2u, 'c', false ), std::make_tuple ( 3u, 'a', false ), std::make_tuple ( 3u, 'a', true ), std::make_tuple ( 3u, 'b', false ), std::make_tuple ( 3u, 'b', true ), std::make_tuple ( 2u, 'c', true ), std::make_tuple ( 1u, 'a', true ), std::make_tuple ( 1u, 'd', false ), std::make_tuple ( 1u, 'd', true ), std::make_tuple ( 1u, 'f', false ), std::make_tuple ( 1u, 'f', true ), std::make_tuple ( 0u, 'c', true ) }; std::vector < std::tuple < unsigned, char, bool > >::const_iterator ref2 = expectedStructure.begin ( ); - for ( std::tree < char >::const_structure_iterator iter = t2.structure_begin ( ); iter != t2.structure_end ( ); ++iter ) { + for ( std::forward_tree < char >::const_structure_iterator iter = t2.structure_begin ( ); iter != t2.structure_end ( ); ++iter ) { CPPUNIT_ASSERT ( iter.getLevel ( ) == std::get < 0 > ( * ref2 ) ); CPPUNIT_ASSERT ( * iter == std::get < 1 > ( * ref2 ) ); CPPUNIT_ASSERT ( iter.getVirtual ( ) == std::get < 2 > ( * ref2 ) ); @@ -96,7 +87,7 @@ void ForwardTreeTest::testTreeStdStructure ( ) { std::vector < std::pair < unsigned, char > > expectedPostfix = { { 2, 'b' }, { 1, 'c' }, { 2, 'a' }, { 3, 'a' }, { 3, 'b' }, { 2, 'c' }, { 1, 'a' }, { 1, 'd' }, { 1, 'f' }, { 0, 'c' } }; std::vector < std::pair < unsigned, char > >::const_iterator ref3 = expectedPostfix.begin ( ); - for ( std::tree < char >::const_postfix_iterator iter = t2.postfix_begin ( ); iter != t2.postfix_end ( ); ++iter ) { + for ( std::forward_tree < char >::const_postfix_iterator iter = t2.postfix_begin ( ); iter != t2.postfix_end ( ); ++iter ) { CPPUNIT_ASSERT ( iter.getLevel ( ) == ref3->first ); CPPUNIT_ASSERT ( * iter == ref3->second ); ++iter; @@ -104,36 +95,33 @@ void ForwardTreeTest::testTreeStdStructure ( ) { ++ref3; } - std::tree < char, RankedArityChecker > rt ( 'a', std::tree < char, RankedArityChecker > ( 'b', std::tree < char, RankedArityChecker > ( 'c' ) ), std::tree < char, RankedArityChecker > ( 'c' ) ); + std::forward_tree < char, RankedArityChecker > rt ( 'a', std::forward_tree < char, RankedArityChecker > ( 'b', std::forward_tree < char, RankedArityChecker > ( 'c' ) ), std::forward_tree < char, RankedArityChecker > ( 'c' ) ); CPPUNIT_ASSERT_EQUAL ( ( char ) rt ( 0, 0 ), 'c' ); rt ( 0, 0 ) = 'd'; CPPUNIT_ASSERT_EQUAL ( ( char ) rt ( 0, 0 ), 'd' ); - rt ( 0, 0 ) = std::tree < char, RankedArityChecker > ( 'e' ); + rt ( 0, 0 ) = std::forward_tree < char, RankedArityChecker > ( 'e' ); CPPUNIT_ASSERT_EQUAL ( ( char ) rt ( 0, 0 ), 'e' ); - CPPUNIT_ASSERT ( rt.checkStructure ( ) ); std::cout << rt << std::endl; swap ( rt ( 0 ), rt ( 1 ) ); - CPPUNIT_ASSERT ( rt.checkStructure ( ) ); std::cout << rt << std::endl; std::stringstream ss2; ss2 << rt; CPPUNIT_ASSERT ( ss2.str ( ) == "[0a[1c,1b[2e]]]" ); - std::tree < char, RankedArityChecker > rt2 ( 'c' ); + std::forward_tree < char, RankedArityChecker > rt2 ( 'c' ); swap ( rt, rt2 ); - CPPUNIT_ASSERT ( rt.checkStructure ( ) ); std::cout << rt << std::endl; std::stringstream ss3; ss3 << rt; CPPUNIT_ASSERT ( ss3.str ( ) == "[0c]" ); std::cout << rt2 << std::endl; - std::tree < char > cmp1 ( 'a' ); - std::tree < char > cmp2 ( 'b' ); - std::tree < char > cmp3 ( 'c' ); + std::forward_tree < char > cmp1 ( 'a' ); + std::forward_tree < char > cmp2 ( 'b' ); + std::forward_tree < char > cmp3 ( 'c' ); CPPUNIT_ASSERT ( cmp1 < cmp2 ); CPPUNIT_ASSERT ( cmp2 < cmp3 ); diff --git a/alib2std/test-src/extensions/ForwardTreeTest.h b/alib2std/test-src/extensions/ForwardTreeTest.h index df89514116cb8a3786b2e92ca49a446752ebc168..77a6fdeb6f14a05fd63d105e6cdac1a60ec812b8 100644 --- a/alib2std/test-src/extensions/ForwardTreeTest.h +++ b/alib2std/test-src/extensions/ForwardTreeTest.h @@ -28,7 +28,7 @@ public: }; - void print_tree ( std::tree < char >::const_children_iterator biter, std::tree < char >::const_children_iterator eiter, std::string indent ); + void print_tree ( std::forward_tree < char >::const_children_iterator biter, std::forward_tree < char >::const_children_iterator eiter, std::string indent ); void setUp ( ); void tearDown ( );