// Copyright 2018 The Chromium 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 SQL_STATEMENT_ID_H_ #define SQL_STATEMENT_ID_H_ #include #include "base/component_export.h" namespace sql { // Identifies a compiled SQLite statement in a statement cache. // // This is a value type with the same performance characteristics as // std::string_view. Instances are thread-unsafe, but not thread-hostile. // // StatementID instances should be constructed by using the SQL_FROM_HERE // macro, which produces an unique ID based on the source file name and line. class COMPONENT_EXPORT(SQL) StatementID { public: // Creates an ID representing a line in the source tree. // // SQL_FROM_HERE should be preferred to calling this constructor directly. // // |source_file| should point to a C-style string that lives for the duration // of the program. explicit StatementID(const char* source_file, size_t source_line) noexcept : source_file_(source_file), source_line_(source_line) {} // Copying intentionally allowed. StatementID(const StatementID&) noexcept = default; StatementID& operator=(const StatementID&) noexcept = default; // Facilitates storing StatementID instances in maps. bool operator<(const StatementID& rhs) const noexcept; private: // Instances cannot be immutable because they support being used as map keys. // // It seems tempting to merge source_file_ and source_line_ in a single // source_location_ member, and to have SQL_FROM_HERE use C++ preprocessor // magic to generate strings like "sql/connection.cc:42". This causes a // non-trivial binary size increase, because Chrome uses -fmerge-constants and // SQL_FROM_HERE tends to be used many times in the same few files. const char* source_file_; size_t source_line_; }; } // namespace sql // Produces a StatementID based on the current line in the source tree. #define SQL_FROM_HERE sql::StatementID(__FILE__, __LINE__) #endif // SQL_STATEMENT_ID_H_