#include <boost/spirit/include/qi.hpp>
#include <boost/fusion/include/define_struct.hpp>
#include <string>
namespace yak { namespace spirit {
// Dummy type for csv separator
// Using to make use of original meta_create_sequence implementation
struct csv_separator {};
namespace detail {
// extracted from boost/spirit/home/support/auto/meta_create.hpp (v1.46)
template <typename T>
struct is_fusion_sequence_but_not_proto_expr
: boost::mpl::and_<
boost::fusion::traits::is_sequence<T>
, boost::mpl::not_<boost::proto::is_expr<T> > >
{};
}
}}
namespace boost { namespace spirit { namespace traits {
// deep_copy may be unnecessary...
// specialization for csv_separator
template<>
struct create_parser<yak::spirit::csv_separator>
{
typedef proto::result_of::deep_copy<
BOOST_TYPEOF(qi::lit(','))
>::type type;
static type call()
{
return proto::deep_copy(qi::lit(','));
}
};
// specialization for std::string
template<>
struct create_parser<std::string>
{
typedef proto::result_of::deep_copy<
BOOST_TYPEOF(*(qi::char_ - qi::lit(',')))
>::type type;
static type call()
{
return proto::deep_copy(*(qi::char_ - qi::lit(',')));
}
};
// specialization for Fusion Sequence
// meta_create_sequence with slight modification
template <typename Sequence>
struct create_parser<Sequence, typename boost::enable_if<
yak::spirit::detail::is_fusion_sequence_but_not_proto_expr<Sequence>
>::type>
{
// create a mpl sequence from the given fusion sequence
typedef typename mpl::fold<
typename fusion::result_of::as_vector<Sequence>::type
, mpl::vector<>, mpl::push_back<mpl::push_back<mpl::_1, mpl::_2>, yak::spirit::csv_separator>
>::type sequence_type_;
typedef typename mpl::if_<mpl::empty<sequence_type_>, sequence_type_, typename mpl::pop_back<sequence_type_>::type>::type sequence_type;
typedef make_nary_proto_expr<
sequence_type, proto::tag::shift_right, qi::domain
> make_proto_expr;
typedef typename make_proto_expr::type type;
static type call()
{
return make_proto_expr::call();
}
};
}}}
// BOOST_FUSION_DEFINE_STRUCT has the same effect as struct definition and BOOST_FUSION_ADAPT_STRUCT.
BOOST_FUSION_DEFINE_STRUCT(
(), // places global namespace
data,
(std::string, namae)
(int, wanryoku)
(int, kiyosa)
(int, subayasa)
(int, tairyoku)
(int, maryoku)
(int, seishin)
(int, miryoku)
)
BOOST_FUSION_DEFINE_STRUCT(
(), // places global namespace
data2,
(std::string, namae)
(std::string, namae2)
(int, wanryoku)
(int, kiyosa)
(int, subayasa)
(int, tairyoku)
(int, maryoku)
(int, seishin)
(int, miryoku)
)
template<typename Attr>
void test_parse(const std::string &s, Attr &attr)
{
namespace qi = boost::spirit::qi;
typedef std::string::const_iterator Iterator;
Iterator first = s.begin(), last = s.end();
qi::phrase_parse(first, last, qi::auto_, qi::space, attr);
boost::fusion::out(std::cout, attr); // output as fusion sequence
std::cout << std::endl;
}
int main()
{
data d;
test_parse("Name1, 21, 12, 20, 17, 15, 19, 20", d);
data2 d2;
test_parse("Name1, Name2, 21, 12, 20, 17, 15, 19, 20", d2);
return 0;
}
I2luY2x1ZGUgPGJvb3N0L3NwaXJpdC9pbmNsdWRlL3FpLmhwcD4KI2luY2x1ZGUgPGJvb3N0L2Z1c2lvbi9pbmNsdWRlL2RlZmluZV9zdHJ1Y3QuaHBwPgoKI2luY2x1ZGUgPHN0cmluZz4KCm5hbWVzcGFjZSB5YWsgeyBuYW1lc3BhY2Ugc3Bpcml0IHsKCgkvLyBEdW1teSB0eXBlIGZvciBjc3Ygc2VwYXJhdG9yCgkvLyBVc2luZyB0byBtYWtlIHVzZSBvZiBvcmlnaW5hbCBtZXRhX2NyZWF0ZV9zZXF1ZW5jZSBpbXBsZW1lbnRhdGlvbgoJc3RydWN0IGNzdl9zZXBhcmF0b3Ige307CgoJbmFtZXNwYWNlIGRldGFpbCB7CgoJCS8vIGV4dHJhY3RlZCBmcm9tIGJvb3N0L3NwaXJpdC9ob21lL3N1cHBvcnQvYXV0by9tZXRhX2NyZWF0ZS5ocHAgKHYxLjQ2KQoJCXRlbXBsYXRlIDx0eXBlbmFtZSBUPgoJCXN0cnVjdCBpc19mdXNpb25fc2VxdWVuY2VfYnV0X25vdF9wcm90b19leHByCgkJICA6IGJvb3N0OjptcGw6OmFuZF88CgkJCQlib29zdDo6ZnVzaW9uOjp0cmFpdHM6OmlzX3NlcXVlbmNlPFQ+CgkJCSAgLCBib29zdDo6bXBsOjpub3RfPGJvb3N0Ojpwcm90bzo6aXNfZXhwcjxUPiA+ID4KCQl7fTsKCX0KCn19CgpuYW1lc3BhY2UgYm9vc3QgeyBuYW1lc3BhY2Ugc3Bpcml0IHsgbmFtZXNwYWNlIHRyYWl0cyB7CgoJLy8gZGVlcF9jb3B5IG1heSBiZSB1bm5lY2Vzc2FyeS4uLgoKCS8vIHNwZWNpYWxpemF0aW9uIGZvciBjc3Zfc2VwYXJhdG9yCgl0ZW1wbGF0ZTw+CglzdHJ1Y3QgY3JlYXRlX3BhcnNlcjx5YWs6OnNwaXJpdDo6Y3N2X3NlcGFyYXRvcj4KCXsKCQl0eXBlZGVmIHByb3RvOjpyZXN1bHRfb2Y6OmRlZXBfY29weTwKCQkJQk9PU1RfVFlQRU9GKHFpOjpsaXQoJywnKSkKCQk+Ojp0eXBlIHR5cGU7CgoJCXN0YXRpYyB0eXBlIGNhbGwoKQoJCXsKCQkJcmV0dXJuIHByb3RvOjpkZWVwX2NvcHkocWk6OmxpdCgnLCcpKTsKCQl9Cgl9OwoKCS8vIHNwZWNpYWxpemF0aW9uIGZvciBzdGQ6OnN0cmluZwoJdGVtcGxhdGU8PgoJc3RydWN0IGNyZWF0ZV9wYXJzZXI8c3RkOjpzdHJpbmc+Cgl7CgkJdHlwZWRlZiBwcm90bzo6cmVzdWx0X29mOjpkZWVwX2NvcHk8CgkJCUJPT1NUX1RZUEVPRigqKHFpOjpjaGFyXyAtIHFpOjpsaXQoJywnKSkpCgkJPjo6dHlwZSB0eXBlOwoKCQlzdGF0aWMgdHlwZSBjYWxsKCkKCQl7CgkJCXJldHVybiBwcm90bzo6ZGVlcF9jb3B5KCoocWk6OmNoYXJfIC0gcWk6OmxpdCgnLCcpKSk7CgkJfQoJfTsKCgkvLyBzcGVjaWFsaXphdGlvbiBmb3IgRnVzaW9uIFNlcXVlbmNlCgkvLyBtZXRhX2NyZWF0ZV9zZXF1ZW5jZSB3aXRoIHNsaWdodCBtb2RpZmljYXRpb24KCXRlbXBsYXRlIDx0eXBlbmFtZSBTZXF1ZW5jZT4KCXN0cnVjdCBjcmVhdGVfcGFyc2VyPFNlcXVlbmNlLCB0eXBlbmFtZSBib29zdDo6ZW5hYmxlX2lmPAoJCQkJeWFrOjpzcGlyaXQ6OmRldGFpbDo6aXNfZnVzaW9uX3NlcXVlbmNlX2J1dF9ub3RfcHJvdG9fZXhwcjxTZXF1ZW5jZT4gCgkJCT46OnR5cGU+Cgl7CgoJCS8vIGNyZWF0ZSBhIG1wbCBzZXF1ZW5jZSBmcm9tIHRoZSBnaXZlbiBmdXNpb24gc2VxdWVuY2UKCQl0eXBlZGVmIHR5cGVuYW1lIG1wbDo6Zm9sZDwKCQkJdHlwZW5hbWUgZnVzaW9uOjpyZXN1bHRfb2Y6OmFzX3ZlY3RvcjxTZXF1ZW5jZT46OnR5cGUKCQkgICwgbXBsOjp2ZWN0b3I8PiwgbXBsOjpwdXNoX2JhY2s8bXBsOjpwdXNoX2JhY2s8bXBsOjpfMSwgbXBsOjpfMj4sIHlhazo6c3Bpcml0Ojpjc3Zfc2VwYXJhdG9yPgoJCT46OnR5cGUgc2VxdWVuY2VfdHlwZV87CgkJdHlwZWRlZiB0eXBlbmFtZSBtcGw6OmlmXzxtcGw6OmVtcHR5PHNlcXVlbmNlX3R5cGVfPiwgc2VxdWVuY2VfdHlwZV8sIHR5cGVuYW1lIG1wbDo6cG9wX2JhY2s8c2VxdWVuY2VfdHlwZV8+Ojp0eXBlPjo6dHlwZSBzZXF1ZW5jZV90eXBlOwoKCQl0eXBlZGVmIG1ha2VfbmFyeV9wcm90b19leHByPAoJCQlzZXF1ZW5jZV90eXBlLCBwcm90bzo6dGFnOjpzaGlmdF9yaWdodCwgcWk6OmRvbWFpbgoJCT4gbWFrZV9wcm90b19leHByOwoKCQl0eXBlZGVmIHR5cGVuYW1lIG1ha2VfcHJvdG9fZXhwcjo6dHlwZSB0eXBlOwoKCQlzdGF0aWMgdHlwZSBjYWxsKCkKCQl7CgkJCXJldHVybiBtYWtlX3Byb3RvX2V4cHI6OmNhbGwoKTsKCQl9Cgl9OwoKCn19fQoKLy8gQk9PU1RfRlVTSU9OX0RFRklORV9TVFJVQ1QgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyBzdHJ1Y3QgZGVmaW5pdGlvbiBhbmQgQk9PU1RfRlVTSU9OX0FEQVBUX1NUUlVDVC4KQk9PU1RfRlVTSU9OX0RFRklORV9TVFJVQ1QoCgkoKSwgLy8gcGxhY2VzIGdsb2JhbCBuYW1lc3BhY2UKCWRhdGEsCgkoc3RkOjpzdHJpbmcsIG5hbWFlKQoJKGludCwgd2Fucnlva3UpCgkoaW50LCBraXlvc2EpCgkoaW50LCBzdWJheWFzYSkKCShpbnQsIHRhaXJ5b2t1KQoJKGludCwgbWFyeW9rdSkKCShpbnQsIHNlaXNoaW4pCgkoaW50LCBtaXJ5b2t1KQopCgpCT09TVF9GVVNJT05fREVGSU5FX1NUUlVDVCgKCSgpLCAvLyBwbGFjZXMgZ2xvYmFsIG5hbWVzcGFjZQoJZGF0YTIsCgkoc3RkOjpzdHJpbmcsIG5hbWFlKQoJKHN0ZDo6c3RyaW5nLCBuYW1hZTIpCgkoaW50LCB3YW5yeW9rdSkKCShpbnQsIGtpeW9zYSkKCShpbnQsIHN1YmF5YXNhKQoJKGludCwgdGFpcnlva3UpCgkoaW50LCBtYXJ5b2t1KQoJKGludCwgc2Vpc2hpbikKCShpbnQsIG1pcnlva3UpCikKCnRlbXBsYXRlPHR5cGVuYW1lIEF0dHI+CnZvaWQgdGVzdF9wYXJzZShjb25zdCBzdGQ6OnN0cmluZyAmcywgQXR0ciAmYXR0cikKewoJbmFtZXNwYWNlIHFpID0gYm9vc3Q6OnNwaXJpdDo6cWk7CgoJdHlwZWRlZiBzdGQ6OnN0cmluZzo6Y29uc3RfaXRlcmF0b3IgSXRlcmF0b3I7CglJdGVyYXRvciBmaXJzdCA9IHMuYmVnaW4oKSwgbGFzdCA9IHMuZW5kKCk7CgoJcWk6OnBocmFzZV9wYXJzZShmaXJzdCwgbGFzdCwgcWk6OmF1dG9fLCBxaTo6c3BhY2UsIGF0dHIpOwoJYm9vc3Q6OmZ1c2lvbjo6b3V0KHN0ZDo6Y291dCwgYXR0cik7IC8vIG91dHB1dCBhcyBmdXNpb24gc2VxdWVuY2UKCXN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7Cn0KCmludCBtYWluKCkKewoJZGF0YSBkOwoJdGVzdF9wYXJzZSgiTmFtZTEsIDIxLCAxMiwgMjAsIDE3LCAxNSwgMTksIDIwIiwgZCk7CgoJZGF0YTIgZDI7Cgl0ZXN0X3BhcnNlKCJOYW1lMSwgTmFtZTIsIDIxLCAxMiwgMjAsIDE3LCAxNSwgMTksIDIwIiwgZDIpOwoKCXJldHVybiAwOwp9