Index: media/cast/common/mod_util.h |
diff --git a/media/cast/common/mod_util.h b/media/cast/common/mod_util.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b2f9dc552220feff16f08bc7423d05b6c4e9ebdb |
--- /dev/null |
+++ b/media/cast/common/mod_util.h |
@@ -0,0 +1,54 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef MEDIA_CAST_COMMON_MOD_UTIL_H_ |
+#define MEDIA_CAST_COMMON_MOD_UTIL_H_ |
+ |
+#include <map> |
+#include "base/logging.h" |
+ |
+namespace media { |
+namespace cast { |
+ |
+// MAP is a map<uint??, ...> where the unsigned integer is |
+// assumed to wrap around, but only a small range is used at a time. |
+// Return the oldest entry in the map. |
+template<class MAP> |
+typename MAP::iterator ModMapOldest(MAP* map) { |
+ typename MAP::iterator ret = map->begin(); |
+ if (ret != map->end()) { |
+ typename MAP::key_type lower_quarter = 0; |
+ lower_quarter--; |
+ lower_quarter >>= 1; |
+ if (ret->first < lower_quarter) { |
+ typename MAP::iterator tmp = map->upper_bound(lower_quarter * 3); |
+ if (tmp != map->end()) |
+ ret = tmp; |
+ } |
+ } |
+ return ret; |
+} |
+ |
+// MAP is a map<uint??, ...> where the unsigned integer is |
+// assumed to wrap around, but only a small range is used at a time. |
+// Returns the previous entry in the map. |
+template<class MAP> |
+typename MAP::iterator ModMapPrevious(MAP* map, typename MAP::iterator i) { |
+ DCHECK(!map->empty()); |
+ typename MAP::iterator ret = i; |
+ if (i == map->begin()) { |
+ ret = map->end(); |
+ } |
+ ret--; |
+ if (i == ret) |
+ return map->end(); |
+ if ((i->first - ret->first) > ((typename MAP::key_type(0) - 1)) >> 1) |
+ return map->end(); |
+ return ret; |
+} |
+ |
+} // namespace cast |
+} // namespace media |
+ |
+#endif |