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