-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathMap.hpp
143 lines (118 loc) · 2.74 KB
/
Map.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/******************************************************************************
** (C) Chris Oldwood
**
** MODULE: MAP.HPP
** COMPONENT: Windows C++ Library.
** DESCRIPTION: The CMap class declaration.
**
*******************************************************************************
*/
// Check for previous inclusion
#ifndef MAP_HPP
#define MAP_HPP
#if _MSC_VER > 1000
#pragma once
#endif
/******************************************************************************
**
** This is the base class used for items stored in a map collection.
**
*******************************************************************************
*/
class CMapItem /*: private NotCopyable*/
{
public:
//
// Constructors/Destructor.
//
virtual ~CMapItem();
//
// Methods.
//
virtual uint Key() const = 0;
virtual bool operator==(const CMapItem& rRHS) const = 0;
virtual bool operator!=(const CMapItem& rRHS) const;
//
// Members.
//
CMapItem* m_pNext; // The next item in the collision chain.
protected:
//
// Constructors/Destructor.
//
CMapItem();
private:
// NotCopyable.
CMapItem(const CMapItem&);
CMapItem& operator=(const CMapItem&);
};
/******************************************************************************
**
** The is the base class for all map collections.
**
*******************************************************************************
*/
class CMap
{
public:
//
// Methods.
//
size_t Count() const;
void RemoveAll();
void Reserve(size_t nItems);
protected:
//
// Constructors/Destructor.
//
CMap();
virtual ~CMap();
//
// Derived class methods.
//
void Add(CMapItem& rItem);
void Remove(const CMapItem& rItem);
CMapItem* Find(const CMapItem& rItem) const;
bool Exists(const CMapItem& rItem) const;
//
// Internal methods.
//
virtual size_t Hash(const CMapItem& rItem) const;
//
// Members.
//
size_t m_iSize; // The size of the map.
CMapItem** m_pMap; // The array of map buckets.
size_t m_iCount; // The number of items in the map.
// Map size table size.
enum { NUM_MAP_SIZES = 15};
// Array of map sizes.
static size_t s_aiSizes[NUM_MAP_SIZES];
// Max expected chain length.
enum { MAX_CHAIN_LEN = 4 };
// Friends.
friend class CMapIter;
private:
// Disallow copying and assignment.
CMap(const CMap&);
void operator=(const CMap&);
};
/******************************************************************************
**
** Implementation of inline functions.
**
*******************************************************************************
*/
inline size_t CMap::Count() const
{
return m_iCount;
}
inline bool CMap::Exists(const CMapItem& rItem) const
{
return (Find(rItem) != NULL);
}
inline bool CMapItem::operator!=(const CMapItem& rRHS) const
{
return !(*this == rRHS);
}
#endif //MAP_HPP