Commit 4af764d0 authored by Michael Winterberg's avatar Michael Winterberg

Changed ArgMap to be backed by a vector instead of a map.

The main reason for this is to avoid a dynamic memory allocation in every format() call with Visual Studio if there are no named arguments.
parent 97e9ed11
...@@ -616,7 +616,7 @@ void fmt::internal::ArgMap<Char>::init(const ArgList &args) { ...@@ -616,7 +616,7 @@ void fmt::internal::ArgMap<Char>::init(const ArgList &args) {
return; return;
case internal::Arg::NAMED_ARG: case internal::Arg::NAMED_ARG:
named_arg = static_cast<const NamedArg*>(args.values_[i].pointer); named_arg = static_cast<const NamedArg*>(args.values_[i].pointer);
map_.insert(Pair(named_arg->name, *named_arg)); map_.push_back(Pair(named_arg->name, *named_arg));
break; break;
default: default:
/*nothing*/; /*nothing*/;
...@@ -628,7 +628,7 @@ void fmt::internal::ArgMap<Char>::init(const ArgList &args) { ...@@ -628,7 +628,7 @@ void fmt::internal::ArgMap<Char>::init(const ArgList &args) {
internal::Arg::Type arg_type = args.type(i); internal::Arg::Type arg_type = args.type(i);
if (arg_type == internal::Arg::NAMED_ARG) { if (arg_type == internal::Arg::NAMED_ARG) {
named_arg = static_cast<const NamedArg*>(args.args_[i].pointer); named_arg = static_cast<const NamedArg*>(args.args_[i].pointer);
map_.insert(Pair(named_arg->name, *named_arg)); map_.push_back(Pair(named_arg->name, *named_arg));
} }
} }
for (unsigned i = ArgList::MAX_PACKED_ARGS;/*nothing*/; ++i) { for (unsigned i = ArgList::MAX_PACKED_ARGS;/*nothing*/; ++i) {
...@@ -637,7 +637,7 @@ void fmt::internal::ArgMap<Char>::init(const ArgList &args) { ...@@ -637,7 +637,7 @@ void fmt::internal::ArgMap<Char>::init(const ArgList &args) {
return; return;
case internal::Arg::NAMED_ARG: case internal::Arg::NAMED_ARG:
named_arg = static_cast<const NamedArg*>(args.args_[i].pointer); named_arg = static_cast<const NamedArg*>(args.args_[i].pointer);
map_.insert(Pair(named_arg->name, *named_arg)); map_.push_back(Pair(named_arg->name, *named_arg));
break; break;
default: default:
/*nothing*/; /*nothing*/;
......
...@@ -36,7 +36,8 @@ ...@@ -36,7 +36,8 @@
#include <memory> #include <memory>
#include <stdexcept> #include <stdexcept>
#include <string> #include <string>
#include <map> #include <vector>
#include <utility>
#ifndef FMT_USE_IOSTREAMS #ifndef FMT_USE_IOSTREAMS
# define FMT_USE_IOSTREAMS 1 # define FMT_USE_IOSTREAMS 1
...@@ -1671,7 +1672,7 @@ namespace internal { ...@@ -1671,7 +1672,7 @@ namespace internal {
template <typename Char> template <typename Char>
class ArgMap { class ArgMap {
private: private:
typedef std::map<fmt::BasicStringRef<Char>, internal::Arg> MapType; typedef std::vector<std::pair<fmt::BasicStringRef<Char>, internal::Arg> > MapType;
typedef typename MapType::value_type Pair; typedef typename MapType::value_type Pair;
MapType map_; MapType map_;
...@@ -1680,7 +1681,12 @@ class ArgMap { ...@@ -1680,7 +1681,12 @@ class ArgMap {
FMT_API void init(const ArgList &args); FMT_API void init(const ArgList &args);
const internal::Arg* find(const fmt::BasicStringRef<Char> &name) const { const internal::Arg* find(const fmt::BasicStringRef<Char> &name) const {
typename MapType::const_iterator it = map_.find(name); typename MapType::const_iterator it = map_.begin();
// the list is unsorted, so just return the first matching name.
for (; it != map_.end(); ++it) {
if (it->first == name)
break;
}
return it != map_.end() ? &it->second : 0; return it != map_.end() ? &it->second : 0;
} }
}; };
......
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