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*/;
}