ADebug.h revision 72961230a5890071bcca436eb5630172ce84ec41
172961230a5890071bcca436eb5630172ce84ec41Andreas Huber/* 272961230a5890071bcca436eb5630172ce84ec41Andreas Huber * Copyright (C) 2010 The Android Open Source Project 372961230a5890071bcca436eb5630172ce84ec41Andreas Huber * 472961230a5890071bcca436eb5630172ce84ec41Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 572961230a5890071bcca436eb5630172ce84ec41Andreas Huber * you may not use this file except in compliance with the License. 672961230a5890071bcca436eb5630172ce84ec41Andreas Huber * You may obtain a copy of the License at 772961230a5890071bcca436eb5630172ce84ec41Andreas Huber * 872961230a5890071bcca436eb5630172ce84ec41Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 972961230a5890071bcca436eb5630172ce84ec41Andreas Huber * 1072961230a5890071bcca436eb5630172ce84ec41Andreas Huber * Unless required by applicable law or agreed to in writing, software 1172961230a5890071bcca436eb5630172ce84ec41Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 1272961230a5890071bcca436eb5630172ce84ec41Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1372961230a5890071bcca436eb5630172ce84ec41Andreas Huber * See the License for the specific language governing permissions and 1472961230a5890071bcca436eb5630172ce84ec41Andreas Huber * limitations under the License. 1572961230a5890071bcca436eb5630172ce84ec41Andreas Huber */ 1672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 1772961230a5890071bcca436eb5630172ce84ec41Andreas Huber#ifndef A_DEBUG_H_ 1872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 1972961230a5890071bcca436eb5630172ce84ec41Andreas Huber#define A_DEBUG_H_ 2072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 2172961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include <string.h> 2272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 2372961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include <media/stagefright/foundation/ABase.h> 2472961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include <media/stagefright/foundation/AString.h> 2572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 2672961230a5890071bcca436eb5630172ce84ec41Andreas Hubernamespace android { 2772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 2872961230a5890071bcca436eb5630172ce84ec41Andreas Huberenum LogType { 2972961230a5890071bcca436eb5630172ce84ec41Andreas Huber VERBOSE, 3072961230a5890071bcca436eb5630172ce84ec41Andreas Huber INFO, 3172961230a5890071bcca436eb5630172ce84ec41Andreas Huber WARNING, 3272961230a5890071bcca436eb5630172ce84ec41Andreas Huber ERROR, 3372961230a5890071bcca436eb5630172ce84ec41Andreas Huber FATAL, 3472961230a5890071bcca436eb5630172ce84ec41Andreas Huber}; 3572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 3672961230a5890071bcca436eb5630172ce84ec41Andreas Huberstruct Logger { 3772961230a5890071bcca436eb5630172ce84ec41Andreas Huber Logger(LogType type); 3872961230a5890071bcca436eb5630172ce84ec41Andreas Huber virtual ~Logger(); 3972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 4072961230a5890071bcca436eb5630172ce84ec41Andreas Huber template<class T> Logger &operator<<(const T &x) { 4172961230a5890071bcca436eb5630172ce84ec41Andreas Huber mMessage.append(x); 4272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 4372961230a5890071bcca436eb5630172ce84ec41Andreas Huber return *this; 4472961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 4572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 4672961230a5890071bcca436eb5630172ce84ec41Andreas Huberprivate: 4772961230a5890071bcca436eb5630172ce84ec41Andreas Huber android::AString mMessage; 4872961230a5890071bcca436eb5630172ce84ec41Andreas Huber LogType mLogType; 4972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 5072961230a5890071bcca436eb5630172ce84ec41Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(Logger); 5172961230a5890071bcca436eb5630172ce84ec41Andreas Huber}; 5272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 5372961230a5890071bcca436eb5630172ce84ec41Andreas Huberconst char *LeafName(const char *s); 5472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 5572961230a5890071bcca436eb5630172ce84ec41Andreas Huber#undef LOG 5672961230a5890071bcca436eb5630172ce84ec41Andreas Huber#define LOG(type) Logger(type) << LeafName(__FILE__) << ":" << __LINE__ << " " 5772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 5872961230a5890071bcca436eb5630172ce84ec41Andreas Huber#define CHECK(condition) \ 5972961230a5890071bcca436eb5630172ce84ec41Andreas Huber do { \ 6072961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (!(condition)) { \ 6172961230a5890071bcca436eb5630172ce84ec41Andreas Huber LOG(FATAL) << "CHECK(" #condition ") failed."; \ 6272961230a5890071bcca436eb5630172ce84ec41Andreas Huber } \ 6372961230a5890071bcca436eb5630172ce84ec41Andreas Huber } while (false) 6472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 6572961230a5890071bcca436eb5630172ce84ec41Andreas Huber#define MAKE_COMPARATOR(suffix,op) \ 6672961230a5890071bcca436eb5630172ce84ec41Andreas Huber template<class A, class B> \ 6772961230a5890071bcca436eb5630172ce84ec41Andreas Huber AString Compare_##suffix(const A &a, const B &b) { \ 6872961230a5890071bcca436eb5630172ce84ec41Andreas Huber AString res; \ 6972961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (!(a op b)) { \ 7072961230a5890071bcca436eb5630172ce84ec41Andreas Huber res.append(a); \ 7172961230a5890071bcca436eb5630172ce84ec41Andreas Huber res.append(" vs. "); \ 7272961230a5890071bcca436eb5630172ce84ec41Andreas Huber res.append(b); \ 7372961230a5890071bcca436eb5630172ce84ec41Andreas Huber } \ 7472961230a5890071bcca436eb5630172ce84ec41Andreas Huber return res; \ 7572961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 7672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 7772961230a5890071bcca436eb5630172ce84ec41Andreas HuberMAKE_COMPARATOR(EQ,==) 7872961230a5890071bcca436eb5630172ce84ec41Andreas HuberMAKE_COMPARATOR(NE,!=) 7972961230a5890071bcca436eb5630172ce84ec41Andreas HuberMAKE_COMPARATOR(LE,<=) 8072961230a5890071bcca436eb5630172ce84ec41Andreas HuberMAKE_COMPARATOR(GE,>=) 8172961230a5890071bcca436eb5630172ce84ec41Andreas HuberMAKE_COMPARATOR(LT,<) 8272961230a5890071bcca436eb5630172ce84ec41Andreas HuberMAKE_COMPARATOR(GT,>) 8372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 8472961230a5890071bcca436eb5630172ce84ec41Andreas Huber#define CHECK_OP(x,y,suffix,op) \ 8572961230a5890071bcca436eb5630172ce84ec41Andreas Huber do { \ 8672961230a5890071bcca436eb5630172ce84ec41Andreas Huber AString ___res = Compare_##suffix(x, y); \ 8772961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (!___res.empty()) { \ 8872961230a5890071bcca436eb5630172ce84ec41Andreas Huber LOG(FATAL) << "CHECK_" #suffix "(" #x "," #y ") failed: " \ 8972961230a5890071bcca436eb5630172ce84ec41Andreas Huber << ___res; \ 9072961230a5890071bcca436eb5630172ce84ec41Andreas Huber } \ 9172961230a5890071bcca436eb5630172ce84ec41Andreas Huber } while (false) 9272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 9372961230a5890071bcca436eb5630172ce84ec41Andreas Huber#define CHECK_EQ(x,y) CHECK_OP(x,y,EQ,==) 9472961230a5890071bcca436eb5630172ce84ec41Andreas Huber#define CHECK_NE(x,y) CHECK_OP(x,y,NE,!=) 9572961230a5890071bcca436eb5630172ce84ec41Andreas Huber#define CHECK_LE(x,y) CHECK_OP(x,y,LE,<=) 9672961230a5890071bcca436eb5630172ce84ec41Andreas Huber#define CHECK_LT(x,y) CHECK_OP(x,y,LT,<) 9772961230a5890071bcca436eb5630172ce84ec41Andreas Huber#define CHECK_GE(x,y) CHECK_OP(x,y,GE,>=) 9872961230a5890071bcca436eb5630172ce84ec41Andreas Huber#define CHECK_GT(x,y) CHECK_OP(x,y,GT,>) 9972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 10072961230a5890071bcca436eb5630172ce84ec41Andreas Huber#define TRESPASS() LOG(FATAL) << "Should not be here." 10172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 10272961230a5890071bcca436eb5630172ce84ec41Andreas Huber} // namespace android 10372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 10472961230a5890071bcca436eb5630172ce84ec41Andreas Huber#endif // A_DEBUG_H_ 10572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 106