| 283 | |
| 284 | |
| 285 | struct value_string_t : public value_t { |
| 286 | value_string_t() { val_str = string(); } |
| 287 | value_string_t(const std::string & v) { val_str = string(v); } |
| 288 | value_string_t(const string & v) { val_str = v; } |
| 289 | virtual std::string type() const override { return "String"; } |
| 290 | virtual string as_string() const override { return val_str; } |
| 291 | virtual std::string as_repr() const override { |
| 292 | std::ostringstream ss; |
| 293 | for (const auto & part : val_str.parts) { |
| 294 | ss << (part.is_input ? "INPUT: " : "TMPL: ") << part.val << "\n"; |
| 295 | } |
| 296 | return ss.str(); |
| 297 | } |
| 298 | virtual bool as_bool() const override { |
| 299 | return val_str.length() > 0; |
| 300 | } |
| 301 | virtual const func_builtins & get_builtins() const override; |
| 302 | virtual bool is_hashable() const override { return true; } |
| 303 | virtual hasher unique_hash() const noexcept override { |
| 304 | const auto type_hash = typeid(*this).hash_code(); |
| 305 | auto hash = hasher(); |
| 306 | hash.update(&type_hash, sizeof(type_hash)); |
| 307 | val_str.hash_update(hash); |
| 308 | return hash; |
| 309 | } |
| 310 | void mark_input() { |
| 311 | val_str.mark_input(); |
| 312 | } |
| 313 | protected: |
| 314 | virtual bool equivalent(const value_t & other) const override { |
| 315 | return typeid(*this) == typeid(other) && val_str.str() == other.val_str.str(); |
| 316 | } |
| 317 | }; |
| 318 | using value_string = std::shared_ptr<value_string_t>; |
| 319 | |
| 320 | |