#include "extract.hpp" // extract.cpp - a simple, hierarchical, tokenizer // // Copyright © 2013-2014 Ben Longbons // // This file is part of The Mana World (Athena server) // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include "../strings/astring.hpp" #include "../strings/xstring.hpp" #include "../strings/vstring.hpp" #include "../poison.hpp" // TODO also pass an io::LineSpan around. namespace tmwa { bool impl_extract(XString str, XString *rv) { *rv = str; return true; } bool impl_extract(XString str, RString *rv) { *rv = str; return true; } bool impl_extract(XString str, AString *rv) { *rv = str; return true; } bool impl_extract(XString str, std::chrono::nanoseconds *ns) { std::chrono::nanoseconds::rep rep; if (extract(str, &rep)) { *ns = std::chrono::nanoseconds(rep); return true; } if (str.endswith("ns"_s)) { if (extract(str.xrslice_h("ns"_s.size()), &rep)) { *ns = std::chrono::nanoseconds(rep); return true; } return false; } std::chrono::microseconds bigger; if (extract(str, &bigger)) { *ns = bigger; return *ns == bigger; } return false; } bool impl_extract(XString str, std::chrono::microseconds *us) { std::chrono::microseconds::rep rep; if (extract(str, &rep)) { *us = std::chrono::microseconds(rep); return true; } if (str.endswith("us"_s)) { if (extract(str.xrslice_h("us"_s.size()), &rep)) { *us = std::chrono::microseconds(rep); return true; } return false; } std::chrono::milliseconds bigger; if (extract(str, &bigger)) { *us = bigger; return *us == bigger; } return false; } bool impl_extract(XString str, std::chrono::milliseconds *ms) { std::chrono::milliseconds::rep rep; if (extract(str, &rep)) { *ms = std::chrono::milliseconds(rep); return true; } if (str.endswith("ms"_s)) { if (extract(str.xrslice_h("ms"_s.size()), &rep)) { *ms = std::chrono::milliseconds(rep); return true; } return false; } std::chrono::seconds bigger; if (extract(str, &bigger)) { *ms = bigger; return *ms == bigger; } return false; } bool impl_extract(XString str, std::chrono::seconds *s) { std::chrono::seconds::rep rep; if (extract(str, &rep)) { *s = std::chrono::seconds(rep); return true; } if (str.endswith("s"_s)) { if (extract(str.xrslice_h("s"_s.size()), &rep)) { *s = std::chrono::seconds(rep); return true; } return false; } std::chrono::minutes bigger; if (extract(str, &bigger)) { *s = bigger; return *s == bigger; } return false; } bool impl_extract(XString str, std::chrono::minutes *min) { std::chrono::minutes::rep rep; if (extract(str, &rep)) { *min = std::chrono::minutes(rep); return true; } if (str.endswith("min"_s)) { if (extract(str.xrslice_h("min"_s.size()), &rep)) { *min = std::chrono::minutes(rep); return true; } return false; } std::chrono::hours bigger; if (extract(str, &bigger)) { *min = bigger; return *min == bigger; } return false; } bool impl_extract(XString str, std::chrono::hours *h) { std::chrono::hours::rep rep; if (extract(str, &rep)) { *h = std::chrono::hours(rep); return true; } if (str.endswith("h"_s)) { if (extract(str.xrslice_h("h"_s.size()), &rep)) { *h = std::chrono::hours(rep); return true; } return false; } std::chrono::duration> bigger; if (extract(str, &bigger)) { *h = bigger; return *h == bigger; } return false; } bool impl_extract(XString str, std::chrono::duration> *d) { std::chrono::duration>::rep rep; if (extract(str, &rep)) { *d = std::chrono::duration>(rep); return true; } if (str.endswith("d"_s)) { if (extract(str.xrslice_h("d"_s.size()), &rep)) { *d = std::chrono::duration>(rep); return true; } return false; } return false; } } // namespace tmwa