[Liblas-commits] hg: add a liblas::Singleton based on the boost recipe to protect...

liblas-commits at liblas.org liblas-commits at liblas.org
Fri Jan 14 11:05:29 EST 2011


details:   http://hg.liblas.orghg/rev/0ee0e38cea1e
changeset: 2768:0ee0e38cea1e
user:      Howard Butler <hobu.inc at gmail.com>
date:      Fri Jan 14 10:05:19 2011 -0600
description:
add a liblas::Singleton based on the boost recipe to protect the instantiation of liblas::DefaultHeader

diffstat:

 CMakeLists.txt                      |   2 +-
 include/liblas/detail/singleton.hpp |  99 +++++++++++++++++++++++++++++++++++++
 include/liblas/header.hpp           |  11 +--
 src/CMakeLists.txt                  |   1 +
 4 files changed, 104 insertions(+), 9 deletions(-)

diffs (156 lines):

diff -r 381ffdfa435a -r 0ee0e38cea1e CMakeLists.txt
--- a/CMakeLists.txt	Fri Jan 14 09:43:25 2011 -0600
+++ b/CMakeLists.txt	Fri Jan 14 10:05:19 2011 -0600
@@ -181,7 +181,7 @@
 endif(WIN32)
 
 # NOTE: Add iostreams to COMPONENTS list to enable bigfile_boost_iostreams_test
-find_package(Boost 1.38 COMPONENTS program_options REQUIRED)
+find_package(Boost 1.38 COMPONENTS program_options thread REQUIRED)
 
 if(Boost_FOUND AND Boost_PROGRAM_OPTIONS_FOUND)
   include_directories(${Boost_INCLUDE_DIRS})
diff -r 381ffdfa435a -r 0ee0e38cea1e include/liblas/detail/singleton.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/liblas/detail/singleton.hpp	Fri Jan 14 10:05:19 2011 -0600
@@ -0,0 +1,99 @@
+/******************************************************************************
+ * $Id$
+ *
+ * Project:  libLAS - http://liblas.org - A BSD library for LAS format data.
+ * Purpose:  LAS singleton class 
+ * Author:   Howard Butler, hobu at hobu.net
+ *
+ ******************************************************************************
+ * Copyright (c) 2010, Howard Butler
+ *
+ * All rights reserved.
+ * 
+ * Redistribution and use in source and binary forms, with or without 
+ * modification, are permitted provided that the following 
+ * conditions are met:
+ * 
+ *     * Redistributions of source code must retain the above copyright 
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright 
+ *       notice, this list of conditions and the following disclaimer in 
+ *       the documentation and/or other materials provided 
+ *       with the distribution.
+ *     * Neither the name of the Martin Isenburg or Iowa Department 
+ *       of Natural Resources nor the names of its contributors may be 
+ *       used to endorse or promote products derived from this software 
+ *       without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 
+ * OF SUCH DAMAGE.
+ ****************************************************************************/
+
+#ifndef LIBLAS_DETAIL_SINGLETON_HPP_INCLUDED
+#define LIBLAS_DETAIL_SINGLETON_HPP_INCLUDED
+
+
+// boost
+#include <boost/shared_ptr.hpp>
+#include <boost/utility.hpp>
+#include <boost/thread/once.hpp>
+#include <boost/scoped_ptr.hpp>
+
+// std
+#include <iosfwd> // std::ostream
+#include <string>
+#include <memory>
+#include <cstdlib> // std::size_t
+
+namespace liblas {
+
+
+// From the boost cookbook
+// http://www.boostcookbook.com/Recipe:/1235044
+// Warning: If T's constructor throws, instance() will return a null reference.
+
+template<class T>
+
+class Singleton : private boost::noncopyable
+{
+
+public:
+    static T& get()
+    {
+        boost::call_once(init, flag);
+        return *t;
+    }
+
+    static void init() // never throws
+    {
+        t.reset(new T());
+    }
+
+protected:
+    ~Singleton() {}
+     Singleton() {}
+
+private:
+     static boost::scoped_ptr<T> t;
+     static boost::once_flag flag;
+
+};
+
+
+template<class T> boost::scoped_ptr<T> Singleton<T>::t(0);
+template<class T> boost::once_flag Singleton<T>::flag = BOOST_ONCE_INIT;
+
+
+} // namespace liblas
+
+#endif // ndef LIBLAS_DETAIL_SINGLETON_HPP_INCLUDED
diff -r 381ffdfa435a -r 0ee0e38cea1e include/liblas/header.hpp
--- a/include/liblas/header.hpp	Fri Jan 14 09:43:25 2011 -0600
+++ b/include/liblas/header.hpp	Fri Jan 14 10:05:19 2011 -0600
@@ -51,6 +51,7 @@
 #include <liblas/version.hpp>
 #include <liblas/external/property_tree/ptree.hpp>
 #include <liblas/export.hpp>
+#include <liblas/detail/singleton.hpp>
 // boost
 #include <boost/cstdint.hpp>
 #include <boost/foreach.hpp>
@@ -421,16 +422,10 @@
 /// a reader creates the point, the HeaderPtr from the file that was 
 /// read will be used, but all stand-alone points will have EmptyHeader 
 /// as their base.
-class LAS_DLL DefaultHeader
+class LAS_DLL DefaultHeader : public Singleton<Header>
 {
 public:
-    virtual ~DefaultHeader() {}
-    
-    static Header const& get() 
-    {
-        static Header object;
-        return object;
-    }
+
 
 protected:
     DefaultHeader();
diff -r 381ffdfa435a -r 0ee0e38cea1e src/CMakeLists.txt
--- a/src/CMakeLists.txt	Fri Jan 14 09:43:25 2011 -0600
+++ b/src/CMakeLists.txt	Fri Jan 14 10:05:19 2011 -0600
@@ -89,6 +89,7 @@
   ${LIBLAS_HEADERS_DIR}/detail/sha1.hpp
   ${LIBLAS_HEADERS_DIR}/detail/timer.hpp
   ${LIBLAS_HEADERS_DIR}/detail/private_utility.hpp
+  ${LIBLAS_HEADERS_DIR}/detail/singleton.hpp
   ${LIBLAS_HEADERS_DIR}/detail/zippoint.hpp)
 
 set(LIBLAS_DETAIL_INDEX_HPP


More information about the Liblas-commits mailing list