//===- Diagnostic.h -------------------------------------------------------===//
//
// The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef MCLD_DIAGNOSTIC_H
#define MCLD_DIAGNOSTIC_H
#ifdef ENABLE_UNITTEST
#include <gtest.h>
#endif
#include <string>
#include <cassert>
#include <mcld/LD/DiagnosticEngine.h>
namespace mcld {
/** \class Diagnostic
* \brief Diagnostic provides current status to DiagnosticPrinters.
*/
class Diagnostic
{
public:
Diagnostic(DiagnosticEngine& pEngine);
~Diagnostic();
unsigned int getID() const
{ return m_Engine.state().ID; }
unsigned int getNumArgs() const
{ return m_Engine.state().numArgs; }
DiagnosticEngine::ArgumentKind getArgKind(unsigned int pIdx) const {
assert(pIdx < getNumArgs() && "Argument index is out of range!");
return (DiagnosticEngine::ArgumentKind)m_Engine.state().ArgumentKinds[pIdx];
}
const std::string &getArgStdStr(unsigned int pIdx) const {
assert(getArgKind(pIdx) == DiagnosticEngine::ak_std_string &&
"Invalid argument accessor!");
return m_Engine.state().ArgumentStrs[pIdx];
}
const char* getArgCStr(unsigned int pIdx) const {
assert(getArgKind(pIdx) == DiagnosticEngine::ak_c_string &&
"Invalid argument accessor!");
return reinterpret_cast<const char*>(m_Engine.state().ArgumentVals[pIdx]);
}
int getArgSInt(unsigned int pIdx) const {
assert(getArgKind(pIdx) == DiagnosticEngine::ak_sint &&
"Invalid argument accessor!");
return (int)m_Engine.state().ArgumentVals[pIdx];
}
unsigned int getArgUInt(unsigned int pIdx) const {
assert(getArgKind(pIdx) == DiagnosticEngine::ak_uint &&
"Invalid argument accessor!");
return (unsigned int)m_Engine.state().ArgumentVals[pIdx];
}
unsigned long long getArgULongLong(unsigned pIdx) const {
assert(getArgKind(pIdx) == DiagnosticEngine::ak_ulonglong &&
"Invalid argument accessor!");
return (unsigned long long)m_Engine.state().ArgumentVals[pIdx];
}
bool getArgBool(unsigned int pIdx) const {
assert(getArgKind(pIdx) == DiagnosticEngine::ak_bool &&
"Invalid argument accessor!");
return (bool)m_Engine.state().ArgumentVals[pIdx];
}
intptr_t getRawVals(unsigned int pIdx) const {
assert(getArgKind(pIdx) != DiagnosticEngine::ak_std_string &&
"Invalid argument accessor!");
return m_Engine.state().ArgumentVals[pIdx];
}
// format - format this diagnostic into string, subsituting the formal
// arguments. The result is appended at on the pOutStr.
void format(std::string& pOutStr) const;
// format - format the given formal string, subsituting the formal
// arguments. The result is appended at on the pOutStr.
void format(const char* pBegin, const char* pEnd, std::string& pOutStr) const;
private:
const char* findMatch(char pVal, const char* pBegin, const char* pEnd ) const;
private:
DiagnosticEngine& m_Engine;
};
} // namespace of mcld
#endif