12 struct fmt_type_traits;
15 struct fmt_type_traits<signed int>
17 static constexpr
const char* designator()
24 struct fmt_type_traits<const char*>
26 static constexpr
const char* designator()
33 struct fmt_type_traits<void*>
35 static constexpr
const char* designator()
42 struct fmt_type_traits<unsigned int>
44 static constexpr
const char* designator()
51 struct fmt_type_traits<float>
53 static constexpr
const char* designator()
60 struct fmt_type_traits<double>
62 static constexpr
const char* designator()
69 struct fmt_type_traits<char>
71 static constexpr
const char* designator()
78 struct fmt_type_traits<long double>
80 static constexpr
const char* designator()
87 struct fmt_type_traits<unsigned long long>
89 static constexpr
const char* designator()
96 struct fmt_type_traits<signed long long>
98 static constexpr
const char* designator()
104 class ControlBlockBase
111 friend class ControlBlockBase;
118 Handle(Handle&& other) =
default;
119 Handle& operator = (Handle&& other) =
default;
121 Handle(
const Handle& other)
122 : parent(other.parent)
127 Handle& operator = (
const Handle& other)
129 other.parent->addRef();
131 parent = other.parent;
137 Handle(ControlBlockBase& parent)
143 ControlBlockBase* parent;
146 virtual ~ControlBlockBase() {}
169 std::size_t counter = 0;
187 : memory(new ControlBlock())
188 , handle(memory->handle())
217 return memory->handle();
226 return &memory->value;
234 return detail::fmt_type_traits<T>::designator();
239 class ControlBlock :
public detail::ControlBlockBase
245 ControlBlock* memory;
246 detail::ControlBlockBase::Handle handle;
273 template<
typename... Args>
274 Label(
const std::string& name,
const std::string_view fmt, Args&... args)
276 values = { args.createHandle()... };
277 const char* types[] = { args.getTypeDesignator()... };
280 auto numTypes = std::extent<decltype(types)>::value;
281 temp.reserve(fmt.size() + numTypes);
283 for (std::size_t i = 0, c = 0; i < fmt.size(); ++i)
289 if (i + 1 < fmt.size() && fmt[i + 1] ==
'%')
293 else if (c < numTypes)
299 abort(
"Invalid format specifier + argument list combination");
316 std::vector<detail::ControlBlockBase::Handle> values;