scopeDescription.h
Go to the documentation of this file.
1 //
2 // Copyright 2016 Pixar
3 //
4 // Licensed under the terms set forth in the LICENSE.txt file available at
5 // https://openusd.org/license.
6 //
7 #ifndef PXR_BASE_TF_SCOPE_DESCRIPTION_H
8 #define PXR_BASE_TF_SCOPE_DESCRIPTION_H
9 
10 #include "pxr/pxr.h"
11 
14 #include "pxr/base/tf/api.h"
15 
16 #include <optional>
17 #include <vector>
18 #include <string>
19 
20 PXR_NAMESPACE_OPEN_SCOPE
21 
23 
50 {
51  TfScopeDescription() = delete;
52  TfScopeDescription(TfScopeDescription const &) = delete;
53  TfScopeDescription &operator=(TfScopeDescription const &) = delete;
54 public:
58  TF_API explicit
59  TfScopeDescription(std::string const &description,
60  TfCallContext const &context = TfCallContext());
61 
65  TF_API explicit
66  TfScopeDescription(std::string &&description,
67  TfCallContext const &context = TfCallContext());
68 
72  TF_API explicit
73  TfScopeDescription(char const *description,
74  TfCallContext const &context = TfCallContext());
75 
78  TF_API ~TfScopeDescription();
79 
83  TF_API void SetDescription(std::string const &description);
84 
87  TF_API void SetDescription(std::string &&description);
88 
92  TF_API void SetDescription(char const *description);
93 
94 private:
95  friend inline TfScopeDescription *
96  Tf_GetPreviousScopeDescription(TfScopeDescription *d) {
97  return d->_prev;
98  }
99  friend inline char const *
100  Tf_GetScopeDescriptionText(TfScopeDescription *d) {
101  return d->_description;
102  }
103  friend inline TfCallContext const &
104  Tf_GetScopeDescriptionContext(TfScopeDescription *d) {
105  return d->_context;
106  }
107 
108  inline void _Push();
109  inline void _Pop() const;
110 
111  std::optional<std::string> _ownedString;
112  char const *_description;
113  TfCallContext _context;
114  void *_localStack;
115  TfScopeDescription *_prev; // link to parent scope.
116 };
117 
122 TF_API std::vector<std::string>
124 
128 TF_API std::vector<std::string>
130 
136 #define TF_DESCRIBE_SCOPE(...) \
137  TfScopeDescription __scope_description__ \
138  (Tf_DescribeScopeFormat(__VA_ARGS__), TF_CALL_CONTEXT); \
139 
140 template <typename... Args>
141 inline std::string
142 Tf_DescribeScopeFormat(const char* fmt, Args&&... args) {
143  return TfStringPrintf(fmt, std::forward<Args>(args)...);
144 }
145 
146 // If there are no formatting arguments, the string can be forwarded to the
147 // scope description constructor. In C++17, consider if std::string_view could
148 // reduce the need for as many of these overloads
149 inline const char*
150 Tf_DescribeScopeFormat(const char* fmt) { return fmt; }
151 
152 inline std::string&&
153 Tf_DescribeScopeFormat(std::string&& fmt) { return std::move(fmt); }
154 
155 inline const std::string&
156 Tf_DescribeScopeFormat(const std::string& fmt) { return fmt; }
157 
158 PXR_NAMESPACE_CLOSE_SCOPE
159 
160 #endif // PXR_BASE_TF_SCOPE_DESCRIPTION_H
TF_API std::string TfStringPrintf(const char *fmt,...)
Returns a string formed by a printf()-like specification.
Functions for recording call locations.
TF_API ~TfScopeDescription()
Destructor.
Definitions of basic string utilities in tf.
TF_API std::vector< std::string > TfGetCurrentScopeDescriptionStack()
Return a copy of the current description stack for the "main" thread as identified by ArchGetMainThre...
TF_API void SetDescription(std::string const &description)
Replace the description stack entry for this scope description.
TF_API std::vector< std::string > TfGetThisThreadScopeDescriptionStack()
Return a copy of the current description stack for the current thread of execution as a vector of str...
This class is used to provide high-level descriptions about scopes of execution that could possibly b...