// Copyright (c) 2014 // INRIA Saclay-Ile de France (France) // // This file is part of CGAL (www.cgal.org) // // $URL: https://github.com/CGAL/cgal/blob/v5.2/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Point_d.h $ // $Id: Point_d.h 8bb22d5 2020-03-26T14:23:37+01:00 Sébastien Loriot // SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial // // Author(s) : Marc Glisse #ifndef CGAL_WRAPPER_POINT_D_H #define CGAL_WRAPPER_POINT_D_H #include #include #include #include #include #include #include #include #include #include namespace CGAL { namespace Wrap { template class Point_d : public Get_type::type // Deriving won't work if the point is just a __m256d. // Test boost/std::is_class for instance { typedef typename Get_type::type RT_; typedef typename Get_type::type FT_; typedef typename R_::Kernel_base Kbase; typedef typename Get_type::type Vector_; typedef typename Get_functor >::type CPBase; typedef typename Get_functor::type CCBase; typedef typename Get_functor >::type CPI; typedef Point_d Self; CGAL_static_assertion((boost::is_same::type>::value)); public: typedef Tag_true Is_wrapper; typedef typename R_::Default_ambient_dimension Ambient_dimension; typedef Dimension_tag<0> Feature_dimension; typedef typename Get_type::type Rep; //typedef typename CGAL::decay::type>::type Cartesian_const_iterator; const Rep& rep() const noexcept { return *this; } Rep& rep() noexcept { return *this; } typedef R_ R; #if defined(BOOST_MSVC) && (BOOST_MSVC == 1900) # pragma warning(push) # pragma warning(disable: 4309) #endif template::type...>,std::tuple >::value>::type> explicit Point_d(U&&...u) : Rep(CPBase()(std::forward(u)...)){} #if defined(BOOST_MSVC) && (BOOST_MSVC == 1900) # pragma warning(pop) #endif // // called from Construct_point_d // template explicit Point_d(Eval_functor&&,U&&...u) // : Rep(Eval_functor(), std::forward(u)...){} template explicit Point_d(Eval_functor&&,F&&f,U&&...u) : Rep(std::forward(f)(std::forward(u)...)){} #if 0 // the new standard may make this necessary Point_d(Point_d const&)=default; Point_d(Point_d &);//=default; Point_d(Point_d &&)=default; #endif // try not to use these Point_d(Rep const& v) : Rep(v) {} Point_d(Rep& v) : Rep(static_cast(v)) {} Point_d(Rep&& v) : Rep(std::move(v)) {} // this one should be implicit Point_d(Origin const& v) : Rep(CPBase()(v)) {} Point_d(Origin& v) : Rep(CPBase()(v)) {} Point_d(Origin&& v) : Rep(CPBase()(std::move(v))) {} friend void swap(Self& a, Self& b) #ifdef __cpp_lib_is_swappable noexcept(std::is_nothrow_swappable_v) #endif { using std::swap; swap(a.rep(), b.rep()); } decltype(auto) cartesian(int i)const{ return CCBase()(rep(),i); } decltype(auto) operator[](int i)const{ return CCBase()(rep(),i); } decltype(auto) cartesian_begin()const{ return CPI()(rep(),Begin_tag()); } decltype(auto) cartesian_end()const{ return CPI()(rep(),End_tag()); } int dimension() const { typedef typename Get_functor::type PDBase; return PDBase()(rep()); } friend auto operator==(Point_d const&p, Point_d const&q) { typedef typename Get_functor::type EPBase; return EPBase()(p.rep(), q.rep()); } friend auto operator!=(Point_d const&p, Point_d const&q) { return !(p==q); } friend std::ostream& operator <<(std::ostream& os, const Point_d& p) { auto b = p.cartesian_begin(); auto e = p.cartesian_end(); if(is_ascii(os)) { os << p.dimension(); for(; b != e; ++b){ os << " " << *b; } } else { write(os, p.dimension()); for(; b != e; ++b){ write(os, *b); } } return os; } // TODO: test if the stream is binary or text? friend std::istream& operator>>(std::istream &is, Point_d & p) { int dim; if( is_ascii(is) ) is >> dim; else { read(is, dim); } if(!is) return is; std::vector coords(dim); if(is_ascii(is)) { for(int i=0;i> iformat(coords[i]); } else { for(int i=0;i Point_d::Point_d(Point_d &)=default; #endif //template //Vector_d operator+(const Vector_d& v,const Vector_d& w) const //{ // return typename R::template Construct::type()(v,w); //} // //template //Vector_d operator-(const Vector_d& v,const Vector_d& w) const //{ // return typename R::template Construct::type()(v,w); //} } //namespace Wrap } //namespace CGAL #endif // CGAL_WRAPPER_POINT_D_H