15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Use of this source code is governed by a BSD-style license that can be
3ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * found in the LICENSE file. */
4ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
5868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#ifndef LIBRARIES_SDK_UTIL_MACROS_H_
6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define LIBRARIES_SDK_UTIL_MACROS_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * A macro to disallow the evil copy constructor and operator= functions
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This should be used in the private: declarations for a class.
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DISALLOW_COPY_AND_ASSIGN(TypeName)      \
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TypeName(const TypeName&);                    \
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void operator=(const TypeName&)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** returns the size of a member of a struct. */
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MEMBER_SIZE(struct_name, member) sizeof(((struct_name*)0)->member)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Macros to prevent name mangling of definitions, allowing them to be
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * referenced from C.
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef __cplusplus
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define EXTERN_C_BEGIN  extern "C" {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define EXTERN_C_END    }
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define EXTERN_C_BEGIN
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define EXTERN_C_END
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  /* __cplusplus */
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Macros to help force linkage of symbols that otherwise would not be
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * included.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * // In a source file that you want to force linkage (file scope):
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * FORCE_LINK_THIS(myfilename);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * // In a source file that you are sure will be linked (file scope):
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * FORCE_LINK_THAT(myfilename)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define FORCE_LINK_THIS(x) int force_link_##x = 0;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define FORCE_LINK_THAT(x) \
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void force_link_function_##x() { \
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extern int force_link_##x; \
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    force_link_##x = 1; \
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch/**
500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch * Macro to error out when a printf-like function is passed incorrect arguments.
510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch *
520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch * Use like this:
530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch * void foo(const char* fmt, ...) PRINTF_LIKE(1, 2);
540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch *
550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch * The first argument is the location of the fmt string (1-based).
560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch * The second argument is the location of the first argument to validate (also
570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch *   1-based, but can be zero if the function uses a va_list, like vprintf.)
580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch */
590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#if defined(__GNUC__)
600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#define PRINTF_LIKE(a, b) __attribute__ ((format(printf, a, b)))
610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#else
620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#define PRINTF_LIKE(a, b)
630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#endif
640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
65868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif  /* LIBRARIES_SDK_UTIL_MACROS_H_ */
66