// Copyright 2015 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CAST_STREAMING_IMPL_EXPANDED_VALUE_BASE_H_ #define CAST_STREAMING_IMPL_EXPANDED_VALUE_BASE_H_ #include <stdint.h> #include <limits> #include "util/osp_logging.h" namespace openscreen::cast { // Abstract base template class for common "sequence value" data types such as // RtpTimeTicks, FrameId, or PacketId which generally increment/decrement in // predictable amounts as media is streamed, and which often need to be reliably // truncated and re-expanded for over-the-wire transmission. // // FullWidthInteger should be a signed integer POD type that is of sufficiently // high width (in bits) such that it is never expected to under/overflow during // the longest reasonable length of continuous system operation. Subclass is // the class inheriting the common functionality provided in this template, and // is used to provide operator overloads. The Subclass must friend this class // to enable these operator overloads. // // Please see RtpTimeTicks and unit test code for examples of how to define // Subclasses and add features specific to their concrete data type, and how to // use data types derived from ExpandedValueBase. For example, a RtpTimeTicks // adds math operators consisting of the meaningful and valid set of operations // allowed for doing "time math." On the other hand, FrameId only adds math // operators for incrementing/decrementing since multiplication and division are // meaningless. template <typename FullWidthInteger, class Subclass> class ExpandedValueBase { … }; } // namespace openscreen::cast #endif // CAST_STREAMING_IMPL_EXPANDED_VALUE_BASE_H_