1 | /*
|
---|
2 | Copyright (C) 2005-2006 Feeling Software Inc.
|
---|
3 | MIT License: http://www.opensource.org/licenses/mit-license.php
|
---|
4 | */
|
---|
5 |
|
---|
6 | /**
|
---|
7 | @file FUUniqueStringMap.h
|
---|
8 | This file contains the FUUniqueStringMapT template.
|
---|
9 | */
|
---|
10 |
|
---|
11 | #ifndef _FU_UNIQUE_ID_MAP_H_
|
---|
12 | #define _FU_UNIQUE_ID_MAP_H_
|
---|
13 |
|
---|
14 | /**
|
---|
15 | A set of unique strings.
|
---|
16 | This class adds three functions to the STL map in order to
|
---|
17 | keep the strings inside unique: AddUniqueString, Exists and Erase.
|
---|
18 |
|
---|
19 | @ingroup FUtils
|
---|
20 | */
|
---|
21 | template <typename STRING_BUILDER>
|
---|
22 | class FUUniqueStringMapT : map<typename STRING_BUILDER::String, void*>
|
---|
23 | {
|
---|
24 | private:
|
---|
25 | typedef map<typename STRING_BUILDER::String, void*> Super;
|
---|
26 |
|
---|
27 | public:
|
---|
28 | /** Adds a string to the map.
|
---|
29 | If the string isn't unique, it will be modified in order to make it unique.
|
---|
30 | @param wantedStr The string to add. This reference will be directly
|
---|
31 | modified to hold the actual unique string added to the map. */
|
---|
32 | void AddUniqueString(typename STRING_BUILDER::String& wantedStr);
|
---|
33 |
|
---|
34 | /** Retrieves whether a given string is contained within the map.
|
---|
35 | @param str The string. */
|
---|
36 | bool Exists(const typename STRING_BUILDER::String& str) const;
|
---|
37 |
|
---|
38 | /** Erases a string from the map.
|
---|
39 | @param str A string contained within the map. */
|
---|
40 | void Erase(const typename STRING_BUILDER::String& str);
|
---|
41 | };
|
---|
42 |
|
---|
43 | typedef FUUniqueStringMapT<FUSStringBuilder> FUSUniqueStringMap; /**< A map of unique UTF-8 strings. */
|
---|
44 | typedef FUUniqueStringMapT<FUStringBuilder> FUUniqueStringMap; /**< A map of unique Unicode strings. */
|
---|
45 |
|
---|
46 | template <typename Builder>
|
---|
47 | void FUUniqueStringMapT<Builder>::AddUniqueString(typename Builder::String& wantedStr)
|
---|
48 | {
|
---|
49 | if (Exists(wantedStr))
|
---|
50 | {
|
---|
51 | // Attempt to generate a new string by appending an increasing counter.
|
---|
52 | uint32 counter = 2;
|
---|
53 | static const maxCounter = 256;
|
---|
54 | Builder buffer;
|
---|
55 | buffer.reserve(wantedStr.length() + 5);
|
---|
56 | do
|
---|
57 | {
|
---|
58 | buffer.set(wantedStr);
|
---|
59 | buffer.append(counter);
|
---|
60 | } while (counter++ < maxCounter && Exists(buffer.ToString()));
|
---|
61 |
|
---|
62 | // Hopefully, this is now unique.
|
---|
63 | wantedStr = buffer.ToString();
|
---|
64 | }
|
---|
65 | insert(Super::value_type(wantedStr, NULL));
|
---|
66 | }
|
---|
67 |
|
---|
68 | template <typename Builder>
|
---|
69 | bool FUUniqueStringMapT<Builder>::Exists(const typename Builder::String& str) const
|
---|
70 | {
|
---|
71 | const_iterator it = find(str);
|
---|
72 | return it != end();
|
---|
73 | }
|
---|
74 |
|
---|
75 | template <typename Builder>
|
---|
76 | void FUUniqueStringMapT<Builder>::Erase(const typename Builder::String& str)
|
---|
77 | {
|
---|
78 | iterator it = find(str);
|
---|
79 | if (it != end()) erase(it);
|
---|
80 | }
|
---|
81 |
|
---|
82 | #endif // _FU_UNIQUE_ID_MAP_H_
|
---|
83 |
|
---|