1/*
2 * Copyright 2011, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef DEPENDENCY_H
6#define DEPENDENCY_H
7
8
9#include <package/PackageResolvableOperator.h>
10
11#include <Referenceable.h>
12
13#include <util/DoublyLinkedList.h>
14
15
16class DependencyFamily;
17class Package;
18class Resolvable;
19class Version;
20
21
22using BPackageKit::BPackageResolvableOperator;
23
24
25class Dependency : public BReferenceable,
26	public DoublyLinkedListLinkImpl<Dependency> {
27public:
28								Dependency(::Package* package);
29	virtual						~Dependency();
30
31			status_t			Init(const char* name);
32			void				SetVersionRequirement(
33									BPackageResolvableOperator op,
34									Version* version);
35									// version is optional; object takes over
36									// ownership
37
38			::Package*			Package() const
39									{ return fPackage; }
40
41			void				SetFamily(DependencyFamily* family)
42									{ fFamily = family; }
43			DependencyFamily*	Family() const
44									{ return fFamily; }
45
46			void				SetResolvable(::Resolvable* resolvable)
47									{ fResolvable = resolvable; }
48			::Resolvable*		Resolvable() const
49									{ return fResolvable; }
50			bool				ResolvableVersionMatches(
51									Version* resolvableVersion) const;
52			bool				ResolvableCompatibleVersionMatches(
53									Version* resolvableVersion) const;
54
55			const char*			Name() const	{ return fName; }
56
57private:
58			::Package*			fPackage;
59			DependencyFamily*	fFamily;
60			::Resolvable*		fResolvable;
61			char*				fName;
62			Version*			fVersion;
63			BPackageResolvableOperator fVersionOperator;
64
65public:	// conceptually package private
66			DoublyLinkedListLink<Dependency> fFamilyListLink;
67			DoublyLinkedListLink<Dependency> fResolvableListLink;
68};
69
70
71typedef DoublyLinkedList<Dependency> DependencyList;
72
73typedef DoublyLinkedList<Dependency,
74	DoublyLinkedListMemberGetLink<Dependency,
75		&Dependency::fFamilyListLink> > FamilyDependencyList;
76
77typedef DoublyLinkedList<Dependency,
78	DoublyLinkedListMemberGetLink<Dependency,
79		&Dependency::fResolvableListLink> > ResolvableDependencyList;
80
81
82#endif	// DEPENDENCY_H
83