Skip to content

Commit

Permalink
Syntax improvment
Browse files Browse the repository at this point in the history
  • Loading branch information
ggrzeczkowicz committed Sep 21, 2023
1 parent e9f7fb5 commit 0d9a472
Show file tree
Hide file tree
Showing 9 changed files with 60 additions and 70 deletions.
31 changes: 13 additions & 18 deletions bridge.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ std::set<pathLink> link_paths(const Surface_mesh &mesh, const std::vector<std::l
for (int selected_label: {3, 8, 9}) {
// List path with selected label
std::list<int> same_label_paths;
for (int i = 0; i < paths.size(); i++) {
for (std::size_t i = 0; i < paths.size(); i++) {
if (label[paths[i].front()] == selected_label && medial_axes.count(i) == 1) {
same_label_paths.push_back(i);
}
Expand Down Expand Up @@ -874,7 +874,6 @@ pathBridge bridge (pathLink link, const Surface_mesh &mesh, const AABB_tree &tre
float dlN = sqrt(CGAL::squared_distance(link.second.point, left2_border.second));
float drN = sqrt(CGAL::squared_distance(link.second.point, right2_border.second));

int N = int(sqrt(link_vector.squared_length ()));
pathBridge bridge(link);
for (int i = 0; i <= bridge.N; i++) {
bridge.xl[i] = dl0 + ((float) i)/bridge.N*(dlN-dl0);
Expand Down Expand Up @@ -1179,8 +1178,8 @@ pathBridge bridge (pathLink link, const Surface_mesh &mesh, const AABB_tree &tre
{ // Surface

Surface_mesh bridge_mesh;
Surface_mesh::Vertex_index Xl[bridge.N+1];
Surface_mesh::Vertex_index Xr[bridge.N+1];
std::vector<Surface_mesh::Vertex_index> Xl(bridge.N+1);
std::vector<Surface_mesh::Vertex_index> Xr(bridge.N+1);

// Add points
for (int i = 0; i <= bridge.N; i++) {
Expand Down Expand Up @@ -1270,9 +1269,6 @@ void close_surface_mesh(Surface_mesh &mesh) {
}
min_h -= 50;

float min_x;
float min_y;

std::vector<Surface_mesh::Halfedge_index> borders_edge;
CGAL::Polygon_mesh_processing::extract_boundary_cycles (mesh, std::back_inserter(borders_edge));
assert(borders_edge.size() == 1);
Expand Down Expand Up @@ -1430,10 +1426,10 @@ Surface_mesh compute_remove_mesh(const pathBridge &bridge, const Surface_mesh_in
auto n = l.perpendicular(CGAL::COUNTERCLOCKWISE);

Surface_mesh bridge_mesh;
Surface_mesh::Vertex_index Xlb[bridge.N+1]; // X left bottom
Surface_mesh::Vertex_index Xrb[bridge.N+1]; // X right bottom
Surface_mesh::Vertex_index Xlt[bridge.N+1]; // X left top
Surface_mesh::Vertex_index Xrt[bridge.N+1]; // X right top
std::vector<Surface_mesh::Vertex_index> Xlb(bridge.N+1); // X left bottom
std::vector<Surface_mesh::Vertex_index> Xrb(bridge.N+1); // X right bottom
std::vector<Surface_mesh::Vertex_index> Xlt(bridge.N+1); // X left top
std::vector<Surface_mesh::Vertex_index> Xrt(bridge.N+1); // X right top

// Add points
for (int i = 0; i <= bridge.N; i++) {
Expand Down Expand Up @@ -1505,10 +1501,10 @@ Surface_mesh compute_support_mesh(const pathBridge &bridge, const Surface_mesh_i
auto n = l.perpendicular(CGAL::COUNTERCLOCKWISE);

Surface_mesh bridge_mesh;
Surface_mesh::Vertex_index Xlb[bridge.N+1]; // X left bottom
Surface_mesh::Vertex_index Xrb[bridge.N+1]; // X right bottom
Surface_mesh::Vertex_index Xlt[bridge.N+1]; // X left top
Surface_mesh::Vertex_index Xrt[bridge.N+1]; // X right top
std::vector<Surface_mesh::Vertex_index> Xlb(bridge.N+1); // X left bottom
std::vector<Surface_mesh::Vertex_index> Xrb(bridge.N+1); // X right bottom
std::vector<Surface_mesh::Vertex_index> Xlt(bridge.N+1); // X left top
std::vector<Surface_mesh::Vertex_index> Xrt(bridge.N+1); // X right top

// Add points
for (int i = 0; i <= bridge.N; i++) {
Expand Down Expand Up @@ -1583,7 +1579,7 @@ struct Extrudor {
assert(has_exact_points);
}

void operator()(const Surface_mesh::Vertex_index &vin, const Surface_mesh::Vertex_index &vout) const {
void operator()(const Surface_mesh::Vertex_index&, const Surface_mesh::Vertex_index &vout) const {
if (top) {
exact_point[vout] += CGAL::Exact_predicates_exact_constructions_kernel::Vector_3(0, 0, tunnel_height);
} else { // bottom
Expand Down Expand Up @@ -1617,7 +1613,6 @@ Surface_mesh compute_crossing_mesh(Surface_mesh mesh, const pathBridge &bridge,
// Compute crossing border

// Exact points
CGAL::Cartesian_converter<Surface_mesh::Point::R, CGAL::Exact_predicates_exact_constructions_kernel> to_exact;
Surface_mesh::Property_map<Surface_mesh::Vertex_index, CGAL::Exact_predicates_exact_constructions_kernel::Point_3> exact_points;
bool created_point;

Expand All @@ -1641,7 +1636,7 @@ Surface_mesh compute_crossing_mesh(Surface_mesh mesh, const pathBridge &bridge,
return crossing_mesh;
}

void add_bridge_to_mesh(Surface_mesh &mesh, const std::vector<pathBridge> &bridges, const std::map<int, CGAL::Polygon_with_holes_2<Exact_predicates_kernel>> &path_polygon, const Surface_mesh_info &mesh_info) {
void add_bridge_to_mesh(Surface_mesh &mesh, const std::vector<pathBridge> &bridges, const std::map<int, CGAL::Polygon_with_holes_2<Exact_predicates_kernel>> &/*path_polygon*/, const Surface_mesh_info &mesh_info) {

// Label
Surface_mesh::Property_map<Surface_mesh::Face_index, unsigned char> label;
Expand Down
14 changes: 5 additions & 9 deletions code.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,10 +66,8 @@ void add_label(const Raster &raster, Surface_mesh &mesh) {
CGAL::Vertex_around_face_iterator<Surface_mesh> vbegin, vend;
boost::tie(vbegin, vend) = vertices_around_face(mesh.halfedge(face), mesh);
for (auto pixel : raster.triangle_to_pixel(mesh.point(*(vbegin++)), mesh.point(*(vbegin++)), mesh.point(*(vbegin++)))) {
if (raster.land_cover[pixel.second][pixel.first] > -1) {
sum_face_label++;
face_label[raster.land_cover[pixel.second][pixel.first]]++;
}
sum_face_label++;
face_label[raster.land_cover[pixel.second][pixel.first]]++;
}

auto argmax = std::max_element(face_label, face_label+LABELS.size());
Expand All @@ -83,7 +81,7 @@ void change_vertical_faces(Surface_mesh &mesh, const Raster &raster) {
boost::tie(label, has_label) = mesh.property_map<Surface_mesh::Face_index, unsigned char>("label");
assert(has_label);

std::unordered_map<Surface_mesh::Face_index, char> new_label;
std::unordered_map<Surface_mesh::Face_index, unsigned char> new_label;
std::list<Surface_mesh::Face_index> remove_face;

for (auto face : mesh.faces()) {
Expand Down Expand Up @@ -128,10 +126,8 @@ void change_vertical_faces(Surface_mesh &mesh, const Raster &raster) {
CGAL::Vertex_around_face_iterator<Surface_mesh> vbegin, vend;
boost::tie(vbegin, vend) = vertices_around_face(mesh.halfedge(face), mesh);
for (auto pixel : raster.triangle_to_pixel(mesh.point(*(vbegin++)), mesh.point(*(vbegin++)), mesh.point(*(vbegin++)))) {
if (raster.land_cover[pixel.second][pixel.first] > -1) {
sum_face_label++;
face_label[raster.land_cover[pixel.second][pixel.first]]++;
}
sum_face_label++;
face_label[raster.land_cover[pixel.second][pixel.first]]++;
}

if (face_label[4] > 0) {
Expand Down
16 changes: 7 additions & 9 deletions edge_collapse.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,12 @@ float single_face_cost(const Raster &raster, const Point_3 &p0, const Point_3 &p
int face_label[LABELS.size()] = {0};
int sum_face_label = 0;
for (auto pixel : pixels) {
if (raster.land_cover[pixel.second][pixel.first] > -1) {
sum_face_label++;
face_label[raster.land_cover[pixel.second][pixel.first]]++;
}
sum_face_label++;
face_label[raster.land_cover[pixel.second][pixel.first]]++;
}
float entropy = 0;
if (sum_face_label > 0) {
for (int i = 0; i < LABELS.size(); i++) {
for (std::size_t i = 0; i < LABELS.size(); i++) {
if (face_label[i] > 0) {
entropy += ((float) face_label[i])*log((float) face_label[i]);
}
Expand Down Expand Up @@ -170,15 +168,15 @@ class Custom_placement {
Point_3 p[5] = {profile.p0(), profile.p0() + 0.25 * vector, profile.p0() + 0.5 * vector, profile.p0() + 0.75 * vector, profile.p1()};
float cost[5] = {0};

/*for (int j = 0; j < 5; j++) {
/*for (unsigned char j = 0; j < 5; j++) {
p[j] = best_point(raster, p[j].x(), p[j].y(), profile);
}*/

for (auto he : CGAL::halfedges_around_source(profile.v0(), profile.surface_mesh())) {
if (he != profile.v0_v1() && he != profile.v0_vR()) {
Point_3 A = get(profile.vertex_point_map(),CGAL::target(he, profile.surface_mesh()));
Point_3 B = get(profile.vertex_point_map(),CGAL::target(CGAL::next(he, profile.surface_mesh()), profile.surface_mesh()));
for (int j = 0; j < 5; j++) {
for (unsigned char j = 0; j < 5; j++) {
cost[j] += face_cost(raster, A, B, p[j]);
}
}
Expand All @@ -187,13 +185,13 @@ class Custom_placement {
if (he != profile.v1_v0() && he != profile.v1_vL()) {
Point_3 A = get(profile.vertex_point_map(),CGAL::target(he, profile.surface_mesh()));
Point_3 B = get(profile.vertex_point_map(),CGAL::target(CGAL::next(he, profile.surface_mesh()), profile.surface_mesh()));
for (int j = 0; j < 5; j++) {
for (unsigned char j = 0; j < 5; j++) {
cost[j] += face_cost(raster, A, B, p[j]);
}
}
}

for (int i = 0; i < 2; i++) {
for (unsigned char i = 0; i < 2; i++) {
int min_cost = std::min_element(cost, cost + 5) - cost;

if (min_cost == 0 || min_cost == 1) {
Expand Down
46 changes: 23 additions & 23 deletions edge_collapse2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,7 @@ std::list<std::pair <K::Vector_3, K::FT>> label_preservation (const SMS::Edge_pr
}

int count_diff_label = 0;
for (int i = 0; i < LABELS.size(); i++) {
for (std::size_t i = 0; i < LABELS.size(); i++) {
if (count_collapse_label[i] > 0) count_diff_label++;
}

Expand All @@ -179,7 +179,7 @@ std::list<std::pair <K::Vector_3, K::FT>> label_preservation (const SMS::Edge_pr

unsigned char label1, label2;
bool first = true;
for (int i = 0; i < LABELS.size(); i++) {
for (std::size_t i = 0; i < LABELS.size(); i++) {
if (count_collapse_label[i] > 0) {
if (first) {
label1 = i;
Expand Down Expand Up @@ -233,10 +233,10 @@ std::list<std::pair <K::Vector_3, K::FT>> label_preservation (const SMS::Edge_pr
Exact_predicates_kernel::FT c = 1;

Program qp (CGAL::EQUAL, true, 0, true, c);
for (int i = 0; i < points_for_svm.size(); i++) {
for (std::size_t i = 0; i < points_for_svm.size(); i++) {
auto vr = Exact_predicates_kernel::Vector_3(CGAL::ORIGIN, point_cloud.point(points_for_svm[i])) * y[i];
qp.set_d(i, i, CGAL::scalar_product(vr,vr));
for (int j = 0; j < i; j++) {
for (std::size_t j = 0; j < i; j++) {
qp.set_d(i, j, CGAL::scalar_product(vr, Exact_predicates_kernel::Vector_3(CGAL::ORIGIN, point_cloud.point(points_for_svm[j])) * y[j]));
}
qp.set_c(i, -1);
Expand All @@ -249,15 +249,15 @@ std::list<std::pair <K::Vector_3, K::FT>> label_preservation (const SMS::Edge_pr

Exact_predicates_kernel::Vector_3 w(CGAL::NULL_VECTOR);
auto value = s.variable_values_begin();
for (int i = 0; i < points_for_svm.size(); i++) {
for (std::size_t i = 0; i < points_for_svm.size(); i++) {
w += y[i] * CGAL::to_double(*(value++)) * Exact_predicates_kernel::Vector_3(CGAL::ORIGIN,point_cloud.point(points_for_svm[i]));
}

Exact_predicates_kernel::FT b = 0;
int count = 0;
Exact_predicates_kernel::FT min_positive = std::numeric_limits<Exact_predicates_kernel::FT>::max();
Exact_predicates_kernel::FT max_negative = std::numeric_limits<Exact_predicates_kernel::FT>::lowest();
for (int i = 0; i < points_for_svm.size(); i++) {
for (std::size_t i = 0; i < points_for_svm.size(); i++) {
Exact_predicates_kernel::FT v = CGAL::scalar_product(w, Exact_predicates_kernel::Vector_3(CGAL::ORIGIN,point_cloud.point(points_for_svm[i])));
if (y[i] > 0 && v < min_positive) min_positive = v;
if (y[i] < 0 && v > max_negative) max_negative = v;
Expand All @@ -268,7 +268,7 @@ std::list<std::pair <K::Vector_3, K::FT>> label_preservation (const SMS::Edge_pr
}
if (count == 0) {
value = s.variable_values_begin();
for (int i = 0; i < points_for_svm.size(); i++) {
for (std::size_t i = 0; i < points_for_svm.size(); i++) {
double v = CGAL::to_double(*(value++));
if (v > 0 && v < c) {
b += y[i] - CGAL::scalar_product(w, Exact_predicates_kernel::Vector_3(CGAL::ORIGIN,point_cloud.point(points_for_svm[i])));
Expand All @@ -278,15 +278,15 @@ std::list<std::pair <K::Vector_3, K::FT>> label_preservation (const SMS::Edge_pr
}
if (count == 0) {
value = s.variable_values_begin();
for (int i = 0; i < points_for_svm.size(); i++) {
for (std::size_t i = 0; i < points_for_svm.size(); i++) {
if (CGAL::to_double(*(value++)) > 0) {
b += y[i] - CGAL::scalar_product(w, Exact_predicates_kernel::Vector_3(CGAL::ORIGIN,point_cloud.point(points_for_svm[i])));
count++;
}
}
}
if (count == 0) {
for (int i = 0; i < points_for_svm.size(); i++) {
for (std::size_t i = 0; i < points_for_svm.size(); i++) {
b += y[i] - CGAL::scalar_product(w, Exact_predicates_kernel::Vector_3(CGAL::ORIGIN,point_cloud.point(points_for_svm[i])));
count++;
}
Expand All @@ -299,7 +299,7 @@ std::list<std::pair <K::Vector_3, K::FT>> label_preservation (const SMS::Edge_pr

} else {

for (int i_label = 0; i_label < LABELS.size(); i_label++) {
for (std::size_t i_label = 0; i_label < LABELS.size(); i_label++) {
if (count_collapse_label[i_label] > 0) {

std::vector<int> y;
Expand All @@ -324,10 +324,10 @@ std::list<std::pair <K::Vector_3, K::FT>> label_preservation (const SMS::Edge_pr
Exact_predicates_kernel::FT c = 1;

Program qp (CGAL::EQUAL, true, 0, true, c);
for (int i = 0; i < points_for_svm.size(); i++) {
for (std::size_t i = 0; i < points_for_svm.size(); i++) {
auto vr = Exact_predicates_kernel::Vector_3(CGAL::ORIGIN, point_cloud.point(points_for_svm[i])) * y[i];
qp.set_d(i, i, CGAL::scalar_product(vr,vr));
for (int j = 0; j < i; j++) {
for (std::size_t j = 0; j < i; j++) {
qp.set_d(i, j, CGAL::scalar_product(vr, Exact_predicates_kernel::Vector_3(CGAL::ORIGIN, point_cloud.point(points_for_svm[j])) * y[j]));
}
qp.set_c(i, -1);
Expand All @@ -340,15 +340,15 @@ std::list<std::pair <K::Vector_3, K::FT>> label_preservation (const SMS::Edge_pr

Exact_predicates_kernel::Vector_3 w(CGAL::NULL_VECTOR);
auto value = s.variable_values_begin();
for (int i = 0; i < points_for_svm.size(); i++) {
for (std::size_t i = 0; i < points_for_svm.size(); i++) {
w += y[i] * CGAL::to_double(*(value++)) * Exact_predicates_kernel::Vector_3(CGAL::ORIGIN,point_cloud.point(points_for_svm[i]));
}

Exact_predicates_kernel::FT b = 0;
int count = 0;
Exact_predicates_kernel::FT min_positive = std::numeric_limits<Exact_predicates_kernel::FT>::max();
Exact_predicates_kernel::FT max_negative = std::numeric_limits<Exact_predicates_kernel::FT>::lowest();
for (int i = 0; i < points_for_svm.size(); i++) {
for (std::size_t i = 0; i < points_for_svm.size(); i++) {
Exact_predicates_kernel::FT v = CGAL::scalar_product(w, Exact_predicates_kernel::Vector_3(CGAL::ORIGIN,point_cloud.point(points_for_svm[i])));
if (y[i] > 0 && v < min_positive) min_positive = v;
if (y[i] < 0 && v > max_negative) max_negative = v;
Expand All @@ -359,7 +359,7 @@ std::list<std::pair <K::Vector_3, K::FT>> label_preservation (const SMS::Edge_pr
}
if (count == 0) {
value = s.variable_values_begin();
for (int i = 0; i < points_for_svm.size(); i++) {
for (std::size_t i = 0; i < points_for_svm.size(); i++) {
double v = CGAL::to_double(*(value++));
if (v > 0 && v < c) {
b += y[i] - CGAL::scalar_product(w, Exact_predicates_kernel::Vector_3(CGAL::ORIGIN,point_cloud.point(points_for_svm[i])));
Expand All @@ -369,15 +369,15 @@ std::list<std::pair <K::Vector_3, K::FT>> label_preservation (const SMS::Edge_pr
}
if (count == 0) {
value = s.variable_values_begin();
for (int i = 0; i < points_for_svm.size(); i++) {
for (std::size_t i = 0; i < points_for_svm.size(); i++) {
if (CGAL::to_double(*(value++)) > 0) {
b += y[i] - CGAL::scalar_product(w, Exact_predicates_kernel::Vector_3(CGAL::ORIGIN,point_cloud.point(points_for_svm[i])));
count++;
}
}
}
if (count == 0) {
for (int i = 0; i < points_for_svm.size(); i++) {
for (std::size_t i = 0; i < points_for_svm.size(); i++) {
b += y[i] - CGAL::scalar_product(w, Exact_predicates_kernel::Vector_3(CGAL::ORIGIN,point_cloud.point(points_for_svm[i])));
count++;
}
Expand Down Expand Up @@ -591,11 +591,11 @@ struct My_visitor : SMS::Edge_collapse_visitor_base<Surface_mesh> {
public:
My_visitor(Surface_mesh &mesh, const Surface_mesh_info &mesh_info, const Point_set &point_cloud, std::map<Surface_mesh::Face_index, std::vector<Point_set::Index>> &point_in_face) : mesh(mesh), mesh_info(mesh_info), point_cloud(point_cloud), point_in_face(point_in_face) {}

void OnStarted (Surface_mesh &mesh) {
void OnStarted (Surface_mesh&) {
start_collecte = std::chrono::system_clock::now();
}

void OnCollected(const SMS::Edge_profile<Surface_mesh>& profile, const boost::optional< SMS::Edge_profile<Surface_mesh>::FT >& cost) {
void OnCollected(const SMS::Edge_profile<Surface_mesh>&, const boost::optional< SMS::Edge_profile<Surface_mesh>::FT >&) {
start_collapse = std::chrono::system_clock::now();
i_collecte++;
if (i_collecte%1000 == 0) {
Expand All @@ -604,7 +604,7 @@ struct My_visitor : SMS::Edge_collapse_visitor_base<Surface_mesh> {
}
}

void OnSelected (const SMS::Edge_profile<Surface_mesh> &profile, boost::optional< SMS::Edge_profile<Surface_mesh>::FT > cost, const SMS::Edge_profile<Surface_mesh>::edges_size_type initial_edge_count, const SMS::Edge_profile<Surface_mesh>::edges_size_type current_edge_count) {
void OnSelected (const SMS::Edge_profile<Surface_mesh>&, boost::optional< SMS::Edge_profile<Surface_mesh>::FT > cost, const SMS::Edge_profile<Surface_mesh>::edges_size_type initial_edge_count, const SMS::Edge_profile<Surface_mesh>::edges_size_type current_edge_count) {
if (current_edge_count%100 == 0) {
auto end = std::chrono::system_clock::now();
std::chrono::duration<double> diff = end - start_collapse;
Expand Down Expand Up @@ -703,7 +703,7 @@ struct My_visitor : SMS::Edge_collapse_visitor_base<Surface_mesh> {

};

void OnCollapsing (const SMS::Edge_profile<Surface_mesh> &profile, const boost::optional<SMS::Edge_profile<Surface_mesh>::Point>& placement) {
void OnCollapsing (const SMS::Edge_profile<Surface_mesh> &profile, const boost::optional<SMS::Edge_profile<Surface_mesh>::Point>&) {
// Called when an edge is about to be collapsed and replaced by a vertex whose position is *placement
for(auto face: profile.triangles()) {
auto fh = mesh.face(mesh.halfedge(face.v0, face.v1));
Expand All @@ -712,7 +712,7 @@ struct My_visitor : SMS::Edge_collapse_visitor_base<Surface_mesh> {
}
};

void OnCollapsed (const SMS::Edge_profile<Surface_mesh> &profile, const Surface_mesh::Vertex_index vd) {
void OnCollapsed (const SMS::Edge_profile<Surface_mesh>&, const Surface_mesh::Vertex_index vd) {
// Called when an edge has been collapsed and replaced by the vertex vd
CGAL::Cartesian_converter<Exact_predicates_kernel,K> type_converter;

Expand Down Expand Up @@ -876,7 +876,7 @@ std::tuple<Surface_mesh, Surface_mesh> compute_meshes(const Raster &raster, cons
Custom_placement pf(params, costs, point_cloud, point_in_face);
Custom_cost cf(costs);
SMS::Bounded_normal_change_filter<> filter;
int r = SMS::edge_collapse(mesh, stop, CGAL::parameters::get_cost(cf).filter(filter).get_placement(pf).visitor(My_visitor(mesh, mesh_info, point_cloud, point_in_face)));
SMS::edge_collapse(mesh, stop, CGAL::parameters::get_cost(cf).filter(filter).get_placement(pf).visitor(My_visitor(mesh, mesh_info, point_cloud, point_in_face)));
std::cout << "\rMesh simplified " << std::endl;

add_label(mesh, point_cloud, point_in_face);
Expand Down
4 changes: 2 additions & 2 deletions label.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ struct Label {
unsigned char red;
unsigned char green;
unsigned char blue;
Label(int value, std::string label, unsigned char red, unsigned char green, unsigned char blue): value(value), label(label), red(red), green(green), blue(blue) {}
Label(unsigned char value, std::string label, unsigned char red, unsigned char green, unsigned char blue): value(value), label(label), red(red), green(green), blue(blue) {}
};

static std::array<Label, 12> LABELS {
Expand All @@ -30,6 +30,6 @@ static std::array<Label, 12> LABELS {
Label(11, "rail crossing", 250, 150, 0)
};

const int LABEL_OTHER = 0;
const unsigned char LABEL_OTHER = 0;

#endif /* !LABEL_H_ */
Loading

0 comments on commit 0d9a472

Please sign in to comment.