diff options
-rw-r--r-- | gentoobrowse-api/domain/converters.cpp | 79 | ||||
-rw-r--r-- | gentoobrowse-api/domain/converters.h | 26 | ||||
-rw-r--r-- | gentoobrowse-api/domain/converters.impl.h | 81 | ||||
-rw-r--r-- | gentoobrowse-api/domain/unpackPqTextArray.h | 6 | ||||
-rw-r--r-- | gentoobrowse-api/domain/unpackPqTextArray.ll | 14 | ||||
-rw-r--r-- | gentoobrowse-api/service/maintenanceGitOperations.cpp | 2 |
6 files changed, 98 insertions, 110 deletions
diff --git a/gentoobrowse-api/domain/converters.cpp b/gentoobrowse-api/domain/converters.cpp index 073c545..b4748cd 100644 --- a/gentoobrowse-api/domain/converters.cpp +++ b/gentoobrowse-api/domain/converters.cpp @@ -1,51 +1,24 @@ #include <portage-models.h> #include "converters.h" +#include "converters.impl.h" #include "unpackPqTextArray.h" #include <string> #include <boost/algorithm/string/join.hpp> #include <boost/algorithm/string/split.hpp> namespace Slicer { - static - void - unpackPqTextArray(const std::string & s, ::Gentoo::StringList & list) - { - std::stringstream ss(s); - UnpackPqTextArray l(ss, list); - l.yylex(); - } - template<typename T> PqArray<T>::PqArray(std::vector<T> * l) : ModelPartForSequence<std::vector<T>>(l) { } - PqArray<std::string>::PqArray(::Gentoo::StringList * sl) : - ModelPartForSequence<::Gentoo::StringList>(sl) - { - } - template<typename T> void PqArray<T>::SetValue(ValueSourcePtr s) { - this->Model->clear(); - std::string v; - s->set(v); - if (v.size() < 3) return; - typedef boost::algorithm::split_iterator<std::string::iterator> string_split_iterator; - string_split_iterator sfi(++v.begin(), --v.end(), boost::algorithm::first_finder(",", boost::algorithm::is_iequal())); - for(auto it = sfi; it != string_split_iterator(); ++it) { - this->Model->push_back(boost::lexical_cast<T>(*it)); - } - } - - void PqArray<std::string>::SetValue(ValueSourcePtr s) - { - Model->clear(); - std::string v; - s->set(v); - unpackPqTextArray(v, *Model); + std::string in; + s->set(in); + *this->Model = unpackPqArray<T>(in); } template<typename T> @@ -56,50 +29,8 @@ namespace Slicer { return true; } - bool - PqArray<std::string>::GetValue(ValueTargetPtr s) - { - s->get(packPqArray(*this->Model)); - return true; - } - template class PqArray<Ice::Int>; - - ::Gentoo::StringList - unpackPqTextArray(const std::string & s) - { - ::Gentoo::StringList list; - unpackPqTextArray(s, list); - return list; - } - - template<typename T> - std::string - packPqArray(const T & l) - { - if (l.empty()) return "{}"; - std::vector<std::string> l2; - l2.reserve(l.size()); - for(const auto & i : l) { - l2.push_back(packPqVar(i)); - } - return "{" + boost::algorithm::join(l2, ",") + "}"; - } - template std::string packPqArray<std::set<std::string>>(const std::set<std::string> &); - - template<typename T> - std::string - packPqVar(const T & l) - { - return boost::lexical_cast<std::string>(l); - } - - template<> - std::string - packPqVar(const std::string & l) - { - return "\"" + boost::algorithm::replace_all_copy(l, "\"", "\\\"") + "\""; - } + template class PqArray<std::string>; boost::posix_time::ptime shortDateToPosixTime(const std::string & s) diff --git a/gentoobrowse-api/domain/converters.h b/gentoobrowse-api/domain/converters.h index 8449a65..404b9a1 100644 --- a/gentoobrowse-api/domain/converters.h +++ b/gentoobrowse-api/domain/converters.h @@ -16,32 +16,6 @@ namespace Slicer { bool GetValue(ValueTargetPtr) override; }; - template<> - class DLL_PUBLIC PqArray<std::string> : public ModelPartForSequence<::Gentoo::StringList> { - public: - PqArray(::Gentoo::StringList *); - - void SetValue(ValueSourcePtr) override; - bool GetValue(ValueTargetPtr) override; - }; - - DLL_PUBLIC - ::Gentoo::StringList - unpackPqTextArray(const std::string & s); - - template<typename T> - DLL_PUBLIC - std::string - packPqArray(const T & l); - - template<typename T> - std::string - packPqVar(const T & l); - - template<> - std::string - packPqVar(const std::string & l); - DLL_PUBLIC boost::posix_time::ptime shortDateToPosixTime(const std::string & s); diff --git a/gentoobrowse-api/domain/converters.impl.h b/gentoobrowse-api/domain/converters.impl.h new file mode 100644 index 0000000..25f9266 --- /dev/null +++ b/gentoobrowse-api/domain/converters.impl.h @@ -0,0 +1,81 @@ +#ifndef GENTOOBROWSE_API_DOMAIN_CONVERTERS_IMPL_H +#define GENTOOBROWSE_API_DOMAIN_CONVERTERS_IMPL_H + +#include "unpackPqTextArray.h" + +namespace Slicer { + template <typename T> + class UnpackPqTextArrayInto : public UnpackPqTextArray { + public: + UnpackPqTextArrayInto(std::istream & s, std::vector<T> & l) : + UnpackPqTextArray(s), + list(l) + { + } + + virtual void consume(const std::string & s) override + { + list.push_back(boost::lexical_cast<T>(s)); + } + + private: + std::vector<T> & list; + }; + + template<typename T> + typename std::enable_if<std::is_arithmetic<T>::value>::type + packPqVar(std::ostream & s, const T & l) + { + s << l; + } + + std::string + escapePqChar(char c) + { + if (c == '"') { + return std::string("\\\"", 2); + } + return std::string(1, c); + } + + void + packPqVar(std::ostream & s, const std::string & l) + { + s << "\""; + std::transform(l.begin(), l.end(), std::ostream_iterator<std::string>(s), escapePqChar); + s << "\""; + } + + template <typename T> + std::vector<T> + unpackPqArray(const std::string & s) + { + std::vector<T> rtn; + std::stringstream ss(s); + UnpackPqTextArrayInto<T> u(ss, rtn); + u.yylex(); + return rtn; + } + + template<typename T> + std::string + packPqArray(const T & l) + { + std::stringstream ss; + ss << "{"; + if (!l.empty()) { + auto i = l.cbegin(); + packPqVar(ss, *i); + i++; + while (i != l.cend()) { + ss << ","; + packPqVar(ss, *i++); + } + } + ss << "}"; + return ss.str(); + } +} + +#endif + diff --git a/gentoobrowse-api/domain/unpackPqTextArray.h b/gentoobrowse-api/domain/unpackPqTextArray.h index aefaddd..5f639b4 100644 --- a/gentoobrowse-api/domain/unpackPqTextArray.h +++ b/gentoobrowse-api/domain/unpackPqTextArray.h @@ -10,13 +10,15 @@ namespace Slicer { class UnpackPqTextArray : public yyFlexLexer { public: - UnpackPqTextArray(std::istream &, ::Gentoo::StringList & sl); + UnpackPqTextArray(std::istream &); + virtual ~UnpackPqTextArray() = default; int yylex() override; void LexerError(const char * msg) override; + virtual void consume(const std::string &) = 0; private: - ::Gentoo::StringList & list; + std::string buffer; }; } diff --git a/gentoobrowse-api/domain/unpackPqTextArray.ll b/gentoobrowse-api/domain/unpackPqTextArray.ll index f8cce5f..224ffc0 100644 --- a/gentoobrowse-api/domain/unpackPqTextArray.ll +++ b/gentoobrowse-api/domain/unpackPqTextArray.ll @@ -35,32 +35,32 @@ char [^"] yy_pop_state(); } <FIRST,NEXT>{unquoted} { - list.push_back(YYText()); + consume(YYText()); BEGIN(AFTER); } <FIRST,NEXT>{quote} { - list.push_back(std::string()); + buffer.clear(); BEGIN(QUOTED); } <AFTER>{comma} { BEGIN(NEXT); } <QUOTED>{quote} { + consume(buffer); BEGIN(AFTER); } <QUOTED>{esc} { - list.back().push_back(*(YYText() + 1)); + buffer.push_back(*(YYText() + 1)); } <QUOTED>{char} { - list.back().append(YYText()); + buffer.append(YYText()); } %% namespace Slicer { - UnpackPqTextArray::UnpackPqTextArray(std::istream & f, ::Gentoo::StringList & sl) : - yyFlexLexer(&f, NULL), - list(sl) + UnpackPqTextArray::UnpackPqTextArray(std::istream & f) : + yyFlexLexer(&f, NULL) { } diff --git a/gentoobrowse-api/service/maintenanceGitOperations.cpp b/gentoobrowse-api/service/maintenanceGitOperations.cpp index 59470c6..d532926 100644 --- a/gentoobrowse-api/service/maintenanceGitOperations.cpp +++ b/gentoobrowse-api/service/maintenanceGitOperations.cpp @@ -11,7 +11,7 @@ #include <sql/maintenance/repoSetLastCommit.sql.h> #include <portage-models.h> #include "utils/git.h" -#include "converters.h" +#include "converters.impl.h" #include <compileTimeFormatter.h> namespace Gentoo { |