xref: /aosp_15_r20/external/google-breakpad/src/processor/static_map.h (revision 9712c20fc9bbfbac4935993a2ca0b3958c5adad2)
1*9712c20fSFrederick Mayle // Copyright 2010 Google LLC
2*9712c20fSFrederick Mayle //
3*9712c20fSFrederick Mayle // Redistribution and use in source and binary forms, with or without
4*9712c20fSFrederick Mayle // modification, are permitted provided that the following conditions are
5*9712c20fSFrederick Mayle // met:
6*9712c20fSFrederick Mayle //
7*9712c20fSFrederick Mayle //     * Redistributions of source code must retain the above copyright
8*9712c20fSFrederick Mayle // notice, this list of conditions and the following disclaimer.
9*9712c20fSFrederick Mayle //     * Redistributions in binary form must reproduce the above
10*9712c20fSFrederick Mayle // copyright notice, this list of conditions and the following disclaimer
11*9712c20fSFrederick Mayle // in the documentation and/or other materials provided with the
12*9712c20fSFrederick Mayle // distribution.
13*9712c20fSFrederick Mayle //     * Neither the name of Google LLC nor the names of its
14*9712c20fSFrederick Mayle // contributors may be used to endorse or promote products derived from
15*9712c20fSFrederick Mayle // this software without specific prior written permission.
16*9712c20fSFrederick Mayle //
17*9712c20fSFrederick Mayle // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18*9712c20fSFrederick Mayle // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19*9712c20fSFrederick Mayle // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20*9712c20fSFrederick Mayle // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21*9712c20fSFrederick Mayle // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22*9712c20fSFrederick Mayle // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23*9712c20fSFrederick Mayle // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24*9712c20fSFrederick Mayle // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25*9712c20fSFrederick Mayle // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26*9712c20fSFrederick Mayle // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27*9712c20fSFrederick Mayle // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*9712c20fSFrederick Mayle 
29*9712c20fSFrederick Mayle // static_map.h: StaticMap.
30*9712c20fSFrederick Mayle //
31*9712c20fSFrederick Mayle // StaticMap provides lookup interfaces and iterators similar as stl::map's.
32*9712c20fSFrederick Mayle // These lookup operations are purely Read-Only, thus memory
33*9712c20fSFrederick Mayle // allocation & deallocation is mostly avoided (intentionally).
34*9712c20fSFrederick Mayle //
35*9712c20fSFrederick Mayle // The chunk of memory should contain data with pre-defined pattern:
36*9712c20fSFrederick Mayle // **************** header ***************
37*9712c20fSFrederick Mayle // uint32 (4 bytes): number of nodes
38*9712c20fSFrederick Mayle // uint32 (4 bytes): address offset of node1's mapped_value
39*9712c20fSFrederick Mayle // uint32 (4 bytes): address offset of node2's mapped_value
40*9712c20fSFrederick Mayle // ...
41*9712c20fSFrederick Mayle // uint32 (4 bytes): address offset of nodeN's mapped_value
42*9712c20fSFrederick Mayle //
43*9712c20fSFrederick Mayle // ************* Key array ************
44*9712c20fSFrederick Mayle // (X bytes): node1's key
45*9712c20fSFrederick Mayle // (X bytes): node2's key
46*9712c20fSFrederick Mayle // ...
47*9712c20fSFrederick Mayle // (X bytes): nodeN's key
48*9712c20fSFrederick Mayle //
49*9712c20fSFrederick Mayle // ************* Value array **********
50*9712c20fSFrederick Mayle // (? bytes): node1's mapped_value
51*9712c20fSFrederick Mayle // (? bytes): node2's mapped_value
52*9712c20fSFrederick Mayle // ...
53*9712c20fSFrederick Mayle // (? bytes): nodeN's mapped_value
54*9712c20fSFrederick Mayle //
55*9712c20fSFrederick Mayle // REQUIREMENT: Key type MUST be primitive type or pointers so that:
56*9712c20fSFrederick Mayle // X = sizeof(typename Key);
57*9712c20fSFrederick Mayle //
58*9712c20fSFrederick Mayle // Note: since address offset is stored as uint32, user should keep in mind that
59*9712c20fSFrederick Mayle // StaticMap only supports up to 4GB size of memory data.
60*9712c20fSFrederick Mayle 
61*9712c20fSFrederick Mayle // Author: Siyang Xie ([email protected])
62*9712c20fSFrederick Mayle 
63*9712c20fSFrederick Mayle 
64*9712c20fSFrederick Mayle #ifndef PROCESSOR_STATIC_MAP_H__
65*9712c20fSFrederick Mayle #define PROCESSOR_STATIC_MAP_H__
66*9712c20fSFrederick Mayle 
67*9712c20fSFrederick Mayle #include "processor/static_map_iterator-inl.h"
68*9712c20fSFrederick Mayle 
69*9712c20fSFrederick Mayle namespace google_breakpad {
70*9712c20fSFrederick Mayle 
71*9712c20fSFrederick Mayle // Default functor to compare keys.
72*9712c20fSFrederick Mayle template<typename Key>
73*9712c20fSFrederick Mayle class DefaultCompare {
74*9712c20fSFrederick Mayle  public:
operator()75*9712c20fSFrederick Mayle   int operator()(const Key& k1, const Key& k2) const {
76*9712c20fSFrederick Mayle     if (k1 < k2) return -1;
77*9712c20fSFrederick Mayle     if (k1 == k2) return 0;
78*9712c20fSFrederick Mayle     return 1;
79*9712c20fSFrederick Mayle   }
80*9712c20fSFrederick Mayle };
81*9712c20fSFrederick Mayle 
82*9712c20fSFrederick Mayle template<typename Key, typename Value, typename Compare = DefaultCompare<Key> >
83*9712c20fSFrederick Mayle class StaticMap {
84*9712c20fSFrederick Mayle  public:
85*9712c20fSFrederick Mayle   typedef StaticMapIterator<Key, Value, Compare> iterator;
86*9712c20fSFrederick Mayle   typedef StaticMapIterator<Key, Value, Compare> const_iterator;
87*9712c20fSFrederick Mayle 
StaticMap()88*9712c20fSFrederick Mayle   StaticMap() : raw_data_(0),
89*9712c20fSFrederick Mayle                 num_nodes_(0),
90*9712c20fSFrederick Mayle                 offsets_(0),
91*9712c20fSFrederick Mayle                 compare_() { }
92*9712c20fSFrederick Mayle 
93*9712c20fSFrederick Mayle   explicit StaticMap(const char* raw_data);
94*9712c20fSFrederick Mayle 
empty()95*9712c20fSFrederick Mayle   inline bool empty() const { return num_nodes_ == 0; }
size()96*9712c20fSFrederick Mayle   inline unsigned int size() const { return num_nodes_; }
97*9712c20fSFrederick Mayle 
98*9712c20fSFrederick Mayle   // Return iterators.
begin()99*9712c20fSFrederick Mayle   inline iterator begin() const { return IteratorAtIndex(0); }
last()100*9712c20fSFrederick Mayle   inline iterator last() const { return IteratorAtIndex(num_nodes_ - 1); }
end()101*9712c20fSFrederick Mayle   inline iterator end() const { return IteratorAtIndex(num_nodes_); }
IteratorAtIndex(int index)102*9712c20fSFrederick Mayle   inline iterator IteratorAtIndex(int index) const {
103*9712c20fSFrederick Mayle     return iterator(raw_data_, index);
104*9712c20fSFrederick Mayle   }
105*9712c20fSFrederick Mayle 
106*9712c20fSFrederick Mayle   // Lookup operations.
107*9712c20fSFrederick Mayle   iterator find(const Key& k) const;
108*9712c20fSFrederick Mayle 
109*9712c20fSFrederick Mayle   // lower_bound(k) searches in a sorted range for the first element that has a
110*9712c20fSFrederick Mayle   // key not less than the argument k.
111*9712c20fSFrederick Mayle   iterator lower_bound(const Key& k) const;
112*9712c20fSFrederick Mayle 
113*9712c20fSFrederick Mayle   // upper_bound(k) searches in a sorted range for the first element that has a
114*9712c20fSFrederick Mayle   // key greater than the argument k.
115*9712c20fSFrederick Mayle   iterator upper_bound(const Key& k) const;
116*9712c20fSFrederick Mayle 
117*9712c20fSFrederick Mayle   // Checks if the underlying memory data conforms to the predefined pattern:
118*9712c20fSFrederick Mayle   // first check the number of nodes is non-negative,
119*9712c20fSFrederick Mayle   // then check both offsets and keys are strictly increasing (sorted).
120*9712c20fSFrederick Mayle   bool ValidateInMemoryStructure() const;
121*9712c20fSFrederick Mayle 
122*9712c20fSFrederick Mayle  private:
123*9712c20fSFrederick Mayle   const Key GetKeyAtIndex(int i) const;
124*9712c20fSFrederick Mayle 
125*9712c20fSFrederick Mayle   // Start address of a raw memory chunk with serialized data.
126*9712c20fSFrederick Mayle   const char* raw_data_;
127*9712c20fSFrederick Mayle 
128*9712c20fSFrederick Mayle   // Number of nodes in the static map.
129*9712c20fSFrederick Mayle   int32_t num_nodes_;
130*9712c20fSFrederick Mayle 
131*9712c20fSFrederick Mayle   // Array of offset addresses for stored values.
132*9712c20fSFrederick Mayle   // For example:
133*9712c20fSFrederick Mayle   // address_of_i-th_node_value = raw_data_ + offsets_[i]
134*9712c20fSFrederick Mayle   const uint32_t* offsets_;
135*9712c20fSFrederick Mayle 
136*9712c20fSFrederick Mayle   // keys_[i] = key of i_th node
137*9712c20fSFrederick Mayle   const Key* keys_;
138*9712c20fSFrederick Mayle 
139*9712c20fSFrederick Mayle   Compare compare_;
140*9712c20fSFrederick Mayle };
141*9712c20fSFrederick Mayle 
142*9712c20fSFrederick Mayle }  // namespace google_breakpad
143*9712c20fSFrederick Mayle 
144*9712c20fSFrederick Mayle #endif  // PROCESSOR_STATIC_MAP_H__
145