#include <iostream>
#include <sstream>
using namespace std;
#include "generator/utility/utility.h"
#include "generator/rule_list/rule_list.h"
#include "generator/rule/terminal_rule.h"
class IDENTIFIER : public Terminal_Rule
{
public:
virtual const bool Check_For_String();
virtual const list<string>& Get_String() const;
virtual const string& Get_Value() const;
protected:
list<string> strings;
string return_value;
};
// ---------------------------------------------------------------------------
const bool IDENTIFIER::Check_For_String()
{
if (!Is_Valid())
return false;
static map<unsigned int, unsigned int> counts;
if (counts.find(m_string_count) != counts.end())
{
if (counts[m_string_count] == 1)
counts.erase(m_string_count);
else
counts[m_string_count]--;
}
m_string_count++;
if (m_string_count > counts.size() + 1)
return false;
counts[m_string_count]++;
stringstream temp_stream;
temp_stream << "id_" << m_string_count;
return_value = temp_stream.str();
strings.clear();
strings.push_back(return_value);
return true;
}
// ---------------------------------------------------------------------------
const list<string>& IDENTIFIER::Get_String() const
{
return strings;
}
// ---------------------------------------------------------------------------
const string& IDENTIFIER::Get_Value() const
{
return return_value;
}
// ---------------------------------------------------------------------------
int main(int argc, char *argv[])
{
list< list< string > > results;
{
Rule_List start;
start.push_back(new IDENTIFIER);
start.push_back(new IDENTIFIER);
start.push_back(new IDENTIFIER);
start.Initialize(3);
while(start.Check_For_String())
{
list<string> temp_strings = start.Get_String();
//cout << Utility::to_string((temp_strings).begin(), (temp_strings).end());
results.push_back( temp_strings );
}
}
bool error = false;
list< list< string > > expected_results;
{
list<string> temp_string_list;
temp_string_list.push_back("id_1");
temp_string_list.push_back("id_1");
temp_string_list.push_back("id_1");
expected_results.push_back(temp_string_list);
}
{
list<string> temp_string_list;
temp_string_list.push_back("id_1");
temp_string_list.push_back("id_1");
temp_string_list.push_back("id_2");
expected_results.push_back(temp_string_list);
}
{
list<string> temp_string_list;
temp_string_list.push_back("id_1");
temp_string_list.push_back("id_2");
temp_string_list.push_back("id_1");
expected_results.push_back(temp_string_list);
}
{
list<string> temp_string_list;
temp_string_list.push_back("id_1");
temp_string_list.push_back("id_2");
temp_string_list.push_back("id_2");
expected_results.push_back(temp_string_list);
}
{
list<string> temp_string_list;
temp_string_list.push_back("id_1");
temp_string_list.push_back("id_2");
temp_string_list.push_back("id_3");
expected_results.push_back(temp_string_list);
}
if(results != expected_results)
{
cout << "Lists do not match" << endl;
{
cout << endl << "Expected:" << endl;
list< list<string> >::const_iterator a_list;
for(a_list = expected_results.begin();
a_list != expected_results.end();
a_list++)
{
cout << Utility::to_string((*a_list).begin(), (*a_list).end());
}
}
{
cout << endl << "Actual:" << endl;
list< list<string> >::const_iterator a_list;
for(a_list = results.begin();
a_list != results.end();
a_list++)
{
cout << Utility::to_string((*a_list).begin(), (*a_list).end());
}
}
error = true;
}
else
{
cout << "Lists match" << endl;
}
if (error)
return 1;
else
return 0;
}