17f40ab39c4b3eb24327edf2be9e74d521d41532fAndrew Rossignol/*
27f40ab39c4b3eb24327edf2be9e74d521d41532fAndrew Rossignol * Copyright (C) 2016 The Android Open Source Project
37f40ab39c4b3eb24327edf2be9e74d521d41532fAndrew Rossignol *
47f40ab39c4b3eb24327edf2be9e74d521d41532fAndrew Rossignol * Licensed under the Apache License, Version 2.0 (the "License");
57f40ab39c4b3eb24327edf2be9e74d521d41532fAndrew Rossignol * you may not use this file except in compliance with the License.
67f40ab39c4b3eb24327edf2be9e74d521d41532fAndrew Rossignol * You may obtain a copy of the License at
77f40ab39c4b3eb24327edf2be9e74d521d41532fAndrew Rossignol *
87f40ab39c4b3eb24327edf2be9e74d521d41532fAndrew Rossignol *      http://www.apache.org/licenses/LICENSE-2.0
97f40ab39c4b3eb24327edf2be9e74d521d41532fAndrew Rossignol *
107f40ab39c4b3eb24327edf2be9e74d521d41532fAndrew Rossignol * Unless required by applicable law or agreed to in writing, software
117f40ab39c4b3eb24327edf2be9e74d521d41532fAndrew Rossignol * distributed under the License is distributed on an "AS IS" BASIS,
127f40ab39c4b3eb24327edf2be9e74d521d41532fAndrew Rossignol * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137f40ab39c4b3eb24327edf2be9e74d521d41532fAndrew Rossignol * See the License for the specific language governing permissions and
147f40ab39c4b3eb24327edf2be9e74d521d41532fAndrew Rossignol * limitations under the License.
157f40ab39c4b3eb24327edf2be9e74d521d41532fAndrew Rossignol */
167f40ab39c4b3eb24327edf2be9e74d521d41532fAndrew Rossignol
177621b3267fd2ff1068d7aa7d75441d68646226abBrian Duddie#ifndef CHRE_UTIL_MACROS_H_
187621b3267fd2ff1068d7aa7d75441d68646226abBrian Duddie#define CHRE_UTIL_MACROS_H_
197f40ab39c4b3eb24327edf2be9e74d521d41532fAndrew Rossignol
207f40ab39c4b3eb24327edf2be9e74d521d41532fAndrew Rossignol/**
217f40ab39c4b3eb24327edf2be9e74d521d41532fAndrew Rossignol * Obtains the number of elements in a C-style array.
227f40ab39c4b3eb24327edf2be9e74d521d41532fAndrew Rossignol */
237f40ab39c4b3eb24327edf2be9e74d521d41532fAndrew Rossignol#define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0]))
247f40ab39c4b3eb24327edf2be9e74d521d41532fAndrew Rossignol
257621b3267fd2ff1068d7aa7d75441d68646226abBrian Duddie/**
267621b3267fd2ff1068d7aa7d75441d68646226abBrian Duddie * Performs macro expansion then converts the value into a string literal
277621b3267fd2ff1068d7aa7d75441d68646226abBrian Duddie */
287621b3267fd2ff1068d7aa7d75441d68646226abBrian Duddie#define STRINGIFY(x) STRINGIFY2(x)
297621b3267fd2ff1068d7aa7d75441d68646226abBrian Duddie#define STRINGIFY2(x) #x
307621b3267fd2ff1068d7aa7d75441d68646226abBrian Duddie
319695b7bc89781c40aeb545ac0e879ff063590bf0Andrew Rossignol/**
329695b7bc89781c40aeb545ac0e879ff063590bf0Andrew Rossignol * Exports a symbol with default visibility.
339695b7bc89781c40aeb545ac0e879ff063590bf0Andrew Rossignol */
349695b7bc89781c40aeb545ac0e879ff063590bf0Andrew Rossignol#if defined(__clang__) || defined(__GNUC__)
359695b7bc89781c40aeb545ac0e879ff063590bf0Andrew Rossignol#define DLL_EXPORT __attribute__((visibility("default")))
369695b7bc89781c40aeb545ac0e879ff063590bf0Andrew Rossignol#else
379695b7bc89781c40aeb545ac0e879ff063590bf0Andrew Rossignol#warn "DLL_EXPORT left undefined"
389695b7bc89781c40aeb545ac0e879ff063590bf0Andrew Rossignol#endif
399695b7bc89781c40aeb545ac0e879ff063590bf0Andrew Rossignol
407621b3267fd2ff1068d7aa7d75441d68646226abBrian Duddie#endif  // CHRE_UTIL_MACROS_H_
41