// 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 #include #include #include #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 FakeUniquePtr : public std::unique_ptr { public: using std::unique_ptr::unique_ptr; ~FakeUniquePtr() { std::unique_ptr::release(); } }; // Type-deducing wrapper for FakeUniquePtr. template FakeUniquePtr MakeFakeUniquePtr(T* arg) { return FakeUniquePtr(arg); } // Convenience routine for "int-fected" code, so that the stl collection // size_t size() method return values will be checked. template ResultType CollectionSize(const Collection& collection) { return pdfium::checked_cast(collection.size()); } // Convenience routine for "int-fected" code, to handle signed indicies. The // compiler can deduce the type, making this more convenient than the above. template bool IndexInBounds(const Collection& collection, IndexType index) { return index >= 0 && index < CollectionSize(collection); } // Equivalent of C++20 std::ranges::fill(). template void Fill(T&& container, const V& value) { std::fill(std::begin(container), std::end(container), 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 void Copy(const T& source_container, U&& dest_container) { static_assert(sizeof(source_container[0]) == sizeof(dest_container[0])); CHECK_GE(std::size(dest_container), std::size(source_container)); std::copy(std::begin(source_container), std::end(source_container), std::begin(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 constexpr std::array ToArrayImpl(const T (&data)[N], std::index_sequence) { // SAFETY: compiler-deduced size `N`. return UNSAFE_BUFFERS({{static_cast(data[I])...}}); } template constexpr std::array ToArray(const U (&data)[N]) { return ToArrayImpl(data, std::make_index_sequence()); } } // namespace fxcrt #endif // CORE_FXCRT_STL_UTIL_H_