/* * Copyright 2015-2020 Michele "King_DuckZ" Santullo * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include "implem_vec_common.hpp" #include "sequence_bt.hpp" #include #include #include #if defined VWR_OUTER_NAMESPACE namespace VWR_OUTER_NAMESPACE { #endif namespace vwr { namespace implem { template Vec& assign_same_type ( Vec& parLeft, const Vec& parRight ); template struct is_vec { enum { value = false }; }; template struct is_vec> { typedef V vector_type; enum { value = true }; }; template struct get_wrapped_ifn { typedef V type; }; template struct get_wrapped_ifn> { typedef T type; }; template struct directly_convertible { enum { value = not HasGetAtMethod::type>>::value and not HasGetAtMethod::type>>::value }; }; 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 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 typename VecBaseStorage::vector_type vector_type; typedef typename VectorWrapperInfo::scalar_type scalar_type; using VecBaseStorage::data; enum { dimensions = VectorWrapperInfo::dimensions }; VecBase ( void ) = default; 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; scalar_type& operator[] ( size_type parIndex ); const scalar_type& operator[] ( size_type parIndex ) const; operator vector_type&() {return this->data();} operator const vector_type&() const {return this->data();} template const typename std::enable_if::value and directly_convertible::value, V2>::type& cast ( void ) const; template typename std::enable_if::value and directly_convertible::value, V2>::type& cast ( void ); template const typename std::enable_if::value and not directly_convertible::value, V2>::type& cast ( void ) const; template typename std::enable_if::value and not directly_convertible::value, V2>::type& cast ( void ); template VecBase& operator+= ( const VecBase& parOther ); template VecBase& operator-= ( const VecBase& parOther ); template VecBase& operator*= ( const VecBase& parOther ); template VecBase& operator/= ( const VecBase& parOther ); VecBase& operator+= ( const scalar_type& parOther ); VecBase& operator-= ( const scalar_type& parOther ); VecBase& operator*= ( const scalar_type& parOther ); VecBase& operator/= ( const scalar_type& parOther ); private: template void assign_values (const bt::number_seq&, Args... parArgs); template 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); }; template < typename T, typename U, size_type S=( static_cast(VectorWrapperInfo::dimensions) < static_cast(VectorWrapperInfo::dimensions) ? static_cast(VectorWrapperInfo::dimensions) : static_cast(VectorWrapperInfo::dimensions) ) > struct have_compat_offsets; template struct have_compat_offsets { enum { value = true }; }; template struct have_compat_offsets { enum { value = VectorWrapperInfo::offset_x - min_offset::value == VectorWrapperInfo::offset_x - min_offset::value and VectorWrapperInfo::offset_y - min_offset::value == VectorWrapperInfo::offset_y - min_offset::value }; }; template struct have_compat_offsets { enum { value = VectorWrapperInfo::offset_x - min_offset::value == VectorWrapperInfo::offset_x - min_offset::value and VectorWrapperInfo::offset_y - min_offset::value == VectorWrapperInfo::offset_y - min_offset::value and VectorWrapperInfo::offset_z - min_offset::value == VectorWrapperInfo::offset_z - min_offset::value }; }; template struct have_compat_offsets { enum { value = VectorWrapperInfo::offset_x - min_offset::value == VectorWrapperInfo::offset_x - min_offset::value and VectorWrapperInfo::offset_y - min_offset::value == VectorWrapperInfo::offset_y - min_offset::value and VectorWrapperInfo::offset_z - min_offset::value == VectorWrapperInfo::offset_z - min_offset::value and VectorWrapperInfo::offset_w - min_offset::value == VectorWrapperInfo::offset_w - min_offset::value }; }; template struct have_compat_layout { enum { value = HasOffsetXEnum>::value and HasOffsetXEnum>::value and have_compat_offsets::value }; }; } //namespace implem template struct is_castable_to { }; } //namespace vwr #if defined VWR_OUTER_NAMESPACE } //namespace VWR_OUTER_NAMESPACE #endif #include "implem_vec_base.inl"