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:
};
-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;
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");
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");
}
-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))