
On Wed, 24 Feb 2010 09:25:55 -0600, "Hartmut Kaiser" <hartmut.kaiser@gmail.com> wrote:
Sebastian,
I've got a Karma generator that should emit a vector of records, writing out the index of every entry at the start. My code looks like this (note that GEOPOINT is a fusion-adapted struct of two doubles):
Could you please provide a minimal, but still self-contained example I could run? That would help me to give you a proper answer to your question. From what I can see your code should work just fine.
This is the test program I'm using, minus a special float formatter. #include <boost/fusion/include/adapt_struct.hpp> #include <boost/fusion/include/vector.hpp> #include <boost/spirit/include/karma.hpp> #include <boost/spirit/include/phoenix.hpp> #include <iostream> #include <vector> namespace ph = boost::phoenix; namespace km = boost::spirit::karma; struct GEOPOINT { double x, y; }; BOOST_FUSION_ADAPT_STRUCT( GEOPOINT, (double, x) (double, y) ) typedef std::vector<GEOPOINT> Contour; typedef std::vector<Contour> Poly; template <typename Iterator> class ZoneWriter : public km::grammar<Iterator, Poly()> { public: ZoneWriter() : base_type(start) { using namespace km; point = L';' << double_ << L';' << double_; contour = L";SUBPOLYGON " << lit(_r1 - 1) << L" POINTS " << lit(ph::size(_val)) << L" MASK XOR" << *point; polygon = L"POLYGON COUNT " << lit(ph::size(_val)) << *(contour(_a)[++_a]); start = polygon; } private: km::rule<Iterator, GEOPOINT()> point; km::rule<Iterator, Contour(int)> contour; km::rule<Iterator, km::locals<int>, Poly()> polygon; km::rule<Iterator, Poly()> start; }; int main() { Poly poly(5); for(int i = 0; i < 5; ++i) { Contour &c = poly[i]; c.resize(10); for(int j = 0; j < 10; ++j) { c[j].x = i + j / 4.25129; c[j].y = -j + i / 1.24951; } } typedef std::ostreambuf_iterator<wchar_t> osbi; km::generate(osbi(std::wcout), ZoneWriter<osbi>(), poly); std::wcout << L'\n'; }