#include #include #include #include #include #include namespace karma = boost::spirit::karma; typedef char byte; typedef std::back_insert_iterator Iterator; typedef unsigned int size_type; typedef signed int integer; int main (int argc, char *argv[]) { size_type size_; karma::rule< Iterator, std::vector () > pascal_string_; karma::rule< Iterator, size_type () > pascal_string_size_; karma::rule< Iterator, void (size_type) > pascal_string_padding_; namespace ascii = karma::ascii; using boost::phoenix::ref; using boost::phoenix::size; using karma::_val; using karma::_1; using karma::_r1; pascal_string_ %= pascal_string_size_[ _1 = size (_val) ] << *karma::byte_ << pascal_string_padding_(size (_val)) ; pascal_string_size_ %= karma::eps (_val <= 0xFFF) // guard clause << karma::byte_('h') << ascii::upper [ karma::right_align (3, '0') [ karma::int_generator< integer, 16 > () ] ] ; pascal_string_padding_ %= karma::repeat (3 - (_r1 + 3) % 4) [ karma::byte_(0) ] ; std::vector v; v.push_back ('1'); v.push_back ('2'); v.push_back ('3'); std::string s; bool r = karma::generate (std::back_inserter (s), pascal_string_, v); std::cout << "'" << s << "'" << std::endl; // expecting 'h003123}