1*56aa031bSSergey Makeev // The MIT License (MIT) 2*56aa031bSSergey Makeev // 3*56aa031bSSergey Makeev // Copyright (c) 2015 Sergey Makeev, Vadim Slyusarev 4*56aa031bSSergey Makeev // 5*56aa031bSSergey Makeev // Permission is hereby granted, free of charge, to any person obtaining a copy 6*56aa031bSSergey Makeev // of this software and associated documentation files (the "Software"), to deal 7*56aa031bSSergey Makeev // in the Software without restriction, including without limitation the rights 8*56aa031bSSergey Makeev // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9*56aa031bSSergey Makeev // copies of the Software, and to permit persons to whom the Software is 10*56aa031bSSergey Makeev // furnished to do so, subject to the following conditions: 11*56aa031bSSergey Makeev // 12*56aa031bSSergey Makeev // The above copyright notice and this permission notice shall be included in 13*56aa031bSSergey Makeev // all copies or substantial portions of the Software. 14*56aa031bSSergey Makeev // 15*56aa031bSSergey Makeev // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16*56aa031bSSergey Makeev // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17*56aa031bSSergey Makeev // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18*56aa031bSSergey Makeev // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19*56aa031bSSergey Makeev // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20*56aa031bSSergey Makeev // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21*56aa031bSSergey Makeev // THE SOFTWARE. 22*56aa031bSSergey Makeev 23*56aa031bSSergey Makeev #pragma once 24*56aa031bSSergey Makeev 25*56aa031bSSergey Makeev 26*56aa031bSSergey Makeev namespace MT 27*56aa031bSSergey Makeev { 28*56aa031bSSergey Makeev 29*56aa031bSSergey Makeev 30*56aa031bSSergey Makeev /// \class ArrayView 31*56aa031bSSergey Makeev /// \brief Simple wrapper to work with raw memory as an array. Includes array bounds checking. 32*56aa031bSSergey Makeev template<class T> 33*56aa031bSSergey Makeev class ArrayView 34*56aa031bSSergey Makeev { 35*56aa031bSSergey Makeev T* data; 36*56aa031bSSergey Makeev size_t count; 37*56aa031bSSergey Makeev 38*56aa031bSSergey Makeev private: 39*56aa031bSSergey Makeev 40*56aa031bSSergey Makeev ArrayView(ArrayView& ) {} 41*56aa031bSSergey Makeev void operator=(const ArrayView&) {} 42*56aa031bSSergey Makeev 43*56aa031bSSergey Makeev public: 44*56aa031bSSergey Makeev 45*56aa031bSSergey Makeev ArrayView(void* memoryChunk, size_t instanceCount) 46*56aa031bSSergey Makeev : data((T*)memoryChunk) 47*56aa031bSSergey Makeev , count(instanceCount) 48*56aa031bSSergey Makeev { 49*56aa031bSSergey Makeev MT_ASSERT(count == 0 || data, "Invalid data array"); 50*56aa031bSSergey Makeev } 51*56aa031bSSergey Makeev 52*56aa031bSSergey Makeev const T &operator[]( size_t i ) const 53*56aa031bSSergey Makeev { 54*56aa031bSSergey Makeev MT_ASSERT( i < Size(), "bad index" ); 55*56aa031bSSergey Makeev return data[i]; 56*56aa031bSSergey Makeev } 57*56aa031bSSergey Makeev 58*56aa031bSSergey Makeev T &operator[]( size_t i ) 59*56aa031bSSergey Makeev { 60*56aa031bSSergey Makeev MT_ASSERT( i < Size(), "bad index" ); 61*56aa031bSSergey Makeev return data[i]; 62*56aa031bSSergey Makeev } 63*56aa031bSSergey Makeev 64*56aa031bSSergey Makeev size_t Size() const 65*56aa031bSSergey Makeev { 66*56aa031bSSergey Makeev return count; 67*56aa031bSSergey Makeev } 68*56aa031bSSergey Makeev 69*56aa031bSSergey Makeev bool IsEmpty() const 70*56aa031bSSergey Makeev { 71*56aa031bSSergey Makeev return count == 0; 72*56aa031bSSergey Makeev } 73*56aa031bSSergey Makeev }; 74*56aa031bSSergey Makeev 75*56aa031bSSergey Makeev 76*56aa031bSSergey Makeev } 77