|
Katana Plug-in APIs 0.1
|
00001 // Copyright (c) 2017 The Foundry Visionmongers Ltd. All Rights Reserved. 00002 #ifndef KATANA_PLUGINAPI_FNATTRIBUTE_FNCONSTVECTOR_H_ 00003 #define KATANA_PLUGINAPI_FNATTRIBUTE_FNCONSTVECTOR_H_ 00004 00005 #include <stdint.h> 00006 #include <cstddef> 00007 #include <utility> 00008 00009 #include "FnAttribute/FnAttributeBase.h" 00010 #include "FnAttribute/FnSampleAccessor.h" 00011 #include "FnAttribute/ns.h" 00012 #include "FnAttribute/suite/FnAttributeSuite.h" 00013 #include "FnPlatform/internal/Portability.h" 00014 00015 FNATTRIBUTE_NAMESPACE_ENTER 00016 { 00032 template<class T> 00033 class ConstVectorBase 00034 { 00035 public: 00039 typedef T value_type; 00043 typedef std::size_t size_type; 00044 typedef std::ptrdiff_t difference_type; 00045 00050 ConstVectorBase(const Attribute& attr, float t) 00051 : _accessor(attr), _elems(_accessor.getNearestSample(t).data()) 00052 { 00053 } 00054 00055 #ifdef FNKAT_CXX11 00056 00059 ConstVectorBase(Attribute&& attr, float t) 00060 : _accessor(std::move(attr)), 00061 _elems(_accessor.getNearestSample(t).data()) 00062 { 00063 } 00064 #endif // FNKAT_CXX11 00065 00066 ConstVectorBase() : _accessor(), _elems() {} 00067 00071 size_type size() const 00072 { 00073 return static_cast<size_type>(_accessor.getNumberOfValues()); 00074 } 00075 00079 bool empty() const { return size() == 0; } 00080 00081 protected: 00082 SampleAccessor<T> _accessor; 00083 const T* _elems; 00084 }; 00085 00086 typedef ConstVectorBase<int32_t> IntConstVectorBase; 00087 typedef ConstVectorBase<float> FloatConstVectorBase; 00088 typedef ConstVectorBase<double> DoubleConstVectorBase; 00089 typedef ConstVectorBase<const char*> StringConstVectorBase; 00090 00103 template <class T> 00104 class ConstVector : public ConstVectorBase<T> 00105 { 00106 public: 00110 ConstVector(const Attribute& attr, float t) 00111 : ConstVectorBase<T>(attr, t) 00112 { 00113 } 00114 00115 #ifdef FNKAT_CXX11 00116 00117 ConstVector(Attribute&& attr, float t) 00118 : ConstVectorBase<T>(std::move(attr), t) 00119 { 00120 } 00121 #endif // FNKAT_CXX11 00122 00123 // NOLINTNEXTLINE(runtime/explicit) 00124 /* implicit */ ConstVector(const ConstVectorBase<T>& other) 00125 : ConstVectorBase<T>(other) 00126 { 00127 } 00128 00129 ConstVector() {} 00130 00134 typedef T value_type; 00138 typedef const value_type* const_iterator; 00142 typedef const value_type& const_reference; 00146 typedef std::size_t size_type; 00147 typedef std::ptrdiff_t difference_type; 00148 00152 size_type size() const 00153 { 00154 return static_cast<size_type>(this->_accessor.getNumberOfValues()); 00155 } 00156 00160 bool empty() const { return size() == 0; } 00161 00165 const_iterator begin() const FNKAT_LVALUE_REF_QUALIFIER 00166 { 00167 return this->_elems; 00168 } 00169 00173 const_iterator end() const FNKAT_LVALUE_REF_QUALIFIER 00174 { 00175 return this->_elems + size(); 00176 } 00177 00181 const_reference operator[](size_type i) const FNKAT_LVALUE_REF_QUALIFIER 00182 { 00183 assert(i < size()); 00184 return this->_elems[i]; 00185 } 00186 00190 const_reference at(size_type i) const FNKAT_LVALUE_REF_QUALIFIER 00191 { 00192 if (i >= size()) 00193 { 00194 throw std::out_of_range("ConstVector::at"); 00195 } 00196 return this->_elems[i]; 00197 } 00198 00202 const_reference front() const FNKAT_LVALUE_REF_QUALIFIER 00203 { 00204 assert(!empty()); 00205 return this->_elems[0]; 00206 } 00207 00211 const_reference back() const FNKAT_LVALUE_REF_QUALIFIER 00212 { 00213 assert(!empty()); 00214 return this->_elems[size() - 1]; 00215 } 00216 00220 const value_type* data() const FNKAT_LVALUE_REF_QUALIFIER 00221 { 00222 return this->_elems; 00223 } 00224 00225 #ifdef FNKAT_CXX11 00226 00227 const_iterator begin() && = delete; 00228 const_iterator end() && = delete; 00229 const_reference operator[](size_type i) && = delete; 00230 const_reference at(size_type i) && = delete; 00231 const_reference front() && = delete; 00232 const_reference back() && = delete; 00233 const value_type* data() && = delete; 00235 #endif // FNKAT_CXX11 00236 }; 00237 00238 typedef ConstVector<int32_t> IntConstVector; 00239 typedef ConstVector<float> FloatConstVector; 00240 typedef ConstVector<double> DoubleConstVector; 00241 typedef ConstVector<const char*> StringConstVector; 00242 00244 } 00245 FNATTRIBUTE_NAMESPACE_EXIT 00246 #endif // KATANA_PLUGINAPI_FNATTRIBUTE_FNCONSTVECTOR_H_
1.7.3