// Copyright (C) 2001-2003

// Mac Murrett

//

// Distributed under the Boost Software License, Version 1.0. (See

// accompanying file LICENSE_1_0.txt or copy at

// http://www.boost.org/LICENSE_1_0.txt)

//

// See http://www.boost.org for most recent version including documentation.



#ifndef BOOST_SINGLETON_MJM012402_HPP

#define BOOST_SINGLETON_MJM012402_HPP



#include <boost/thread/detail/config.hpp>



namespace boost {

namespace detail {

namespace thread {



// class singleton has the same goal as all singletons: create one instance of

// a class on demand, then dish it out as requested.



template <class T>

class singleton : private T

{

private:

    singleton();

    ~singleton();



public:

    static T &instance();

};





template <class T>

inline singleton<T>::singleton()

{

    /* no-op */

}



template <class T>

inline singleton<T>::~singleton()

{

    /* no-op */

}



template <class T>

/*static*/ T &singleton<T>::instance()

{

    // function-local static to force this to work correctly at static

    // initialization time.

    static singleton<T> s_oT;

    return(s_oT);

}



} // namespace thread

} // namespace detail

} // namespace boost



#endif // BOOST_SINGLETON_MJM012402_HPP

