| /* -*- 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_ */ |