On Wed, 24 Feb 2010 09:25:55 -0600, "Hartmut Kaiser"
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
#include
#include
#include
#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
{
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 point;
km::rule contour;
km::rule polygon;
km::rule 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 osbi;
km::generate(osbi(std::wcout), ZoneWriter<osbi>(), poly);
std::wcout << L'\n';
}