// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Define a set of C++ specific macros. // Mojo C++ API users can assume that mojo/public/cpp/system/macros.h // includes mojo/public/c/system/macros.h. #ifndef MOJO_PUBLIC_CPP_SYSTEM_MACROS_H_ #define MOJO_PUBLIC_CPP_SYSTEM_MACROS_H_ #include #include "mojo/public/c/system/macros.h" // Symbols exposed. // A macro to disallow the copy constructor and operator= functions. #define MOJO_DISALLOW_COPY_AND_ASSIGN(TypeName) \ TypeName(const TypeName&) = delete; \ void operator=(const TypeName&) = delete // Used to calculate the number of elements in an array. // (See |arraysize()| in Chromium's base/macros.h for more details.) namespace mojo { namespace internal { template char(&ArraySizeHelper(T(&array)[N]))[N]; #if !defined(_MSC_VER) template char(&ArraySizeHelper(const T(&array)[N]))[N]; #endif } // namespace internal } // namespace mojo #define MOJO_ARRAYSIZE(array) (sizeof(::mojo::internal::ArraySizeHelper(array))) // Used to make a type non-copyable. See Chromium's base/move.h for more // details. The MoveOnlyTypeForCPP03 typedef is for Chromium's base/callback.h // to tell that this type is move-only, allowing these types to be bound or // passed to Callbacks. #define MOJO_MOVE_ONLY_TYPE(type) \ private: \ type(const type&) = delete; \ void operator=(const type&) = delete; \ \ public: \ typedef void MoveOnlyTypeForCPP03; \ \ private: // The C++ standard requires that static const members have an out-of-class // definition (in a single compilation unit), but MSVC chokes on this (when // language extensions, which are required, are enabled). (You're only likely to // notice the need for a definition if you take the address of the member or, // more commonly, pass it to a function that takes it as a reference argument -- // probably an STL function.) This macro makes MSVC do the right thing. See // http://msdn.microsoft.com/en-us/library/34h23df8(v=vs.100).aspx for more // information. This workaround does not appear to be necessary after VS2015. // Use like: // // In the .h file: // struct Foo { // static const int kBar = 5; // }; // // In the .cc file: // MOJO_STATIC_CONST_MEMBER_DEFINITION const int Foo::kBar; #if defined(_MSC_VER) && _MSC_VER < 1900 #define MOJO_STATIC_CONST_MEMBER_DEFINITION __declspec(selectany) #else #define MOJO_STATIC_CONST_MEMBER_DEFINITION #endif namespace mojo { // Used to explicitly mark the return value of a function as unused. (You this // if you are really sure you don't want to do anything with the return value of // a function marked with |MOJO_WARN_UNUSED_RESULT|. template inline void ignore_result(const T&) { } } // namespace mojo #endif // MOJO_PUBLIC_CPP_SYSTEM_MACROS_H_