21 #include <unordered_map>
30 const std::string& name_) :
38 name(std::move(exc_.name)) {
47 return "missing user datum '" + name +
"'";
51 const std::string& name_,
52 const std::string& actual_,
53 const std::string& expected_) :
56 expected_type(expected_) {
63 name(std::move(exc_.name)),
64 actual_type(std::move(exc_.actual_type)),
65 expected_type(std::move(exc_.expected_type)) {
74 return "requested type of the user datum '" + name +
"' is '"
75 + expected_type +
"' but the type '" + actual_type +
"' is set";
78 UserData::Datum::Datum() {
82 UserData::Datum::~Datum() {
86 struct UserData::Impl {
87 typedef std::unordered_map<std::string, std::unique_ptr<UserData::Datum>> Data;
92 const Impl&) =
delete;
94 const Impl&) =
delete;
100 UserData::Impl::Impl() {
104 UserData::Impl::~Impl() {
117 void UserData::doSetDatum(
118 const std::string& name_,
119 std::unique_ptr<Datum>&& datum_) {
120 pimpl->data.erase(name_);
121 pimpl->data.emplace(name_, std::move(datum_));
124 UserData::Datum* UserData::doGetDatum(
125 const std::string& name_)
const {
126 auto iter_(pimpl->data.find(name_));
127 if(iter_ == pimpl->data.end())
128 throw UserDataMissingException(name_);
129 return (*iter_).second.get();