1*4bdff4beSrobert // -*- C++ -*- 2*4bdff4beSrobert //===----------------------------------------------------------------------===// 3*4bdff4beSrobert // 4*4bdff4beSrobert // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5*4bdff4beSrobert // See https://llvm.org/LICENSE.txt for license information. 6*4bdff4beSrobert // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7*4bdff4beSrobert // 8*4bdff4beSrobert //===----------------------------------------------------------------------===// 9*4bdff4beSrobert 10*4bdff4beSrobert #ifndef _LIBCPP___FORMAT_FORMAT_ARGS_H 11*4bdff4beSrobert #define _LIBCPP___FORMAT_FORMAT_ARGS_H 12*4bdff4beSrobert 13*4bdff4beSrobert #include <__availability> 14*4bdff4beSrobert #include <__config> 15*4bdff4beSrobert #include <__format/format_arg.h> 16*4bdff4beSrobert #include <__format/format_arg_store.h> 17*4bdff4beSrobert #include <__format/format_fwd.h> 18*4bdff4beSrobert #include <cstddef> 19*4bdff4beSrobert #include <cstdint> 20*4bdff4beSrobert 21*4bdff4beSrobert #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 22*4bdff4beSrobert # pragma GCC system_header 23*4bdff4beSrobert #endif 24*4bdff4beSrobert 25*4bdff4beSrobert _LIBCPP_BEGIN_NAMESPACE_STD 26*4bdff4beSrobert 27*4bdff4beSrobert #if _LIBCPP_STD_VER > 17 28*4bdff4beSrobert 29*4bdff4beSrobert template <class _Context> 30*4bdff4beSrobert class _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT basic_format_args { 31*4bdff4beSrobert public: 32*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI basic_format_args() noexcept = default; 33*4bdff4beSrobert 34*4bdff4beSrobert template <class... _Args> basic_format_args(const __format_arg_store<_Context,_Args...> & __store)35*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI basic_format_args(const __format_arg_store<_Context, _Args...>& __store) noexcept 36*4bdff4beSrobert : __size_(sizeof...(_Args)) { 37*4bdff4beSrobert if constexpr (sizeof...(_Args) != 0) { 38*4bdff4beSrobert if constexpr (__format::__use_packed_format_arg_store(sizeof...(_Args))) { 39*4bdff4beSrobert __values_ = __store.__storage.__values_; 40*4bdff4beSrobert __types_ = __store.__storage.__types_; 41*4bdff4beSrobert } else 42*4bdff4beSrobert __args_ = __store.__storage.__args_; 43*4bdff4beSrobert } 44*4bdff4beSrobert } 45*4bdff4beSrobert 46*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI get(size_t __id)47*4bdff4beSrobert basic_format_arg<_Context> get(size_t __id) const noexcept { 48*4bdff4beSrobert if (__id >= __size_) 49*4bdff4beSrobert return basic_format_arg<_Context>{}; 50*4bdff4beSrobert 51*4bdff4beSrobert if (__format::__use_packed_format_arg_store(__size_)) 52*4bdff4beSrobert return basic_format_arg<_Context>{__format::__get_packed_type(__types_, __id), __values_[__id]}; 53*4bdff4beSrobert 54*4bdff4beSrobert return __args_[__id]; 55*4bdff4beSrobert } 56*4bdff4beSrobert __size()57*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI size_t __size() const noexcept { return __size_; } 58*4bdff4beSrobert 59*4bdff4beSrobert private: 60*4bdff4beSrobert size_t __size_{0}; 61*4bdff4beSrobert // [format.args]/5 62*4bdff4beSrobert // [Note 1: Implementations are encouraged to optimize the representation of 63*4bdff4beSrobert // basic_format_args for small number of formatting arguments by storing 64*4bdff4beSrobert // indices of type alternatives separately from values and packing the 65*4bdff4beSrobert // former. - end note] 66*4bdff4beSrobert union { 67*4bdff4beSrobert struct { 68*4bdff4beSrobert const __basic_format_arg_value<_Context>* __values_; 69*4bdff4beSrobert uint64_t __types_; 70*4bdff4beSrobert }; 71*4bdff4beSrobert const basic_format_arg<_Context>* __args_; 72*4bdff4beSrobert }; 73*4bdff4beSrobert }; 74*4bdff4beSrobert _LIBCPP_CTAD_SUPPORTED_FOR_TYPE(basic_format_args); 75*4bdff4beSrobert 76*4bdff4beSrobert #endif //_LIBCPP_STD_VER > 17 77*4bdff4beSrobert 78*4bdff4beSrobert _LIBCPP_END_NAMESPACE_STD 79*4bdff4beSrobert 80*4bdff4beSrobert #endif // _LIBCPP___FORMAT_FORMAT_ARGS_H 81