b40ad060e0
Summary: Test Plan: Reviewers: CC: Task ID: # Blame Rev:
71 lines
2.0 KiB
C
71 lines
2.0 KiB
C
/*
|
|
* Copyright 2012 Facebook, Inc.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
// @author: Andrei Alexandrescu
|
|
|
|
#ifndef FOLLY_PREPROCESSOR_
|
|
#define FOLLY_PREPROCESSOR_
|
|
|
|
/**
|
|
* Necessarily evil preprocessor-related amenities.
|
|
*/
|
|
|
|
/**
|
|
* FB_ONE_OR_NONE(hello, world) expands to hello and
|
|
* FB_ONE_OR_NONE(hello) expands to nothing. This macro is used to
|
|
* insert or eliminate text based on the presence of another argument.
|
|
*/
|
|
#define FB_ONE_OR_NONE(a, ...) FB_THIRD(a, ## __VA_ARGS__, a)
|
|
#define FB_THIRD(a, b, ...) __VA_ARGS__
|
|
|
|
/**
|
|
* Helper macro that extracts the first argument out of a list of any
|
|
* number of arguments.
|
|
*/
|
|
#define FB_ARG_1(a, ...) a
|
|
|
|
/**
|
|
* Helper macro that extracts the second argument out of a list of any
|
|
* number of arguments. If only one argument is given, it returns
|
|
* that.
|
|
*/
|
|
#define FB_ARG_2_OR_1(...) FB_ARG_2_OR_1_IMPL(__VA_ARGS__, __VA_ARGS__)
|
|
// Support macro for the above
|
|
#define FB_ARG_2_OR_1_IMPL(a, b, ...) b
|
|
|
|
/**
|
|
* FB_ANONYMOUS_VARIABLE(str) introduces an identifier starting with
|
|
* str and ending with a number that varies with the line.
|
|
*/
|
|
#ifndef FB_ANONYMOUS_VARIABLE
|
|
#define FB_CONCATENATE_IMPL(s1, s2) s1##s2
|
|
#define FB_CONCATENATE(s1, s2) FB_CONCATENATE_IMPL(s1, s2)
|
|
#ifdef __COUNTER__
|
|
#define FB_ANONYMOUS_VARIABLE(str) FB_CONCATENATE(str, __COUNTER__)
|
|
#else
|
|
#define FB_ANONYMOUS_VARIABLE(str) FB_CONCATENATE(str, __LINE__)
|
|
#endif
|
|
#endif
|
|
|
|
/**
|
|
* Use FB_STRINGIZE(name) when you'd want to do what #name does inside
|
|
* another macro expansion.
|
|
*/
|
|
#define FB_STRINGIZE(name) #name
|
|
|
|
|
|
#endif // FOLLY_PREPROCESSOR_
|