80 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			2.4 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___FORMAT_FORMAT_ARGS_H
 | 
						|
#define _LIBCPP___FORMAT_FORMAT_ARGS_H
 | 
						|
 | 
						|
#include <__availability>
 | 
						|
#include <__config>
 | 
						|
#include <__format/format_arg.h>
 | 
						|
#include <__format/format_arg_store.h>
 | 
						|
#include <__format/format_fwd.h>
 | 
						|
#include <cstddef>
 | 
						|
#include <cstdint>
 | 
						|
 | 
						|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 | 
						|
#  pragma GCC system_header
 | 
						|
#endif
 | 
						|
 | 
						|
_LIBCPP_BEGIN_NAMESPACE_STD
 | 
						|
 | 
						|
#if _LIBCPP_STD_VER > 17
 | 
						|
 | 
						|
template <class _Context>
 | 
						|
class _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT basic_format_args {
 | 
						|
public:
 | 
						|
  _LIBCPP_HIDE_FROM_ABI basic_format_args() noexcept = default;
 | 
						|
 | 
						|
  template <class... _Args>
 | 
						|
  _LIBCPP_HIDE_FROM_ABI basic_format_args(const __format_arg_store<_Context, _Args...>& __store) noexcept
 | 
						|
      : __size_(sizeof...(_Args)) {
 | 
						|
    if constexpr (sizeof...(_Args) != 0) {
 | 
						|
      if constexpr (__format::__use_packed_format_arg_store(sizeof...(_Args))) {
 | 
						|
        __values_ = __store.__storage.__values_;
 | 
						|
        __types_ = __store.__storage.__types_;
 | 
						|
      } else
 | 
						|
        __args_ = __store.__storage.__args_;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  _LIBCPP_HIDE_FROM_ABI
 | 
						|
  basic_format_arg<_Context> get(size_t __id) const noexcept {
 | 
						|
    if (__id >= __size_)
 | 
						|
      return basic_format_arg<_Context>{};
 | 
						|
 | 
						|
    if (__format::__use_packed_format_arg_store(__size_))
 | 
						|
      return basic_format_arg<_Context>{__format::__get_packed_type(__types_, __id), __values_[__id]};
 | 
						|
 | 
						|
    return __args_[__id];
 | 
						|
  }
 | 
						|
 | 
						|
  _LIBCPP_HIDE_FROM_ABI size_t __size() const noexcept { return __size_; }
 | 
						|
 | 
						|
private:
 | 
						|
  size_t __size_{0};
 | 
						|
  // [format.args]/5
 | 
						|
  // [Note 1: Implementations are encouraged to optimize the representation of
 | 
						|
  // basic_format_args for small number of formatting arguments by storing
 | 
						|
  // indices of type alternatives separately from values and packing the
 | 
						|
  // former. - end note]
 | 
						|
  union {
 | 
						|
    struct {
 | 
						|
      const __basic_format_arg_value<_Context>* __values_;
 | 
						|
      uint64_t __types_;
 | 
						|
    };
 | 
						|
    const basic_format_arg<_Context>* __args_;
 | 
						|
  };
 | 
						|
};
 | 
						|
 | 
						|
#endif //_LIBCPP_STD_VER > 17
 | 
						|
 | 
						|
_LIBCPP_END_NAMESPACE_STD
 | 
						|
 | 
						|
#endif // _LIBCPP___FORMAT_FORMAT_ARGS_H
 |