chromium/third_party/pdfium/core/fxcrt/stl_util.h

// Copyright 2015 The PDFium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CORE_FXCRT_STL_UTIL_H_
#define CORE_FXCRT_STL_UTIL_H_

#include <algorithm>
#include <array>
#include <iterator>
#include <memory>

#include "core/fxcrt/check_op.h"
#include "core/fxcrt/compiler_specific.h"
#include "core/fxcrt/numerics/safe_conversions.h"

namespace fxcrt {

// Means of generating a key for searching STL collections of std::unique_ptr
// that avoids the side effect of deleting the pointer.
template <class T>
class FakeUniquePtr : public std::unique_ptr<T> {};

// Type-deducing wrapper for FakeUniquePtr<T>.
template <class T>
FakeUniquePtr<T> MakeFakeUniquePtr(T* arg) {}

// Convenience routine for "int-fected" code, so that the stl collection
// size_t size() method return values will be checked.
template <typename ResultType, typename Collection>
ResultType CollectionSize(const Collection& collection) {}

// Convenience routine for "int-fected" code, to handle signed indicies. The
// compiler can deduce the type, making this more convenient than the above.
template <typename IndexType, typename Collection>
bool IndexInBounds(const Collection& collection, IndexType index) {}

// Equivalent of C++20 std::ranges::fill().
template <typename T, typename V>
void Fill(T&& container, const V& value) {}

// Non-flawed version of C++20 std::ranges::copy(), which takes an output
// range as the second parameter and CHECKS() if it not sufficiently sized.
template <typename T, typename U>
void Copy(const T& source_container, U&& dest_container) {}

// ToArray<>() implementation as taken from chromium /base. Replace with
// std::to_array<>() when C++20 becomes available.
//
// Helper inspired by C++20's std::to_array to convert a C-style array to a
// std::array. As opposed to the C++20 version this implementation does not
// provide an overload for rvalues and does not strip cv qualifers from the
// returned std::array::value_type. The returned value_type needs to be
// specified explicitly, allowing the construction of std::arrays with const
// elements.
//
// Reference: https://en.cppreference.com/w/cpp/container/array/to_array
template <typename U, typename T, size_t N, size_t... I>
constexpr std::array<U, N> ToArrayImpl(const T (&data)[N],
                                       std::index_sequence<I...>) {}

template <typename U, size_t N>
constexpr std::array<U, N> ToArray(const U (&data)[N]) {}

}  // namespace fxcrt

#endif  // CORE_FXCRT_STL_UTIL_H_