From fcaa62d69f286ba523febef9c229c2c1f6e36896 Mon Sep 17 00:00:00 2001 From: King_DuckZ Date: Thu, 8 Apr 2021 15:01:42 +0200 Subject: [PATCH] Fix copy-construction warning in clang This bumps the c++ requirement to c++17 --- CMakeLists.txt | 1 + include/vectorwrapper/implem_vec_base.hpp | 38 ++++++++++++++++++---- include/vectorwrapper/implem_vec_base.inl | 25 ++++++++++---- include/vectorwrapper/vectorwrapper.hpp.in | 8 ++--- include/vectorwrapper/vectorwrapper.inl | 2 +- meson.build | 2 +- 6 files changed, 56 insertions(+), 20 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bf9b35f..ec3147e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,6 +28,7 @@ target_include_directories(${PROJECT_NAME} INTERFACE $ INTERFACE $ ) +target_compile_features(${PROJECT_NAME} INTERFACE cxx_std_17) install(DIRECTORY include/vectorwrapper DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} diff --git a/include/vectorwrapper/implem_vec_base.hpp b/include/vectorwrapper/implem_vec_base.hpp index 3fc4328..fb55a53 100644 --- a/include/vectorwrapper/implem_vec_base.hpp +++ b/include/vectorwrapper/implem_vec_base.hpp @@ -55,12 +55,40 @@ namespace vwr { }; }; + template ::value> + class VecBaseStorage { + protected: + constexpr static const bool IsWrappedCopyConstructible = IsCopyConstr; + typedef V vector_type; + VecBaseStorage() = default; + VecBaseStorage (const VecBaseStorage& parOther) = delete; + VecBaseStorage (const vector_type& parInit) : m_wrapped(parInit) {} + vector_type& data ( void ) { return m_wrapped; } + const vector_type& data ( void ) const { return m_wrapped; } + private: + vector_type m_wrapped; + }; template - class VecBase { + class VecBaseStorage { + protected: + constexpr static const bool IsWrappedCopyConstructible = false; + typedef V vector_type; + VecBaseStorage() = default; + VecBaseStorage (const VecBaseStorage&) = delete; + VecBaseStorage (const vector_type&) { } + vector_type& data ( void ) { return m_wrapped; } + const vector_type& data ( void ) const { return m_wrapped; } + private: + vector_type m_wrapped; + }; + + template + class VecBase : private VecBaseStorage { friend Vec& assign_same_type ( Vec& parLeft, const Vec& parRight ); public: - typedef V vector_type; + typedef typename VecBaseStorage::vector_type vector_type; typedef typename VectorWrapperInfo::scalar_type scalar_type; + using VecBaseStorage::data; enum { dimensions = VectorWrapperInfo::dimensions @@ -70,6 +98,7 @@ namespace vwr { template explicit VecBase ( const T& parInit, typename std::enable_if::value and not std::is_same::value, bool>::type=false ); explicit VecBase ( const vector_type& parInit ); + VecBase ( const VecBase& parOther ); template VecBase ( scalar_type parX, scalar_type parY, Args... parArgs ); ~VecBase ( void ) = default; @@ -77,9 +106,6 @@ namespace vwr { scalar_type& operator[] ( size_type parIndex ); const scalar_type& operator[] ( size_type parIndex ) const; - vector_type& data ( void ) { return m_wrapped; } - const vector_type& data ( void ) const { return m_wrapped; } - operator vector_type&() {return this->data();} operator const vector_type&() const {return this->data();} @@ -109,8 +135,6 @@ namespace vwr { void assign_values_op (Op parOp, const bt::number_seq& parSeq, const VecBase& parOther); template void assign_values_op_scalar (Op parOp, const bt::number_seq& parSeq, const scalar_type& parOther); - - vector_type m_wrapped; }; template < diff --git a/include/vectorwrapper/implem_vec_base.inl b/include/vectorwrapper/implem_vec_base.inl index a488f25..16a4ef9 100644 --- a/include/vectorwrapper/implem_vec_base.inl +++ b/include/vectorwrapper/implem_vec_base.inl @@ -28,22 +28,27 @@ namespace vwr { template VecBase::VecBase (const T& parInit, typename std::enable_if::value and not std::is_same::value, bool>::type) { for (size_type z = 0; z < VectorWrapperInfo::dimensions; ++z) { - VecGetter::get_at(m_wrapped, z) = parInit; + VecGetter::get_at(data(), z) = parInit; } } template VecBase::VecBase (const vector_type& parInit) : - m_wrapped(parInit) + VecBaseStorage(parInit) { + if constexpr (not VecBaseStorage::IsWrappedCopyConstructible) { + for (size_type z = 0; z < dimensions; ++z) { + (*this)[z] = parInit[z]; + } + } } template template VecBase::VecBase (scalar_type parX, scalar_type parY, Args... parArgs) { static_assert(2 + sizeof...(Args) == dimensions, "Wrong number of parameters received"); - VecGetter::get_at(m_wrapped, 0) = parX; - VecGetter::get_at(m_wrapped, 1) = parY; + VecGetter::get_at(data(), 0) = parX; + VecGetter::get_at(data(), 1) = parY; assign_values(bt::number_range(), std::forward(parArgs)...); } @@ -54,7 +59,7 @@ namespace vwr { static_assert(sizeof...(I) == sizeof...(Args), "Argument count and indices count mismatch"); std::initializer_list t { - (VecGetter::get_at(m_wrapped, I) = parArgs)... + (VecGetter::get_at(data(), I) = parArgs)... }; static_cast(t); } @@ -73,12 +78,12 @@ namespace vwr { template auto VecBase::operator[] (size_type parIndex) -> scalar_type& { - return VecGetter::get_at(m_wrapped, parIndex); + return VecGetter::get_at(data(), parIndex); } template auto VecBase::operator[] (size_type parIndex) const -> const scalar_type& { - return VecGetter::get_at(const_cast(m_wrapped), parIndex); + return VecGetter::get_at(const_cast(data()), parIndex); } template @@ -181,6 +186,12 @@ namespace vwr { this->assign_values_op_scalar(std::divides(), bt::number_range::dimensions>(), parOther); return *this; } + + template + inline VecBase::VecBase (const VecBase& parOther) : + VecBase(parOther.data()) + { + } } //namespace implem } //namespace vwr diff --git a/include/vectorwrapper/vectorwrapper.hpp.in b/include/vectorwrapper/vectorwrapper.hpp.in index e1987ea..e4f447c 100644 --- a/include/vectorwrapper/vectorwrapper.hpp.in +++ b/include/vectorwrapper/vectorwrapper.hpp.in @@ -252,7 +252,7 @@ namespace vwr { static const Vec unit_x; Vec ( void ) = default; - Vec ( const Vec& parOther ) { implem::assign_same_type(*this, parOther); } + Vec ( const Vec& parOther ) : implem::VecBase(parOther) { } Vec ( const vector_type& parIn ) : implem::VecBase(parIn) { } template explicit Vec ( const typename std::enable_if::value and not std::is_same::value, T>::type& parX ) : implem::VecBase(parX) { } @@ -280,7 +280,7 @@ namespace vwr { static const Vec unit_y; Vec ( void ) = default; - Vec ( const Vec& parOther ) { implem::assign_same_type(*this, parOther); } + Vec ( const Vec& parOther ) : implem::VecBase(parOther) { } Vec ( const vector_type& parIn ) : implem::VecBase(parIn) { } explicit Vec ( const scalar_type parX ) : implem::VecBase(parX) { } Vec ( scalar_type parX, scalar_type parY ) : implem::VecBase(parX, parY) { } @@ -310,7 +310,7 @@ namespace vwr { static const Vec unit_z; Vec ( void ) = default; - Vec ( const Vec& parOther ) { implem::assign_same_type(*this, parOther); } + Vec ( const Vec& parOther ) : implem::VecBase(parOther) { } Vec ( const vector_type& parIn ) : implem::VecBase(parIn) { } explicit Vec ( const scalar_type parX ) : implem::VecBase(parX) { } Vec ( scalar_type parX, scalar_type parY, scalar_type parZ ) : implem::VecBase(parX, parY, parZ) { } @@ -341,7 +341,7 @@ namespace vwr { static const Vec unit_w; Vec ( void ) = default; - Vec ( const Vec& parOther ) { implem::assign_same_type(*this, parOther); } + Vec ( const Vec& parOther ) : implem::VecBase(parOther) { } Vec ( const vector_type& parIn ) : implem::VecBase(parIn) { } explicit Vec ( const scalar_type parX ) : implem::VecBase(parX) { } Vec ( scalar_type parX, scalar_type parY, scalar_type parZ, scalar_type parW ) : implem::VecBase(parX, parY, parZ, parW) { } diff --git a/include/vectorwrapper/vectorwrapper.inl b/include/vectorwrapper/vectorwrapper.inl index d2c3b5d..87292ff 100644 --- a/include/vectorwrapper/vectorwrapper.inl +++ b/include/vectorwrapper/vectorwrapper.inl @@ -65,7 +65,7 @@ namespace vwr { template Vec& assign_same_type (Vec& parLeft, const Vec& parRight) { - implem::AssignWrapped::assign(parLeft.m_wrapped, parRight.m_wrapped); + implem::AssignWrapped::assign(parLeft.data(), parRight.data()); return parLeft; } diff --git a/meson.build b/meson.build index 98f8810..38fa6aa 100644 --- a/meson.build +++ b/meson.build @@ -1,7 +1,7 @@ project('vectorwrapper', 'cpp', version: '1.1.2', meson_version: '>=0.50.0', - default_options:['cpp_std=c++11', 'b_ndebug=if-release'] + default_options:['cpp_std=c++17', 'b_ndebug=if-release'] ) pkg = import('pkgconfig')