libept
version.h
Go to the documentation of this file.
00001 // -*- C++ -*-
00002 #ifndef EPT_CORE_APT_VERSION_H
00003 #define EPT_CORE_APT_VERSION_H
00004 
00005 namespace ept {
00006 namespace core {
00007 namespace version {
00008 
00009 struct InternalList {
00010     package::Internal m_pkg;
00011     Internal m_ver;
00012 
00013     typedef Internal Type;
00014 
00015     InternalList tail() const {
00016         InternalList t = *this;
00017         t.m_ver ++;
00018         t.seek();
00019         return t;
00020     }
00021 
00022     const Internal head() const {
00023         return m_ver;
00024     }
00025 
00026     Internal head() {
00027         return m_ver;
00028     }
00029 
00030     bool empty() const {
00031         return m_pkg.end();
00032     }
00033 
00034     void seek()
00035     {
00036         while ( m_ver.end() && !m_pkg.end() ) {
00037             m_pkg ++;
00038             m_ver = m_pkg.VersionList();
00039         }
00040     }
00041 
00042     InternalList( package::Internal i )
00043         : m_pkg( i )
00044     {
00045         m_ver = m_pkg.VersionList();
00046         seek();
00047     }
00048 };
00049 
00050 struct Setup {
00051     typedef ept::Token Token;
00052     typedef version::Internal Internal;
00053     typedef version::PropertyId PropertyId;
00054     typedef version::InternalList InternalList;
00055 };
00056 
00057 struct Source : core::Source< Source, Setup, PropertyType >
00058 {
00059     AptDatabase &m_db;
00060     Source( AptDatabase &db ) : m_db( db ) {}
00061 
00062     InternalList listInternal() {
00063         return InternalList( m_db.cache().PkgBegin() );
00064     }
00065 
00066     Token getToken( Internal i ) {
00067         Token t;
00068         t._id = std::string( i.ParentPkg().Name() ) + "_" + i.VerStr();
00069         return t;
00070     }
00071 
00072     Internal lookupToken( Token t ) {
00073         return m_db.lookupVersion( t );
00074     }
00075 
00076     template< PropertyId p >
00077     typename PropertyType< p >::T getInternal( Internal );
00078 };
00079 
00080 template<> struct PropertyType< Package > { typedef Token T; };
00081 
00082 template<> inline Token Source::getInternal< Package >( Internal i ) {
00083     assert( !i.end() );
00084     Token t;
00085     t._id = i.ParentPkg().Name();
00086     return t;
00087 }
00088 
00089 }
00090 }
00091 }
00092 
00093 #endif