| // 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 "base/check.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 // MEDIA_CAST_COMMON_MOD_UTIL_H_ |