1 : // -*- C++ -*-
2 : #ifndef EPT_CORE_APT_VERSION_H
3 : #define EPT_CORE_APT_VERSION_H
4 :
5 : namespace ept {
6 : namespace core {
7 : namespace version {
8 :
9 3616 : struct InternalList {
10 : package::Internal m_pkg;
11 : Internal m_ver;
12 :
13 : typedef Internal Type;
14 :
15 3616 : InternalList tail() const {
16 3616 : InternalList t = *this;
17 3616 : t.m_ver ++;
18 3616 : t.seek();
19 : return t;
20 : }
21 :
22 5424 : const Internal head() const {
23 5424 : return m_ver;
24 : }
25 :
26 : Internal head() {
27 : return m_ver;
28 : }
29 :
30 3618 : bool empty() const {
31 3618 : return m_pkg.end();
32 : }
33 :
34 3618 : void seek()
35 : {
36 14790 : while ( m_ver.end() && !m_pkg.end() ) {
37 7554 : m_pkg ++;
38 7554 : m_ver = m_pkg.VersionList();
39 : }
40 3618 : }
41 :
42 2 : InternalList( package::Internal i )
43 2 : : m_pkg( i )
44 : {
45 2 : m_ver = m_pkg.VersionList();
46 2 : seek();
47 2 : }
48 : };
49 :
50 : struct Setup {
51 : typedef ept::Token Token;
52 : typedef version::Internal Internal;
53 : typedef version::PropertyId PropertyId;
54 : typedef version::InternalList InternalList;
55 : };
56 :
57 : struct Source : core::Source< Source, Setup, PropertyType >
58 12 : {
59 : AptDatabase &m_db;
60 12 : Source( AptDatabase &db ) : m_db( db ) {}
61 :
62 2 : InternalList listInternal() {
63 2 : return InternalList( m_db.cache().PkgBegin() );
64 : }
65 :
66 1808 : Token getToken( Internal i ) {
67 1808 : Token t;
68 1808 : t._id = std::string( i.ParentPkg().Name() ) + "_" + i.VerStr();
69 0 : return t;
70 : }
71 :
72 : Internal lookupToken( Token t ) {
73 : return m_db.lookupVersion( t );
74 : }
75 :
76 : template< PropertyId p >
77 : typename PropertyType< p >::T getInternal( Internal );
78 : };
79 :
80 : template<> struct PropertyType< Package > { typedef Token T; };
81 :
82 3616 : template<> inline Token Source::getInternal< Package >( Internal i ) {
83 3616 : assert( !i.end() );
84 3616 : Token t;
85 7232 : t._id = i.ParentPkg().Name();
86 0 : return t;
87 : }
88 :
89 : }
90 : }
91 : }
92 :
93 : #endif
|