I am using boost/polygon to do unions of multiple polygons, and I lose holes that were in the input after the assign() operation. Here is code that demonstrates the issue:
// Create outer contour
Point outer[] = {gtl::construct<Point>(0, 0),
gtl::construct<Point>(0, 10),
gtl::construct<Point>(10, 10),
gtl::construct<Point>(10, 0)};
// Create inner contour
Point inner[] = {gtl::construct<Point>(2, 2),
gtl::construct<Point>(8, 2),
gtl::construct<Point>(8, 8),
gtl::construct<Point>(2, 8)};
// Define inner contour as a polygon
polygon_with_holes_data<long> input_poly_inner;
gtl::set_points(input_poly_inner, inner, inner+4);
// Put inner polygon in a list
vector<polygon_with_holes_data<long> > inners;
inners.push_back(input_poly_inner);
// Create input polygon as outer contour + inner polygon list
polygon_with_holes_data<long> input_poly;
gtl::set_points(input_poly, outer, outer+4);
gtl::set_holes(input_poly, inners.begin(), inners.end());
// Create input polygon set, insert input polygon
polygon_set_data<long> input_poly_set;
input_poly_set.insert(input_poly);
// Create output polygon set, assign input polygon set
vector<polygon_with_holes_data<long> > output_poly_set;
assign(output_poly_set, input_poly_set);
// Print result
std::cout << output_poly_set.size() << " polys" << std::endl;
std::cout << output_poly_set[0].size_holes() << " holes" << std::endl;