1/* 2 * Copyright 2011, Ingo Weinhold, ingo_weinhold@gmx.de. 3 * Distributed under the terms of the MIT License. 4 */ 5#ifndef DEPENDENCY_FAMILY_H 6#define DEPENDENCY_FAMILY_H 7 8 9#include <util/OpenHashTable.h> 10 11#include "Dependency.h" 12 13 14class DependencyFamily { 15public: 16 void AddDependency(Dependency* dependency); 17 void RemoveDependency(Dependency* dependency); 18 19 void AddDependenciesToList( 20 ResolvableDependencyList& list) const; 21 22 String Name() const; 23 24 bool IsLastDependency(Dependency* dependency) const; 25 26 DependencyFamily*& HashLink() { return fHashLink; } 27 28private: 29 DependencyFamily* fHashLink; 30 FamilyDependencyList fDependencies; 31}; 32 33 34inline void 35DependencyFamily::AddDependency(Dependency* dependency) 36{ 37 fDependencies.Add(dependency); 38 dependency->SetFamily(this); 39} 40 41 42inline void 43DependencyFamily::RemoveDependency(Dependency* dependency) 44{ 45 dependency->SetFamily(NULL); 46 fDependencies.Remove(dependency); 47} 48 49 50inline void 51DependencyFamily::AddDependenciesToList(ResolvableDependencyList& list) const 52{ 53 for (FamilyDependencyList::ConstIterator it = fDependencies.GetIterator(); 54 Dependency* dependency = it.Next();) { 55 list.Add(dependency); 56 } 57} 58 59 60inline String 61DependencyFamily::Name() const 62{ 63 Dependency* head = fDependencies.Head(); 64 return head != NULL ? head->Name() : String(); 65} 66 67 68inline bool 69DependencyFamily::IsLastDependency(Dependency* dependency) const 70{ 71 return fDependencies.Head() == dependency 72 && fDependencies.Tail() == dependency; 73} 74 75 76// #pragma mark - DependencyFamilyHashDefinition 77 78 79struct DependencyFamilyHashDefinition { 80 typedef String KeyType; 81 typedef DependencyFamily ValueType; 82 83 size_t HashKey(const String& key) const 84 { 85 return key.Hash(); 86 } 87 88 size_t Hash(const DependencyFamily* value) const 89 { 90 return value->Name().Hash(); 91 } 92 93 bool Compare(const String& key, const DependencyFamily* value) const 94 { 95 return key == value->Name(); 96 } 97 98 DependencyFamily*& GetLink(DependencyFamily* value) const 99 { 100 return value->HashLink(); 101 } 102}; 103 104 105typedef BOpenHashTable<DependencyFamilyHashDefinition> 106 DependencyFamilyHashTable; 107 108 109#endif // DEPENDENCY_FAMILY_H 110