1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// This file contains macros and macro-like constructs (e.g., templates) that
6// are commonly used throughout Chromium source. (It may also contain things
7// that are closely related to things that are commonly used that belong in this
8// file.)
9
10#ifndef BASE_MACROS_H_
11#define BASE_MACROS_H_
12
13// Put this in the declarations for a class to be uncopyable.
14#define DISALLOW_COPY(TypeName) \
15 TypeName(const TypeName&) = delete
16
17// Put this in the declarations for a class to be unassignable.
18#define DISALLOW_ASSIGN(TypeName) TypeName& operator=(const TypeName&) = delete
19
20// Put this in the declarations for a class to be uncopyable and unassignable.
21#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
22 DISALLOW_COPY(TypeName); \
23 DISALLOW_ASSIGN(TypeName)
24
25// A macro to disallow all the implicit constructors, namely the
26// default constructor, copy constructor and operator= functions.
27// This is especially useful for classes containing only static methods.
28#define DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName) \
29 TypeName() = delete; \
30 DISALLOW_COPY_AND_ASSIGN(TypeName)
31
32// Workaround for MSVC, which expands __VA_ARGS__ as one macro argument. To
33// work around this bug, wrap the entire expression in this macro...
34#define CR_EXPAND_ARG(arg) arg
35
36// Used to explicitly mark the return value of a function as unused. If you are
37// really sure you don't want to do anything with the return value of a function
38// that has been marked WARN_UNUSED_RESULT, wrap it with this. Example:
39//
40// std::unique_ptr<MyType> my_var = ...;
41// if (TakeOwnership(my_var.get()) == SUCCESS)
42// ignore_result(my_var.release());
43//
44template<typename T>
45inline void ignore_result(const T&) {
46}
47
48#endif // BASE_MACROS_H_
49