/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* 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/. */ /* * Provides DebugOnly, a type for variables used only in debug builds (i.e. by * assertions). */ #ifndef mozilla_DebugOnly_h_ #define mozilla_DebugOnly_h_ namespace mozilla { /** * DebugOnly contains a value of type T, but only in debug builds. In release * builds, it does not contain a value. This helper is intended to be used with * MOZ_ASSERT()-style macros, allowing one to write: * * DebugOnly<bool> check = func(); * MOZ_ASSERT(check); * * more concisely than declaring |check| conditional on #ifdef DEBUG, but also * without allocating storage space for |check| in release builds. * * DebugOnly instances can only be coerced to T in debug builds. In release * builds they don't have a value, so type coercion is not well defined. */ template<typename T> class DebugOnly { public: #ifdef DEBUG T value; DebugOnly() { } DebugOnly(const T& other) : value(other) { } DebugOnly(const DebugOnly& other) : value(other.value) { } DebugOnly& operator=(const T& rhs) { value = rhs; return *this; } void operator++(int) { value++; } void operator--(int) { value--; } T* operator&() { return &value; } operator T&() { return value; } operator const T&() const { return value; } T& operator->() { return value; } #else DebugOnly() { } DebugOnly(const T&) { } DebugOnly(const DebugOnly&) { } DebugOnly& operator=(const T&) { return *this; } void operator++(int) { } void operator--(int) { } #endif /* * DebugOnly must always have a destructor or else it will * generate "unused variable" warnings, exactly what it's intended * to avoid! */ ~DebugOnly() {} }; } #endif /* mozilla_DebugOnly_h_ */