summaryrefslogtreecommitdiffstats
path: root/source/core/slang-array-view.h
diff options
context:
space:
mode:
authorjsmall-nvidia <jsmall@nvidia.com>2019-05-31 17:20:37 -0400
committerGitHub <noreply@github.com>2019-05-31 17:20:37 -0400
commit6cbc3929a54d37bd23cb5efa8e3320ba02f78b2f (patch)
tree5a23cb47782e9e2a77762c90dd35da1005eba8d0 /source/core/slang-array-view.h
parentb81ff3ef968d1cc4e954b31a1812b3c391d17b02 (diff)
Use slang- prefix on slang compiler and core source (#973)
* Prefixing source files in source/slang with slang- * Prefix source in source/slang with slang- prefix. * Rename core source files with slang- prefix. * Update project files. * Fix problems from automatic merge.
Diffstat (limited to 'source/core/slang-array-view.h')
-rw-r--r--source/core/slang-array-view.h112
1 files changed, 112 insertions, 0 deletions
diff --git a/source/core/slang-array-view.h b/source/core/slang-array-view.h
new file mode 100644
index 000000000..8b653f4c7
--- /dev/null
+++ b/source/core/slang-array-view.h
@@ -0,0 +1,112 @@
+#ifndef SLANG_CORE_ARRAY_VIEW_H
+#define SLANG_CORE_ARRAY_VIEW_H
+
+#include "slang-common.h"
+
+namespace Slang
+{
+ template<typename T>
+ class ArrayView
+ {
+ private:
+ T* m_buffer;
+ int m_count;
+ public:
+ const T* begin() const { return m_buffer; }
+ T* begin() { return m_buffer; }
+
+ const T* end() const { return m_buffer + m_count; }
+ T* end() { return m_buffer + m_count; }
+
+ public:
+ ArrayView():
+ m_buffer(nullptr),
+ m_count(0)
+ {
+ }
+ ArrayView(T& singleObj):
+ m_buffer(&singleObj),
+ m_count(1)
+ {
+ }
+ ArrayView(T* buffer, int size):
+ m_buffer(buffer),
+ m_count(size)
+ {
+ }
+
+ inline int getCount() const { return m_count; }
+
+ inline const T& operator [](int idx) const
+ {
+ SLANG_ASSERT(idx >= 0 && idx <= m_count);
+ return m_buffer[idx];
+ }
+ inline T& operator [](int idx)
+ {
+ SLANG_ASSERT(idx >= 0 && idx <= m_count);
+ return m_buffer[idx];
+ }
+
+ inline const T* getBuffer() const { return m_buffer; }
+ inline T* getBuffer() { return m_buffer; }
+
+ template<typename T2>
+ int indexOf(const T2 & val) const
+ {
+ for (int i = 0; i < m_count; i++)
+ {
+ if (m_buffer[i] == val)
+ return i;
+ }
+ return -1;
+ }
+
+ template<typename T2>
+ int lastIndexOf(const T2 & val) const
+ {
+ for (int i = m_count - 1; i >= 0; i--)
+ {
+ if (m_buffer[i] == val)
+ return i;
+ }
+ return -1;
+ }
+
+ template<typename Func>
+ int findFirstIndex(const Func& predicate) const
+ {
+ for (int i = 0; i < m_count; i++)
+ {
+ if (predicate(m_buffer[i]))
+ return i;
+ }
+ return -1;
+ }
+
+ template<typename Func>
+ int findLastIndex(const Func& predicate) const
+ {
+ for (int i = m_count - 1; i >= 0; i--)
+ {
+ if (predicate(m_buffer[i]))
+ return i;
+ }
+ return -1;
+ }
+ };
+
+ template<typename T>
+ ArrayView<T> makeArrayView(T& obj)
+ {
+ return ArrayView<T>(obj);
+ }
+
+ template<typename T>
+ ArrayView<T> makeArrayView(T* buffer, int count)
+ {
+ return ArrayView<T>(buffer, count);
+ }
+}
+
+#endif