OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef COMPONENTS_COPRESENCE_TIMED_MAP_H_ | 5 #ifndef COMPONENTS_COPRESENCE_TIMED_MAP_H_ |
6 #define COMPONENTS_COPRESENCE_TIMED_MAP_H_ | 6 #define COMPONENTS_COPRESENCE_TIMED_MAP_H_ |
7 | 7 |
8 #include <map> | 8 #include <map> |
9 #include <queue> | 9 #include <queue> |
10 #include <utility> | 10 #include <utility> |
11 #include <vector> | 11 #include <vector> |
12 | 12 |
13 #include "base/macros.h" | 13 #include "base/macros.h" |
14 #include "base/memory/scoped_ptr.h" | 14 #include "base/memory/scoped_ptr.h" |
15 #include "base/time/default_tick_clock.h" | 15 #include "base/time/default_tick_clock.h" |
16 #include "base/time/tick_clock.h" | 16 #include "base/time/tick_clock.h" |
17 #include "base/time/time.h" | 17 #include "base/time/time.h" |
18 #include "base/timer/timer.h" | 18 #include "base/timer/timer.h" |
19 | 19 |
20 namespace copresence { | 20 namespace copresence { |
21 | 21 |
22 // TimedMap is a map with the added functionality of clearing any | 22 // TimedMap is a map with the added functionality of clearing any |
23 // key/value pair after its specified lifetime is over. | 23 // key/value pair after its specified lifetime is over. |
| 24 // TODO(ckehoe): Why is this interface so different from std::map? |
24 template <typename KeyType, typename ValueType> | 25 template <typename KeyType, typename ValueType> |
25 class TimedMap { | 26 class TimedMap { |
26 public: | 27 public: |
27 TimedMap(const base::TimeDelta& lifetime, size_t max_elements) | 28 TimedMap(const base::TimeDelta& lifetime, size_t max_elements) |
28 : kEmptyValue(ValueType()), | 29 : kEmptyValue(ValueType()), |
29 clock_(new base::DefaultTickClock()), | 30 clock_(new base::DefaultTickClock()), |
30 lifetime_(lifetime), | 31 lifetime_(lifetime), |
31 max_elements_(max_elements) { | 32 max_elements_(max_elements) { |
32 timer_.Start(FROM_HERE, lifetime_, this, &TimedMap::ClearExpiredTokens); | 33 timer_.Start(FROM_HERE, lifetime_, this, &TimedMap::ClearExpiredTokens); |
33 } | 34 } |
(...skipping 11 matching lines...) Expand all Loading... |
45 ClearExpiredTokens(); | 46 ClearExpiredTokens(); |
46 return map_.find(key) != map_.end(); | 47 return map_.find(key) != map_.end(); |
47 } | 48 } |
48 | 49 |
49 const ValueType& GetValue(const KeyType& key) { | 50 const ValueType& GetValue(const KeyType& key) { |
50 ClearExpiredTokens(); | 51 ClearExpiredTokens(); |
51 auto elt = map_.find(key); | 52 auto elt = map_.find(key); |
52 return elt == map_.end() ? kEmptyValue : elt->second; | 53 return elt == map_.end() ? kEmptyValue : elt->second; |
53 } | 54 } |
54 | 55 |
| 56 ValueType* GetMutableValue(const KeyType& key) { |
| 57 ClearExpiredTokens(); |
| 58 auto elt = map_.find(key); |
| 59 return elt == map_.end() ? nullptr : &(elt->second); |
| 60 } |
| 61 |
| 62 // TODO(ckehoe): Add a unit test for this. |
| 63 size_t Erase(const KeyType& key) { |
| 64 return map_.erase(key); |
| 65 } |
| 66 |
55 void set_clock_for_testing(scoped_ptr<base::TickClock> clock) { | 67 void set_clock_for_testing(scoped_ptr<base::TickClock> clock) { |
56 clock_ = clock.Pass(); | 68 clock_ = clock.Pass(); |
57 } | 69 } |
58 | 70 |
59 private: | 71 private: |
60 void ClearExpiredTokens() { | 72 void ClearExpiredTokens() { |
61 while (!expiry_queue_.empty() && | 73 while (!expiry_queue_.empty() && |
62 expiry_queue_.top().second <= clock_->NowTicks()) | 74 expiry_queue_.top().second <= clock_->NowTicks()) |
63 ClearOldestToken(); | 75 ClearOldestToken(); |
64 } | 76 } |
(...skipping 26 matching lines...) Expand all Loading... |
91 // Priority queue with our element keys ordered by the earliest expiring keys | 103 // Priority queue with our element keys ordered by the earliest expiring keys |
92 // first. | 104 // first. |
93 ExpiryQueue expiry_queue_; | 105 ExpiryQueue expiry_queue_; |
94 | 106 |
95 DISALLOW_COPY_AND_ASSIGN(TimedMap); | 107 DISALLOW_COPY_AND_ASSIGN(TimedMap); |
96 }; | 108 }; |
97 | 109 |
98 } // namespace copresence | 110 } // namespace copresence |
99 | 111 |
100 #endif // COMPONENTS_COPRESENCE_TIMED_MAP_H_ | 112 #endif // COMPONENTS_COPRESENCE_TIMED_MAP_H_ |
OLD | NEW |