]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/articlenumber.cpp
Rework article numbers
[r2c2.git] / source / libr2c2 / articlenumber.cpp
index dd19eb5710e1ab0b7d1d719ef0969b1545cdd08f..d8028310daca1085b64da61a68b8b1debe25489d 100644 (file)
@@ -6,75 +6,44 @@ using namespace Msp;
 
 namespace R2C2 {
 
-ArticleNumber::ArticleNumber(unsigned n)
-{
-       Part part;
-       part.number = n;
-       part.letter = 0;
-       parts.push_back(part);
-}
-
-ArticleNumber::ArticleNumber(const string &s)
-{
-       vector<string> sparts = split(s, '-');
-       for(vector<string>::iterator i=sparts.begin(); i!=sparts.end(); ++i)
-       {
-               if(i->empty())
-                       throw invalid_argument("ArticleNumber::ArticleNumber");
+ArticleNumber::ArticleNumber(const string &a):
+       article(a)
+{ }
 
-               unsigned nondigit = i->size();
-               for(unsigned j=0; j<i->size(); ++j)
-                       if(!isdigit((*i)[j]))
-                       {
-                               nondigit = j;
-                               break;
-                       }
-
-               if(!nondigit || nondigit<i->size()-1)
-                       throw invalid_argument("ArticleNumber::ArticleNumber");
-
-               Part part;
-               part.number = lexical_cast<unsigned>(i->substr(0, nondigit));
-               part.letter = nondigit<i->size() ? (*i)[nondigit] : 0;
-               parts.push_back(part);
-       }
-}
+ArticleNumber::ArticleNumber(const string &v, const string &a, const string &p):
+       vendor(v),
+       article(a),
+       part(p)
+{ }
 
 string ArticleNumber::str() const
 {
        string result;
-       for(vector<Part>::const_iterator i=parts.begin(); i!=parts.end(); ++i)
+       if(!vendor.empty())
        {
-               if(!result.empty())
-                       result += '-';
-
-               result += lexical_cast<string>(i->number);
-               if(i->letter)
-                       result += i->letter;
+               result += vendor;
+               result += ' ';
+       }
+       result += article;
+       if(!part.empty())
+       {
+               result += '-';
+               result += part;
        }
 
        return result;
 }
 
-bool ArticleNumber::operator<(const ArticleNumber &other) const
-{
-       return parts<other.parts;
-}
 
-
-bool ArticleNumber::Part::operator<(const Part &other) const
+ArticleNumber::Loader::Loader(ArticleNumber &an):
+       DataFile::ObjectLoader<ArticleNumber>(an)
 {
-       if(number!=other.number)
-               return number<other.number;
-       return letter<other.letter;
+       add("vendor", &ArticleNumber::vendor);
+       add("article", &ArticleNumber::article);
+       add("part", &ArticleNumber::part);
 }
 
 
-void operator>>(const LexicalConverter &conv, ArticleNumber &art_nr)
-{
-       art_nr = ArticleNumber(conv.get());
-}
-
 void operator<<(LexicalConverter &conv, const ArticleNumber &art_nr)
 {
        conv.result(art_nr.str());