File Solid.h
Go to the documentation of this file
// Copyright (c) 2012-2013, IGN France.
// Copyright (c) 2012-2022, Oslandia.
// SPDX-License-Identifier: LGPL-2.0-or-later
#ifndef _SFCGAL_SOLID_H_
#define _SFCGAL_SOLID_H_
#include <boost/assert.hpp>
#include <vector>
#include <boost/ptr_container/ptr_vector.hpp>
#include <boost/serialization/base_object.hpp>
#include <boost/serialization/vector.hpp>
#include "SFCGAL/PolyhedralSurface.h"
namespace SFCGAL {
class SFCGAL_API Solid : public Geometry {
public:
typedef boost::ptr_vector<PolyhedralSurface>::iterator iterator;
typedef boost::ptr_vector<PolyhedralSurface>::const_iterator const_iterator;
Solid();
Solid(const PolyhedralSurface &exteriorShell);
Solid(PolyhedralSurface *exteriorShell);
Solid(const std::vector<PolyhedralSurface> &shells);
Solid(const Solid &other);
Solid &
operator=(Solid other);
~Solid();
//-- SFCGAL::Geometry
virtual Solid *
clone() const;
//-- SFCGAL::Geometry
virtual std::string
geometryType() const;
//-- SFCGAL::Geometry
virtual GeometryType
geometryTypeId() const;
//-- SFCGAL::Geometry
virtual int
dimension() const;
//-- SFCGAL::Geometry
virtual int
coordinateDimension() const;
//-- SFCGAL::Geometry
virtual bool
isEmpty() const;
//-- SFCGAL::Geometry
virtual bool
is3D() const;
//-- SFCGAL::Geometry
virtual bool
isMeasured() const;
inline const PolyhedralSurface &
exteriorShell() const
{
return _shells[0];
}
inline PolyhedralSurface &
exteriorShell()
{
return _shells[0];
}
inline size_t
numInteriorShells() const
{
return _shells.size() - 1;
}
inline const PolyhedralSurface &
interiorShellN(size_t const &n) const
{
return _shells[n + 1];
}
inline PolyhedralSurface &
interiorShellN(size_t const &n)
{
return _shells[n + 1];
}
inline void
addInteriorShell(const PolyhedralSurface &shell)
{
_shells.push_back(shell.clone());
}
inline void
addInteriorShell(PolyhedralSurface *shell)
{
BOOST_ASSERT(shell != NULL);
_shells.push_back(shell);
}
inline size_t
numShells() const
{
return _shells.size();
}
inline const PolyhedralSurface &
shellN(const size_t &n) const
{
BOOST_ASSERT(n < numShells());
return _shells[n];
}
inline PolyhedralSurface &
shellN(const size_t &n)
{
BOOST_ASSERT(n < numShells());
return _shells[n];
}
//-- iterators
inline iterator
begin()
{
return _shells.begin();
}
inline const_iterator
begin() const
{
return _shells.begin();
}
inline iterator
end()
{
return _shells.end();
}
inline const_iterator
end() const
{
return _shells.end();
}
//-- visitors
//-- SFCGAL::Geometry
virtual void
accept(GeometryVisitor &visitor);
//-- SFCGAL::Geometry
virtual void
accept(ConstGeometryVisitor &visitor) const;
template <class Archive>
void
serialize(Archive &ar, const unsigned int /*version*/)
{
ar &boost::serialization::base_object<Geometry>(*this);
ar &_shells;
}
private:
boost::ptr_vector<PolyhedralSurface> _shells;
void
swap(Solid &other)
{
_shells.swap(other._shells);
}
};
} // namespace SFCGAL
#endif