]> git.mxchange.org Git - simgear.git/commitdiff
#512: fix compatibility issue with boost 1.48.0
authorThorstenB <brehmt@gmail.com>
Sun, 18 Dec 2011 13:06:27 +0000 (14:06 +0100)
committerThorstenB <brehmt@gmail.com>
Sun, 18 Dec 2011 13:06:27 +0000 (14:06 +0100)
Thanks to handigehansje.

simgear/structure/CMakeLists.txt
simgear/structure/Singleton.hxx
simgear/structure/singleton.hpp [new file with mode: 0644]

index e5ff687a519f0489769670e8882b82556aabd17f..ebe6be5d0a769341ee37e189a0cb60cdc5c2d9e5 100644 (file)
@@ -1,7 +1,7 @@
 
 include (SimGearComponent)
 
-set(HEADERS 
+set(HEADERS
     OSGUtils.hxx
     OSGVersion.hxx
     SGAtomic.hxx
@@ -14,6 +14,7 @@ set(HEADERS
     SGWeakPtr.hxx
     SGWeakReferenced.hxx
     SGPerfMon.hxx
+    singleton.hpp
     Singleton.hxx
     StringTable.hxx
     callback.hxx
@@ -23,8 +24,8 @@ set(HEADERS
     intern.hxx
     subsystem_mgr.hxx
     )
-    
-set(SOURCES 
+
+set(SOURCES
     SGAtomic.cxx
     SGBinding.cxx
     SGExpression.cxx
@@ -38,4 +39,4 @@ set(SOURCES
     subsystem_mgr.cxx
     )
 
-simgear_component(structure structure "${SOURCES}" "${HEADERS}")
\ No newline at end of file
+simgear_component(structure structure "${SOURCES}" "${HEADERS}")
index cc98c497633a7d754f910af66d151a8995b6325a..35c712a28f66c0194f4fec8b8f3c9e26bb1001c2 100644 (file)
@@ -1,12 +1,12 @@
 #ifndef SIMGEAR_SINGLETON_HXX
 #define SIMGEAR_SINGLETON_HXX 1
 
-#include <boost/pool/detail/singleton.hpp>
+#include "singleton.hpp"
 
 #ifndef NO_OPENSCENEGRAPH_INTERFACE
 #include <osg/Referenced>
 #include <osg/ref_ptr>
-#endif 
+#endif
 
 namespace simgear
 {
diff --git a/simgear/structure/singleton.hpp b/simgear/structure/singleton.hpp
new file mode 100644 (file)
index 0000000..9f6109d
--- /dev/null
@@ -0,0 +1,128 @@
+// Copyright (C) 2000 Stephen Cleary
+//
+// Distributed under the Boost Software License, Version 1.0.
+// Boost Software License - Version 1.0 - August 17th, 2003
+
+// Permission is hereby granted, free of charge, to any person or organization
+// obtaining a copy of the software and accompanying documentation covered by
+// this license (the "Software") to use, reproduce, display, distribute,
+// execute, and transmit the Software, and to prepare derivative works of the
+// Software, and to permit third-parties to whom the Software is furnished to
+// do so, all subject to the following:
+
+// The copyright notices in the Software and this entire statement, including
+// the above license grant, this restriction and the following disclaimer,
+// must be included in all copies of the Software, in whole or in part, and
+// all derivative works of the Software, unless such copies or derivative
+// works are solely in the form of machine-executable object code generated by
+// a source language processor.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+//
+// See http://www.boost.org for updates, documentation, and revision history.
+
+#ifndef BOOST_POOL_SINGLETON_HPP
+#define BOOST_POOL_SINGLETON_HPP
+
+// The following code might be put into some Boost.Config header in a later revision
+#ifdef __BORLANDC__
+# pragma option push -w-inl
+#endif
+
+//
+// The following helper classes are placeholders for a generic "singleton"
+//  class.  The classes below support usage of singletons, including use in
+//  program startup/shutdown code, AS LONG AS there is only one thread
+//  running before main() begins, and only one thread running after main()
+//  exits.
+//
+// This class is also limited in that it can only provide singleton usage for
+//  classes with default constructors.
+//
+
+// The design of this class is somewhat twisted, but can be followed by the
+//  calling inheritance.  Let us assume that there is some user code that
+//  calls "singleton_default<T>::instance()".  The following (convoluted)
+//  sequence ensures that the same function will be called before main():
+//    instance() contains a call to create_object.do_nothing()
+//    Thus, object_creator is implicitly instantiated, and create_object
+//      must exist.
+//    Since create_object is a static member, its constructor must be
+//      called before main().
+//    The constructor contains a call to instance(), thus ensuring that
+//      instance() will be called before main().
+//    The first time instance() is called (i.e., before main()) is the
+//      latest point in program execution where the object of type T
+//      can be created.
+//    Thus, any call to instance() will auto-magically result in a call to
+//      instance() before main(), unless already present.
+//  Furthermore, since the instance() function contains the object, instead
+//  of the singleton_default class containing a static instance of the
+//  object, that object is guaranteed to be constructed (at the latest) in
+//  the first call to instance().  This permits calls to instance() from
+//  static code, even if that code is called before the file-scope objects
+//  in this file have been initialized.
+
+namespace boost {
+
+namespace details {
+namespace pool {
+
+// T must be: no-throw default constructible and no-throw destructible
+template <typename T>
+struct singleton_default
+{
+  private:
+    struct object_creator
+    {
+      // This constructor does nothing more than ensure that instance()
+      //  is called before main() begins, thus creating the static
+      //  T object before multithreading race issues can come up.
+      object_creator() { singleton_default<T>::instance(); }
+      inline void do_nothing() const { }
+    };
+    static object_creator create_object;
+
+    singleton_default();
+
+  public:
+    typedef T object_type;
+
+    // If, at any point (in user code), singleton_default<T>::instance()
+    //  is called, then the following function is instantiated.
+    static object_type & instance()
+    {
+      // This is the object that we return a reference to.
+      // It is guaranteed to be created before main() begins because of
+      //  the next line.
+      static object_type obj;
+
+      // The following line does nothing else than force the instantiation
+      //  of singleton_default<T>::create_object, whose constructor is
+      //  called before main() begins.
+      create_object.do_nothing();
+
+      return obj;
+    }
+};
+template <typename T>
+typename singleton_default<T>::object_creator
+singleton_default<T>::create_object;
+
+} // namespace pool
+} // namespace details
+
+} // namespace boost
+
+// The following code might be put into some Boost.Config header in a later revision
+#ifdef __BORLANDC__
+# pragma option pop
+#endif
+
+#endif