1378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// Copyright 2010 Google Inc. All Rights Reserved.
2378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com//
3378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// Redistribution and use in source and binary forms, with or without
4378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// modification, are permitted provided that the following conditions are
5378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// met:
6378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com//
7378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com//     * Redistributions of source code must retain the above copyright
8378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// notice, this list of conditions and the following disclaimer.
9378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com//     * Redistributions in binary form must reproduce the above
10378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// copyright notice, this list of conditions and the following disclaimer
11378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// in the documentation and/or other materials provided with the
12378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// distribution.
13378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com//     * Neither the name of Google Inc. nor the names of its
14378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// contributors may be used to endorse or promote products derived from
15378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// this software without specific prior written permission.
16378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com//
17378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com
29378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// static_map_iterator-inl.h: StaticMapIterator implementation.
30378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com//
31378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// See static_map_iterator.h for documentation.
32378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com//
33378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// Author: Siyang Xie (lambxsy@google.com)
34378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com
35378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com#ifndef PROCESSOR_STATIC_MAP_ITERATOR_INL_H__
36378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com#define PROCESSOR_STATIC_MAP_ITERATOR_INL_H__
37378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com
38378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com#include "processor/static_map_iterator.h"
39378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com
40378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com#include "processor/logging.h"
41378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com
42378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.comnamespace google_breakpad {
43378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com
44378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.comtemplate<typename Key, typename Value, typename Compare>
45378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.comStaticMapIterator<Key, Value, Compare>::StaticMapIterator(const char* base,
46378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com                                                            const int &index):
47378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com      index_(index), base_(base) {
48378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com  // See static_map.h for documentation on
49378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com  // bytes format of serialized StaticMap data.
50378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com  num_nodes_ = *(reinterpret_cast<const int32_t*>(base_));
516162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  offsets_ = reinterpret_cast<const uint32_t*>(base_ + sizeof(num_nodes_));
52378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com  keys_ = reinterpret_cast<const Key*>(
53378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com      base_ + (1 + num_nodes_) * sizeof(num_nodes_));
54378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com}
55378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com
56378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com// Increment & Decrement operators:
57378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.comtemplate<typename Key, typename Value, typename Compare>
58378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.comStaticMapIterator<Key, Value, Compare>&
59378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.comStaticMapIterator<Key, Value, Compare>::operator++() {
60378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com  if (!IsValid()) {
61378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com    BPLOG(ERROR) << "operator++ on invalid iterator";
62378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com    return *this;
63378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com  }
64378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com  if (++index_ > num_nodes_) index_ = num_nodes_;
65378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com  return *this;
66378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com}
67378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com
68378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.comtemplate<typename Key, typename Value, typename Compare>
69378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.comStaticMapIterator<Key, Value, Compare>
70378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.comStaticMapIterator<Key, Value, Compare>::operator++(int postfix_operator) {
71378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com  if (!IsValid()) {
72378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com    BPLOG(ERROR) << "operator++ on invalid iterator";
73378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com    return *this;
74378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com  }
75378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com  StaticMapIterator<Key, Value, Compare> tmp = *this;
76378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com  if (++index_ > num_nodes_) index_ = num_nodes_;
77378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com  return tmp;
78378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com}
79378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com
80378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.comtemplate<typename Key, typename Value, typename Compare>
81378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.comStaticMapIterator<Key, Value, Compare>&
82378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.comStaticMapIterator<Key, Value, Compare>::operator--() {
83378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com  if (!IsValid()) {
84378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com    BPLOG(ERROR) << "operator++ on invalid iterator";
85378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com    return *this;
86378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com  }
87378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com
88378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com  if (--index_ < 0) index_ = 0;
89378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com  return *this;
90378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com}
91378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com
92378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.comtemplate<typename Key, typename Value, typename Compare>
93378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.comStaticMapIterator<Key, Value, Compare>
94378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.comStaticMapIterator<Key, Value, Compare>::operator--(int postfix_operator) {
95378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com  if (!IsValid()) {
96378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com    BPLOG(ERROR) << "operator++ on invalid iterator";
97378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com    return *this;
98378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com  }
99378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com  StaticMapIterator<Key, Value, Compare> tmp = *this;
100378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com
101378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com  if (--index_ < 0) index_ = 0;
102378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com  return tmp;
103378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com}
104378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com
105378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.comtemplate<typename Key, typename Value, typename Compare>
106378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.comconst Key* StaticMapIterator<Key, Value, Compare>::GetKeyPtr() const {
107378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com  if (!IsValid()) {
108378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com    BPLOG(ERROR) << "call GetKeyPtr() on invalid iterator";
109378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com    return NULL;
110378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com  }
111378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com  return &(keys_[index_]);
112378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com}
113378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com
114378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.comtemplate<typename Key, typename Value, typename Compare>
115378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.comconst char* StaticMapIterator<Key, Value, Compare>::GetValueRawPtr() const {
116378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com  if (!IsValid()) {
117378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com    BPLOG(ERROR) << "call GetValuePtr() on invalid iterator";
118378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com    return NULL;
119378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com  }
120378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com  return base_ + offsets_[index_];
121378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com}
122378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com
123378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.comtemplate<typename Key, typename Value, typename Compare>
124378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.combool StaticMapIterator<Key, Value, Compare>::operator==(
125378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com    const StaticMapIterator<Key, Value, Compare>& x) const {
126378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com  return base_ == x.base_ && index_ == x.index_;
127378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com}
128378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com
129378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.comtemplate<typename Key, typename Value, typename Compare>
130378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.combool StaticMapIterator<Key, Value, Compare>::operator!=(
131378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com    const StaticMapIterator<Key, Value, Compare>& x) const {
132378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com  // Only need to compare base_ and index_.
133378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com  // Other data members are auxiliary.
134378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com  return base_ != x.base_ || index_ != x.index_;
135378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com}
136378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com
137378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.comtemplate<typename Key, typename Value, typename Compare>
138378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.combool StaticMapIterator<Key, Value, Compare>::IsValid() const {
139378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com  if (!base_ || index_ < 0 || index_ > num_nodes_)
140378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com    return false;
141378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com
142378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com  return true;
143378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com}
144378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com
145378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com}  // namespace google_breakpad
146378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com
147378e28e30147a6baba275ecce3c8fda06cfd5849SiyangXie@gmail.com#endif  // PROCESSOR_STATIC_MAP_ITERATOR_INL_H__
148