1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// found in the LICENSE file.
4effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
5effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#ifndef MOJO_PUBLIC_CPP_SYSTEM_MACROS_H_
6effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#define MOJO_PUBLIC_CPP_SYSTEM_MACROS_H_
7effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
8effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "mojo/public/c/system/macros.h"
9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Define a set of C++ specific macros.
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Mojo C++ API users can assume that mojo/public/cpp/system/macros.h
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// includes mojo/public/c/system/macros.h.
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
14effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Annotate a virtual method indicating it must be overriding a virtual method
15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// in the parent class. Use like:
16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch//   virtual void foo() OVERRIDE;
17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if defined(_MSC_VER) || defined(__clang__)
18effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#define MOJO_OVERRIDE override
19effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#else
20effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#define MOJO_OVERRIDE
21effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif
22effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
23effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// A macro to disallow the copy constructor and operator= functions.
24effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// This should be used in the private: declarations for a class.
25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#define MOJO_DISALLOW_COPY_AND_ASSIGN(TypeName) \
26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    TypeName(const TypeName&); \
27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    void operator=(const TypeName&)
28effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Used to calculate the number of elements in an array.
30effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// (See |arraysize()| in Chromium's base/basictypes.h for more details.)
31effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace mojo {
32effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochtemplate <typename T, size_t N>
33effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochchar (&ArraySizeHelper(T (&array)[N]))[N];
34effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if !defined(_MSC_VER)
35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochtemplate <typename T, size_t N>
36effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochchar (&ArraySizeHelper(const T (&array)[N]))[N];
37effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif
38effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}  // namespace mojo
39effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#define MOJO_ARRAYSIZE(array) (sizeof(::mojo::ArraySizeHelper(array)))
40effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Used to make a type move-only in C++03. See Chromium's base/move.h for more
42effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// details.
43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#define MOJO_MOVE_ONLY_TYPE_FOR_CPP_03(type, rvalue_type) \
44effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch   private: \
45effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    struct rvalue_type { \
46effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      explicit rvalue_type(type* object) : object(object) {} \
47effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      type* object; \
48effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    }; \
49effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    type(type&); \
50effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    void operator=(type&); \
51effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch   public: \
52effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    operator rvalue_type() { return rvalue_type(this); } \
53effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    type Pass() { return type(rvalue_type(this)); } \
54effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    typedef void MoveOnlyTypeForCPP03; \
55effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch   private:
56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
57effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif  // MOJO_PUBLIC_CPP_SYSTEM_MACROS_H_
58