brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.1 KiB · d7d89f5 Raw
121 lines · c
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#ifndef SUPPORT_INSERT_RANGE_HELPERS_H10#define SUPPORT_INSERT_RANGE_HELPERS_H11 12#include <algorithm>13#include <array>14#include <cassert>15#include <concepts>16#include <map>17#include <ranges>18#include <set>19#include <type_traits>20#include <unordered_map>21#include <unordered_set>22#include <vector>23 24#include "exception_safety_helpers.h"25#include "from_range_helpers.h"26#include "min_allocator.h"27#include "test_allocator.h"28#include "test_iterators.h"29#include "test_macros.h"30#include "type_algorithms.h"31 32// A simple literal-type container. It can be used as a `constexpr` global variable (which isn't supported by33// `std::vector`).34template <class T, std::size_t N = 32>35class Buffer {36public:37  constexpr Buffer() = default;38 39  constexpr Buffer(std::initializer_list<T> input) {40    assert(input.size() <= N);41    std::ranges::copy(input, data_);42    size_ = input.size();43  }44 45  // Makes initializing `Buffer<char>` nicer -- allows writing `buf = "abc"` instead of `buf = {'a', 'b', 'c'}`.46  // To make the two forms equivalent, omits the terminating null.47  template <std::size_t N2>48  constexpr Buffer(const char (&input)[N2])49    requires std::same_as<T, char>50  {51    static_assert(N2 <= N);52    std::ranges::copy(input, data_);53    // Omit the terminating null.54    size_ = input[N2 - 1] == '\0' ? N2 - 1 : N2;55  }56 57  constexpr const T* begin() const { return data_; }58  constexpr const T* end() const { return data_ + size_; }59  constexpr std::size_t size() const { return size_; }60 61private:62  std::size_t size_ = 0;63  T data_[N]        = {};64};65 66template <class T>67struct TestCase {68  Buffer<T> initial;69  std::size_t index = 0;70  Buffer<T> input;71  Buffer<T> expected;72};73 74template <class T, class PtrT, class Func>75constexpr void for_all_iterators_and_allocators(Func f) {76  using Iterators =77      types::type_list< cpp20_input_iterator<PtrT>,78                        forward_iterator<PtrT>,79                        bidirectional_iterator<PtrT>,80                        random_access_iterator<PtrT>,81                        contiguous_iterator<PtrT>,82                        PtrT >;83 84  types::for_each(Iterators{}, [=]<class Iter>() {85    f.template operator()<Iter, sentinel_wrapper<Iter>, std::allocator<T>>();86    f.template operator()<Iter, sentinel_wrapper<Iter>, test_allocator<T>>();87    f.template operator()<Iter, sentinel_wrapper<Iter>, min_allocator<T>>();88    f.template operator()<Iter, sentinel_wrapper<Iter>, safe_allocator<T>>();89 90    if constexpr (std::sentinel_for<Iter, Iter>) {91      f.template operator()<Iter, Iter, std::allocator<T>>();92      f.template operator()<Iter, Iter, test_allocator<T>>();93      f.template operator()<Iter, Iter, min_allocator<T>>();94      f.template operator()<Iter, Iter, safe_allocator<T>>();95    }96  });97}98 99// Uses a shorter list of iterator types for use in `constexpr` mode for cases when running the full set in would take100// too long.101template <class T, class PtrT, class Func>102constexpr void for_all_iterators_and_allocators_constexpr(Func f) {103  using Iterators = types::type_list< cpp20_input_iterator<PtrT>, forward_iterator<PtrT>, PtrT >;104 105  types::for_each(Iterators{}, [=]<class Iter>() {106    f.template operator()<Iter, sentinel_wrapper<Iter>, std::allocator<T>>();107    f.template operator()<Iter, sentinel_wrapper<Iter>, test_allocator<T>>();108    f.template operator()<Iter, sentinel_wrapper<Iter>, min_allocator<T>>();109    f.template operator()<Iter, sentinel_wrapper<Iter>, safe_allocator<T>>();110 111    if constexpr (std::sentinel_for<Iter, Iter>) {112      f.template operator()<Iter, Iter, std::allocator<T>>();113      f.template operator()<Iter, Iter, test_allocator<T>>();114      f.template operator()<Iter, Iter, min_allocator<T>>();115      f.template operator()<Iter, Iter, safe_allocator<T>>();116    }117  });118}119 120#endif // SUPPORT_INSERT_RANGE_HELPERS_H121