Katana Plug-in APIs 0.1

FnConstVector.h

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_
 All Classes Functions Variables Typedefs Enumerations Enumerator