#include <iostream>
#include <iterator>
#include <type_traits>
#include <tuple>
#include <vector>
#include <string>
#include <algorithm>

std::vector<std::string> tokenizeLine(const std::string str)
{
    std::vector<std::string> tokens;

    std::string::size_type start = 0;
    std::string::size_type end   = 0;
    while (end != std::string::npos)
    {
        enum POSES // Deliminators
        {
            EQUALS,
            OPEN,
            CLOSE,
            SPACE,
            EOL,
            RETURN,
            TAB,
            COMMENT,
            POSES_SIZE
        };
        std::string::size_type pos[] =
        {
            str.find('=', start),
            str.find('{', start),
            str.find('}', start),
            str.find(' ', start),
            str.find('\n', start),
            str.find('\r', start),
            str.find('\t', start),
            str.find('#', start)
        };
        end = *std::min_element(pos, &pos[POSES_SIZE]);

        switch (str[start])
        {
        case('=') :
            tokens.push_back("=");
            break;
        case('{') :
            tokens.push_back("{");
            break;
        case('}') :
            tokens.push_back("}");
            break;
        case(' ') :
        case('\n') :
        case('\r') :
        case('\t'):
            break;
        case('#') :
            return tokens;
            break;
        default:
			if (str.substr(start, end - start).length() > 0)
			{
				tokens.push_back(str.substr(start, end - start));
				--end;
			}
        }

        // If at end, use start=maxSize.  Else use start=end+delimiter.
        start = ((end > (std::string::npos - sizeof(char)))
            ? std::string::npos : end + sizeof(char));
    }
    return tokens;
}

int main()
{
	auto ans = tokenizeLine("show_position = { x=-9 y =78 }");
	std::ostream_iterator<std::string> o(std::cout, "\n");
	std::copy(ans.begin(), ans.end(), o);
	return 0;
}