diff --git a/libcxx/include/CMakeLists.txt b/libcxx/include/CMakeLists.txt --- a/libcxx/include/CMakeLists.txt +++ b/libcxx/include/CMakeLists.txt @@ -8,6 +8,7 @@ __debug __errc __format/format_error.h + __format/format_parse_context.h __function_like.h __functional_03 __functional_base diff --git a/libcxx/include/format b/libcxx/include/__format/format_parse_context.h copy from libcxx/include/format copy to libcxx/include/__format/format_parse_context.h --- a/libcxx/include/format +++ b/libcxx/include/__format/format_parse_context.h @@ -1,5 +1,5 @@ // -*- C++ -*- -//===--------------------------- format -----------------------------------===// +//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -7,61 +7,15 @@ // //===----------------------------------------------------------------------===// -#ifndef _LIBCPP_FORMAT -#define _LIBCPP_FORMAT - -/* - -namespace std { - // [format.error], class format_error - class format_error : public runtime_error { - public: - explicit format_error(const string& what_arg); - explicit format_error(const char* what_arg); - }; - - // [format.parse.ctx], class template basic_format_parse_context - template - class basic_format_parse_context { - public: - using char_type = charT; - using const_iterator = typename basic_string_view::const_iterator; - using iterator = const_iterator; - - private: - iterator begin_; // exposition only - iterator end_; // exposition only - enum indexing { unknown, manual, automatic }; // exposition only - indexing indexing_; // exposition only - size_t next_arg_id_; // exposition only - size_t num_args_; // exposition only - - public: - constexpr explicit basic_format_parse_context(basic_string_view fmt, - size_t num_args = 0) noexcept; - basic_format_parse_context(const basic_format_parse_context&) = delete; - basic_format_parse_context& operator=(const basic_format_parse_context&) = delete; - - constexpr const_iterator begin() const noexcept; - constexpr const_iterator end() const noexcept; - constexpr void advance_to(const_iterator it); - - constexpr size_t next_arg_id(); - constexpr void check_arg_id(size_t id); - }; - using format_parse_context = basic_format_parse_context; - using wformat_parse_context = basic_format_parse_context; -} - -*/ +#ifndef _LIBCPP___FORMAT_FORMAT_PARSE_CONTEXT_H +#define _LIBCPP___FORMAT_FORMAT_PARSE_CONTEXT_H #include <__config> #include <__format/format_error.h> #include -#include #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) -# pragma GCC system_header +#pragma GCC system_header #endif _LIBCPP_PUSH_MACROS @@ -75,20 +29,19 @@ // If the compiler has no concepts support, the format header will be disabled. // Without concepts support enable_if needs to be used and that too much effort // to support compilers with partial C++20 support. -#if !defined(_LIBCPP_HAS_NO_CONCEPTS) && !defined(_LIBCPP_HAS_NO_BUILTIN_IS_CONSTANT_EVALUATED) +#if !defined(_LIBCPP_HAS_NO_CONCEPTS) && \ + !defined(_LIBCPP_HAS_NO_BUILTIN_IS_CONSTANT_EVALUATED) template class _LIBCPP_TEMPLATE_VIS basic_format_parse_context { public: using char_type = _CharT; - using const_iterator = - typename basic_string_view<_CharT>::const_iterator; + using const_iterator = typename basic_string_view<_CharT>::const_iterator; using iterator = const_iterator; -public: _LIBCPP_INLINE_VISIBILITY - constexpr explicit basic_format_parse_context( - basic_string_view<_CharT> __fmt, size_t __num_args = 0) noexcept + constexpr explicit basic_format_parse_context(basic_string_view<_CharT> __fmt, + size_t __num_args = 0) noexcept : __begin_(__fmt.begin()), __end_(__fmt.end()), __indexing_(__unknown), @@ -150,10 +103,11 @@ using wformat_parse_context = basic_format_parse_context; #endif // !defined(_LIBCPP_HAS_NO_CONCEPTS) && !defined(_LIBCPP_HAS_NO_BUILTIN_IS_CONSTANT_EVALUATED) + #endif //_LIBCPP_STD_VER > 17 _LIBCPP_END_NAMESPACE_STD _LIBCPP_POP_MACROS -#endif // _LIBCPP_FORMAT +#endif // _LIBCPP___FORMAT_FORMAT_PARSE_CONTEXT_H diff --git a/libcxx/include/format b/libcxx/include/format --- a/libcxx/include/format +++ b/libcxx/include/format @@ -57,7 +57,7 @@ #include <__config> #include <__format/format_error.h> -#include +#include <__format/format_parse_context.h> #include #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) @@ -71,85 +71,6 @@ #if _LIBCPP_STD_VER > 17 -// TODO FMT Remove this once we require compilers with proper C++20 support. -// If the compiler has no concepts support, the format header will be disabled. -// Without concepts support enable_if needs to be used and that too much effort -// to support compilers with partial C++20 support. -#if !defined(_LIBCPP_HAS_NO_CONCEPTS) && !defined(_LIBCPP_HAS_NO_BUILTIN_IS_CONSTANT_EVALUATED) - -template -class _LIBCPP_TEMPLATE_VIS basic_format_parse_context { -public: - using char_type = _CharT; - using const_iterator = - typename basic_string_view<_CharT>::const_iterator; - using iterator = const_iterator; - -public: - _LIBCPP_INLINE_VISIBILITY - constexpr explicit basic_format_parse_context( - basic_string_view<_CharT> __fmt, size_t __num_args = 0) noexcept - : __begin_(__fmt.begin()), - __end_(__fmt.end()), - __indexing_(__unknown), - __next_arg_id_(0), - __num_args_(__num_args) {} - - basic_format_parse_context(const basic_format_parse_context&) = delete; - basic_format_parse_context& - operator=(const basic_format_parse_context&) = delete; - - _LIBCPP_INLINE_VISIBILITY constexpr const_iterator begin() const noexcept { - return __begin_; - } - _LIBCPP_INLINE_VISIBILITY constexpr const_iterator end() const noexcept { - return __end_; - } - _LIBCPP_INLINE_VISIBILITY constexpr void advance_to(const_iterator __it) { - __begin_ = __it; - } - - _LIBCPP_INLINE_VISIBILITY constexpr size_t next_arg_id() { - if (__indexing_ == __manual) - __throw_format_error("Using automatic argument numbering in manual " - "argument numbering mode"); - - if (__indexing_ == __unknown) - __indexing_ = __automatic; - return __next_arg_id_++; - } - _LIBCPP_INLINE_VISIBILITY constexpr void check_arg_id(size_t __id) { - if (__indexing_ == __automatic) - __throw_format_error("Using manual argument numbering in automatic " - "argument numbering mode"); - - if (__indexing_ == __unknown) - __indexing_ = __manual; - - // Throws an exception to make the expression a non core constant - // expression as required by: - // [format.parse.ctx]/11 - // Remarks: Call expressions where id >= num_args_ are not core constant - // expressions ([expr.const]). - // Note: the Throws clause [format.parse.ctx]/10 doesn't specify the - // behavior when id >= num_args_. - if (is_constant_evaluated() && __id >= __num_args_) - __throw_format_error("Argument index outside the valid range"); - } - -private: - iterator __begin_; - iterator __end_; - enum _Indexing { __unknown, __manual, __automatic }; - _Indexing __indexing_; - size_t __next_arg_id_; - size_t __num_args_; -}; - -using format_parse_context = basic_format_parse_context; -using wformat_parse_context = basic_format_parse_context; - -#endif // !defined(_LIBCPP_HAS_NO_CONCEPTS) && !defined(_LIBCPP_HAS_NO_BUILTIN_IS_CONSTANT_EVALUATED) #endif //_LIBCPP_STD_VER > 17 _LIBCPP_END_NAMESPACE_STD