22 #include "Segments.hpp" 
   23 #include "UTF8Util.hpp" 
   34   virtual std::string Key() 
const = 0;
 
   36   virtual std::vector<std::string> Values() 
const = 0;
 
   38   virtual std::string GetDefault() 
const = 0;
 
   40   virtual size_t NumValues() 
const = 0;
 
   42   virtual std::string ToString() 
const = 0;
 
   44   size_t KeyLength()
 const { 
return Key().length(); }
 
   46   bool operator<(
const DictEntry& that)
 const { 
return Key() < that.Key(); }
 
   48   bool operator==(
const DictEntry& that)
 const { 
return Key() == that.Key(); }
 
   50   static bool UPtrLessThan(
const std::unique_ptr<DictEntry>& a,
 
   51                            const std::unique_ptr<DictEntry>& b) {
 
   62   virtual std::string Key()
 const { 
return key; }
 
   64   virtual std::vector<std::string> Values()
 const {
 
   65     return std::vector<std::string>();
 
   68   virtual std::string GetDefault()
 const { 
return key; }
 
   70   virtual size_t NumValues()
 const { 
return 0; }
 
   72   virtual std::string ToString()
 const { 
return key; }
 
   80   virtual std::string Value() 
const = 0;
 
   82   virtual std::vector<std::string> Values()
 const {
 
   83     return std::vector<std::string>{Value()};
 
   86   virtual std::string GetDefault()
 const { 
return Value(); }
 
   88   virtual size_t NumValues()
 const { 
return 1; }
 
   90   virtual std::string ToString()
 const {
 
   91     return std::string(Key()) + 
"\t" + Value();
 
   98       : key(_key), value(_value) {}
 
  102   virtual std::string Key()
 const { 
return key; }
 
  104   virtual std::string Value()
 const { 
return value; }
 
  113   virtual std::string GetDefault()
 const {
 
  114     if (NumValues() > 0) {
 
  115       return Values().at(0);
 
  121   virtual std::string ToString() 
const;
 
  127                          const std::vector<std::string>& _values)
 
  128       : key(_key), values(_values) {}
 
  132   virtual std::string Key()
 const { 
return key; }
 
  134   size_t NumValues()
 const { 
return values.size(); }
 
  136   std::vector<std::string> Values()
 const { 
return values; }
 
  140   std::vector<std::string> values;
 
  145   static DictEntry* New(
const std::string& key) {
 
  149   static DictEntry* New(
const std::string& key, 
const std::string& value) {
 
  153   static DictEntry* New(
const std::string& key,
 
  154                         const std::vector<std::string>& values) {
 
  155     if (values.size() == 0) {
 
  157     } 
else if (values.size() == 1) {
 
  158       return New(key, values.front());
 
  164     if (entry->NumValues() == 0) {
 
  166     } 
else if (entry->NumValues() == 1) {