source: branches/tree/CORE/StrUniquifier.h

Last change on this file was 17909, checked in by westram, 5 years ago
  • refactored KeyOccur into new class StrUniquifier (in CORE).
    • really compare strings (not only pointers to keys; did only work by luck).
    • document restrictions.
    • make_unique_key return pointer to static buffer (valid until next call).
    • allow to define string to separate key and counter.
    • only change key when duplicated.
File size: 1.9 KB
Line 
1// ========================================================= //
2//                                                           //
3//   File      : StrUniquifier.h                             //
4//   Purpose   : generate fast + quite unique IDs            //
5//                                                           //
6//   Coded by Ralf Westram (coder@reallysoft.de) in Jun 19   //
7//   http://www.arb-home.de/                                 //
8//                                                           //
9// ========================================================= //
10
11#ifndef STRUNIQUIFIER_H
12#define STRUNIQUIFIER_H
13
14#ifndef ARBTOOLS_H
15#include <arbtools.h>
16#endif
17#ifndef ARB_STRBUF_H
18#include "arb_strbuf.h"
19#endif
20#ifndef _GLIBCXX_MAP
21#include <map>
22#endif
23
24class StrUniquifier : virtual Noncopyable {
25    // keys passed to make_unique_key have to exist until destruction of StrUniquifier.
26    // keys are NOT strongly guaranteed to be unique.
27
28    typedef std::map<const char *, int, charpLess> KeyOccur;
29
30    KeyOccur       occurred;
31    char          *separator;
32    GBS_strstruct  buffer;
33
34public:
35    StrUniquifier(const char *separator_ = "_") :
36        separator(strdup(separator_))
37    {}
38    ~StrUniquifier() {
39        free(separator);
40    }
41
42    const char *make_unique_key(const char *key) {
43        KeyOccur::iterator found = occurred.find(key);
44        int                count = 1;
45        if (found == occurred.end()) {
46            occurred[key] = count;
47        }
48        else {
49            count = ++found->second;
50        }
51
52        buffer.erase();
53        buffer.cat(key);
54        if (count>1) {
55            buffer.cat(separator);
56            buffer.putlong(count);
57        }
58        return buffer.get_data(); // valid until next call of make_unique_key()
59    }
60
61    void clear() { occurred.clear(); }
62};
63
64
65#else
66#error StrUniquifier.h included twice
67#endif // STRUNIQUIFIER_H
Note: See TracBrowser for help on using the repository browser.