brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.0 KiB · 61fa350 Raw
95 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_NAIVE_STATIC_VECTOR_H10#define SUPPORT_NAIVE_STATIC_VECTOR_H11 12#include <cstddef>13#include <utility>14#include "test_iterators.h"15#include "test_macros.h"16 17template <class T, std::size_t N>18struct NaiveStaticVector {19  struct CapacityError {};20 21  using value_type      = T;22  using difference_type = short;23  using size_type       = unsigned short;24  using iterator        = random_access_iterator<T*>;25  using const_iterator  = random_access_iterator<const T*>;26 27  explicit NaiveStaticVector() = default;28  template <class It>29  explicit NaiveStaticVector(It first, It last) {30    while (first != last)31      insert(*first++);32  }33 34  // Moving-from a NaiveStaticVector leaves the source vector holding moved-from objects.35  // This is intentional (the "Naive" in the name).36  // Specifically, moving-out-of a sorted+uniqued NaiveStaticVector<MoveOnly>37  // will leave it in a non-sorted+uniqued state.38 39  NaiveStaticVector(const NaiveStaticVector&)            = default;40  NaiveStaticVector(NaiveStaticVector&&)                 = default; // deliberately don't reset size_41  NaiveStaticVector& operator=(const NaiveStaticVector&) = default;42  NaiveStaticVector& operator=(NaiveStaticVector&&)      = default;43 44  iterator begin() { return iterator(data_); }45  const_iterator begin() const { return const_iterator(data_); }46  const_iterator cbegin() const { return const_iterator(data_); }47  iterator end() { return begin() + size(); }48  const_iterator end() const { return begin() + size(); }49  size_type size() const { return size_; }50  bool empty() const { return size_ == 0; }51 52  void clear() { size_ = 0; }53 54  template <class It>55  iterator insert(const_iterator pos, It first, It last) {56    iterator result = pos - cbegin() + begin();57    while (first != last) {58      insert(pos++, *first++);59    }60    return result;61  }62 63  iterator insert(const_iterator pos, T value) {64    if (size_ == N) {65      throw CapacityError();66    }67    int i = pos - cbegin();68    size_ += 1;69    std::move_backward(&data_[i], &data_[size_ - 1], &data_[size_]);70    data_[i] = std::move(value);71    return begin() + i;72  }73 74  template <class... Args>75  iterator emplace(const_iterator pos, Args&&... args) {76    return insert(pos, T(std::forward<Args>(args)...));77  }78 79  iterator erase(const_iterator first, const_iterator last) {80    int i = first - cbegin();81    int j = last - cbegin();82    std::move(&data_[j], &data_[size_], &data_[i]);83    size_ -= (last - first);84    return begin() + i;85  }86 87  iterator erase(const_iterator pos) { return erase(pos, std::next(pos)); }88 89private:90  T data_[N];91  std::size_t size_ = 0;92};93 94#endif // SUPPORT_NAIVE_STATIC_VECTOR_H95