/* * 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 class VecBase { friend Vec& assign_same_type ( Vec& parLeft, const Vec& parRight ); public: typedef V vector_type; typedef typename VectorWrapperInfo::scalar_type scalar_type; 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 ); 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; 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();} 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); vector_type m_wrapped; }; 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"