diff options
| author | Tim Foley <tfoley@nvidia.com> | 2017-06-09 11:34:21 -0700 |
|---|---|---|
| committer | Tim Foley <tfoley@nvidia.com> | 2017-06-09 13:44:59 -0700 |
| commit | fcf83dbf9effab3bd98bad2b83b2468b7eb05cfd (patch) | |
| tree | 41047c94883b86ec085a81597391ce3ef557cd43 /source/core/array-view.h | |
| parent | 52e8d4b9a27ab0060f874c3a63ab531847be35c0 (diff) | |
Initial import of code.
Diffstat (limited to 'source/core/array-view.h')
| -rw-r--r-- | source/core/array-view.h | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/source/core/array-view.h b/source/core/array-view.h new file mode 100644 index 000000000..201ef2a79 --- /dev/null +++ b/source/core/array-view.h @@ -0,0 +1,131 @@ +#ifndef CORE_LIB_ARRAY_VIEW_H +#define CORE_LIB_ARRAY_VIEW_H + +#include "Exception.h" + +namespace CoreLib +{ + namespace Basic + { + template<typename T> + class ArrayView + { + private: + T * _buffer; + int _count; + int stride; + public: + T* begin() const + { + return _buffer; + } + T* end() const + { + return (T*)((char*)_buffer + _count*stride); + } + public: + ArrayView() + { + _buffer = 0; + _count = 0; + } + ArrayView(const T & singleObj) + { + SetData((T*)&singleObj, 1, sizeof(T)); + } + ArrayView(T * buffer, int count) + { + SetData(buffer, count, sizeof(T)); + } + ArrayView(void * buffer, int count, int _stride) + { + SetData(buffer, count, _stride); + } + void SetData(void * buffer, int count, int _stride) + { + this->_buffer = (T*)buffer; + this->_count = count; + this->stride = _stride; + } + inline int GetCapacity() const + { + return _count; + } + inline int Count() const + { + return _count; + } + + inline T & operator [](int id) const + { +#if _DEBUG + if (id >= _count || id < 0) + throw IndexOutofRangeException("Operator[]: Index out of Range."); +#endif + return *(T*)((char*)_buffer+id*stride); + } + + inline T* Buffer() const + { + return _buffer; + } + + template<typename T2> + int IndexOf(const T2 & val) const + { + for (int i = 0; i < _count; i++) + { + if (*(T*)((char*)_buffer + i*stride) == val) + return i; + } + return -1; + } + + template<typename T2> + int LastIndexOf(const T2 & val) const + { + for (int i = _count - 1; i >= 0; i--) + { + if (*(T*)((char*)_buffer + i*stride) == val) + return i; + } + return -1; + } + + template<typename Func> + int FindFirst(const Func & predicate) const + { + for (int i = 0; i < _count; i++) + { + if (predicate(_buffer[i])) + return i; + } + return -1; + } + + template<typename Func> + int FindLast(const Func & predicate) const + { + for (int i = _count - 1; i >= 0; i--) + { + if (predicate(_buffer[i])) + return i; + } + return -1; + } + }; + + template<typename T> + ArrayView<T> MakeArrayView(const T & obj) + { + return ArrayView<T>(obj); + } + + template<typename T> + ArrayView<T> MakeArrayView(T * buffer, int count) + { + return ArrayView<T>(buffer, count); + } + } +} +#endif
\ No newline at end of file |
