]> git.ipfire.org Git - thirdparty/vectorscan.git/commitdiff
small_vector: add header to handle older Boost
authorJustin Viiret <justin.viiret@intel.com>
Fri, 10 Mar 2017 02:43:31 +0000 (13:43 +1100)
committerMatthew Barr <matthew.barr@intel.com>
Wed, 26 Apr 2017 05:17:11 +0000 (15:17 +1000)
This provides ue2::small_vector<T, N, Alloc> which will fall back to
std::vector<T, Alloc> where the Boost version is too old or not present.

CMakeLists.txt
src/util/small_vector.h [new file with mode: 0644]
src/util/ue2_containers.h

index 868d5e36ec86b1f2cdc8cd88c9a7c240364ca415..0fd3639fc39e0e28588a60abea40c47f016f633f 100644 (file)
@@ -1012,6 +1012,7 @@ SET (hs_SRCS
     src/util/report_manager.cpp
     src/util/report_manager.h
     src/util/simd_utils.h
+    src/util/small_vector.h
     src/util/target_info.cpp
     src/util/target_info.h
     src/util/ue2_containers.h
diff --git a/src/util/small_vector.h b/src/util/small_vector.h
new file mode 100644 (file)
index 0000000..c67ad56
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2017, Intel Corporation
+ *
+ * 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 Intel Corporation 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 UTIL_SMALL_VECTOR_H
+#define UTIL_SMALL_VECTOR_H
+
+#include <vector>
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 105800
+#  define HAVE_BOOST_CONTAINER_SMALL_VECTOR
+#endif
+
+#if defined(HAVE_BOOST_CONTAINER_SMALL_VECTOR)
+#  include <boost/container/small_vector.hpp>
+#endif
+
+namespace ue2 {
+
+#if defined(HAVE_BOOST_CONTAINER_SMALL_VECTOR)
+
+template <class T, std::size_t N,
+          typename Allocator = boost::container::new_allocator<T>>
+using small_vector = boost::container::small_vector<T, N, Allocator>;
+
+#else
+
+// Boost version isn't new enough, fall back to just using std::vector.
+template <class T, std::size_t N,
+          typename Allocator = boost::container::new_allocator<T>>
+using small_vector = std::vector<T, Allocator>;
+
+#endif // HAVE_BOOST_CONTAINER_SMALL_VECTOR
+
+} // namespace ue2
+
+#endif // UTIL_SMALL_VECTOR_H
index ea8ff7bc8132fc3ea74f42d6fd996c637f6ef91f..ef93b2d96ea797c19c2d9f625c92c3227b4ad6ce 100644 (file)
 #define UTIL_UE2_CONTAINERS_H_
 
 #include "ue2common.h"
+#include "util/small_vector.h"
 
 #include <algorithm>
 #include <iterator>
 #include <type_traits>
 #include <utility>
 
-#include <boost/container/small_vector.hpp>
 #include <boost/functional/hash/hash_fwd.hpp>
 #include <boost/iterator/iterator_facade.hpp>
 #include <boost/operators.hpp>
@@ -97,7 +97,7 @@ template <class T, class Compare, class Allocator>
 class flat_base {
 protected:
     // Underlying storage is a small vector with local space for one element.
-    using storage_type = boost::container::small_vector<T, 1, Allocator>;
+    using storage_type = small_vector<T, 1, Allocator>;
     using storage_alloc_type = typename storage_type::allocator_type;
 
     // Putting our storage and comparator in a tuple allows us to make use of