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