diff --git a/format.cc b/format.cc index 9d05991d..f292441f 100644 --- a/format.cc +++ b/format.cc @@ -586,11 +586,13 @@ FMT_FUNC void fmt::internal::format_windows_error( #endif template -void fmt::ArgList::Map::init(const ArgList &args) { +void fmt::internal::ArgMap::init(const ArgList &args) { if (!map_.empty()) return; - const internal::NamedArg* named_arg; - bool use_values = args.type(MAX_PACKED_ARGS - 1) == internal::Arg::NONE; + typedef internal::NamedArg NamedArg; + const NamedArg* named_arg = 0; + bool use_values = + args.type(ArgList::MAX_PACKED_ARGS - 1) == internal::Arg::NONE; if (use_values) { for (unsigned i = 0;/*nothing*/; ++i) { internal::Arg::Type arg_type = args.type(i); @@ -598,7 +600,7 @@ void fmt::ArgList::Map::init(const ArgList &args) { case internal::Arg::NONE: return; case internal::Arg::NAMED_ARG: - named_arg = static_cast*>(args.values_[i].pointer); + named_arg = static_cast(args.values_[i].pointer); map_.insert(Pair(named_arg->name, *named_arg)); break; default: @@ -607,19 +609,19 @@ void fmt::ArgList::Map::init(const ArgList &args) { } return; } - for (unsigned i = 0; i != MAX_PACKED_ARGS; ++i) { + for (unsigned i = 0; i != ArgList::MAX_PACKED_ARGS; ++i) { internal::Arg::Type arg_type = args.type(i); if (arg_type == internal::Arg::NAMED_ARG) { - named_arg = static_cast*>(args.args_[i].pointer); + named_arg = static_cast(args.args_[i].pointer); map_.insert(Pair(named_arg->name, *named_arg)); } } - for (unsigned i = MAX_PACKED_ARGS;/*nothing*/; ++i) { + for (unsigned i = ArgList::MAX_PACKED_ARGS;/*nothing*/; ++i) { switch (args.args_[i].type) { case internal::Arg::NONE: return; case internal::Arg::NAMED_ARG: - named_arg = static_cast*>(args.args_[i].pointer); + named_arg = static_cast(args.args_[i].pointer); map_.insert(Pair(named_arg->name, *named_arg)); break; default: diff --git a/format.h b/format.h index 15ebbfa6..2c73d7cd 100644 --- a/format.h +++ b/format.h @@ -972,7 +972,8 @@ class MakeValue : public Arg { return IsConvertibleToInt::value ? Arg::INT : Arg::CUSTOM; } - // Additional template param `Char_` is needed here because make_type always uses MakeValue. + // Additional template param `Char_` is needed here because make_type always + // uses MakeValue. template MakeValue(const NamedArg &value) { pointer = &value; } @@ -1110,6 +1111,9 @@ class RuntimeError : public std::runtime_error { template class ArgFormatter; + +template +class ArgMap; } // namespace internal /** An argument list. */ @@ -1135,13 +1139,13 @@ class ArgList { (types_ & (mask << shift)) >> shift); } + template + friend class internal::ArgMap; + public: // Maximum number of arguments with packed types. enum { MAX_PACKED_ARGS = 16 }; - template - struct Map; - ArgList() : types_(0) {} ArgList(ULongLong types, const internal::Value *values) @@ -1176,11 +1180,19 @@ class ArgList { } }; +struct FormatSpec; + +namespace internal { + template -struct fmt::ArgList::Map { +class ArgMap { + private: typedef std::map, internal::Arg> MapType; typedef typename MapType::value_type Pair; + MapType map_; + + public: void init(const ArgList &args); const internal::Arg* find(const fmt::BasicStringRef &name) const { @@ -1189,16 +1201,8 @@ struct fmt::ArgList::Map { return &it->second; return 0; } - -private: - - MapType map_; }; -struct FormatSpec; - -namespace internal { - class FormatterBase { protected: ArgList args_; @@ -1255,7 +1259,7 @@ class BasicFormatter : private internal::FormatterBase { private: BasicWriter &writer_; const Char *start_; - ArgList::Map map_; + internal::ArgMap map_; FMT_DISALLOW_COPY_AND_ASSIGN(BasicFormatter); @@ -1263,7 +1267,8 @@ class BasicFormatter : private internal::FormatterBase { // Checks if manual indexing is used and returns the argument with // specified name. - internal::Arg get_arg(const BasicStringRef& arg_name, const char *&error); + internal::Arg get_arg(const BasicStringRef& arg_name, + const char *&error); // Parses argument index and returns corresponding argument. internal::Arg parse_arg_index(const Char *&s);