/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=8 sts=2 et sw=2 tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
template <>
uint8_t StartValue<uint8_t>() { // Picking a value near middle of uint8_t's range. returnstatic_cast<uint8_t>(std::numeric_limits<int8_t>::max());
}
template <>
uint16_t StartValue<uint16_t>() { // Picking a value near middle of uint16_t's range. returnstatic_cast<uint8_t>(std::numeric_limits<int16_t>::max());
}
template <>
uint32_t StartValue<uint32_t>() { // Picking a value near middle of uint32_t's range. returnstatic_cast<uint8_t>(std::numeric_limits<int32_t>::max());
}
// Add //
template <typename T> staticvoid TestPrefixIncr() {
T value = StartValue<T>();
Saturate<T> satValue(value);
for (T i = 0; i < static_cast<T>(sNumOps); ++i) {
A(++value == ++satValue);
}
}
template <typename T> staticvoid TestPostfixIncr() {
T value = StartValue<T>();
Saturate<T> satValue(value);
for (T i = 0; i < static_cast<T>(sNumOps); ++i) {
A(value++ == satValue++);
}
}
template <typename T> staticvoid TestAdd() {
T value = StartValue<T>();
Saturate<T> satValue(value);
for (T i = 0; i < static_cast<T>(sNumOps); ++i) {
A((value + i) == (satValue + i));
}
}
// Subtract //
template <typename T> staticvoid TestPrefixDecr() {
T value = StartValue<T>();
Saturate<T> satValue(value);
for (T i = 0; i < static_cast<T>(sNumOps); ++i) {
A(--value == --satValue);
}
}
template <typename T> staticvoid TestPostfixDecr() {
T value = StartValue<T>();
Saturate<T> satValue(value);
for (T i = 0; i < static_cast<T>(sNumOps); ++i) {
A(value-- == satValue--);
}
}
template <typename T> staticvoid TestSub() {
T value = StartValue<T>();
Saturate<T> satValue(value);
for (T i = 0; i < static_cast<T>(sNumOps); ++i) {
A((value - i) == (satValue - i));
}
}
A(++satValue == (std::numeric_limits<T>::min() + 1));
A(--satValue == (std::numeric_limits<T>::min()));
A(--satValue == (std::numeric_limits<T>::min())); // don't overflow here
A(--satValue == (std::numeric_limits<T>::min())); // don't overflow here
A(++satValue == (std::numeric_limits<T>::min() + 1)); // back at (max + 1)
A(++satValue == (std::numeric_limits<T>::min() + 2));
}
// Framework //
template <typename T> staticvoid TestAll() { // Assert that we don't accidently hit type's range limits in tests. const T value = StartValue<T>();
A(std::numeric_limits<T>::min() + static_cast<T>(sNumOps) <= value);
A(std::numeric_limits<T>::max() - static_cast<T>(sNumOps) >= value);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.