ArrayView.h algorithm cassert cstddef Aliases.h StringView.h trust::ArrayViewTraits trust::ArrayViewTraits< const T > trust::ArrayView trust TRUST_ARRAYVIEW_H //CopyrightEpicGames,Inc.AllRightsReserved. #pragmaonce //*INDENT-OFF* #ifndefTRUST_ARRAYVIEW_H #defineTRUST_ARRAYVIEW_H #ifdef_MSC_VER #pragmawarning(push) #pragmawarning(disable:43654987) #endif #include<algorithm> #include<cassert> #include<cstddef> #ifdef_MSC_VER #pragmawarning(pop) #endif namespacetrust{ template<typenameT> structArrayViewTraits{ usingvalue_type=T; usingreference=T&; usingconst_reference=constT&; usingpointer=T*; usingconst_pointer=constT*; usingsize_type=std::size_t; usingdifference_type=std::ptrdiff_t; }; template<typenameT> structArrayViewTraits<constT>{ usingvalue_type=constT; usingreference=constT&; usingconst_reference=constT&; usingpointer=constT*; usingconst_pointer=constT*; usingsize_type=std::size_t; usingdifference_type=std::ptrdiff_t; }; template<typenameT> classArrayView{ public: usingvalue_type=typenameArrayViewTraits<T>::value_type; usingreference=typenameArrayViewTraits<T>::reference; usingconst_reference=typenameArrayViewTraits<T>::const_reference; usingconst_pointer=typenameArrayViewTraits<T>::const_pointer; usingpointer=typenameArrayViewTraits<T>::pointer; usingsize_type=typenameArrayViewTraits<T>::size_type; usingdifference_type=typenameArrayViewTraits<T>::difference_type; ArrayView()=default; ~ArrayView()noexcept=default; ArrayView(constArrayView&)=default; ArrayView&operator=(constArrayView&)=default; ArrayView(ArrayView&&)=default; ArrayView&operator=(ArrayView&&)=default; ArrayView(pointersrc,size_typesize): ptr{src}, sz{size}{ } ArrayView(std::nullptr_t/*unused*/,size_type/*unused*/):ArrayView{nullptr,{}}{ } template<typenameU> ArrayView(ArrayView<U>&src):ArrayView{src.data(),src.size()}{ } template<typenameU> ArrayView(constArrayView<U>&src):ArrayView{src.data(),src.size()}{ } template<typenameU> ArrayView(ArrayView<U>&&src):ArrayView{src.data(),src.size()}{ } template<typenameU,typenamestd::enable_if<!std::is_rvalue_reference<U&&>::value,int>::type=0> explicitArrayView(U&&src):ArrayView{src.data(),src.size()}{ } size_typesize()const{ returnsz; } pointerdata(){ returnptr; } const_pointerdata()const{ returnptr; } pointerbegin(){ returnptr; } pointerend(){ returnptr+sz; } const_pointercbegin()const{ returnptr; } const_pointercend()const{ returnptr+sz; } const_pointerbegin()const{ returncbegin(); } const_pointerend()const{ returncend(); } referenceoperator[](std::size_tindex){ assert(index<sz); returnptr[index]; } const_referenceoperator[](std::size_tindex)const{ assert(index<sz); returnptr[index]; } referenceat(std::size_tindex){ returnthis->operator[](index); } const_referenceat(std::size_tindex)const{ returnthis->operator[](index); } ArrayViewsubview(std::size_toffset,std::size_tcount)const{ assert(offset<=sz); assert((offset+count)<=sz); return{ptr+offset,count}; } ArrayViewfirst(std::size_tcount)const{ assert(count<=sz); return{ptr,count}; } ArrayViewlast(std::size_tcount)const{ assert(count<=sz); return{ptr+(sz-count),count}; } private: pointerptr{nullptr}; size_typesz{}; }; template<typenameT,typenameU> booloperator==(constArrayView<T>&lhs,constArrayView<U>&rhs){ if(lhs.size()!=rhs.size()){ returnfalse; } if(lhs.data()==rhs.data()){ returntrue; } #if__cplusplus>=201402L||(defined(_MSC_VER)&&_MSC_VER>=1900) //UnderVisualStudio2015,theoverloadofstd::equalaccepting4parametersmustbeused, //becausethe3-parameterversioncausesinsuppressiblewarnings returnstd::equal(lhs.begin(),lhs.end(),rhs.begin(),rhs.end()); #else returnstd::equal(lhs.begin(),lhs.end(),rhs.begin()); #endif } template<typenameT,typenameU> booloperator!=(constArrayView<T>&lhs,constArrayView<U>&rhs){ return!(lhs==rhs); } template<typenameT,typenameTContainer> booloperator==(constArrayView<T>&lhs,constTContainer&rhs){ if(lhs.size()!=rhs.size()){ returnfalse; } #if__cplusplus>=201402L||(defined(_MSC_VER)&&_MSC_VER>=1900) //UnderVisualStudio2015,theoverloadofstd::equalaccepting4parametersmustbeused, //becausethe3-parameterversioncausesinsuppressiblewarnings returnstd::equal(lhs.begin(),lhs.end(),rhs.begin(),rhs.end()); #else returnstd::equal(lhs.begin(),lhs.end(),rhs.begin()); #endif } template<typenameT,typenameTContainer> booloperator!=(constArrayView<T>&lhs,constTContainer&rhs){ return!(lhs==rhs); } template<typenameT,typenameTContainer> booloperator==(constTContainer&lhs,constArrayView<T>&rhs){ return(rhs==lhs); } template<typenameT,typenameTContainer> booloperator!=(constTContainer&lhs,constArrayView<T>&rhs){ return!(lhs==rhs); } template<typenameT> usingConstArrayView=ArrayView<const T>; }//namespacetrust #endif//TRUST_ARRAYVIEW_H //*INDENT-ON*