#include <boost/spirit/include/karma.hpp>
#include <iostream>
#include <string>
#include <vector>
namespace client
{
struct use_as_container
{
struct iterator
{
iterator(use_as_container const* container, int const* current)
: container_(container), current_(current)
{}
use_as_container const* container_;
int const* current_;
};
typedef int type;
use_as_container(int value1, int value2, int value3)
: value1_(value1), value2_(value2), value3_(value3)
{}
int value1_;
std::string dummy1_; int value2_;
std::string dummy2_; int value3_;
};
}
namespace boost { namespace spirit { namespace traits
{
template <>
struct is_container<client::use_as_container const>
: mpl::true_
{};
template <>
struct container_iterator<client::use_as_container const>
{
typedef client::use_as_container::iterator type;
};
template <>
struct begin_container<client::use_as_container const>
{
static client::use_as_container::iterator
call(client::use_as_container const& c)
{
return client::use_as_container::iterator(&c, &c.value1_);
}
};
template <>
struct end_container<client::use_as_container const>
{
static client::use_as_container::iterator
call(client::use_as_container const& c)
{
return client::use_as_container::iterator(&c, (int const*)0);
}
};
}}}
namespace boost { namespace spirit { namespace traits
{
template <>
struct deref_iterator<client::use_as_container::iterator>
{
typedef client::use_as_container::type type;
static type call(client::use_as_container::iterator const& it)
{
return *it.current_;
}
};
template <>
struct next_iterator<client::use_as_container::iterator>
{
static void call(client::use_as_container::iterator& it)
{
if (it.current_ == &it.container_->value1_)
it.current_ = &it.container_->value2_;
else if (it.current_ == &it.container_->value2_)
it.current_ = &it.container_->value3_;
else
it.current_ = 0;
}
};
template <>
struct compare_iterators<client::use_as_container::iterator>
{
static bool call(client::use_as_container::iterator const& it1
, client::use_as_container::iterator const& it2)
{
return it1.current_ == it2.current_ &&
it1.container_ == it2.container_;
}
};
}}}
namespace karma = boost::spirit::karma;
int main()
{
client::use_as_container d2 (1, 2, 3);
std::cout << karma::format(karma::int_ % ", ", d2) << std::endl; return 0;
}