/* */ #include "Option.h" #include #include #include "prefs.h" #include "bitfield.h" namespace aria2 { Option::Option() : table_(option::countOption()), use_((option::countOption()+7)/8) {} Option::~Option() {} Option::Option(const Option& option) : table_(option.table_), use_(option.use_), parent_(option.parent_) {} Option& Option::operator=(const Option& option) { if(this != &option) { table_ = option.table_; use_ = option.use_; parent_ = option.parent_; } return *this; } namespace { template void setBit(V& b, const Pref* pref) { b[pref->i/8] |= 128 >> (pref->i%8); } template void unsetBit(V& b, const Pref* pref) { b[pref->i/8] &= ~(128 >> (pref->i%8)); } } // namespace void Option::put(const Pref* pref, const std::string& value) { setBit(use_, pref); table_[pref->i] = value; } bool Option::defined(const Pref* pref) const { return bitfield::test(use_, use_.size()*8, pref->i) || (parent_ && parent_->defined(pref)); } bool Option::definedLocal(const Pref* pref) const { return bitfield::test(use_, use_.size()*8, pref->i); } bool Option::blank(const Pref* pref) const { if(bitfield::test(use_, use_.size()*8, pref->i)) { return table_[pref->i].empty(); } else { return !parent_ || parent_->blank(pref); } } const std::string& Option::get(const Pref* pref) const { if(bitfield::test(use_, use_.size()*8, pref->i)) { return table_[pref->i]; } else if(parent_) { return parent_->get(pref); } else { return A2STR::NIL; } } int32_t Option::getAsInt(const Pref* pref) const { const std::string& value = get(pref); if(value.empty()) { return 0; } else { return strtol(value.c_str(), 0, 10); } } int64_t Option::getAsLLInt(const Pref* pref) const { const std::string& value = get(pref); if(value.empty()) { return 0; } else { return strtoll(value.c_str(), 0, 10); } } bool Option::getAsBool(const Pref* pref) const { return get(pref) == A2_V_TRUE; } double Option::getAsDouble(const Pref* pref) const { const std::string& value = get(pref); if(value.empty()) { return 0.0; } else { return strtod(value.c_str(), 0); } } void Option::remove(const Pref* pref) { unsetBit(use_, pref); table_[pref->i].clear(); } void Option::clear() { std::fill(use_.begin(), use_.end(), 0); std::fill(table_.begin(), table_.end(), ""); } void Option::merge(const Option& option) { size_t bits = option.use_.size()*8; for(size_t i = 1, len = table_.size(); i < len; ++i) { if(bitfield::test(option.use_, bits, i)) { use_[i/8] |= 128 >> (i%8); table_[i] = option.table_[i]; } } } void Option::setParent(const std::shared_ptr