gem5  v19.0.0.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
cprintf.hh
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2014 ARM Limited
3  * Copyright (c) 2002-2006 The Regents of The University of Michigan
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions are
8  * met: redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer;
10  * redistributions in binary form must reproduce the above copyright
11  * notice, this list of conditions and the following disclaimer in the
12  * documentation and/or other materials provided with the distribution;
13  * neither the name of the copyright holders nor the names of its
14  * contributors may be used to endorse or promote products derived from
15  * this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  *
29  * Authors: Nathan Binkert
30  * Steve Reinhardt
31  * Andreas Sandberg
32  */
33 
34 #ifndef __BASE_CPRINTF_HH__
35 #define __BASE_CPRINTF_HH__
36 
37 #include <ios>
38 #include <iostream>
39 #include <list>
40 #include <string>
41 
42 #include "base/cprintf_formats.hh"
43 
44 namespace cp {
45 
46 struct Print
47 {
48  protected:
49  std::ostream &stream;
50  const char *format;
51  const char *ptr;
52  bool cont;
53 
54  std::ios::fmtflags saved_flags;
55  char saved_fill;
58 
60  void process();
61  void process_flag();
62 
63  public:
64  Print(std::ostream &stream, const std::string &format);
65  Print(std::ostream &stream, const char *format);
66  ~Print();
67 
68  int
70  {
71  return data;
72  }
73 
74  template <typename T>
75  int
76  get_number(const T& data)
77  {
78  return 0;
79  }
80 
81  template <typename T>
82  void
83  add_arg(const T &data)
84  {
85  if (!cont)
86  process();
87 
88  if (fmt.get_width) {
89  fmt.get_width = false;
90  cont = true;
91  fmt.width = get_number(data);
92  return;
93  }
94 
95  if (fmt.get_precision) {
96  fmt.get_precision = false;
97  cont = true;
98  fmt.precision = get_number(data);
99  return;
100  }
101 
102  switch (fmt.format) {
103  case Format::character:
104  format_char(stream, data, fmt);
105  break;
106 
107  case Format::integer:
108  format_integer(stream, data, fmt);
109  break;
110 
111  case Format::floating:
112  format_float(stream, data, fmt);
113  break;
114 
115  case Format::string:
116  format_string(stream, data, fmt);
117  break;
118 
119  default:
120  stream << "<bad format>";
121  break;
122  }
123  }
124 
125  void end_args();
126 };
127 
128 } // namespace cp
129 
130 inline void
132 {
133  print.end_args();
134 }
135 
136 
137 template<typename T, typename ...Args> void
138 ccprintf(cp::Print &print, const T &value, const Args &...args)
139 {
140  print.add_arg(value);
141 
142  ccprintf(print, args...);
143 }
144 
145 
146 template<typename ...Args> void
147 ccprintf(std::ostream &stream, const char *format, const Args &...args)
148 {
149  cp::Print print(stream, format);
150 
151  ccprintf(print, args...);
152 }
153 
154 
155 template<typename ...Args> void
156 cprintf(const char *format, const Args &...args)
157 {
158  ccprintf(std::cout, format, args...);
159 }
160 
161 template<typename ...Args> std::string
162 csprintf(const char *format, const Args &...args)
163 {
164  std::stringstream stream;
165  ccprintf(stream, format, args...);
166  return stream.str();
167 }
168 
169 /*
170  * functions again with std::string. We have both so we don't waste
171  * time converting const char * to std::string since we don't take
172  * advantage of it.
173  */
174 template<typename ...Args> void
175 ccprintf(std::ostream &stream, const std::string &format, const Args &...args)
176 {
177  ccprintf(stream, format.c_str(), args...);
178 }
179 
180 template<typename ...Args> void
181 cprintf(const std::string &format, const Args &...args)
182 {
183  ccprintf(std::cout, format.c_str(), args...);
184 }
185 
186 template<typename ...Args> std::string
187 csprintf(const std::string &format, const Args &...args)
188 {
189  return csprintf(format.c_str(), args...);
190 }
191 
192 #endif // __CPRINTF_HH__
void ccprintf(cp::Print &print)
Definition: cprintf.hh:131
const char * ptr
Definition: cprintf.hh:51
void add_arg(const T &data)
Definition: cprintf.hh:83
void process()
Definition: cprintf.cc:67
Print(std::ostream &stream, const std::string &format)
Definition: cprintf.cc:44
enum cp::Format::@26 format
void format_string(std::ostream &out, const T &data, Format &fmt)
int saved_precision
Definition: cprintf.hh:56
Definition: cprintf.cc:42
void format_float(std::ostream &out, const T &data, Format &fmt)
void format_integer(std::ostream &out, const T &data, Format &fmt)
void process_flag()
Definition: cprintf.cc:104
int get_number(int data)
Definition: cprintf.hh:69
std::string csprintf(const char *format, const Args &...args)
Definition: cprintf.hh:162
void format_char(std::ostream &out, const T &data, Format &fmt)
int saved_width
Definition: cprintf.hh:57
int get_number(const T &data)
Definition: cprintf.hh:76
~Print()
Definition: cprintf.cc:62
void end_args()
Definition: cprintf.cc:280
const char * format
Definition: cprintf.hh:50
Format fmt
Definition: cprintf.hh:59
std::ostream & stream
Definition: cprintf.hh:49
char saved_fill
Definition: cprintf.hh:55
std::ios::fmtflags saved_flags
Definition: cprintf.hh:54
const char data[]
bool cont
Definition: cprintf.hh:52
void cprintf(const char *format, const Args &...args)
Definition: cprintf.hh:156

Generated on Fri Feb 28 2020 16:26:58 for gem5 by doxygen 1.8.13