#include <string>
#include <iostream>
#include <array>
#include <utility>
#include <unordered_map>
using namespace std;
class my_class
{
bool empty = false;
public:
my_class(int) { cerr << "c'tor\n"; }
my_class() { cerr << "default c'tor\n"; }
my_class(const my_class&) { cerr << "copy c'tor\n"; }
my_class(my_class&& o) { cerr << "move c'tor\n"; o.empty = true;}
~my_class() { cerr << (empty ? "Empty": "Filled") << " d'tor\n"; }
};
int main ( int , char *[])
{
const string key{"key"};
// OK
{
unordered_map<string, std::array<my_class, 2>> contig_sizes;
std::cerr << "Precreated value\n";
array<my_class, 2> value{1, 2};
std::cerr << "Now emplace:\n";
contig_sizes.emplace(key, value);
std::cerr << "Done:\n";
}
// OK
{
unordered_map<string, std::array<my_class, 2>> contig_sizes;
std::cerr << "\nEmplace key, casted value:\n";
contig_sizes.emplace(key, std::array<my_class, 2>{1, 2});
std::cerr << "Done:\n";
}
// OK use Very inefficient insert
{
unordered_map<string, std::array<my_class, 2>> contig_sizes;
std::cerr << "\nVery inefficient insert:\n";
contig_sizes.insert({key, {1,2}});
std::cerr << "Done:\n";
}
// OK use inefficient insert
{
unordered_map<string, std::array<my_class, 2>> contig_sizes;
std::cerr << "\nInefficient insert:\n";
contig_sizes.insert({key, std::array<my_class, 2>{1,2}});
std::cerr << "Done:\n";
}
// OK use ugly insert
{
unordered_map<string, std::array<my_class, 2>> contig_sizes;
std::cerr << "\nUgly insert:\n";
contig_sizes.insert(pair<const string, array<my_class, 2>>{key, array<my_class, 2>{1, 2}});
//contig_sizes.insert(make_pair(key, array<my_class, 2>{1, 2}));
std::cerr << "Done:\n";
}
// OK emplace with the correct pair type (typedef)
{
typedef pair<const string, array<my_class, 2>> pair_type;
unordered_map<string, std::array<my_class, 2>> contig_sizes;
//std::cerr << "\nPieceswise construct with pair typedef:\n";
//pair_type p{std::piecewise_construct,
// std::forward_as_tuple(string(key)),
// std::forward_as_tuple(std::array<my_class, 2>({1, 2}))};
std::cerr << "\nEmplace with pair typedef:\n";
// c'tor removed with extra cast
contig_sizes.emplace(pair_type{key, {1, 2}});
std::cerr << "Done:\n";
}
// OK ugly emplace with the correct pair type (typedef)
{
typedef pair<const string, array<my_class, 2>> pair_type;
unordered_map<string, std::array<my_class, 2>> contig_sizes;
std::cerr << "\nUgly Emplace with pair typedef:\n";
// c'tor removed with extra cast
contig_sizes.emplace(pair_type{key, std::array<my_class, 2>{1, 2}});
std::cerr << "Done:\n";
}
// compile error
//contig_sizes.emplace(key, {{1,2}});
}
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YXJyYXk+CiNpbmNsdWRlIDx1dGlsaXR5PgojaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIG15X2NsYXNzCnsKCWJvb2wgZW1wdHkgPSBmYWxzZTsKCXB1YmxpYzoKCW15X2NsYXNzKGludCkJCXsJY2VyciA8PCAiYyd0b3JcbiI7CX0KCW15X2NsYXNzKCkJCQkJCXsJY2VyciA8PCAiZGVmYXVsdCBjJ3RvclxuIjsJfQoJbXlfY2xhc3MoY29uc3QgbXlfY2xhc3MmKQl7CWNlcnIgPDwgImNvcHkgYyd0b3JcbiI7CX0KCW15X2NsYXNzKG15X2NsYXNzJiYgbykJCXsJY2VyciA8PCAibW92ZSBjJ3RvclxuIjsJby5lbXB0eSA9IHRydWU7fQoJfm15X2NsYXNzKCkJCQkJCXsJY2VyciA8PCAoZW1wdHkgPyAiRW1wdHkiOiAiRmlsbGVkIikgPDwgIiBkJ3RvclxuIjsJfQoJCn07IAoKCmludCBtYWluICggaW50ICAsIGNoYXIgKltdKQp7CgoJY29uc3Qgc3RyaW5nIGtleXsia2V5In07CgoKCS8vIE9LCgl7CgkJdW5vcmRlcmVkX21hcDxzdHJpbmcsIHN0ZDo6YXJyYXk8bXlfY2xhc3MsIDI+PiBjb250aWdfc2l6ZXM7CgkJc3RkOjpjZXJyIDw8ICJQcmVjcmVhdGVkIHZhbHVlXG4iOwoJCWFycmF5PG15X2NsYXNzLCAyPiB2YWx1ZXsxLCAyfTsKCQlzdGQ6OmNlcnIgPDwgIk5vdyBlbXBsYWNlOlxuIjsKCQljb250aWdfc2l6ZXMuZW1wbGFjZShrZXksIHZhbHVlKTsKCQlzdGQ6OmNlcnIgPDwgIkRvbmU6XG4iOwoJfQoKCS8vIE9LCgl7CgkJdW5vcmRlcmVkX21hcDxzdHJpbmcsIHN0ZDo6YXJyYXk8bXlfY2xhc3MsIDI+PiBjb250aWdfc2l6ZXM7CgkJc3RkOjpjZXJyIDw8ICJcbkVtcGxhY2Uga2V5LCBjYXN0ZWQgdmFsdWU6XG4iOwoJCWNvbnRpZ19zaXplcy5lbXBsYWNlKGtleSwgc3RkOjphcnJheTxteV9jbGFzcywgMj57MSwgMn0pOwoJCXN0ZDo6Y2VyciA8PCAiRG9uZTpcbiI7Cgl9CgoJLy8gT0sgdXNlIFZlcnkgaW5lZmZpY2llbnQgaW5zZXJ0Cgl7CgkJdW5vcmRlcmVkX21hcDxzdHJpbmcsIHN0ZDo6YXJyYXk8bXlfY2xhc3MsIDI+PiBjb250aWdfc2l6ZXM7CgkJc3RkOjpjZXJyIDw8ICJcblZlcnkgaW5lZmZpY2llbnQgaW5zZXJ0OlxuIjsKICAgICAgICBjb250aWdfc2l6ZXMuaW5zZXJ0KHtrZXksIHsxLDJ9fSk7CgkJc3RkOjpjZXJyIDw8ICJEb25lOlxuIjsKCX0KCgkvLyBPSyB1c2UgaW5lZmZpY2llbnQgaW5zZXJ0Cgl7CgkJdW5vcmRlcmVkX21hcDxzdHJpbmcsIHN0ZDo6YXJyYXk8bXlfY2xhc3MsIDI+PiBjb250aWdfc2l6ZXM7CgkJc3RkOjpjZXJyIDw8ICJcbkluZWZmaWNpZW50IGluc2VydDpcbiI7CiAgICAgICAgY29udGlnX3NpemVzLmluc2VydCh7a2V5LCBzdGQ6OmFycmF5PG15X2NsYXNzLCAyPnsxLDJ9fSk7CgkJc3RkOjpjZXJyIDw8ICJEb25lOlxuIjsKCX0KCiAgICAvLyBPSyB1c2UgdWdseSBpbnNlcnQKCXsKCQl1bm9yZGVyZWRfbWFwPHN0cmluZywgc3RkOjphcnJheTxteV9jbGFzcywgMj4+IGNvbnRpZ19zaXplczsKCQlzdGQ6OmNlcnIgPDwgIlxuVWdseSBpbnNlcnQ6XG4iOwogICAgICAgIGNvbnRpZ19zaXplcy5pbnNlcnQocGFpcjxjb25zdCBzdHJpbmcsIGFycmF5PG15X2NsYXNzLCAyPj57a2V5LCBhcnJheTxteV9jbGFzcywgMj57MSwgMn19KTsKCQkvL2NvbnRpZ19zaXplcy5pbnNlcnQobWFrZV9wYWlyKGtleSwgYXJyYXk8bXlfY2xhc3MsIDI+ezEsIDJ9KSk7CgkJc3RkOjpjZXJyIDw8ICJEb25lOlxuIjsKCX0KCQoJLy8gT0sgZW1wbGFjZSB3aXRoIHRoZSBjb3JyZWN0IHBhaXIgdHlwZSAodHlwZWRlZikKCXsKCQl0eXBlZGVmIHBhaXI8Y29uc3Qgc3RyaW5nLCBhcnJheTxteV9jbGFzcywgMj4+IHBhaXJfdHlwZTsKCQl1bm9yZGVyZWRfbWFwPHN0cmluZywgc3RkOjphcnJheTxteV9jbGFzcywgMj4+IGNvbnRpZ19zaXplczsKCQkvL3N0ZDo6Y2VyciA8PCAiXG5QaWVjZXN3aXNlIGNvbnN0cnVjdCB3aXRoIHBhaXIgdHlwZWRlZjpcbiI7CgkJLy9wYWlyX3R5cGUgcHtzdGQ6OnBpZWNld2lzZV9jb25zdHJ1Y3QsIAoJCS8vCQkJc3RkOjpmb3J3YXJkX2FzX3R1cGxlKHN0cmluZyhrZXkpKSwgCgkJLy8JCQlzdGQ6OmZvcndhcmRfYXNfdHVwbGUoc3RkOjphcnJheTxteV9jbGFzcywgMj4oezEsIDJ9KSl9OwoJCXN0ZDo6Y2VyciA8PCAiXG5FbXBsYWNlIHdpdGggcGFpciB0eXBlZGVmOlxuIjsKICAgICAgICAvLyBjJ3RvciByZW1vdmVkIHdpdGggZXh0cmEgY2FzdAogICAgICAgIGNvbnRpZ19zaXplcy5lbXBsYWNlKHBhaXJfdHlwZXtrZXksIHsxLCAyfX0pOwoJCXN0ZDo6Y2VyciA8PCAiRG9uZTpcbiI7Cgl9CgkKCS8vIE9LIHVnbHkgZW1wbGFjZSB3aXRoIHRoZSBjb3JyZWN0IHBhaXIgdHlwZSAodHlwZWRlZikKCXsKCQl0eXBlZGVmIHBhaXI8Y29uc3Qgc3RyaW5nLCBhcnJheTxteV9jbGFzcywgMj4+IHBhaXJfdHlwZTsKCQl1bm9yZGVyZWRfbWFwPHN0cmluZywgc3RkOjphcnJheTxteV9jbGFzcywgMj4+IGNvbnRpZ19zaXplczsKCQlzdGQ6OmNlcnIgPDwgIlxuVWdseSBFbXBsYWNlIHdpdGggcGFpciB0eXBlZGVmOlxuIjsKICAgICAgICAvLyBjJ3RvciByZW1vdmVkIHdpdGggZXh0cmEgY2FzdAogICAgICAgIGNvbnRpZ19zaXplcy5lbXBsYWNlKHBhaXJfdHlwZXtrZXksIHN0ZDo6YXJyYXk8bXlfY2xhc3MsIDI+ezEsIDJ9fSk7CgkJc3RkOjpjZXJyIDw8ICJEb25lOlxuIjsKCX0KICAgICAgICAKCgkvLyBjb21waWxlIGVycm9yCgkvL2NvbnRpZ19zaXplcy5lbXBsYWNlKGtleSwge3sxLDJ9fSk7Cn0=