blob: 6b48d1f36b4ff418ac81e16a09c5673f249159c2 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SRC_DEVELOPER_DEBUG_SHARED_LOGGING_FILE_LINE_FUNCTION_H_
#define SRC_DEVELOPER_DEBUG_SHARED_LOGGING_FILE_LINE_FUNCTION_H_
#include <string>
namespace debug {
#define FROM_HERE ::debug::FileLineFunction(__FILE__, __LINE__, __FUNCTION__)
#define FROM_HERE_NO_FUNC ::debug::FileLineFunction(__FILE__, __LINE__)
// For performance, this class accepts "const char*" instead of "std::string" for file and function
// names. It's usually not an issue since __FILE__ and __FUNCTION__ macros are generating static,
// global strings. However, if you construct |FileLineFunction| from a temporary string, i.e.,
// "std::string().c_str()", the lifecycle of the |FileLineFunction| object must be taken care of.
class FileLineFunction {
public:
FileLineFunction() = default;
FileLineFunction(const char* file, uint32_t line, const char* function = nullptr)
: file_(file), function_(function), line_(line) {}
bool is_valid() const { return file_ && line_ > 0; }
const char* file() const { return file_; }
uint32_t line() const { return line_; }
const char* function() const { return function_; }
std::string ToString() const;
private:
const char* file_ = nullptr;
const char* function_ = nullptr;
uint32_t line_ = 0;
};
// Comparison function for use in set and map.
bool operator<(const FileLineFunction& a, const FileLineFunction& b);
bool operator==(const FileLineFunction& a, const FileLineFunction& b);
bool operator!=(const FileLineFunction& a, const FileLineFunction& b);
} // namespace debug
#endif // SRC_DEVELOPER_DEBUG_SHARED_LOGGING_FILE_LINE_FUNCTION_H_