#define TEST_TRACE_CALL_STACK_H
/*
- * Copyright (c) 2020 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2021 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
{
public:
/// Typedef for passing and storing named parameters
- typedef std::map<std::string, std::string> NamedParams;
+ class NamedParams
+ {
+ public:
+ struct NameValue
+ {
+ std::string parameterName;
+ std::ostringstream value;
+ NameValue(std::string pname, std::string aValue)
+ : parameterName(pname),
+ value(aValue)
+ {
+ }
+ NameValue(const NameValue& rhs)
+ : parameterName(rhs.parameterName),
+ value(rhs.value.str())
+ {
+ }
+ NameValue& operator=(const NameValue& rhs)
+ {
+ if(this != &rhs)
+ {
+ this->parameterName = rhs.parameterName;
+ this->value.str(rhs.value.str());
+ }
+ return *this;
+ }
+
+ bool operator==(const NameValue& rhs)
+ {
+ return !parameterName.compare(rhs.parameterName) && !value.str().compare(rhs.value.str());
+ }
+
+ bool operator==(int match) const;
+ };
+
+ auto find(const std::string& param) const
+ {
+ auto iter = mParams.begin();
+ for(; iter != mParams.end(); ++iter)
+ {
+ if(!iter->parameterName.compare(param))
+ {
+ break;
+ }
+ }
+ return iter;
+ }
+
+ auto begin() const
+ {
+ return mParams.begin();
+ }
+ auto end() const
+ {
+ return mParams.end();
+ }
+
+ std::ostringstream& operator[](std::string name)
+ {
+ auto iter = mParams.begin();
+ for(; iter != mParams.end(); ++iter)
+ {
+ if(!iter->parameterName.compare(name))
+ {
+ break;
+ }
+ }
+
+ if(iter != mParams.end())
+ {
+ return iter->value;
+ }
+ else
+ {
+ mParams.push_back(NameValue(name, ""));
+ return mParams.back().value;
+ }
+ }
+
+ std::string str() const
+ {
+ std::ostringstream out;
+ bool first = true;
+ for(auto& elem : mParams)
+ {
+ out << (first ? "" : " ") << elem.parameterName << ": " << elem.value.str();
+ first = false;
+ }
+ return out.str();
+ }
+ std::vector<NameValue> mParams{};
+ };
/**
* Constructor
*/
- TraceCallStack();
+ TraceCallStack(bool logging, std::string prefix);
+
+ TraceCallStack(const TraceCallStack&) = delete;
+ TraceCallStack(TraceCallStack&&) = delete;
/**
* Destructor
bool IsEnabled();
+ void EnableLogging(bool enable);
+
/**
* Push a call onto the stack if the trace is active
* @param[in] method The name of the method
int FindIndexFromMethodAndParams(std::string method, const NamedParams& params) const;
/**
+ * Search for the most recent occurrence of the method with the given (partial) parameters.
+ * @param[in] method The name of the method
+ * @param[in] params A map of named parameter values to match
+ * @return The full named parameters of the matching call.
+ */
+ const NamedParams* FindLastMatch(std::string method, const TraceCallStack::NamedParams& params) const;
+
+ /**
* Test if the given method and parameters are at a given index in the stack
* @param[in] index Index in the call stack
* @param[in] method Name of method to test
return traceStream.str();
}
-private:
- bool mTraceActive; ///< True if the trace is active
+public:
+ bool mTraceActive{false}; ///< True if the trace is active
+ bool mLogging{false}; ///< True if the trace is logged to stdout
+ std::string mPrefix;
struct FunctionCall
{