xref: /aosp_15_r20/external/ComputeLibrary/arm_compute/core/utils/logging/LogMsgDecorators.h (revision c217d954acce2dbc11938adb493fc0abd69584f3)
1 /*
2  * Copyright (c) 2016-2019 Arm Limited.
3  *
4  * SPDX-License-Identifier: MIT
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to
8  * deal in the Software without restriction, including without limitation the
9  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10  * sell copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in all
14  * copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22  * SOFTWARE.
23  */
24 #ifndef ARM_COMPUTE_LOGGING_LOG_MSG_DECORATORS_H
25 #define ARM_COMPUTE_LOGGING_LOG_MSG_DECORATORS_H
26 
27 #include "arm_compute/core/Error.h"
28 #include "arm_compute/core/utils/logging/Helpers.h"
29 #include "arm_compute/core/utils/logging/Types.h"
30 
31 #include <chrono>
32 #include <ctime>
33 #include <string>
34 #ifndef NO_MULTI_THREADING
35 #include <thread>
36 #endif /* NO_MULTI_THREADING */
37 
38 namespace arm_compute
39 {
40 namespace logging
41 {
42 /** Log message decorator interface */
43 class IDecorator
44 {
45 public:
46     /** Default Destructor */
47     virtual ~IDecorator() = default;
48     /** Decorates log message
49      *
50      * @param[in] log_msg Log message to decorate
51      */
52     virtual void decorate(LogMsg &log_msg) = 0;
53 };
54 
55 /** String Decorator
56  *
57  * Appends a user defined string in the log message
58  */
59 class StringDecorator : public IDecorator
60 {
61 public:
62     /** Defaults constructor
63      *
64      * @param str Sting to append
65      */
StringDecorator(const std::string & str)66     StringDecorator(const std::string &str)
67         : _str(str)
68     {
69         _str = angle_wrap_value(str);
70     }
71 
72     // Inherited methods overridden:
decorate(LogMsg & log_msg)73     void decorate(LogMsg &log_msg) override
74     {
75         log_msg.raw_ += _str;
76     }
77 
78 private:
79     std::string _str;
80 };
81 
82 /** Date Decorator
83  *
84  * Appends the date and time in the log message
85  */
86 class DateDecorator : public IDecorator
87 {
88 public:
89     // Inherited methods overridden:
decorate(LogMsg & log_msg)90     void decorate(LogMsg &log_msg) override
91     {
92         log_msg.raw_ += angle_wrap_value(get_time());
93     }
94 
95 private:
96     /** Gets current system local time
97      *
98      * @return Local time
99      */
get_time()100     std::string get_time()
101     {
102         auto now  = std::chrono::system_clock::now();
103         auto time = std::chrono::system_clock::to_time_t(now);
104 
105         // TODO: use put_time for gcc > 4.9
106         char buf[100] = { 0 };
107         std::strftime(buf, sizeof(buf), "%d-%m-%Y %I:%M:%S", std::localtime(&time));
108         return buf;
109     }
110 };
111 
112 /** Thread ID Decorator
113  *
114  * Appends the thread ID in the log message
115  */
116 class ThreadIdDecorator : public IDecorator
117 {
118 public:
119     // Inherited methods overridden:
decorate(LogMsg & log_msg)120     void decorate(LogMsg &log_msg) override
121     {
122 #ifndef NO_MULTI_THREADING
123         log_msg.raw_ += angle_wrap_value(std::this_thread::get_id());
124 #else  /* NO_MULTI_THREADING */
125         ARM_COMPUTE_UNUSED(log_msg);
126 #endif /* NO_MULTI_THREADING */
127     }
128 };
129 
130 /** Log Level Decorator
131  *
132  * Appends the logging level in the log message
133  */
134 class LogLevelDecorator : public IDecorator
135 {
136 public:
137     // Inherited methods overridden:
decorate(LogMsg & log_msg)138     void decorate(LogMsg &log_msg) override
139     {
140         log_msg.raw_ += angle_wrap_value(string_from_log_level(log_msg.log_level_));
141     }
142 };
143 } // namespace logging
144 } // namespace arm_compute
145 #endif /* ARM_COMPUTE_LOGGING_LOG_MSG_DECORATORS_H */
146