xref: /openbsd-src/gnu/llvm/libcxx/include/__format/format_args.h (revision 4bdff4bed0e3d54e55670334c7d0077db4170f86)
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