std::span
#
Basic Usage#
#include <gtest/gtest.h>
#include <span>
TEST(span_suite, basic_usage)
{
std::array numbers{1,2,3,4,5};
std::span view(numbers);
ASSERT_EQ(view[2], 3);
ASSERT_EQ(view.size(), 5);
}
Is A Range#
#include <gtest/gtest.h>
#include <span>
#include <ranges>
TEST(span_suite, is_a_range)
{
std::array numbers{1,2,3,4,5};
std::span view(numbers);
std::vector<decltype(numbers)::value_type> resulting;
for (auto elem: view | std::views::drop(3))
resulting.push_back(elem);
ASSERT_EQ(resulting[0], 4);
ASSERT_EQ(resulting[1], 5);
}
Compile Time vs. Runtime .size()
#
#include <gtest/gtest.h>
#include <span>
TEST(span_suite, compiletime)
{
std::array numbers{1,2,3,4,5};
std::span view(numbers);
static_assert(view.size() == 5);
}
#include <gtest/gtest.h>
#include <span>
TEST(span_suite, runtime)
{
std::vector numbers{1,2,3,4,5};
std::span view(numbers);
ASSERT_EQ(view.size(), 5);
}
Static vs. Dynamic Extent ⟶ constexpr
All The Things#
#include <gtest/gtest.h>
#include <span>
TEST(span_suite, static_extent)
{
std::array numbers{1,2,3,4,5}; // <-- 5 at compile time
std::span span(numbers);
static_assert(span.extent == 5); // <-- constexpr
if constexpr (span.extent != std::dynamic_extent)
/*do_something*/;
else
/*do_something_else*/;
}
#include <gtest/gtest.h>
#include <span>
TEST(span_suite, dynamic_extent)
{
std::vector numbers{1,2,3,4,5}; // <-- 5 at runtime
std::span span(numbers);
static_assert(span.extent == std::dynamic_extent); // <-- constexpr
if constexpr (span.extent != std::dynamic_extent)
/*do_something*/;
else
/*do_something_else*/;
}