Previous: Subclassing library_base, Up: Implementing new library classes



5.4.4 Subclassing library_entry impl

The last step of implementing a library is to provide a class that implements the library_entry::impl interface, and most importantly, the library_entry::impl::readentry function. There are various possible implementation strategies: the simplest is to get readentry to parse the whole of the library entry, store the name, place notation and so on in data members, and then have the name, pn, etc. functions return these. This is illustrated below:

     class mylibrary : public library_base {
       class my_library::entry_type : public library_entry::impl {
     
         // Do a deep-copy of the entry
         virtual library_entry::impl* clone() const {
           return new entry_type(*this);
         }
     
         // Parse the entry
         virtual bool readentry( library_bas& lb ) {
           ifstream &ifs = dynamic_cast< cclib& >( lb ).ifs;
           if (!ifs) return false; // Have we reached the end of file?
           string entry; getline( ifs, entry );
     
           // Assume the entry is in the format Method Name:Place Notation
           string::size_type p = linebuf.find(':');
           name_ = string( entry, 0, p );
           pn_   = string( entry, p+1, string::npos );
           return true;
         }
     
         // Access parts of the entry
         virtual string name() const { return name_; }
         virtual string pn() const   { return pn_;   }
     
         string name_, pn_;
       };
     
       ifstream ifs;
     };

An alternative implementation strategy would be to have readline store the whole line in data member (i.e. make entry a data member), and then get name and pn to generate these on-the-fly from the entry string.