/* */ #include "ValueBase.h" namespace aria2 { String::String(const ValueType& string):str_{string} {} String::String(ValueType&& string):str_{std::move(string)} {} String::String(const char* cstring):str_{cstring} {} String::String(const char* data, size_t length) : str_{&data[0], &data[length]} {} String::String(const unsigned char* data, size_t length) : str_{&data[0], &data[length]} {} String::String() {} const String::ValueType& String::s() const { return str_; } String::ValueType String::popValue() const { return std::move(str_); } const unsigned char* String::uc() const { return reinterpret_cast(str_.data()); } std::unique_ptr String::g(const ValueType& string) { return make_unique(string); } std::unique_ptr String::g(ValueType&& string) { return make_unique(std::move(string)); } std::unique_ptr String::g(const unsigned char* data, size_t length) { return make_unique(data, length); } void String::accept(ValueBaseVisitor& v) const { v.visit(*this); } Integer::Integer(ValueType integer) : integer_{integer} {} Integer::Integer() : integer_{0} {} Integer::ValueType Integer::i() const { return integer_; } std::unique_ptr Integer::g(ValueType integer) { return make_unique(integer); } void Integer::accept(ValueBaseVisitor& v) const { v.visit(*this); } Bool::Bool(bool val):val_{val} {} std::unique_ptr Bool::gTrue() { return make_unique(true); } std::unique_ptr Bool::gFalse() { return make_unique(false); } bool Bool::val() const { return val_; } void Bool::accept(ValueBaseVisitor& v) const { v.visit(*this); } Null::Null() {} std::unique_ptr Null::g() { return make_unique(); } void Null::accept(ValueBaseVisitor& v) const { v.visit(*this); } List::List() {} ValueBase* List::get(size_t index) const { return list_[index].get(); } void List::set(size_t index, std::unique_ptr v) { list_[index] = std::move(v); } void List::append(std::unique_ptr v) { list_.push_back(std::move(v)); } void List::append(String::ValueType string) { list_.push_back(String::g(std::move(string))); } List& List::operator<<(std::unique_ptr v) { list_.push_back(std::move(v)); return *this; } ValueBase* List::operator[](size_t index) const { return list_[index].get(); } List::ValueType::iterator List::begin() { return list_.begin(); } List::ValueType::iterator List::end() { return list_.end(); } List::ValueType::const_iterator List::begin() const { return list_.begin(); } List::ValueType::const_iterator List::end() const { return list_.end(); } List::ValueType::const_iterator List::cbegin() const { return list_.cbegin(); } List::ValueType::const_iterator List::cend() const { return list_.cend(); } size_t List::size() const { return list_.size(); } bool List::empty() const { return list_.empty(); } std::unique_ptr List::g() { return make_unique(); } void List::accept(ValueBaseVisitor& v) const { v.visit(*this); } Dict::Dict() {} void Dict::put(std::string key, std::unique_ptr vlb) { auto p = std::make_pair(std::move(key), std::move(vlb)); auto r = dict_.insert(std::move(p)); if(!r.second) { (*r.first).second = std::move(vlb); } } void Dict::put(std::string key, String::ValueType string) { put(std::move(key), String::g(std::move(string))); } ValueBase* Dict::get(const std::string& key) const { auto itr = dict_.find(key); if(itr == std::end(dict_)) { return nullptr; } else { return (*itr).second.get(); } } ValueBase* Dict::operator[](const std::string& key) const { return get(key); } bool Dict::containsKey(const std::string& key) const { return dict_.count(key); } void Dict::removeKey(const std::string& key) { dict_.erase(key); } std::unique_ptr Dict::popValue(const std::string& key) { auto i = dict_.find(key); if(i == std::end(dict_)) { return nullptr; } else { auto res = std::move((*i).second); dict_.erase(i); return res; } } Dict::ValueType::iterator Dict::begin() { return dict_.begin(); } Dict::ValueType::iterator Dict::end() { return dict_.end(); } Dict::ValueType::const_iterator Dict::begin() const { return dict_.begin(); } Dict::ValueType::const_iterator Dict::end() const { return dict_.end(); } Dict::ValueType::const_iterator Dict::cbegin() const { return dict_.cbegin(); } Dict::ValueType::const_iterator Dict::cend() const { return dict_.cend(); } size_t Dict::size() const { return dict_.size(); } bool Dict::empty() const { return dict_.empty(); } std::unique_ptr Dict::g() { return make_unique(); } void Dict::accept(ValueBaseVisitor& v) const { v.visit(*this); } } // namespace aria2