aboutsummaryrefslogtreecommitdiff
path: root/toolsrc/include/Span.h
diff options
context:
space:
mode:
authorRobert Schumacher <roschuma@microsoft.com>2017-06-08 00:36:17 -0700
committerRobert Schumacher <roschuma@microsoft.com>2017-06-08 04:32:57 -0700
commit247a6cec90004b8666d155eacc0f27d3a6c8fcf9 (patch)
treee63038044933f747161f94f52fc35f435573d08b /toolsrc/include/Span.h
parent1b717d851fda51e03b98a18f5304e29b7876c8a3 (diff)
downloadvcpkg-247a6cec90004b8666d155eacc0f27d3a6c8fcf9.tar.gz
vcpkg-247a6cec90004b8666d155eacc0f27d3a6c8fcf9.zip
[vcpkg] Improve diagnostics upon port load failure
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;
+};