/* */ #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_) {} Option& Option::operator=(const Option& option) { if(this != &option) { table_ = option.table_; use_ = option.use_; } 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); } bool Option::blank(const Pref* pref) const { return !defined(pref) || table_[pref->i].empty(); } const std::string& Option::get(const Pref* pref) const { return table_[pref->i]; } 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(), ""); } } // namespace aria2