libept
|
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