23 #ifndef TANGENTIAL_COMPLEX_UTILITIES_H_ 24 #define TANGENTIAL_COMPLEX_UTILITIES_H_ 26 #include <CGAL/Dimension.h> 27 #include <CGAL/Combination_enumerator.h> 28 #include <CGAL/IO/Triangulation_off_ostream.h> 30 #include <boost/container/flat_set.hpp> 33 #include <Eigen/Eigen> 43 namespace tangential_complex {
50 :
public std::atomic<T> {
51 typedef std::atomic<T> Base;
55 Atomic_wrapper(
const T &t) : Base(t) { }
57 Atomic_wrapper(
const std::atomic<T> &a) : Base(a.load()) { }
59 Atomic_wrapper(
const Atomic_wrapper &other) : Base(other.load()) { }
61 Atomic_wrapper &operator=(
const T &other) {
66 Atomic_wrapper &operator=(
const std::atomic<T> &other) {
67 Base::store(other.load());
71 Atomic_wrapper &operator=(
const Atomic_wrapper &other) {
72 Base::store(other.load());
79 typename K::Vector_d& normalize_vector(
typename K::Vector_d& v,
81 v = k.scaled_vector_d_object()(
82 v,
typename K::FT(1) / std::sqrt(k.squared_length_d_object()(v)));
86 template<
typename Kernel>
88 typedef typename Kernel::FT FT;
89 typedef typename Kernel::Point_d Point;
90 typedef typename Kernel::Vector_d Vector;
91 typedef typename std::vector<Vector>::const_iterator const_iterator;
94 std::vector<Vector> m_vectors;
96 std::size_t origin()
const {
100 void set_origin(std::size_t o) {
104 const_iterator begin()
const {
105 return m_vectors.begin();
108 const_iterator end()
const {
109 return m_vectors.end();
112 std::size_t size()
const {
113 return m_vectors.size();
116 Vector& operator[](
const std::size_t i) {
120 const Vector& operator[](
const std::size_t i)
const {
124 void push_back(
const Vector& v) {
125 m_vectors.push_back(v);
128 void reserve(
const std::size_t s) {
129 m_vectors.reserve(s);
134 Basis(std::size_t origin) : m_origin(origin) { }
136 Basis(std::size_t origin,
const std::vector<Vector>& vectors)
137 : m_origin(origin), m_vectors(vectors) { }
139 int dimension()
const {
140 return static_cast<int> (m_vectors.size());
146 template <
typename Kernel,
typename Po
int_range>
147 std::ostream &export_point_set(
149 Point_range
const& points,
151 const char *coord_separator =
" ") {
153 typename Kernel::Construct_cartesian_const_iterator_d ccci =
154 k.construct_cartesian_const_iterator_d_object();
156 os << points.size() <<
"\n";
158 typename Point_range::const_iterator it_p = points.begin();
159 typename Point_range::const_iterator it_p_end = points.end();
161 for (; it_p != it_p_end; ++it_p) {
162 for (
auto it = ccci(*it_p); it != ccci(*it_p, 0); ++it)
163 os << CGAL::to_double(*it) << coord_separator;
174 template <
typename Elements_container,
typename Output_iterator>
175 void combinations(
const Elements_container elements,
int k,
176 Output_iterator combinations) {
177 std::size_t n = elements.size();
178 std::vector<bool> booleans(n,
false);
179 std::fill(booleans.begin() + n - k, booleans.end(),
true);
181 boost::container::flat_set<std::size_t> combination;
182 typename Elements_container::const_iterator it_elt = elements.begin();
183 for (std::size_t i = 0; i < n; ++i, ++it_elt) {
185 combination.insert(*it_elt);
187 *combinations++ = combination;
188 }
while (std::next_permutation(booleans.begin(), booleans.end()));
195 #endif // TANGENTIAL_COMPLEX_UTILITIES_H_ Definition: SimplicialComplexForAlpha.h:26