diff --git a/alib2data/src/automaton/FSM/DFA.h b/alib2data/src/automaton/FSM/DFA.h index 42b4869012d89c2b766f45b1a126bce3629d8350..df3dda5ad832a1ba09270e296d7bcb4c09f836b7 100644 --- a/alib2data/src/automaton/FSM/DFA.h +++ b/alib2data/src/automaton/FSM/DFA.h @@ -443,31 +443,13 @@ ext::map < ext::pair < StateType, SymbolType >, StateType > && DFA<SymbolType, S return std::move ( transitions ); } -template < class SymbolType, class StateType > -class Compar { - const StateType & m_data; - -public: - Compar ( const StateType & data ) : m_data ( data ) { - - } - - friend bool operator < ( const Compar & first, const std::pair < StateType, SymbolType > & second ) { - return first.m_data < second.first; - } - - friend bool operator < ( const std::pair < StateType, SymbolType > & first, const Compar & second ) { - return first.first < second.m_data; - } -}; - template<class SymbolType, class StateType > ext::iterator_range < typename ext::map < ext::pair < StateType, SymbolType >, StateType >::const_iterator > DFA<SymbolType, StateType>::getTransitionsFromState ( const StateType & from ) const { if ( !getStates ( ).count ( from ) ) throw AutomatonException ( "State \"" + ext::to_string ( from ) + "\" doesn't exist" ); - auto lower = transitions.lower_bound ( Compar < SymbolType, StateType > ( from ) ); - auto upper = transitions.upper_bound ( Compar < SymbolType, StateType > ( from ) ); + auto lower = transitions.lower_bound ( ext::slice_comp ( from ) ); + auto upper = transitions.upper_bound ( ext::slice_comp ( from ) ); return ext::make_iterator_range ( lower, upper ); } diff --git a/alib2std/src/extensions/functional.hpp b/alib2std/src/extensions/functional.hpp index 84d5283fb29e7d0b398db30b9b1e4943da3789dd..4992b050e24a194266aee17f0c0a836cd12b4e17 100644 --- a/alib2std/src/extensions/functional.hpp +++ b/alib2std/src/extensions/functional.hpp @@ -74,6 +74,40 @@ bool operator < ( const R &, const PolyComp < T > & ) { return std::type_index ( typeid ( R ) ) < std::type_index ( typeid ( T ) ); } +template < class ... Ts > +struct SliceComp { + std::tuple < const Ts & ... > m_data; + + SliceComp ( const Ts & ... data ) : m_data ( data ... ) { + } + + template < class T, size_t ... I > + static bool compare ( const SliceComp < Ts ... > & first, const T & second, std::index_sequence < I ... > ) { + return first.m_data < std::tie ( std::get < I > ( second ) ... ); + } + + template < class T > + friend bool operator < ( const SliceComp < Ts ... > & first, const T & second ) { + return compare < T > ( first, second, std::make_index_sequence < sizeof ... ( Ts ) > { } ); + } + + template < class T, size_t ... I > + static bool compare ( const T & first, const SliceComp < Ts ... > & second, std::index_sequence < I ... > ) { + return std::tie ( std::get < I > ( first ) ... ) < second.m_data; + } + + template < class T > + friend bool operator < ( const T & first, const SliceComp < Ts ... > & second ) { + return compare < T > ( first, second, std::make_index_sequence < sizeof ... ( Ts ) > { } ); + } + +}; + +template < class ... Ts > +SliceComp < Ts ... > slice_comp ( const Ts & ... inst ) { + return SliceComp < Ts ... > ( inst ... ); +} + /** * \brief * Class extending the reference wrapper class from the standard library. Original reason is to allow its use with standard stream aggregation class. diff --git a/alib2std/test-src/extensions/FunctionalTest.cpp b/alib2std/test-src/extensions/FunctionalTest.cpp index f61eed5044e6d722159159f624861518092baa4e..595c4a5ce8ff979733ea690ed74c3fcadcbec3fe 100644 --- a/alib2std/test-src/extensions/FunctionalTest.cpp +++ b/alib2std/test-src/extensions/FunctionalTest.cpp @@ -11,5 +11,10 @@ TEST_CASE ( "Functional Test", "[unit][std][bits]" ) { CHECK_EXCLUSIVE_OR( ( test ( ext::poly_comp ( std::string ( "aa" ) ), 1 ) ), ( test ( ext::poly_comp ( 1 ), std::string ( "aa" ) ) ) ); CHECK ( test ( ext::poly_comp ( 1 ), 2 ) == true ); + + std::pair < int, std::string > value ( 1, "aa" ); + + CHECK ( test ( ext::slice_comp ( 0 ), value ) == true ); + CHECK ( test ( ext::slice_comp ( 1 ), value ) == false ); } }