#ifndef RULE_LIST_H #define RULE_LIST_H #include #include #include #include #include #include #ifndef DISABLE_ALLOCATION_CACHING_OPTIMIZATION #include "generator/allocations/allocations_cache.h" #endif // DISABLE_ALLOCATION_CACHING_OPTIMIZATION using namespace std; #include "generator/utility/utility.h" class Rule; class Rule_List : public vector { friend class Nonterminal_Rule; #ifdef SHORT_RULE_TRACE friend string Utility::to_string( const Rule_List &in_rule_list, const bool &in_show_lengths); #endif // SHORT_RULE_TRACE public: Rule_List(); virtual ~Rule_List(); virtual void Initialize(const unsigned int in_allowed_length, const Rule *in_previous_rule = NULL); virtual void Reset_String(); virtual void Invalidate(); virtual const bool Is_Valid(); virtual const bool Check_For_String(); virtual const list& Get_String(); #ifndef DISABLE_ALLOCATION_CACHING_OPTIMIZATION virtual const unsigned int Get_Allowed_Length() const; virtual const vector< unsigned int > Get_Allocations() const; #endif // DISABLE_ALLOCATION_CACHING_OPTIMIZATION virtual void Set_Allocations(const vector< unsigned int > &in_allocations); friend ostream& operator<< (ostream& in_ostream, const Rule_List& in_rule_list); friend void Utility::yyerror(); private: Rule_List(const Rule_List &in_rule_list); protected: virtual const bool Check_For_String_Without_Incrementing( const iterator in_start_rule); virtual const bool Check_Action(); virtual const bool Check_For_String_In_Current_Allocation(); virtual const bool Check_For_String_In_Incremented_Allocation(); virtual const bool Find_Next_Valid_Allocation(); virtual const bool Increment_Allocation(); virtual const bool Allocation_Is_Valid(); virtual void Do_Action(); virtual void Undo_Action(); const Rule *m_previous_rule; unsigned int m_allowed_length; bool m_is_valid; bool m_needs_reset; bool m_first_string; bool m_error_occurred; list m_terminals; list strings; #ifndef DISABLE_ALLOCATION_CACHING_OPTIMIZATION static Allocations_Cache m_allocations_cache; list< vector< unsigned int > >::const_iterator m_current_allocations; #endif // DISABLE_ALLOCATION_CACHING_OPTIMIZATION static Rule_List* CURRENTLY_ACTIVE_RULE_LIST; }; #endif // RULE_LIST_H