// Copyright 2023 PingCAP, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #pragma once namespace ext { /** Example (1): * * class Derived : public ext::Singleton * { * friend class ext::singleton; * ... * protected: * Derived() {}; * }; * * Example (2): * * class Some * { * ... * }; * * class SomeSingleton : public Some, public ext::Singleton {} */ template class Singleton { public: static T & instance() { /// C++11 has thread safe statics. GCC and Clang have thread safe statics by default even before C++11. static T instance; return instance; } protected: Singleton() = default; public: Singleton(const Singleton &) = delete; Singleton & operator=(const Singleton &) = delete; }; } // namespace ext