78 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// REQUIRES: std-at-least-c++2310 11// <ranges>12 13// join_with_view()14// requires default_initializable<V> && default_initializable<Pattern> = default;15 16#include <ranges>17 18#include <algorithm>19#include <array>20#include <cassert>21#include <type_traits>22 23static constexpr auto view = std::to_array<std::array<int, 2>>({{1, 2}, {3, 4}, {5, 6}});24 25struct TrivialView : std::ranges::view_base {26 int val_; // intentionally uninitialized27 28 constexpr auto begin() { return view.data(); }29 constexpr auto end() { return view.data() + view.size(); }30};31 32static_assert(std::is_trivially_copyable_v<TrivialView> && std::is_trivially_default_constructible_v<TrivialView>);33 34struct NonDefaultConstructibleView : TrivialView {35 NonDefaultConstructibleView(int);36};37 38struct TrivialPattern : std::ranges::view_base {39 int val_; // intentionally uninitialized40 41 constexpr int* begin() { return &val_; }42 constexpr int* end() { return &val_ + 1; }43};44 45static_assert(std::is_trivially_copyable_v<TrivialPattern> &&46 std::is_trivially_default_constructible_v<TrivialPattern>);47 48struct NonDefaultConstructiblePattern : TrivialPattern {49 NonDefaultConstructiblePattern(int);50};51 52constexpr bool test() {53 { // Check if `base_` and `pattern_` are value initialised54 std::ranges::join_with_view<TrivialView, TrivialPattern> v;55 assert(std::move(v).base().val_ == 0);56 assert(std::ranges::equal(v, std::array{1, 2, 0, 3, 4, 0, 5, 6}));57 }58 59 { // Default constructor should not be explicit60 [[maybe_unused]] std::ranges::join_with_view<TrivialView, TrivialPattern> v = {};61 }62 63 static_assert(std::default_initializable<std::ranges::join_with_view<TrivialView, TrivialPattern>>);64 static_assert(!std::default_initializable<std::ranges::join_with_view<TrivialView, NonDefaultConstructiblePattern>>);65 static_assert(!std::default_initializable<std::ranges::join_with_view<NonDefaultConstructibleView, TrivialPattern>>);66 static_assert(!std::default_initializable<67 std::ranges::join_with_view<NonDefaultConstructibleView, NonDefaultConstructiblePattern>>);68 69 return true;70}71 72int main(int, char**) {73 test();74 static_assert(test());75 76 return 0;77}78