[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