Implemented first, last, subspan.
diff --git a/include/span.h b/include/span.h
index 7e8c119..032779c 100644
--- a/include/span.h
+++ b/include/span.h
@@ -234,19 +234,50 @@
     ~span() noexcept = default;
     constexpr span& operator=(const span& other) noexcept = default;
     constexpr span& operator=(span&& other) noexcept = default;
-#if 0 // TODO
 
     // [span.sub], span subviews  
     template <ptrdiff_t Count>
-    constexpr span<element_type, Count> first() const;
+    constexpr span<element_type, Count> first() const
+    {
+        Expects(Count >= 0 && Count <= size());
+        return { data(), Count };
+    }
+
     template <ptrdiff_t Count>
-    constexpr span<element_type, Count> last() const;
+    constexpr span<element_type, Count> last() const
+    {
+        Expects(Count >= 0 && Count <= size());
+        return{ Count == 0 ? data() : data() + (size() - Count), Count };
+    }
+
     template <ptrdiff_t Offset, ptrdiff_t Count = dynamic_extent>
-    constexpr span<element_type, Count> subspan() const;
-    constexpr span<element_type, dynamic_extent> first(index_type count) const;
-    constexpr span<element_type, dynamic_extent> last(index_type count) const;
-    constexpr span<element_type, dynamic_extent> subspan(index_type offset, index_type count = dynamic_extent) const;
-#endif
+    constexpr span<element_type, Count> subspan() const
+    {
+        Expects((Offset == 0 || Offset > 0 && Offset <= size()) &&
+            (Count == dynamic_extent || Count >= 0 && Offset + Count <= size()));
+        return { data() + Offset, Count == dynamic_extent ? size() - Offset : Count };
+    }
+
+    constexpr span<element_type, dynamic_extent> first(index_type count) const
+    {
+        Expects(count >= 0 && count <= size());
+        return { data(), count };
+    }
+
+    constexpr span<element_type, dynamic_extent> last(index_type count) const
+    {
+        Expects(count >= 0 && count <= size());
+        return { count == 0 ? data() : data() + (size() - count), count };
+    }
+
+    constexpr span<element_type, dynamic_extent> subspan(index_type offset,
+        index_type count = dynamic_extent) const
+    {
+        Expects((offset == 0 || offset > 0 && offset <= size()) &&
+            (count == dynamic_extent || count >= 0 && offset + count <= size()));
+        return { data() + offset, count == dynamic_extent ? size() - offset : count };
+    }
+
     // [span.obs], span observers 
     constexpr index_type length() const noexcept { return size(); }
     constexpr index_type size() const noexcept { return storage_.size();  }