Commit a721319e authored by Dean Moldovan's avatar Dean Moldovan

Add MakeArg constructor for Arg

parent 29726cef
...@@ -1211,17 +1211,27 @@ class MakeValue : public Arg { ...@@ -1211,17 +1211,27 @@ class MakeValue : public Arg {
static uint64_t type(const NamedArg<Char_> &) { return Arg::NAMED_ARG; } static uint64_t type(const NamedArg<Char_> &) { return Arg::NAMED_ARG; }
}; };
template <typename Formatter>
class MakeArg : public Arg {
public:
MakeArg() {
type = Arg::NONE;
}
template <typename T>
MakeArg(const T &value)
: Arg(MakeValue<Formatter>(value)) {
type = static_cast<Arg::Type>(MakeValue<Formatter>::type(value));
}
};
template <typename Char> template <typename Char>
struct NamedArg : Arg { struct NamedArg : Arg {
BasicStringRef<Char> name; BasicStringRef<Char> name;
typedef internal::MakeValue< BasicFormatter<Char> > MakeValue;
template <typename T> template <typename T>
NamedArg(BasicStringRef<Char> argname, const T &value) NamedArg(BasicStringRef<Char> argname, const T &value)
: Arg(MakeValue(value)), name(argname) { : Arg(MakeArg< BasicFormatter<Char> >(value)), name(argname) {}
type = static_cast<Arg::Type>(MakeValue::type(value));
}
}; };
#define FMT_DISPATCH(call) static_cast<Impl*>(this)->call #define FMT_DISPATCH(call) static_cast<Impl*>(this)->call
...@@ -1931,44 +1941,29 @@ inline uint64_t make_type(const Arg &first, const Args & ... tail) { ...@@ -1931,44 +1941,29 @@ inline uint64_t make_type(const Arg &first, const Args & ... tail) {
return make_type(first) | (make_type(tail...) << 4); return make_type(first) | (make_type(tail...) << 4);
} }
inline void do_set_types(Arg *) {} template <typename Formatter>
inline void store_args(Arg *args) {
template <typename T, typename... Args> *args = MakeArg<Formatter>();
inline void do_set_types(Arg *args, const T &arg, const Args & ... tail) {
args->type = static_cast<Arg::Type>(
MakeValue< BasicFormatter<char> >::type(arg));
do_set_types(args + 1, tail...);
}
template <typename... Args>
inline void set_types(Arg *array, const Args & ... args) {
if (check(sizeof...(Args) > ArgList::MAX_PACKED_ARGS))
do_set_types(array, args...);
array[sizeof...(Args)].type = Arg::NONE;
} }
template <typename... Args> template <typename Formatter, typename T, typename... Args>
inline void set_types(Value *, const Args & ...) { inline void store_args(Arg *args, const T &arg, const Args & ... tail) {
// Do nothing as types are passed separately from values. *args = MakeArg<Formatter>(arg);
store_args<Formatter>(args + 1, tail...);
} }
template <typename Formatter, typename Value> template <typename Formatter>
inline void store_args(Value *) {} inline void store_args(Value *) {}
template <typename Formatter, typename Arg, typename T, typename... Args> template <typename Formatter, typename T, typename... Args>
inline void store_args(Arg *args, const T &arg, const Args & ... tail) { inline void store_args(Value *args, const T &arg, const Args & ... tail) {
// Assign only the Value subobject of Arg and don't overwrite type (if any) *args = MakeValue<Formatter>(arg);
// that is assigned by set_types.
Value &value = *args;
value = MakeValue<Formatter>(arg);
store_args<Formatter>(args + 1, tail...); store_args<Formatter>(args + 1, tail...);
} }
template <typename Formatter, typename... Args> template <typename Formatter, typename... Args>
ArgList make_arg_list(typename ArgArray<sizeof...(Args)>::Type array, ArgList make_arg_list(typename ArgArray<sizeof...(Args)>::Type array,
const Args & ... args) { const Args & ... args) {
if (check(sizeof...(Args) >= ArgList::MAX_PACKED_ARGS))
set_types(array, args...);
store_args<Formatter>(array, args...); store_args<Formatter>(array, args...);
return ArgList(make_type(args...), array); return ArgList(make_type(args...), array);
} }
...@@ -2944,10 +2939,8 @@ void format(BasicFormatter<Char> &f, const Char *&format_str, const T &value) { ...@@ -2944,10 +2939,8 @@ void format(BasicFormatter<Char> &f, const Char *&format_str, const T &value) {
output << value; output << value;
BasicStringRef<Char> str(&buffer[0], format_buf.size()); BasicStringRef<Char> str(&buffer[0], format_buf.size());
typedef internal::MakeValue< BasicFormatter<Char> > MakeValue; typedef internal::MakeArg< BasicFormatter<Char> > MakeArg;
internal::Arg arg = MakeValue(str); format_str = f.format(format_str, MakeArg(str));
arg.type = static_cast<internal::Arg::Type>(MakeValue::type(str));
format_str = f.format(format_str, arg);
} }
// Reports a system error without throwing an exception. // Reports a system error without throwing an exception.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment