mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-28 11:36:06 +00:00

This defines a new policy for removal of transitive includes. The goal of the policy it to make it relatively easy to remove headers when needed, but avoid breaking developers using and vendors shipping libc++. The method used is to guard transitive includes based on the C++ language version. For the upcoming C++23 we can remove headers when we want, but for other language versions we try to keep it to a minimum. In this code the transitive include of `<chrono>` is removed since D128577 introduces a header cycle between `<format>` and `<chrono>`. This cycle is indirectly required by the Standard. Our cycle dependency tool basically is a grep based tool, so it needs some hints to ignore cycles. With the input of our transitive include tests we can create a better tool. However that's out of the scope of this patch. Note the flag `_LIBCPP_REMOVE_TRANSITIVE_INCLUDES` remains unchanged. So users can still opt-out of transitives includes entirely. Reviewed By: #libc, ldionne, philnik Differential Revision: https://reviews.llvm.org/D132284
79 lines
2.3 KiB
C++
79 lines
2.3 KiB
C++
// -*- C++ -*-
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef _LIBCPP_EXPERIMENTAL_UNORDERED_MAP
|
|
#define _LIBCPP_EXPERIMENTAL_UNORDERED_MAP
|
|
|
|
/*
|
|
experimental/unordered_map synopsis
|
|
|
|
// C++1z
|
|
namespace std {
|
|
namespace experimental {
|
|
inline namespace fundamentals_v1 {
|
|
namespace pmr {
|
|
|
|
template <class Key, class T,
|
|
class Hash = hash<Key>,
|
|
class Pred = equal_to<Key>>
|
|
using unordered_map =
|
|
std::unordered_map<Key, T, Hash, Pred,
|
|
polymorphic_allocator<pair<const Key,T>>>;
|
|
|
|
template <class Key, class T,
|
|
class Hash = hash<Key>,
|
|
class Pred = equal_to<Key>>
|
|
using unordered_multimap =
|
|
std::unordered_multimap<Key, T, Hash, Pred,
|
|
polymorphic_allocator<pair<const Key,T>>>;
|
|
|
|
} // namespace pmr
|
|
} // namespace fundamentals_v1
|
|
} // namespace experimental
|
|
} // namespace std
|
|
|
|
*/
|
|
|
|
#include <__assert> // all public C++ headers provide the assertion handler
|
|
#include <experimental/__config>
|
|
#include <experimental/memory_resource>
|
|
#include <unordered_map>
|
|
|
|
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
|
|
# include <algorithm>
|
|
# include <array>
|
|
# include <bit>
|
|
# include <functional>
|
|
# include <vector>
|
|
#endif
|
|
|
|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
|
# pragma GCC system_header
|
|
#endif
|
|
|
|
_LIBCPP_BEGIN_NAMESPACE_LFTS_PMR
|
|
|
|
#ifndef _LIBCPP_CXX03_LANG
|
|
|
|
template <class _Key, class _Value,
|
|
class _Hash = hash<_Key>, class _Pred = equal_to<_Key>>
|
|
using unordered_map = _VSTD::unordered_map<_Key, _Value, _Hash, _Pred,
|
|
polymorphic_allocator<pair<const _Key, _Value>>>;
|
|
|
|
template <class _Key, class _Value,
|
|
class _Hash = hash<_Key>, class _Pred = equal_to<_Key>>
|
|
using unordered_multimap = _VSTD::unordered_multimap<_Key, _Value, _Hash, _Pred,
|
|
polymorphic_allocator<pair<const _Key, _Value>>>;
|
|
|
|
#endif // _LIBCPP_CXX03_LANG
|
|
|
|
_LIBCPP_END_NAMESPACE_LFTS_PMR
|
|
|
|
#endif /* _LIBCPP_EXPERIMENTAL_UNORDERED_MAP */
|