MsgHandler.h revision f33f6de54db174aa679a4b6d1e040d37e95541c0
1//===- MsgHandler.h -------------------------------------------------------===//
2//
3//                     The MCLinker Project
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9#ifndef MCLD_LD_MSGHANDLER_H
10#define MCLD_LD_MSGHANDLER_H
11#ifdef ENABLE_UNITTEST
12#include <gtest.h>
13#endif
14#include <string>
15#include <llvm/ADT/StringRef.h>
16#include <llvm/ADT/Twine.h>
17#include <mcld/Support/Path.h>
18#include <mcld/LD/DiagnosticEngine.h>
19
20namespace mcld {
21
22/** \class MsgHandler
23 *  \brief MsgHandler controls the timing to output message.
24 */
25class MsgHandler
26{
27public:
28  MsgHandler(DiagnosticEngine& pEngine);
29  ~MsgHandler();
30
31  bool emit();
32
33  void addString(llvm::StringRef pStr) const;
34
35  void addString(const std::string& pStr) const;
36
37  void addTaggedVal(intptr_t pValue, DiagnosticEngine::ArgumentKind pKind) const;
38
39private:
40  void flushCounts()
41  { m_Engine.state().numArgs = m_NumArgs; }
42
43private:
44  DiagnosticEngine& m_Engine;
45  mutable unsigned int m_NumArgs;
46};
47
48inline const MsgHandler &
49operator<<(const MsgHandler& pHandler, llvm::StringRef pStr)
50{
51  pHandler.addString(pStr);
52  return pHandler;
53}
54
55inline const MsgHandler &
56operator<<(const MsgHandler& pHandler, const std::string& pStr)
57{
58  pHandler.addString(pStr);
59  return pHandler;
60}
61
62inline const MsgHandler &
63operator<<(const MsgHandler& pHandler, const sys::fs::Path& pPath)
64{
65  pHandler.addString(pPath.native());
66  return pHandler;
67}
68
69inline const MsgHandler &
70operator<<(const MsgHandler& pHandler, const char* pStr)
71{
72  pHandler.addTaggedVal(reinterpret_cast<intptr_t>(pStr),
73                        DiagnosticEngine::ak_c_string);
74  return pHandler;
75}
76
77inline const MsgHandler &
78operator<<(const MsgHandler& pHandler, int pValue)
79{
80  pHandler.addTaggedVal(pValue, DiagnosticEngine::ak_sint);
81  return pHandler;
82}
83
84inline const MsgHandler &
85operator<<(const MsgHandler& pHandler, unsigned int pValue)
86{
87  pHandler.addTaggedVal(pValue, DiagnosticEngine::ak_uint);
88  return pHandler;
89}
90
91inline const MsgHandler &
92operator<<(const MsgHandler& pHandler, long pValue)
93{
94  pHandler.addTaggedVal(pValue, DiagnosticEngine::ak_sint);
95  return pHandler;
96}
97
98inline const MsgHandler &
99operator<<(const MsgHandler& pHandler, unsigned long pValue)
100{
101  pHandler.addTaggedVal(pValue, DiagnosticEngine::ak_uint);
102  return pHandler;
103}
104
105inline const MsgHandler &
106operator<<(const MsgHandler& pHandler, unsigned long long pValue)
107{
108  pHandler.addTaggedVal(pValue, DiagnosticEngine::ak_ulonglong);
109  return pHandler;
110}
111
112inline const MsgHandler &
113operator<<(const MsgHandler& pHandler, bool pValue)
114{
115  pHandler.addTaggedVal(pValue, DiagnosticEngine::ak_bool);
116  return pHandler;
117}
118
119} // namespace of mcld
120
121#endif
122
123