__formatter_chrono(_ChronoSpec<_CharT> __spec) noexcept
: _M_spec(__spec)
{ }
-
+
constexpr typename basic_format_parse_context<_CharT>::iterator
_M_parse(basic_format_parse_context<_CharT>& __pc, _ChronoParts __parts,
const _ChronoSpec<_CharT>& __def)
};
#if __glibcxx_print >= 202406L
+ // _GLIBCXX_RESOLVE_LIB_DEFECTS
+ // 4400. enable_nonlocking_formatter_optimization for durations with custom rep
template<typename _Rep, typename _Period>
constexpr bool
enable_nonlocking_formatter_optimization<chrono::duration<_Rep, _Period>>
- = enable_nonlocking_formatter_optimization<_Rep>;
+ = is_arithmetic_v<_Rep>;
#endif
template<__format::__char _CharT>
};
#if __glibcxx_print >= 202406L
- template<typename _Duration>
- constexpr bool
- enable_nonlocking_formatter_optimization<chrono::hh_mm_ss<_Duration>>
- = true;
+ // _GLIBCXX_RESOLVE_LIB_DEFECTS
+ // 4400. enable_nonlocking_formatter_optimization for durations with custom rep
+ template<typename _Duration>
+ constexpr bool
+ enable_nonlocking_formatter_optimization<chrono::hh_mm_ss<_Duration>>
+ = enable_nonlocking_formatter_optimization<_Duration>;
#endif
#if _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI
};
#if __glibcxx_print >= 202406L
- template<typename _Duration>
- constexpr bool
- enable_nonlocking_formatter_optimization<chrono::sys_time<_Duration>>
- = true;
+ // _GLIBCXX_RESOLVE_LIB_DEFECTS
+ // 4400. enable_nonlocking_formatter_optimization for durations with custom rep
+ template<typename _Duration>
+ constexpr bool
+ enable_nonlocking_formatter_optimization<chrono::sys_time<_Duration>>
+ = enable_nonlocking_formatter_optimization<_Duration>;
#endif
template<typename _Duration, __format::__char _CharT>
};
#if __glibcxx_print >= 202406L
- template<typename _Duration>
- constexpr bool
- enable_nonlocking_formatter_optimization<chrono::utc_time<_Duration>>
- = true;
+ // _GLIBCXX_RESOLVE_LIB_DEFECTS
+ // 4400. enable_nonlocking_formatter_optimization for durations with custom rep
+ template<typename _Duration>
+ constexpr bool
+ enable_nonlocking_formatter_optimization<chrono::utc_time<_Duration>>
+ = enable_nonlocking_formatter_optimization<_Duration>;
#endif
template<typename _Duration, __format::__char _CharT>
};
#if __glibcxx_print >= 202406L
- template<typename _Duration>
- constexpr bool
- enable_nonlocking_formatter_optimization<chrono::tai_time<_Duration>>
- = true;
+ // _GLIBCXX_RESOLVE_LIB_DEFECTS
+ // 4400. enable_nonlocking_formatter_optimization for durations with custom rep
+ template<typename _Duration>
+ constexpr bool
+ enable_nonlocking_formatter_optimization<chrono::tai_time<_Duration>>
+ = enable_nonlocking_formatter_optimization<_Duration>;
#endif
template<typename _Duration, __format::__char _CharT>
};
#if __glibcxx_print >= 202406L
- template<typename _Duration>
- constexpr bool
- enable_nonlocking_formatter_optimization<chrono::gps_time<_Duration>>
- = true;
+ // _GLIBCXX_RESOLVE_LIB_DEFECTS
+ // 4400. enable_nonlocking_formatter_optimization for durations with custom rep
+ template<typename _Duration>
+ constexpr bool
+ enable_nonlocking_formatter_optimization<chrono::gps_time<_Duration>>
+ = enable_nonlocking_formatter_optimization<_Duration>;
#endif
template<typename _Duration, __format::__char _CharT>
};
#if __glibcxx_print >= 202406L
- template<typename _Duration>
- constexpr bool
- enable_nonlocking_formatter_optimization<chrono::file_time<_Duration>>
- = true;
+ // _GLIBCXX_RESOLVE_LIB_DEFECTS
+ // 4400. enable_nonlocking_formatter_optimization for durations with custom rep
+ template<typename _Duration>
+ constexpr bool
+ enable_nonlocking_formatter_optimization<chrono::file_time<_Duration>>
+ = enable_nonlocking_formatter_optimization<_Duration>;
#endif
template<typename _Duration, __format::__char _CharT>
};
#if __glibcxx_print >= 202406L
- template<typename _Duration>
- constexpr bool
- enable_nonlocking_formatter_optimization<chrono::local_time<_Duration>>
- = true;
+ // _GLIBCXX_RESOLVE_LIB_DEFECTS
+ // 4400. enable_nonlocking_formatter_optimization for durations with custom rep
+ template<typename _Duration>
+ constexpr bool
+ enable_nonlocking_formatter_optimization<chrono::local_time<_Duration>>
+ = enable_nonlocking_formatter_optimization<_Duration>;
#endif
template<typename _Duration, __format::__char _CharT>
};
#if __glibcxx_print >= 202406L
- template<typename _Duration>
- constexpr bool
- enable_nonlocking_formatter_optimization<
- chrono::__detail::__local_time_fmt<_Duration>> = true;
+ // _GLIBCXX_RESOLVE_LIB_DEFECTS
+ // 4400. enable_nonlocking_formatter_optimization for durations with custom rep
+ template<typename _Duration>
+ constexpr bool
+ enable_nonlocking_formatter_optimization<
+ chrono::__detail::__local_time_fmt<_Duration>>
+ = enable_nonlocking_formatter_optimization<_Duration>;
#endif
#if _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI
};
#if __glibcxx_print >= 202406L
- template<typename _Duration>
- constexpr bool
- enable_nonlocking_formatter_optimization<
- chrono::zoned_time<_Duration, const chrono::time_zone*>> = true;
+ // _GLIBCXX_RESOLVE_LIB_DEFECTS
+ // 4400. enable_nonlocking_formatter_optimization for durations with custom rep
+ template<typename _Duration>
+ constexpr bool
+ enable_nonlocking_formatter_optimization<
+ chrono::zoned_time<_Duration, const chrono::time_zone*>>
+ = enable_nonlocking_formatter_optimization<_Duration>;
#endif
#endif
};
#if __glibcxx_print >= 202406L
+ // _GLIBCXX_RESOLVE_LIB_DEFECTS
+ // 4399. enable_nonlocking_formatter_optimization for pair and tuple needs remove_cvref_t
template<typename _Fp, typename _Sp>
constexpr bool enable_nonlocking_formatter_optimization<pair<_Fp, _Sp>>
- // TODO this should have remove_cvref_t.
- = enable_nonlocking_formatter_optimization<_Fp>
- && enable_nonlocking_formatter_optimization<_Sp>;
+ = enable_nonlocking_formatter_optimization<remove_cvref_t<_Fp>>
+ && enable_nonlocking_formatter_optimization<remove_cvref_t<_Sp>>;
#endif
template<__format::__char _CharT, formattable<_CharT>... _Tps>
};
#if __glibcxx_print >= 202406L
+ // _GLIBCXX_RESOLVE_LIB_DEFECTS
+ // 4399. enable_nonlocking_formatter_optimization for pair and tuple needs remove_cvref_t
template<typename... _Tps>
- // TODO this should have remove_cvref_t.
constexpr bool enable_nonlocking_formatter_optimization<tuple<_Tps...>>
- = (enable_nonlocking_formatter_optimization<_Tps> && ...);
+ = (enable_nonlocking_formatter_optimization<remove_cvref_t<_Tps>> && ...);
#endif
// [format.range.formatter], class template range_formatter
};
#if __glibcxx_print >= 202406L
+ // _GLIBCXX_RESOLVE_LIB_DEFECTS
+ // 4398. enable_nonlocking_formatter_optimization should be disabled for container adaptors
template<typename _Tp, typename _Container>
constexpr bool
- // TODO should be false
- enable_nonlocking_formatter_optimization<queue<_Tp, _Container>> = true;
+ enable_nonlocking_formatter_optimization<queue<_Tp, _Container>> = false;
#endif
template<__format::__char _CharT, typename _Tp,
};
#if __glibcxx_print >= 202406L
+ // _GLIBCXX_RESOLVE_LIB_DEFECTS
+ // 4398. enable_nonlocking_formatter_optimization should be disabled for container adaptors
template<typename _Tp, typename _Container, typename _Comparator>
constexpr bool
- // TODO should be false
enable_nonlocking_formatter_optimization<
- priority_queue<_Tp, _Container, _Comparator>> = true;
+ priority_queue<_Tp, _Container, _Comparator>> = false;
#endif
_GLIBCXX_END_NAMESPACE_VERSION
};
#if __glibcxx_print >= 202406L
+ // _GLIBCXX_RESOLVE_LIB_DEFECTS
+ // 4398. enable_nonlocking_formatter_optimization should be disabled for container adaptors
template<typename _Tp, typename _Container>
constexpr bool
- // TODO should be false
- enable_nonlocking_formatter_optimization<stack<_Tp, _Container>> = true;
+ enable_nonlocking_formatter_optimization<stack<_Tp, _Container>> = false;
#endif
_GLIBCXX_END_NAMESPACE_VERSION
} // namespace std
// Formatter check if container is formattable, not container elements.
static_assert(!std::formattable<Adaptor<int, NotFormattableCont<int>>, CharT>);
- // TODO should be false
- static_assert(std::enable_nonlocking_formatter_optimization<
+ static_assert(!std::enable_nonlocking_formatter_optimization<
Adaptor<int>>);
- static_assert(std::enable_nonlocking_formatter_optimization<
+ static_assert(!std::enable_nonlocking_formatter_optimization<
Adaptor<MutFormat>>);
- static_assert(std::enable_nonlocking_formatter_optimization<
+ static_assert(!std::enable_nonlocking_formatter_optimization<
Adaptor<int, std::deque<int>>>);
- static_assert(std::enable_nonlocking_formatter_optimization<
+ static_assert(!std::enable_nonlocking_formatter_optimization<
Adaptor<int, NotFormattableCont<int>>>);
}
{
static_assert(std::enable_nonlocking_formatter_optimization<
Tuple<int, float>>);
- // TODO missing remove_cv_ref
- static_assert(!std::enable_nonlocking_formatter_optimization<
+ static_assert(std::enable_nonlocking_formatter_optimization<
Tuple<const int, const float>>);
- static_assert(!std::enable_nonlocking_formatter_optimization<
+ static_assert(std::enable_nonlocking_formatter_optimization<
Tuple<int&, float&>>);
static_assert(!std::enable_nonlocking_formatter_optimization<
#endif
template<typename Duration>
-using local_time_fmt
+using local_time_fmt
= decltype(std::chrono::local_time_format(std::chrono::local_time<Duration>{}));
-
+
static_assert(std::enable_nonlocking_formatter_optimization<
std::chrono::seconds>);
static_assert(std::enable_nonlocking_formatter_optimization<
static_assert(!std::enable_nonlocking_formatter_optimization<
BufferedDuration>);
-static_assert(std::enable_nonlocking_formatter_optimization<
+static_assert(!std::enable_nonlocking_formatter_optimization<
std::chrono::local_time<BufferedDuration>>);
-static_assert(std::enable_nonlocking_formatter_optimization<
+static_assert(!std::enable_nonlocking_formatter_optimization<
std::chrono::sys_time<BufferedDuration>>);
-static_assert(std::enable_nonlocking_formatter_optimization<
+static_assert(!std::enable_nonlocking_formatter_optimization<
std::chrono::utc_time<BufferedDuration>>);
-static_assert(std::enable_nonlocking_formatter_optimization<
+static_assert(!std::enable_nonlocking_formatter_optimization<
std::chrono::gps_time<BufferedDuration>>);
-static_assert(std::enable_nonlocking_formatter_optimization<
+static_assert(!std::enable_nonlocking_formatter_optimization<
std::chrono::tai_time<BufferedDuration>>);
-static_assert(std::enable_nonlocking_formatter_optimization<
+static_assert(!std::enable_nonlocking_formatter_optimization<
std::chrono::file_time<BufferedDuration>>);
-static_assert(std::enable_nonlocking_formatter_optimization<
+static_assert(!std::enable_nonlocking_formatter_optimization<
local_time_fmt<BufferedDuration>>);
template<>
using NonBufferedRep = std::chrono::duration<Rep<void, long>>;
-static_assert(std::enable_nonlocking_formatter_optimization<
+static_assert(!std::enable_nonlocking_formatter_optimization<
NonBufferedRep>);
-static_assert(std::enable_nonlocking_formatter_optimization<
+static_assert(!std::enable_nonlocking_formatter_optimization<
std::chrono::local_time<NonBufferedRep>>);
-static_assert(std::enable_nonlocking_formatter_optimization<
+static_assert(!std::enable_nonlocking_formatter_optimization<
std::chrono::sys_time<NonBufferedRep>>);
-static_assert(std::enable_nonlocking_formatter_optimization<
+static_assert(!std::enable_nonlocking_formatter_optimization<
std::chrono::utc_time<NonBufferedRep>>);
-static_assert(std::enable_nonlocking_formatter_optimization<
+static_assert(!std::enable_nonlocking_formatter_optimization<
std::chrono::gps_time<NonBufferedRep>>);
-static_assert(std::enable_nonlocking_formatter_optimization<
+static_assert(!std::enable_nonlocking_formatter_optimization<
std::chrono::tai_time<NonBufferedRep>>);
-static_assert(std::enable_nonlocking_formatter_optimization<
+static_assert(!std::enable_nonlocking_formatter_optimization<
std::chrono::file_time<NonBufferedRep>>);
-static_assert(std::enable_nonlocking_formatter_optimization<
+static_assert(!std::enable_nonlocking_formatter_optimization<
local_time_fmt<NonBufferedRep>>);
using NonBufferedDuration = std::chrono::duration<Rep<void, short>>;
#if _GLIBCXX_USE_CXX11_ABI || !_GLIBCXX_USE_DUAL_ABI
static_assert(std::enable_nonlocking_formatter_optimization<
std::chrono::zoned_time<std::chrono::seconds>>);
-static_assert(std::enable_nonlocking_formatter_optimization<
+static_assert(!std::enable_nonlocking_formatter_optimization<
std::chrono::zoned_time<BufferedDuration>>);
-static_assert(std::enable_nonlocking_formatter_optimization<
+static_assert(!std::enable_nonlocking_formatter_optimization<
std::chrono::zoned_time<NonBufferedRep>>);
static_assert(std::enable_nonlocking_formatter_optimization<
std::chrono::zoned_time<NonBufferedDuration>>);
{
static const MyTimeZone* default_zone();
static const MyTimeZone* locate_zone(std::string_view name);
-};
+};
static_assert(!std::enable_nonlocking_formatter_optimization<
std::chrono::zoned_time<std::chrono::seconds, MyTimeZone>>);