aboutsummaryrefslogtreecommitdiff
path: root/toolsrc/include/Span.h
diff options
context:
space:
mode:
authoratkawa7 <atkawa7@yahoo.com>2017-06-14 08:29:12 -0700
committeratkawa7 <atkawa7@yahoo.com>2017-06-14 08:29:12 -0700
commitce5ad1ffe1ed0c6351a09b01bc92a2ad258b8f19 (patch)
treeb64edb2fe7d020661b3fe30213eef2a967a60fd3 /toolsrc/include/Span.h
parent0a7fee0e8b0a637c83b9dd55bcb7a85c85779aba (diff)
parentc5ac9898999b712b7bac2fbc497825882d5e9011 (diff)
downloadvcpkg-ce5ad1ffe1ed0c6351a09b01bc92a2ad258b8f19.tar.gz
vcpkg-ce5ad1ffe1ed0c6351a09b01bc92a2ad258b8f19.zip
Merge https://github.com/Microsoft/vcpkg
Diffstat (limited to 'toolsrc/include/Span.h')
-rw-r--r--toolsrc/include/Span.h38
1 files changed, 38 insertions, 0 deletions
diff --git a/toolsrc/include/Span.h b/toolsrc/include/Span.h
new file mode 100644
index 000000000..b16af2cef
--- /dev/null
+++ b/toolsrc/include/Span.h
@@ -0,0 +1,38 @@
+#pragma once
+
+#include <array>
+#include <cstddef>
+#include <vector>
+
+template<class T>
+struct span
+{
+public:
+ using element_type = T;
+ using pointer = T*;
+ using reference = T&;
+ using iterator = T*;
+
+ constexpr span() noexcept : m_ptr(nullptr), m_count(0) {}
+ constexpr span(std::nullptr_t) noexcept : span() {}
+ constexpr span(T* ptr, size_t count) noexcept : m_ptr(ptr), m_count(count) {}
+ constexpr span(T* ptr_begin, T* ptr_end) noexcept : m_ptr(ptr_begin), m_count(ptr_end - ptr_begin) {}
+
+ template<size_t N>
+ constexpr span(T (&arr)[N]) noexcept : span(arr, N)
+ {
+ }
+
+ span(std::vector<T>& v) noexcept : span(v.data(), v.size()) {}
+ span(const std::vector<std::remove_const_t<T>>& v) noexcept : span(v.data(), v.size()) {}
+
+ constexpr iterator begin() const { return m_ptr; }
+ constexpr iterator end() const { return m_ptr + m_count; }
+
+ constexpr reference operator[](size_t i) const { return m_ptr[i]; }
+ constexpr size_t size() const { return m_count; }
+
+private:
+ pointer m_ptr;
+ size_t m_count;
+};