/*
 * Author: ProgramCpp
 */
#include <iostream>
#include <string>

class CTokenize
{
	std::string string, delimiters;
	public:
	CTokenize(std::string s, std::string delim) : string(s), delimiters (delim) {}

	std::string GetNextToken()
	{
 		// Skip delimiters at beginning.
		 std::string::size_type lastPos = string.find_first_not_of(delimiters, 0);
    	// Find first "non-delimiter".
    	 std::string::size_type pos = string.find_first_of(delimiters, lastPos);

    	if (std::string::npos != pos || std::string::npos != lastPos)
    	{
			std::string token = string.substr(lastPos, pos - lastPos);
			string.erase (lastPos, pos - lastPos);
			return token;
		}
		 return "";
	}

	bool HaveMoreTokens()
	{
	
		return !string.empty();
	}

};

int main(void) {
	// your code goes here

   std::string str("This - should also - tokenized");
   std::string str2("demo string _ be _ and printed.");

   CTokenize tokens(str, std::string("-"));
   CTokenize tokens2(str2, std::string("_"));
   
   /* walk through the tokens */
   while( tokens.HaveMoreTokens() || tokens2.HaveMoreTokens()) 
   {    
     	if(tokens.HaveMoreTokens())
		{
			std::cout << tokens.GetNextToken() <<std::endl;
		}

	 	if(tokens2.HaveMoreTokens())
		{
		  	std::cout << tokens2.GetNextToken() <<std::endl;
		}
   }
  
   return 0;
}