From 95fd1d68cd067eb206652ae672e5e6ac22e171cc Mon Sep 17 00:00:00 2001 From: Mark Meredith Date: Thu, 30 Apr 2020 12:21:33 -0400 Subject: [PATCH 1/5] Add optional $name to CSG objects --- src/csg/impl/csg_types.hpp | 2 ++ src/csg/impl/parser.cpp | 9 +++++++++ src/csg/tests/parser/primitives.t.cpp | 3 ++- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/csg/impl/csg_types.hpp b/src/csg/impl/csg_types.hpp index 448ad8d..89135ee 100644 --- a/src/csg/impl/csg_types.hpp +++ b/src/csg/impl/csg_types.hpp @@ -28,12 +28,14 @@ struct Cube { }; struct Cylinder { + std::string name; double radius; double height; bool center; }; struct Cone { + std::string name; double radius1; double radius2; double height; diff --git a/src/csg/impl/parser.cpp b/src/csg/impl/parser.cpp index 34b6477..23128bd 100644 --- a/src/csg/impl/parser.cpp +++ b/src/csg/impl/parser.cpp @@ -461,6 +461,13 @@ template <> struct action { template static void apply(const Input &in, parser_state &st) { auto &curr_attr = st.curr_attrs.back(); + + std::string name(""); + if (curr_attr.count("$name")) { + name = std::get(curr_attr["$name"]); + name = name.substr(1, name.length() - 2); // strip quotes + } + if (curr_attr.count("r")) { // proper cylinder if (curr_attr.count("r1") || curr_attr.count("r2")) { @@ -468,6 +475,7 @@ template <> struct action { << std::endl; } csg::Cylinder cyl; + cyl.name = name; cyl.center = std::get(curr_attr["center"]); cyl.height = std::get(curr_attr["h"]); cyl.radius = std::get(curr_attr["r"]); @@ -477,6 +485,7 @@ template <> struct action { } else { // conic "cylinder" csg::Cone cone; + cone.name = name; cone.center = std::get(curr_attr["center"]); cone.height = std::get(curr_attr["h"]); cone.radius1 = std::get(curr_attr["r1"]); diff --git a/src/csg/tests/parser/primitives.t.cpp b/src/csg/tests/parser/primitives.t.cpp index 03493ba..430e3ad 100644 --- a/src/csg/tests/parser/primitives.t.cpp +++ b/src/csg/tests/parser/primitives.t.cpp @@ -7,9 +7,10 @@ TEST_CASE("cylinder", "[csg]") { auto st = *csg::parse_csg(R"( -cylinder(h = 2, r = 10, center=true); +cylinder($name="my_cyl", h = 2, r = 10, center=true); )"); auto cyl = std::get(st.top.objs.at(0)); + CHECK(cyl.name == "my_cyl"); CHECK(cyl.radius == 10); CHECK(cyl.height == 2); } -- GitLab From 1b1be9cb562b997226f78e167225074da2d7614a Mon Sep 17 00:00:00 2001 From: Mark Meredith Date: Thu, 30 Apr 2020 12:38:03 -0400 Subject: [PATCH 2/5] More $names --- src/csg/impl/csg_types.hpp | 4 ++++ src/csg/impl/parser.cpp | 27 +++++++++++++++++---------- src/csg/tests/parser/primitives.t.cpp | 16 ++++++++++++++-- 3 files changed, 35 insertions(+), 12 deletions(-) diff --git a/src/csg/impl/csg_types.hpp b/src/csg/impl/csg_types.hpp index 89135ee..5d4e819 100644 --- a/src/csg/impl/csg_types.hpp +++ b/src/csg/impl/csg_types.hpp @@ -10,19 +10,23 @@ namespace csg { struct Circle { + std::string name; double radius; }; struct Square { + std::string name; std::tuple size; bool center; }; struct Sphere { + std::string name; double radius; }; struct Cube { + std::string name; std::tuple size; bool center; }; diff --git a/src/csg/impl/parser.cpp b/src/csg/impl/parser.cpp index 23128bd..20daf0b 100644 --- a/src/csg/impl/parser.cpp +++ b/src/csg/impl/parser.cpp @@ -14,6 +14,7 @@ using namespace tao::pegtl; namespace { using Attr = std::variant, std::string>; +using AttrMap = std::map; struct parser_state { std::vector> current_3d_objs; @@ -24,8 +25,8 @@ struct parser_state { std::vector current_vec; std::vector> current_matrix; std::vector>> current_matrices; - std::map curr_attr; - std::vector> curr_attrs; + AttrMap curr_attr; + std::vector curr_attrs; }; enum Dimension { D2, D3 }; @@ -443,12 +444,21 @@ template <> struct action { } }; +std::string get_name(AttrMap curr_attr) { + std::string name(""); + if (curr_attr.count("$name")) { + name = std::get(curr_attr["$name"]); + name = name.substr(1, name.length() - 2); // strip quotes + } + return name; +} template <> struct action { template static void apply(const Input &in, parser_state &st) { csg::Cube cub; auto &curr_attr = st.curr_attrs.back(); auto size = std::get>(curr_attr["size"]); + cub.name = get_name(curr_attr); cub.size = {size[0], size[1], size[2]}; cub.center = std::get(curr_attr["center"]); @@ -462,12 +472,6 @@ template <> struct action { static void apply(const Input &in, parser_state &st) { auto &curr_attr = st.curr_attrs.back(); - std::string name(""); - if (curr_attr.count("$name")) { - name = std::get(curr_attr["$name"]); - name = name.substr(1, name.length() - 2); // strip quotes - } - if (curr_attr.count("r")) { // proper cylinder if (curr_attr.count("r1") || curr_attr.count("r2")) { @@ -475,7 +479,7 @@ template <> struct action { << std::endl; } csg::Cylinder cyl; - cyl.name = name; + cyl.name = get_name(curr_attr); cyl.center = std::get(curr_attr["center"]); cyl.height = std::get(curr_attr["h"]); cyl.radius = std::get(curr_attr["r"]); @@ -485,7 +489,7 @@ template <> struct action { } else { // conic "cylinder" csg::Cone cone; - cone.name = name; + cone.name = get_name(curr_attr); cone.center = std::get(curr_attr["center"]); cone.height = std::get(curr_attr["h"]); cone.radius1 = std::get(curr_attr["r1"]); @@ -501,6 +505,7 @@ template <> struct action { static void apply(const Input &in, parser_state &st) { csg::Sphere sph; auto &curr_attr = st.curr_attrs.back(); + sph.name = get_name(curr_attr); sph.radius = std::get(curr_attr["r"]); st.current_3d_objs.back().push_back(sph); @@ -513,6 +518,7 @@ template <> struct action { static void apply(const Input &in, parser_state &st) { csg::Circle cir; auto &curr_attr = st.curr_attrs.back(); + cir.name = get_name(curr_attr); cir.radius = std::get(curr_attr["r"]); st.current_2d_objs.back().push_back(cir); @@ -526,6 +532,7 @@ template <> struct action { csg::Square sq; auto &curr_attr = st.curr_attrs.back(); auto size = std::get>(curr_attr["size"]); + sq.name = get_name(curr_attr); sq.size = {size[0], size[1]}; sq.center = std::get(curr_attr["center"]); diff --git a/src/csg/tests/parser/primitives.t.cpp b/src/csg/tests/parser/primitives.t.cpp index 430e3ad..a8df2e3 100644 --- a/src/csg/tests/parser/primitives.t.cpp +++ b/src/csg/tests/parser/primitives.t.cpp @@ -15,12 +15,23 @@ cylinder($name="my_cyl", h = 2, r = 10, center=true); CHECK(cyl.height == 2); } +TEST_CASE("nameless cylinder", "[csg]") { + auto st = *csg::parse_csg(R"( +cylinder(h = 2, r = 10, center=true); +)"); + auto cyl = std::get(st.top.objs.at(0)); + CHECK(cyl.name == ""); + CHECK(cyl.radius == 10); + CHECK(cyl.height == 2); +} + TEST_CASE("cube", "[csg]") { auto st = *csg::parse_csg(R"( -cube(size = [1,2,3], center=true); +cube(size = [1,2,3], center=true, $name="my_cube"); )"); auto cub = std::get(st.top.objs.at(0)); auto [XX, YY, ZZ] = cub.size; + CHECK(cub.name == "my_cube"); CHECK(XX == 1); CHECK(YY == 2); CHECK(ZZ == 3); @@ -28,9 +39,10 @@ cube(size = [1,2,3], center=true); TEST_CASE("sphere", "[csg]") { auto st = *csg::parse_csg(R"( -sphere(r = 10); +sphere(r = 10, $name="my_sphere"); )"); auto sph = std::get(st.top.objs.at(0)); + CHECK(sph.name == "my_sphere"); CHECK(sph.radius == 10); } -- GitLab From a9ee5b066ff8d14415457ffe67273e97bc05578b Mon Sep 17 00:00:00 2001 From: Mark Meredith Date: Thu, 30 Apr 2020 12:39:12 -0400 Subject: [PATCH 3/5] space --- src/csg/impl/parser.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/csg/impl/parser.cpp b/src/csg/impl/parser.cpp index 20daf0b..be18a82 100644 --- a/src/csg/impl/parser.cpp +++ b/src/csg/impl/parser.cpp @@ -452,6 +452,7 @@ std::string get_name(AttrMap curr_attr) { } return name; } + template <> struct action { template static void apply(const Input &in, parser_state &st) { -- GitLab From 4f1c3b779a83757a11e977e93775d9ca50d38637 Mon Sep 17 00:00:00 2001 From: Mark Meredith Date: Thu, 30 Apr 2020 12:39:42 -0400 Subject: [PATCH 4/5] revert --- src/csg/impl/parser.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/csg/impl/parser.cpp b/src/csg/impl/parser.cpp index be18a82..65bebc3 100644 --- a/src/csg/impl/parser.cpp +++ b/src/csg/impl/parser.cpp @@ -472,7 +472,6 @@ template <> struct action { template static void apply(const Input &in, parser_state &st) { auto &curr_attr = st.curr_attrs.back(); - if (curr_attr.count("r")) { // proper cylinder if (curr_attr.count("r1") || curr_attr.count("r2")) { -- GitLab From 46ec773324bb57c9720d70e3c50d05087e481f69 Mon Sep 17 00:00:00 2001 From: Mark Meredith Date: Thu, 30 Apr 2020 13:16:52 -0400 Subject: [PATCH 5/5] Optional names --- src/csg/impl/csg_types.hpp | 12 ++++++------ src/csg/impl/parser.cpp | 10 +++++----- src/csg/tests/parser/primitives.t.cpp | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/csg/impl/csg_types.hpp b/src/csg/impl/csg_types.hpp index 5d4e819..eff2deb 100644 --- a/src/csg/impl/csg_types.hpp +++ b/src/csg/impl/csg_types.hpp @@ -10,36 +10,36 @@ namespace csg { struct Circle { - std::string name; + std::optional name; double radius; }; struct Square { - std::string name; + std::optional name; std::tuple size; bool center; }; struct Sphere { - std::string name; + std::optional name; double radius; }; struct Cube { - std::string name; + std::optional name; std::tuple size; bool center; }; struct Cylinder { - std::string name; + std::optional name; double radius; double height; bool center; }; struct Cone { - std::string name; + std::optional name; double radius1; double radius2; double height; diff --git a/src/csg/impl/parser.cpp b/src/csg/impl/parser.cpp index 65bebc3..7bfb052 100644 --- a/src/csg/impl/parser.cpp +++ b/src/csg/impl/parser.cpp @@ -444,13 +444,13 @@ template <> struct action { } }; -std::string get_name(AttrMap curr_attr) { - std::string name(""); +std::optional get_name(AttrMap curr_attr) { if (curr_attr.count("$name")) { - name = std::get(curr_attr["$name"]); - name = name.substr(1, name.length() - 2); // strip quotes + auto quoted_name = std::get(curr_attr["$name"]); + auto name = quoted_name.substr(1, quoted_name.length() - 2); + return name; } - return name; + return std::nullopt; } template <> struct action { diff --git a/src/csg/tests/parser/primitives.t.cpp b/src/csg/tests/parser/primitives.t.cpp index a8df2e3..ca2175c 100644 --- a/src/csg/tests/parser/primitives.t.cpp +++ b/src/csg/tests/parser/primitives.t.cpp @@ -20,7 +20,7 @@ TEST_CASE("nameless cylinder", "[csg]") { cylinder(h = 2, r = 10, center=true); )"); auto cyl = std::get(st.top.objs.at(0)); - CHECK(cyl.name == ""); + CHECK_FALSE(cyl.name.has_value()); CHECK(cyl.radius == 10); CHECK(cyl.height == 2); } -- GitLab