]> git.tdb.fi Git - libs/math.git/commitdiff
Simplify Loader initialization with a constexpr if
authorMikko Rasa <tdb@tdb.fi>
Sun, 26 Jan 2025 10:23:03 +0000 (12:23 +0200)
committerMikko Rasa <tdb@tdb.fi>
Sun, 26 Jan 2025 10:23:25 +0000 (12:23 +0200)
Build
source/geometry/loader.h

diff --git a/Build b/Build
index c1c5d2e807e8822b78ad1df3de50aad3f53e75fe..cbb0b75dedad60040b3740f3b987ac237e92c6b1 100644 (file)
--- a/Build
+++ b/Build
@@ -6,7 +6,7 @@ package "mspmath"
 
        build_info
        {
-               standard CXX "c++14";
+               standard CXX "c++17";
        };
 
        if_arch "linux"
index bcb5a90531ebd516f866d8b7a8ddb297b65ed7ca..14a2fb894ec080c1cc81baf16a1464a87b1ff41d 100644 (file)
@@ -17,15 +17,16 @@ namespace Msp {
 namespace Geometry {
 
 template<typename T, unsigned D>
-class DimensionIndependentLoader: public DataFile::Loader
+class Loader: public DataFile::Loader
 {
 protected:
        bool single = true;
        std::vector<std::unique_ptr<Shape<T, D>>> shapes;
 
-       DimensionIndependentLoader(bool = true);
-
+       Loader(bool);
 public:
+       Loader(): Loader(true) { }
+
        std::unique_ptr<Shape<T, D>> take_shape();
 
 protected:
@@ -34,24 +35,6 @@ protected:
 };
 
 
-template<typename T, unsigned D, bool = (D>1)>
-class Loader;
-
-template<typename T, unsigned D>
-class Loader<T, D, false>: public DimensionIndependentLoader<T, D>
-{
-public:
-       Loader(bool = true);
-};
-
-template<typename T, unsigned D>
-class Loader<T, D, true>: public DimensionIndependentLoader<T, D>
-{
-public:
-       Loader(bool = true);
-};
-
-
 template<typename S>
 class ShapeLoader;
 
@@ -179,20 +162,23 @@ class ShapeLoader<Union<T, D> >: public CompositeLoader<T, D, Union<T, D> >
 
 
 template<typename T, unsigned D>
-inline DimensionIndependentLoader<T, D>::DimensionIndependentLoader(bool s):
+inline Loader<T, D>::Loader(bool s):
        single(s)
 {
-       add("box", &DimensionIndependentLoader::shape<HyperBox<T, D> >);
-       add("halfspace", &DimensionIndependentLoader::shape<HalfSpace<T, D> >);
-       add("intersection", &DimensionIndependentLoader::shape<Intersection<T, D> >);
-       add("negation", &DimensionIndependentLoader::shape<Negation<T, D> >);
-       add("sphere", &DimensionIndependentLoader::shape<HyperSphere<T, D> >);
-       add("transformed", &DimensionIndependentLoader::shape<TransformedShape<T, D> >);
-       add("union", &DimensionIndependentLoader::shape<Union<T, D> >);
+       add("box", &Loader::shape<HyperBox<T, D>>);
+       add("halfspace", &Loader::shape<HalfSpace<T, D>>);
+       add("intersection", &Loader::shape<Intersection<T, D>>);
+       add("negation", &Loader::shape<Negation<T, D>>);
+       add("sphere", &Loader::shape<HyperSphere<T, D>>);
+       add("transformed", &Loader::shape<TransformedShape<T, D>>);
+       add("union", &Loader::shape<Union<T, D>>);
+
+       if constexpr(D>1)
+                       add("extruded", &Loader<T, D>::template shape<ExtrudedShape<T, D>>);
 }
 
 template<typename T, unsigned D>
-inline std::unique_ptr<Shape<T, D>> DimensionIndependentLoader<T, D>::take_shape()
+inline std::unique_ptr<Shape<T, D>> Loader<T, D>::take_shape()
 {
        if(shapes.empty())
                throw std::runtime_error("no shape");
@@ -201,7 +187,7 @@ inline std::unique_ptr<Shape<T, D>> DimensionIndependentLoader<T, D>::take_shape
 
 template<typename T, unsigned D>
 template<typename S>
-inline void DimensionIndependentLoader<T, D>::shape()
+inline void Loader<T, D>::shape()
 {
        if(single && !shapes.empty())
                throw std::runtime_error("shape already loaded");
@@ -212,19 +198,6 @@ inline void DimensionIndependentLoader<T, D>::shape()
 }
 
 
-template<typename T, unsigned D>
-inline Loader<T, D, false>::Loader(bool s):
-       DimensionIndependentLoader<T, D>(s)
-{ }
-
-template<typename T, unsigned D>
-inline Loader<T, D, true>::Loader(bool s):
-       DimensionIndependentLoader<T, D>(s)
-{
-       this->add("extruded", &Loader<T, D>::template shape<ExtrudedShape<T, D> >);
-}
-
-
 template<typename T, unsigned D>
 inline ShapeLoader<ExtrudedShape<T, D> >::ShapeLoader():
        length_(T(1))