|
Boost : |
Subject: [boost] [gsoc16] Can I quickly check if the below really is the best approach?
From: Niall Douglas (s_sourceforge_at_[hidden])
Date: 2016-01-12 15:09:02
Dear Boost,
In the prototype https://svn.boost.org/trac/boost/wiki/SoC2016 at
https://goo.gl/1CQAuQ I claim "Even with all of Boost's facilities
[1] and using C++ 14, this program represents the currently best
available method of implementing a static constant associative map of
keys to values" and you can find either the code at the link or
pasted below.
Can I quickly check here if that claim is true? Is there a better way
than my example program?
BTW by static constant associative map of keys to values I mean the
thing me and Tony van Eerd were speaking about here last year and the
year before, and indeed frequently at BlackBerry!
Niall
[1]: I believe Boost.Hana could implement a static constan
associative map quite easily, but I'd be fairly sure Hana will likely
be beyond most students.
--- cut ---
#include <initializer_list>
#include <experimental/string_view>
#include <map>
#include <unordered_map>
#include <iostream>
using std::experimental::string_view;
enum class weekday { sunday, monday, tuesday, wednesday, thursday,
friday, saturday };
// initializer_list, pair and string_view are constexpr, so this list
can be constexpr
// (i.e. lives in the mind of the compiler only and has zero
representation in generated code)
#define STRING_VIEW(str) { str, sizeof(str)-1 }
constexpr std::initializer_list<std::pair<const string_view,
weekday>> string_to_weekday {
{ STRING_VIEW("sunday"), weekday::sunday },
{ STRING_VIEW("monday"), weekday::monday },
{ STRING_VIEW("tuesday"), weekday::tuesday },
{ STRING_VIEW("wednesday"), weekday::wednesday },
{ STRING_VIEW("thursday"), weekday::thursday },
{ STRING_VIEW("friday"), weekday::friday },
{ STRING_VIEW("saturday"), weekday::saturday }
};
int main(void)
{
{
// Calls malloc() at least 7 times
static const std::map<string_view, weekday> to_weekday1 =
string_to_weekday;
std::cout << "'monday' maps to " <<
static_cast<int>(to_weekday1.at("monday")) << std::endl;
std::cout << "'friday' maps to " <<
static_cast<int>(to_weekday1.at("friday")) << std::endl;
// Calls free() at least 7 times
}
{
// Calls malloc() at least 8 times
static const std::unordered_map<string_view, weekday> to_weekday2
= string_to_weekday;
std::cout << "'monday' maps to " <<
static_cast<int>(to_weekday2.at("monday")) << std::endl;
std::cout << "'friday' maps to " <<
static_cast<int>(to_weekday2.at("friday")) << std::endl;
// Calls free() at least 8 times
}
return 0;
}
-- ned Productions Limited Consulting http://www.nedproductions.biz/ http://ie.linkedin.com/in/nialldouglas/
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk