Added from-container constructors.
diff --git a/include/span.h b/include/span.h
index 2d95899..eab2659 100644
--- a/include/span.h
+++ b/include/span.h
@@ -72,12 +72,35 @@
namespace gsl
{
+template <class ElementType, std::ptrdiff_t Extent = dynamic_extent>
+class span;
+
+
+namespace details
+{
+template <class T>
+struct is_span_oracle : std::false_type
+{
+};
+
+template <class ElementType, std::ptrdiff_t Extent>
+struct is_span_oracle<gsl::span<ElementType, Extent>> : std::true_type
+{
+};
+
+template <class T>
+struct is_span : is_span_oracle<std::remove_cv_t<T>>
+{
+};
+} // namespace details
+
+
// [views.constants], constants
constexpr const std::ptrdiff_t dynamic_extent = -1;
// [span], class template span
-template <class ElementType, std::ptrdiff_t Extent = dynamic_extent>
+template <class ElementType, std::ptrdiff_t Extent>
class span {
public:
// constants and types
@@ -122,11 +145,25 @@
: storage_(&arr[0], extent_type<N>())
{}
-#if 0 // TODO
- template <class Container>
- constexpr span(Container& cont);
- template <class Container>
+ // NB: the SFINAE here uses .data() as a incomplete/imperfect proxy for the requirement
+ // on Container to be a contiguous sequence container.
+ template <class Container,
+ class = std::enable_if_t<!details::is_span<Container>::value &&
+ std::is_convertible<Container::pointer, pointer>::value &&
+ std::is_convertible<Container::pointer, decltype(std::declval<Container>().data())>::value>
+ >
+ constexpr span(Container& cont) : span(cont.data(), cont.size()) {}
+
+ // NB: the SFINAE here uses .data() as an incomplete/imperfect proxy for the requirement
+ // on Container to be a contiguous sequence container.
+ template <class Container,
+ class = std::enable_if_t<!details::is_span<Container>::value &&
+ std::is_convertible<Container::pointer, pointer>::value &&
+ std::is_convertible<Container::pointer, decltype(std::declval<Container>().data())>::value>
+ >
span(const Container&&) = delete;
+
+#if 0 // TODO
constexpr span(const span& other) noexcept = default;
constexpr span(span&& other) noexcept = default;
template <class OtherElementType, ptrdiff_t OtherExtent>
@@ -231,9 +268,6 @@
storage_type(pointer data, OtherExtentType ext)
: ExtentType(ext), data_(data) {}
- //storage_type(pointer data, ExtentType ext)
- // : ExtentType(ext), data_(data) {}
-
constexpr inline pointer data() const noexcept
{ return data_; }