Skip to content

File Solid.h

File List > src > 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