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