diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..71ac2da868ffd8a639f7cd57bd78e78f45234081
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,17 @@
+cmake_minimum_required(VERSION 3.0)
+project (TMC3 CXX)
+
+include( CheckCXXCompilerFlag )
+CHECK_CXX_COMPILER_FLAG( "-std=c++11" COMPILER_SUPPORTS_CXX11 )
+CHECK_CXX_COMPILER_FLAG( "-std=c++0x" COMPILER_SUPPORTS_CXX0X )
+
+if (COMPILER_SUPPORTS_CXX11)
+ set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11" )
+elseif (COMPILER_SUPPORTS_CXX0X)
+ set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x" )
+else ()
+ MESSAGE(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
+endif ()
+
+add_subdirectory(dependencies)
+add_subdirectory(tmc3)
diff --git a/README.md b/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..f07589b47434004e5e37bb95cc4fcd977c7d2117
--- /dev/null
+++ b/README.md
@@ -0,0 +1,21 @@
+# TMC3
+
+## Building
+
+### OSX
+- mkdir build
+- cd build
+- cmake .. -G Xcode
+- open the generated xcode project and build it
+
+### Linux
+- mkdir build
+- cd build
+- cmake ..
+- make
+
+### Windows
+- md build
+- cd build
+- cmake .. -G "Visual Studio 15 2017 Win64"
+- open the generated visual studio solution and build it
diff --git a/dependencies/CMakeLists.txt b/dependencies/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f7a8b11984352412d028c261688da32b90b86f32
--- /dev/null
+++ b/dependencies/CMakeLists.txt
@@ -0,0 +1,2 @@
+add_subdirectory (tbb)
+add_subdirectory (arithmetic-coding)
\ No newline at end of file
diff --git a/dependencies/arithmetic-coding/CMakeLists.txt b/dependencies/arithmetic-coding/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..045f2e6b5d4103b3f82d47db050380d4322e1335
--- /dev/null
+++ b/dependencies/arithmetic-coding/CMakeLists.txt
@@ -0,0 +1 @@
+add_subdirectory (src)
\ No newline at end of file
diff --git a/dependencies/arithmetic-coding/inc/ArithmeticCodec.h b/dependencies/arithmetic-coding/inc/ArithmeticCodec.h
new file mode 100644
index 0000000000000000000000000000000000000000..a96c533fa7f6ba450fedaa6e155a6c637557c8bf
--- /dev/null
+++ b/dependencies/arithmetic-coding/inc/ArithmeticCodec.h
@@ -0,0 +1,321 @@
+/*
+Copyright (c) 2004 Amir Said (said@ieee.org) & William A. Pearlman (pearlw@ecse.rpi.edu)
+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.
+
+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 HOLDER 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.
+*/
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// -
+// **************************** -
+// ARITHMETIC CODING EXAMPLES -
+// **************************** -
+// -
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// -
+// Fast arithmetic coding implementation -
+// -> 32-bit variables, 32-bit product, periodic updates, table decoding -
+// -
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// -
+// Version 1.00 - April 25, 2004 -
+// -
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// -
+// WARNING -
+// ========= -
+// -
+// The only purpose of this program is to demonstrate the basic principles -
+// of arithmetic coding. It is provided as is, without any express or -
+// implied warranty, without even the warranty of fitness for any particular -
+// purpose, or that the implementations are correct. -
+// -
+// Permission to copy and redistribute this code is hereby granted, provided -
+// that this warning and copyright notices are not removed or altered. -
+// -
+// Copyright (c) 2004 by Amir Said (said@ieee.org) & -
+// William A. Pearlman (pearlw@ecse.rpi.edu) -
+// -
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// -
+// A description of the arithmetic coding method used here is available in -
+// -
+// Lossless Compression Handbook, ed. K. Sayood -
+// Chapter 5: Arithmetic Coding (A. Said), pp. 101-152, Academic Press, 2003 -
+// -
+// A. Said, Introduction to Arithetic Coding Theory and Practice -
+// HP Labs report HPL-2004-76 - http://www.hpl.hp.com/techreports/ -
+// -
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+// - - Definitions - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+#ifndef O3DGC_ARITHMETIC_CODEC
+#define O3DGC_ARITHMETIC_CODEC
+
+#include
+
+namespace o3dgc {
+
+inline unsigned long IntToUInt(long value)
+{
+ return (value < 0) ? static_cast(-1 - (2 * value)) : static_cast(2 * value);
+}
+inline long UIntToInt(unsigned long uiValue)
+{
+ return (uiValue & 1) ? -(static_cast((uiValue + 1) >> 1)) : (static_cast(uiValue >> 1));
+}
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// - - Class definitions - - - - - - - - - - - - - - - - - - - - - - - - - - -
+class Static_Bit_Model // static model for binary data
+ {
+public:
+ Static_Bit_Model(void);
+
+ void set_probability_0(double); // set probability of symbol '0'
+
+private: // . . . . . . . . . . . . . . . . . . . . . .
+ unsigned bit_0_prob;
+ friend class Arithmetic_Codec;
+};
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+class Static_Data_Model // static model for general data
+ {
+public:
+ Static_Data_Model(void);
+ ~Static_Data_Model(void);
+
+ unsigned model_symbols(void) { return data_symbols; }
+
+ void set_distribution(unsigned number_of_symbols,
+ const double probability[] = 0); // 0 means uniform
+
+private: // . . . . . . . . . . . . . . . . . . . . . .
+ unsigned *distribution, *decoder_table;
+ unsigned data_symbols, last_symbol, table_size, table_shift;
+ friend class Arithmetic_Codec;
+};
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+class Adaptive_Bit_Model // adaptive model for binary data
+ {
+public:
+ Adaptive_Bit_Model(void);
+
+ void reset(void); // reset to equiprobable model
+
+private: // . . . . . . . . . . . . . . . . . . . . . .
+ void update(void);
+ unsigned update_cycle, bits_until_update;
+ unsigned bit_0_prob, bit_0_count, bit_count;
+ friend class Arithmetic_Codec;
+};
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+class Adaptive_Data_Model // adaptive model for binary data
+ {
+public:
+ Adaptive_Data_Model(void);
+ Adaptive_Data_Model(unsigned number_of_symbols);
+ ~Adaptive_Data_Model(void);
+
+ unsigned model_symbols(void) { return data_symbols; }
+
+ void reset(void); // reset to equiprobable model
+ void set_alphabet(unsigned number_of_symbols);
+
+private: // . . . . . . . . . . . . . . . . . . . . . .
+ void update(bool);
+ unsigned *distribution, *symbol_count, *decoder_table;
+ unsigned total_count, update_cycle, symbols_until_update;
+ unsigned data_symbols, last_symbol, table_size, table_shift;
+ friend class Arithmetic_Codec;
+};
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// - - Encoder and decoder class - - - - - - - - - - - - - - - - - - - - - - -
+
+// Class with both the arithmetic encoder and decoder. All compressed data is
+// saved to a memory buffer
+
+class Arithmetic_Codec {
+public:
+ Arithmetic_Codec(void);
+ ~Arithmetic_Codec(void);
+ Arithmetic_Codec(unsigned max_code_bytes,
+ unsigned char* user_buffer = 0); // 0 = assign new
+
+ unsigned char* buffer(void) { return code_buffer; }
+
+ void set_buffer(unsigned max_code_bytes,
+ unsigned char* user_buffer = 0); // 0 = assign new
+
+ void start_encoder(void);
+ void start_decoder(void);
+ void read_from_file(FILE* code_file); // read code data, start decoder
+
+ unsigned stop_encoder(void); // returns number of bytes used
+ unsigned write_to_file(FILE* code_file); // stop encoder, write code data
+ void stop_decoder(void);
+
+ void put_bit(unsigned bit);
+ unsigned get_bit(void);
+
+ void put_bits(unsigned data, unsigned number_of_bits);
+ unsigned get_bits(unsigned number_of_bits);
+
+ void encode(unsigned bit,
+ Static_Bit_Model&);
+ unsigned decode(Static_Bit_Model&);
+
+ void encode(unsigned data,
+ Static_Data_Model&);
+ unsigned decode(Static_Data_Model&);
+
+ void encode(unsigned bit,
+ Adaptive_Bit_Model&);
+ unsigned decode(Adaptive_Bit_Model&);
+
+ void encode(unsigned data,
+ Adaptive_Data_Model&);
+ unsigned decode(Adaptive_Data_Model&);
+
+ // This section was added by K. Mammou
+ void ExpGolombEncode(unsigned int symbol,
+ int k,
+ Static_Bit_Model& bModel0,
+ Adaptive_Bit_Model& bModel1)
+ {
+ while (1) {
+ if (symbol >= static_cast(1 << k)) {
+ encode(1, bModel1);
+ symbol = symbol - (1 << k);
+ k++;
+ }
+ else {
+ encode(0, bModel1); // now terminated zero of unary part
+ while (k--) // next binary part
+ {
+ encode(static_cast((symbol >> k) & 1), bModel0);
+ }
+ break;
+ }
+ }
+ }
+
+ unsigned ExpGolombDecode(int k,
+ Static_Bit_Model& bModel0,
+ Adaptive_Bit_Model& bModel1)
+ {
+ unsigned int l;
+ int symbol = 0;
+ int binary_symbol = 0;
+ do {
+ l = decode(bModel1);
+ if (l == 1) {
+ symbol += (1 << k);
+ k++;
+ }
+ } while (l != 0);
+ while (k--) //next binary part
+ if (decode(bModel0) == 1) {
+ binary_symbol |= (1 << k);
+ }
+ return static_cast(symbol + binary_symbol);
+ }
+ //----------------------------------------------------------
+
+private: // . . . . . . . . . . . . . . . . . . . . . .
+ void propagate_carry(void);
+ void renorm_enc_interval(void);
+ void renorm_dec_interval(void);
+ unsigned char *code_buffer, *new_buffer, *ac_pointer;
+ unsigned base, value, length; // arithmetic coding state
+ unsigned buffer_size, mode; // mode: 0 = undef, 1 = encoder, 2 = decoder
+};
+inline long DecodeIntACEGC(Arithmetic_Codec& acd,
+ Adaptive_Data_Model& mModelValues,
+ Static_Bit_Model& bModel0,
+ Adaptive_Bit_Model& bModel1,
+ const unsigned long exp_k,
+ const unsigned long M)
+{
+ unsigned long uiValue = acd.decode(mModelValues);
+ if (uiValue == M) {
+ uiValue += acd.ExpGolombDecode(exp_k, bModel0, bModel1);
+ }
+ return UIntToInt(uiValue);
+}
+inline unsigned long DecodeUIntACEGC(Arithmetic_Codec& acd,
+ Adaptive_Data_Model& mModelValues,
+ Static_Bit_Model& bModel0,
+ Adaptive_Bit_Model& bModel1,
+ const unsigned long exp_k,
+ const unsigned long M)
+{
+ unsigned long uiValue = acd.decode(mModelValues);
+ if (uiValue == M) {
+ uiValue += acd.ExpGolombDecode(exp_k, bModel0, bModel1);
+ }
+ return uiValue;
+}
+
+inline void EncodeIntACEGC(long predResidual,
+ Arithmetic_Codec& ace,
+ Adaptive_Data_Model& mModelValues,
+ Static_Bit_Model& bModel0,
+ Adaptive_Bit_Model& bModel1,
+ const unsigned long M)
+{
+ unsigned long uiValue = IntToUInt(predResidual);
+ if (uiValue < M) {
+ ace.encode(uiValue, mModelValues);
+ }
+ else {
+ ace.encode(M, mModelValues);
+ ace.ExpGolombEncode(uiValue - M, 0, bModel0, bModel1);
+ }
+}
+inline void EncodeUIntACEGC(long predResidual,
+ Arithmetic_Codec& ace,
+ Adaptive_Data_Model& mModelValues,
+ Static_Bit_Model& bModel0,
+ Adaptive_Bit_Model& bModel1,
+ const unsigned long M)
+{
+ unsigned long uiValue = static_cast(predResidual);
+ if (uiValue < M) {
+ ace.encode(uiValue, mModelValues);
+ }
+ else {
+ ace.encode(M, mModelValues);
+ ace.ExpGolombEncode(uiValue - M, 0, bModel0, bModel1);
+ }
+}
+}
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+#endif
+
diff --git a/dependencies/arithmetic-coding/src/ArithmeticCodec.cpp b/dependencies/arithmetic-coding/src/ArithmeticCodec.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..c9492aba59d376ca9e547076ac6d2ff27096bfec
--- /dev/null
+++ b/dependencies/arithmetic-coding/src/ArithmeticCodec.cpp
@@ -0,0 +1,938 @@
+/*
+Copyright (c) 2004 Amir Said (said@ieee.org) & William A. Pearlman (pearlw@ecse.rpi.edu)
+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.
+
+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 HOLDER 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.
+
+*/
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// -
+// **************************** -
+// ARITHMETIC CODING EXAMPLES -
+// **************************** -
+// -
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// -
+// Fast arithmetic coding implementation -
+// -> 32-bit variables, 32-bit product, periodic updates, table decoding -
+// -
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// -
+// Version 1.00 - April 25, 2004 -
+// -
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// -
+// WARNING -
+// ========= -
+// -
+// The only purpose of this program is to demonstrate the basic principles -
+// of arithmetic coding. It is provided as is, without any express or -
+// implied warranty, without even the warranty of fitness for any particular -
+// purpose, or that the implementations are correct. -
+// -
+// Permission to copy and redistribute this code is hereby granted, provided -
+// that this warning and copyright notices are not removed or altered. -
+// -
+// Copyright (c) 2004 by Amir Said (said@ieee.org) & -
+// William A. Pearlman (pearlw@ecse.rpi.edu) -
+// -
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// -
+// A description of the arithmetic coding method used here is available in -
+// -
+// Lossless Compression Handbook, ed. K. Sayood -
+// Chapter 5: Arithmetic Coding (A. Said), pp. 101-152, Academic Press, 2003 -
+// -
+// A. Said, Introduction to Arithetic Coding Theory and Practice -
+// HP Labs report HPL-2004-76 - http://www.hpl.hp.com/techreports/ -
+// -
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+// - - Inclusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+#include "ArithmeticCodec.h"
+#include
+#include
+
+namespace o3dgc {
+// - - Constants - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+const unsigned AC__MinLength = 0x01000000U; // threshold for renormalization
+const unsigned AC__MaxLength = 0xFFFFFFFFU; // maximum AC interval length
+
+// Maximum values for binary models
+const unsigned BM__LengthShift = 13; // length bits discarded before mult.
+const unsigned BM__MaxCount = 1 << BM__LengthShift; // for adaptive models
+
+// Maximum values for general models
+const unsigned DM__LengthShift = 15; // length bits discarded before mult.
+const unsigned DM__MaxCount = 1 << DM__LengthShift; // for adaptive models
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// - - Static functions - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+//static void AC_Error(const char* msg) __attribute__((noreturn));
+static void AC_Error(const char* msg)
+{
+ fprintf(stderr, "\n\n -> Arithmetic coding error: ");
+ fputs(msg, stderr);
+ fputs("\n Execution terminated!\n", stderr);
+ getchar();
+ exit(1);
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// - - Coding implementations - - - - - - - - - - - - - - - - - - - - - - - -
+
+inline void Arithmetic_Codec::propagate_carry(void)
+{
+ unsigned char* p; // carry propagation on compressed data buffer
+ for (p = ac_pointer - 1; *p == 0xFFU; p--)
+ *p = 0;
+ ++*p;
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+inline void Arithmetic_Codec::renorm_enc_interval(void)
+{
+ do { // output and discard top byte
+ *ac_pointer++ = static_cast(base >> 24);
+ base <<= 8;
+ } while ((length <<= 8) < AC__MinLength); // length multiplied by 256
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+inline void Arithmetic_Codec::renorm_dec_interval(void)
+{
+ unsigned char* const limit = code_buffer + buffer_size - 1;
+ do { // read least-significant byte
+ if (ac_pointer < limit) {
+ value = (value << 8) | unsigned(*++ac_pointer);
+ }
+ else {
+ value = (value << 8);
+ }
+ // value = (value << 8) | unsigned(*++ac_pointer);
+ } while ((length <<= 8) < AC__MinLength); // length multiplied by 256
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+void Arithmetic_Codec::put_bit(unsigned bit)
+{
+#ifdef _DEBUG
+ if (mode != 1)
+ AC_Error("encoder not initialized");
+#endif
+
+ length >>= 1; // halve interval
+ if (bit) {
+ unsigned init_base = base;
+ base += length; // move base
+ if (init_base > base)
+ propagate_carry(); // overflow = carry
+ }
+
+ if (length < AC__MinLength)
+ renorm_enc_interval(); // renormalization
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+unsigned Arithmetic_Codec::get_bit(void)
+{
+#ifdef _DEBUG
+ if (mode != 2)
+ AC_Error("decoder not initialized");
+#endif
+
+ length >>= 1; // halve interval
+ unsigned bit = (value >= length); // decode bit
+ if (bit)
+ value -= length; // move base
+
+ if (length < AC__MinLength)
+ renorm_dec_interval(); // renormalization
+
+ return bit; // return data bit value
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+void Arithmetic_Codec::put_bits(unsigned data, unsigned bits)
+{
+#ifdef _DEBUG
+ if (mode != 1)
+ AC_Error("encoder not initialized");
+ if ((bits < 1) || (bits > 20))
+ AC_Error("invalid number of bits");
+ if (data >= (1U << bits))
+ AC_Error("invalid data");
+#endif
+
+ unsigned init_base = base;
+ base += data * (length >>= bits); // new interval base and length
+
+ if (init_base > base)
+ propagate_carry(); // overflow = carry
+ if (length < AC__MinLength)
+ renorm_enc_interval(); // renormalization
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+unsigned Arithmetic_Codec::get_bits(unsigned bits)
+{
+#ifdef _DEBUG
+ if (mode != 2)
+ AC_Error("decoder not initialized");
+ if ((bits < 1) || (bits > 20))
+ AC_Error("invalid number of bits");
+#endif
+
+ unsigned s = value / (length >>= bits); // decode symbol, change length
+
+ value -= length * s; // update interval
+ if (length < AC__MinLength)
+ renorm_dec_interval(); // renormalization
+
+ return s;
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+void Arithmetic_Codec::encode(unsigned bit, Static_Bit_Model& M)
+{
+#ifdef _DEBUG
+ if (mode != 1)
+ AC_Error("encoder not initialized");
+#endif
+
+ unsigned x = M.bit_0_prob * (length >> BM__LengthShift); // product l x p0
+ // update interval
+ if (bit == 0)
+ length = x;
+ else {
+ unsigned init_base = base;
+ base += x;
+ length -= x;
+ if (init_base > base)
+ propagate_carry(); // overflow = carry
+ }
+
+ if (length < AC__MinLength)
+ renorm_enc_interval(); // renormalization
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+unsigned Arithmetic_Codec::decode(Static_Bit_Model& M)
+{
+#ifdef _DEBUG
+ if (mode != 2)
+ AC_Error("decoder not initialized");
+#endif
+
+ unsigned x = M.bit_0_prob * (length >> BM__LengthShift); // product l x p0
+ unsigned bit = (value >= x); // decision
+ // update & shift interval
+ if (bit == 0)
+ length = x;
+ else {
+ value -= x; // shifted interval base = 0
+ length -= x;
+ }
+
+ if (length < AC__MinLength)
+ renorm_dec_interval(); // renormalization
+
+ return bit; // return data bit value
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+void Arithmetic_Codec::encode(unsigned bit,
+ Adaptive_Bit_Model& M)
+{
+#ifdef _DEBUG
+ if (mode != 1)
+ AC_Error("encoder not initialized");
+#endif
+
+ unsigned x = M.bit_0_prob * (length >> BM__LengthShift); // product l x p0
+ // update interval
+ if (bit == 0) {
+ length = x;
+ ++M.bit_0_count;
+ }
+ else {
+ unsigned init_base = base;
+ base += x;
+ length -= x;
+ if (init_base > base)
+ propagate_carry(); // overflow = carry
+ }
+
+ if (length < AC__MinLength)
+ renorm_enc_interval(); // renormalization
+
+ if (--M.bits_until_update == 0)
+ M.update(); // periodic model update
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+unsigned Arithmetic_Codec::decode(Adaptive_Bit_Model& M)
+{
+#ifdef _DEBUG
+ if (mode != 2)
+ AC_Error("decoder not initialized");
+#endif
+
+ unsigned x = M.bit_0_prob * (length >> BM__LengthShift); // product l x p0
+ unsigned bit = (value >= x); // decision
+ // update interval
+ if (bit == 0) {
+ length = x;
+ ++M.bit_0_count;
+ }
+ else {
+ value -= x;
+ length -= x;
+ }
+
+ if (length < AC__MinLength)
+ renorm_dec_interval(); // renormalization
+
+ if (--M.bits_until_update == 0)
+ M.update(); // periodic model update
+
+ return bit; // return data bit value
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+void Arithmetic_Codec::encode(unsigned data,
+ Static_Data_Model& M)
+{
+#ifdef _DEBUG
+ if (mode != 1)
+ AC_Error("encoder not initialized");
+ if (data >= M.data_symbols)
+ AC_Error("invalid data symbol");
+#endif
+
+ unsigned x, init_base = base;
+ // compute products
+ if (data == M.last_symbol) {
+ x = M.distribution[data] * (length >> DM__LengthShift);
+ base += x; // update interval
+ length -= x; // no product needed
+ }
+ else {
+ x = M.distribution[data] * (length >>= DM__LengthShift);
+ base += x; // update interval
+ length = M.distribution[data + 1] * length - x;
+ }
+
+ if (init_base > base)
+ propagate_carry(); // overflow = carry
+
+ if (length < AC__MinLength)
+ renorm_enc_interval(); // renormalization
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+unsigned Arithmetic_Codec::decode(Static_Data_Model& M)
+{
+#ifdef _DEBUG
+ if (mode != 2)
+ AC_Error("decoder not initialized");
+#endif
+
+ unsigned n, s, x, y = length;
+
+ if (M.decoder_table) { // use table look-up for faster decoding
+
+ unsigned dv = value / (length >>= DM__LengthShift);
+ unsigned t = dv >> M.table_shift;
+
+ s = M.decoder_table[t]; // initial decision based on table look-up
+ n = M.decoder_table[t + 1] + 1;
+
+ while (n > s + 1) { // finish with bisection search
+ unsigned m = (s + n) >> 1;
+ if (M.distribution[m] > dv)
+ n = m;
+ else
+ s = m;
+ }
+ // compute products
+ x = M.distribution[s] * length;
+ if (s != M.last_symbol)
+ y = M.distribution[s + 1] * length;
+ }
+
+ else { // decode using only multiplications
+
+ x = s = 0;
+ length >>= DM__LengthShift;
+ unsigned m = (n = M.data_symbols) >> 1;
+ // decode via bisection search
+ do {
+ unsigned z = length * M.distribution[m];
+ if (z > value) {
+ n = m;
+ y = z; // value is smaller
+ }
+ else {
+ s = m;
+ x = z; // value is larger or equal
+ }
+ } while ((m = (s + n) >> 1) != s);
+ }
+
+ value -= x; // update interval
+ length = y - x;
+
+ if (length < AC__MinLength)
+ renorm_dec_interval(); // renormalization
+
+ return s;
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+void Arithmetic_Codec::encode(unsigned data,
+ Adaptive_Data_Model& M)
+{
+#ifdef _DEBUG
+ if (mode != 1)
+ AC_Error("encoder not initialized");
+ if (data >= M.data_symbols) {
+ AC_Error("invalid data symbol");
+ }
+#endif
+
+ unsigned x, init_base = base;
+ // compute products
+ if (data == M.last_symbol) {
+ x = M.distribution[data] * (length >> DM__LengthShift);
+ base += x; // update interval
+ length -= x; // no product needed
+ }
+ else {
+ x = M.distribution[data] * (length >>= DM__LengthShift);
+ base += x; // update interval
+ length = M.distribution[data + 1] * length - x;
+ }
+
+ if (init_base > base)
+ propagate_carry(); // overflow = carry
+
+ if (length < AC__MinLength)
+ renorm_enc_interval(); // renormalization
+
+ ++M.symbol_count[data];
+ if (--M.symbols_until_update == 0)
+ M.update(true); // periodic model update
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+unsigned Arithmetic_Codec::decode(Adaptive_Data_Model& M)
+{
+#ifdef _DEBUG
+ if (mode != 2)
+ AC_Error("decoder not initialized");
+#endif
+
+ unsigned n, s, x, y = length;
+
+ if (M.decoder_table) { // use table look-up for faster decoding
+
+ unsigned dv = value / (length >>= DM__LengthShift);
+ unsigned t = dv >> M.table_shift;
+
+ s = M.decoder_table[t]; // initial decision based on table look-up
+ n = M.decoder_table[t + 1] + 1;
+
+ while (n > s + 1) { // finish with bisection search
+ unsigned m = (s + n) >> 1;
+ if (M.distribution[m] > dv)
+ n = m;
+ else
+ s = m;
+ }
+ // compute products
+ x = M.distribution[s] * length;
+ if (s != M.last_symbol) {
+ y = M.distribution[s + 1] * length;
+ }
+ }
+
+ else { // decode using only multiplications
+
+ x = s = 0;
+ length >>= DM__LengthShift;
+ unsigned m = (n = M.data_symbols) >> 1;
+ // decode via bisection search
+ do {
+ unsigned z = length * M.distribution[m];
+ if (z > value) {
+ n = m;
+ y = z; // value is smaller
+ }
+ else {
+ s = m;
+ x = z; // value is larger or equal
+ }
+ } while ((m = (s + n) >> 1) != s);
+ }
+
+ value -= x; // update interval
+ length = y - x;
+
+ if (length < AC__MinLength)
+ renorm_dec_interval(); // renormalization
+
+ ++M.symbol_count[s];
+ if (--M.symbols_until_update == 0)
+ M.update(false); // periodic model update
+
+ return s;
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// - - Other Arithmetic_Codec implementations - - - - - - - - - - - - - - - -
+
+Arithmetic_Codec::Arithmetic_Codec(void)
+{
+ mode = buffer_size = 0;
+ new_buffer = code_buffer = 0;
+}
+
+Arithmetic_Codec::Arithmetic_Codec(unsigned max_code_bytes,
+ unsigned char* user_buffer)
+{
+ mode = buffer_size = 0;
+ new_buffer = code_buffer = 0;
+ set_buffer(max_code_bytes, user_buffer);
+}
+
+Arithmetic_Codec::~Arithmetic_Codec(void)
+{
+ delete[] new_buffer;
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+void Arithmetic_Codec::set_buffer(unsigned max_code_bytes,
+ unsigned char* user_buffer)
+{
+ // test for reasonable sizes
+ if (!max_code_bytes) // || (max_code_bytes > 0x10000000U)) // updated by K. Mammou
+ {
+ AC_Error("invalid codec buffer size");
+ }
+ if (mode != 0)
+ AC_Error("cannot set buffer while encoding or decoding");
+
+ if (user_buffer != 0) { // user provides memory buffer
+ buffer_size = max_code_bytes;
+ code_buffer = user_buffer; // set buffer for compressed data
+ delete[] new_buffer; // free anything previously assigned
+ new_buffer = 0;
+ return;
+ }
+
+ if (max_code_bytes <= buffer_size)
+ return; // enough available
+
+ buffer_size = max_code_bytes; // assign new memory
+ delete[] new_buffer; // free anything previously assigned
+ if ((new_buffer = new unsigned char[buffer_size + 16]) == 0) // 16 extra bytes
+ AC_Error("cannot assign memory for compressed data buffer");
+ code_buffer = new_buffer; // set buffer for compressed data
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+void Arithmetic_Codec::start_encoder(void)
+{
+ if (mode != 0)
+ AC_Error("cannot start encoder");
+ if (buffer_size == 0)
+ AC_Error("no code buffer set");
+
+ mode = 1;
+ base = 0; // initialize encoder variables: interval and pointer
+ length = AC__MaxLength;
+ ac_pointer = code_buffer; // pointer to next data byte
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+void Arithmetic_Codec::start_decoder(void)
+{
+ if (mode != 0)
+ AC_Error("cannot start decoder");
+ if (buffer_size == 0)
+ AC_Error("no code buffer set");
+
+ // initialize decoder: interval, pointer, initial code value
+ mode = 2;
+ length = AC__MaxLength;
+ ac_pointer = code_buffer + 3;
+ value = (unsigned(code_buffer[0]) << 24) | (unsigned(code_buffer[std::min(1, buffer_size)]) << 16) | (unsigned(code_buffer[std::min(2, buffer_size)]) << 8) | unsigned(code_buffer[std::min(3, buffer_size)]);
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+void Arithmetic_Codec::read_from_file(FILE* code_file)
+{
+ unsigned shift = 0, code_bytes = 0;
+ int file_byte;
+ // read variable-length header with number of code bytes
+ do {
+ if ((file_byte = getc(code_file)) == EOF)
+ AC_Error("cannot read code from file");
+ code_bytes |= unsigned(file_byte & 0x7F) << shift;
+ shift += 7;
+ } while (file_byte & 0x80);
+ // read compressed data
+ if (code_bytes > buffer_size)
+ AC_Error("code buffer overflow");
+ if (fread(code_buffer, 1, code_bytes, code_file) != code_bytes)
+ AC_Error("cannot read code from file");
+
+ start_decoder(); // initialize decoder
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+unsigned Arithmetic_Codec::stop_encoder(void)
+{
+ if (mode != 1)
+ AC_Error("invalid to stop encoder");
+ mode = 0;
+
+ unsigned init_base = base; // done encoding: set final data bytes
+
+ if (length > 2 * AC__MinLength) {
+ base += AC__MinLength; // base offset
+ length = AC__MinLength >> 1; // set new length for 1 more byte
+ }
+ else {
+ base += AC__MinLength >> 1; // base offset
+ length = AC__MinLength >> 9; // set new length for 2 more bytes
+ }
+
+ if (init_base > base)
+ propagate_carry(); // overflow = carry
+
+ renorm_enc_interval(); // renormalization = output last bytes
+
+ unsigned code_bytes = unsigned(ac_pointer - code_buffer);
+ if (code_bytes > buffer_size)
+ AC_Error("code buffer overflow");
+
+ return code_bytes; // number of bytes used
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+unsigned Arithmetic_Codec::write_to_file(FILE* code_file)
+{
+ unsigned header_bytes = 0, code_bytes = stop_encoder(), nb = code_bytes;
+
+ // write variable-length header with number of code bytes
+ do {
+ int file_byte = int(nb & 0x7FU);
+ if ((nb >>= 7) > 0)
+ file_byte |= 0x80;
+ if (putc(file_byte, code_file) == EOF)
+ AC_Error("cannot write compressed data to file");
+ header_bytes++;
+ } while (nb);
+ // write compressed data
+ if (fwrite(code_buffer, 1, code_bytes, code_file) != code_bytes)
+ AC_Error("cannot write compressed data to file");
+
+ return code_bytes + header_bytes; // bytes used
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+void Arithmetic_Codec::stop_decoder(void)
+{
+ if (mode != 2)
+ AC_Error("invalid to stop decoder");
+ mode = 0;
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// - Static bit model implementation - - - - - - - - - - - - - - - - - - - - -
+
+Static_Bit_Model::Static_Bit_Model(void)
+{
+ bit_0_prob = 1U << (BM__LengthShift - 1); // p0 = 0.5
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+void Static_Bit_Model::set_probability_0(double p0)
+{
+ if ((p0 < 0.0001) || (p0 > 0.9999))
+ AC_Error("invalid bit probability");
+ bit_0_prob = unsigned(p0 * (1 << BM__LengthShift));
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// - Adaptive bit model implementation - - - - - - - - - - - - - - - - - - - -
+
+Adaptive_Bit_Model::Adaptive_Bit_Model(void)
+{
+ reset();
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+void Adaptive_Bit_Model::reset(void)
+{
+ // initialization to equiprobable model
+ bit_0_count = 1;
+ bit_count = 2;
+ bit_0_prob = 1U << (BM__LengthShift - 1);
+ update_cycle = bits_until_update = 4; // start with frequent updates
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+void Adaptive_Bit_Model::update(void)
+{
+ // halve counts when a threshold is reached
+
+ if ((bit_count += update_cycle) > BM__MaxCount) {
+ bit_count = (bit_count + 1) >> 1;
+ bit_0_count = (bit_0_count + 1) >> 1;
+ if (bit_0_count == bit_count)
+ ++bit_count;
+ }
+ // compute scaled bit 0 probability
+ unsigned scale = 0x80000000U / bit_count;
+ bit_0_prob = (bit_0_count * scale) >> (31 - BM__LengthShift);
+
+ // set frequency of model updates
+ update_cycle = (5 * update_cycle) >> 2;
+ if (update_cycle > 64)
+ update_cycle = 64;
+ bits_until_update = update_cycle;
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// - - Static data model implementation - - - - - - - - - - - - - - - - - - -
+
+Static_Data_Model::Static_Data_Model(void)
+{
+ data_symbols = 0;
+ distribution = 0;
+}
+
+Static_Data_Model::~Static_Data_Model(void)
+{
+ delete[] distribution;
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+void Static_Data_Model::set_distribution(unsigned number_of_symbols,
+ const double probability[])
+{
+ if ((number_of_symbols < 2) || (number_of_symbols > (1 << 11)))
+ AC_Error("invalid number of data symbols");
+
+ if (data_symbols != number_of_symbols) { // assign memory for data model
+ data_symbols = number_of_symbols;
+ last_symbol = data_symbols - 1;
+ delete[] distribution;
+ // define size of table for fast decoding
+ if (data_symbols > 16) {
+ unsigned table_bits = 3;
+ while (data_symbols > (1U << (table_bits + 2)))
+ ++table_bits;
+ table_size = 1 << table_bits;
+ table_shift = DM__LengthShift - table_bits;
+ distribution = new unsigned[data_symbols + table_size + 2];
+ decoder_table = distribution + data_symbols;
+ }
+ else { // small alphabet: no table needed
+ decoder_table = 0;
+ table_size = table_shift = 0;
+ distribution = new unsigned[data_symbols];
+ }
+ if (distribution == 0)
+ AC_Error("cannot assign model memory");
+ }
+ // compute cumulative distribution, decoder table
+ unsigned s = 0;
+ double sum = 0.0, p = 1.0 / double(data_symbols);
+
+ for (unsigned k = 0; k < data_symbols; k++) {
+ if (probability)
+ p = probability[k];
+ if ((p < 0.0001) || (p > 0.9999))
+ AC_Error("invalid symbol probability");
+ distribution[k] = unsigned(sum * (1 << DM__LengthShift));
+ sum += p;
+ if (table_size == 0)
+ continue;
+ unsigned w = distribution[k] >> table_shift;
+ while (s < w)
+ decoder_table[++s] = k - 1;
+ }
+
+ if (table_size != 0) {
+ decoder_table[0] = 0;
+ while (s <= table_size)
+ decoder_table[++s] = data_symbols - 1;
+ }
+
+ if ((sum < 0.9999) || (sum > 1.0001))
+ AC_Error("invalid probabilities");
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// - - Adaptive data model implementation - - - - - - - - - - - - - - - - - -
+
+Adaptive_Data_Model::Adaptive_Data_Model(void)
+{
+ data_symbols = 0;
+ distribution = 0;
+}
+
+Adaptive_Data_Model::Adaptive_Data_Model(unsigned number_of_symbols)
+{
+ data_symbols = 0;
+ distribution = 0;
+ set_alphabet(number_of_symbols);
+}
+
+Adaptive_Data_Model::~Adaptive_Data_Model(void)
+{
+ delete[] distribution;
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+void Adaptive_Data_Model::set_alphabet(unsigned number_of_symbols)
+{
+ if ((number_of_symbols < 2) || (number_of_symbols > (1 << 11)))
+ AC_Error("invalid number of data symbols");
+
+ if (data_symbols != number_of_symbols) { // assign memory for data model
+ data_symbols = number_of_symbols;
+ last_symbol = data_symbols - 1;
+ delete[] distribution;
+ // define size of table for fast decoding
+ if (data_symbols > 16) {
+ unsigned table_bits = 3;
+ while (data_symbols > (1U << (table_bits + 2)))
+ ++table_bits;
+ table_size = 1 << table_bits;
+ table_shift = DM__LengthShift - table_bits;
+ distribution = new unsigned[2 * data_symbols + table_size + 2];
+ decoder_table = distribution + 2 * data_symbols;
+ }
+ else { // small alphabet: no table needed
+ decoder_table = 0;
+ table_size = table_shift = 0;
+ distribution = new unsigned[2 * data_symbols];
+ }
+ symbol_count = distribution + data_symbols;
+ if (distribution == 0)
+ AC_Error("cannot assign model memory");
+ }
+
+ reset(); // initialize model
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+void Adaptive_Data_Model::update(bool from_encoder)
+{
+ // halve counts when a threshold is reached
+
+ if ((total_count += update_cycle) > DM__MaxCount) {
+ total_count = 0;
+ for (unsigned n = 0; n < data_symbols; n++)
+ total_count += (symbol_count[n] = (symbol_count[n] + 1) >> 1);
+ }
+ // compute cumulative distribution, decoder table
+ unsigned k, sum = 0, s = 0;
+ unsigned scale = 0x80000000U / total_count;
+
+ if (from_encoder || (table_size == 0))
+ for (k = 0; k < data_symbols; k++) {
+ distribution[k] = (scale * sum) >> (31 - DM__LengthShift);
+ sum += symbol_count[k];
+ }
+ else {
+ for (k = 0; k < data_symbols; k++) {
+ distribution[k] = (scale * sum) >> (31 - DM__LengthShift);
+ sum += symbol_count[k];
+ unsigned w = distribution[k] >> table_shift;
+ while (s < w)
+ decoder_table[++s] = k - 1;
+ }
+ decoder_table[0] = 0;
+ while (s <= table_size)
+ decoder_table[++s] = data_symbols - 1;
+ }
+ // set frequency of model updates
+ update_cycle = (5 * update_cycle) >> 2;
+ unsigned max_cycle = (data_symbols + 6) << 3;
+ if (update_cycle > max_cycle)
+ update_cycle = max_cycle;
+ symbols_until_update = update_cycle;
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+void Adaptive_Data_Model::reset(void)
+{
+ if (data_symbols == 0)
+ return;
+
+ // restore probability estimates to uniform distribution
+ total_count = 0;
+ update_cycle = data_symbols;
+ for (unsigned k = 0; k < data_symbols; k++)
+ symbol_count[k] = 1;
+ update(false);
+ symbols_until_update = update_cycle = (data_symbols + 6) >> 1;
+}
+}
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
\ No newline at end of file
diff --git a/dependencies/arithmetic-coding/src/CMakeLists.txt b/dependencies/arithmetic-coding/src/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..1062aa32ef2a159c57b92014bcd9e8e1540437cd
--- /dev/null
+++ b/dependencies/arithmetic-coding/src/CMakeLists.txt
@@ -0,0 +1,9 @@
+file(GLOB PROJECT_CPP_FILES_LOCAL "*.cpp")
+if (PROJECT_CPP_FILES STREQUAL "")
+ set(PROJECT_CPP_FILES ${PROJECT_CPP_FILES_LOCAL} CACHE STRING "C++ files" FORCE)
+else(PROJECT_CPP_FILES STREQUAL "")
+ set(PROJECT_CPP_FILES "${PROJECT_CPP_FILES};${PROJECT_CPP_FILES_LOCAL}" CACHE STRING "C++ files" FORCE)
+endif(PROJECT_CPP_FILES STREQUAL "")
+
+
+
diff --git a/dependencies/nanoflann/KDTreeVectorOfVectorsAdaptor.h b/dependencies/nanoflann/KDTreeVectorOfVectorsAdaptor.h
new file mode 100644
index 0000000000000000000000000000000000000000..dff4e18cb9f902965795f8e95081331a8332e13b
--- /dev/null
+++ b/dependencies/nanoflann/KDTreeVectorOfVectorsAdaptor.h
@@ -0,0 +1,128 @@
+/***********************************************************************
+ * Software License Agreement (BSD License)
+ *
+ * Copyright 2011-16 Jose Luis Blanco (joseluisblancoc@gmail.com).
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+ *************************************************************************/
+
+#pragma once
+
+#include "nanoflann.hpp"
+
+#include
+
+// ===== This example shows how to use nanoflann with these types of containers: =======
+// typedef std::vector > my_vector_of_vectors_t;
+// typedef std::vector my_vector_of_vectors_t; // This requires #include
+//
+// =====================================================================================
+
+/** A simple vector-of-vectors adaptor for nanoflann, without duplicating the storage.
+ * The i'th vector represents a point in the state space.
+ *
+ * \tparam DIM If set to >0, it specifies a compile-time fixed dimensionality for the points in
+ * the data set, allowing more compiler optimizations.
+ * \tparam num_t The type of the point coordinates (typically, double or float).
+ * \tparam Distance The distance metric to use: nanoflann::metric_L1, nanoflann::metric_L2,
+ * nanoflann::metric_L2_Simple, etc.
+ * \tparam IndexType The type for indices in the KD-tree index (typically, size_t of int)
+ */
+template
+struct KDTreeVectorOfVectorsAdaptor {
+ typedef KDTreeVectorOfVectorsAdaptor self_t;
+ typedef typename Distance::template traits::distance_t metric_t;
+ typedef nanoflann::KDTreeSingleIndexAdaptor index_t;
+
+ index_t *index; //! The kd-tree index for the user to call its methods as usual with any other
+ //! FLANN index.
+
+ /// Constructor: takes a const ref to the vector of vectors object with the data points
+ KDTreeVectorOfVectorsAdaptor(const int dimensionality, const VectorOfVectorsType &mat,
+ const int leaf_max_size = 10)
+ : m_data(mat) {
+ // assert(mat.size()!=0 && mat[0].size()!=0);
+ // const size_t dims = mat[0].size();
+ // if (DIM>0 && static_cast(dims)!=DIM)
+ // throw std::runtime_error("Data set dimensionality does not match the 'DIM'
+ // template
+ // argument");
+ // size_t dims = dimensionality;
+ index = new index_t(dimensionality, *this /* adaptor */,
+ nanoflann::KDTreeSingleIndexAdaptorParams(leaf_max_size));
+ index->buildIndex();
+ }
+
+ ~KDTreeVectorOfVectorsAdaptor() { delete index; }
+
+ const VectorOfVectorsType &m_data;
+
+ /** Query for the \a num_closest closest points to a given point (entered as
+ * query_point[0:dim-1]).
+ * Note that this is a short-cut method for index->findNeighbors().
+ * The user can also call index->... methods as desired.
+ * \note nChecks_IGNORED is ignored but kept for compatibility with the original FLANN interface.
+ */
+ inline void query(const num_t *query_point, const size_t num_closest, IndexType *out_indices,
+ num_t *out_distances_sq, const int nChecks_IGNORED = 10) const {
+ nanoflann::KNNResultSet resultSet(num_closest);
+ resultSet.init(out_indices, out_distances_sq);
+ index->findNeighbors(resultSet, query_point, nanoflann::SearchParams());
+ }
+
+ /** @name Interface expected by KDTreeSingleIndexAdaptor
+ * @{ */
+
+ const self_t &derived() const { return *this; }
+ self_t &derived() { return *this; }
+
+ // Must return the number of data points
+ inline size_t kdtree_get_point_count() const { return m_data.getPointCount(); }
+
+ // Returns the distance between the vector "p1[0:size-1]" and the data point with index "idx_p2"
+ // stored in the class:
+ inline num_t kdtree_distance(const num_t *p1, const size_t idx_p2, size_t size) const {
+ num_t s = 0;
+ for (size_t i = 0; i < size; i++) {
+ const num_t d = p1[i] - m_data[idx_p2][i];
+ s += d * d;
+ }
+ return s;
+ }
+
+ // Returns the dim'th component of the idx'th point in the class:
+ inline num_t kdtree_get_pt(const size_t idx, int dim) const { return m_data[idx][dim]; }
+
+ // Optional bounding-box computation: return false to default to a standard bbox computation loop.
+ // Return true if the BBOX was already computed by the class and returned in "bb" so it can be
+ // avoided to redo it again.
+ // Look at bb.size() to find out the expected dimensionality (e.g. 2 or 3 for point clouds)
+ template
+ bool kdtree_get_bbox(BBOX & /*bb*/) const {
+ return false;
+ }
+
+ /** @} */
+
+}; // end of KDTreeVectorOfVectorsAdaptor
diff --git a/dependencies/nanoflann/nanoflann.hpp b/dependencies/nanoflann/nanoflann.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..445aa2998c37f387e30e72c6d4fa27606c7100be
--- /dev/null
+++ b/dependencies/nanoflann/nanoflann.hpp
@@ -0,0 +1,1398 @@
+/***********************************************************************
+ * Software License Agreement (BSD License)
+ *
+ * Copyright 2008-2009 Marius Muja (mariusm@cs.ubc.ca). All rights reserved.
+ * Copyright 2008-2009 David G. Lowe (lowe@cs.ubc.ca). All rights reserved.
+ * Copyright 2011-2016 Jose Luis Blanco (joseluisblancoc@gmail.com).
+ * All rights reserved.
+ *
+ * THE BSD LICENSE
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+ *************************************************************************/
+
+/** \mainpage nanoflann C++ API documentation
+ * nanoflann is a C++ header-only library for building KD-Trees, mostly
+ * optimized for 2D or 3D point clouds.
+ *
+ * nanoflann does not require compiling or installing, just an
+ * #include in your code.
+ *
+ * See:
+ * - C++ API organized by modules
+ * - Online README
+ * - Doxygen documentation
+ */
+
+#ifndef NANOFLANN_HPP_
+#define NANOFLANN_HPP_
+
+#include
+#include
+#include
+#include
+#include // for fwrite()
+#include // for abs()
+#include // for abs()
+#include
+
+// Avoid conflicting declaration of min/max macros in windows headers
+#if !defined(NOMINMAX) && (defined(_WIN32) || defined(_WIN32_) || defined(WIN32) || defined(_WIN64))
+# define NOMINMAX
+# ifdef max
+# undef max
+# undef min
+# endif
+#endif
+
+namespace nanoflann
+{
+/** @addtogroup nanoflann_grp nanoflann C++ library for ANN
+ * @{ */
+
+ /** Library version: 0xMmP (M=Major,m=minor,P=patch) */
+ #define NANOFLANN_VERSION 0x123
+
+ /** @addtogroup result_sets_grp Result set classes
+ * @{ */
+ template
+ class KNNResultSet
+ {
+ IndexType * indices;
+ DistanceType* dists;
+ CountType capacity;
+ CountType count;
+
+ public:
+ inline KNNResultSet(CountType capacity_) : indices(0), dists(0), capacity(capacity_), count(0)
+ {
+ }
+
+ inline void init(IndexType* indices_, DistanceType* dists_)
+ {
+ indices = indices_;
+ dists = dists_;
+ count = 0;
+ if (capacity)
+ dists[capacity-1] = (std::numeric_limits::max)();
+ }
+
+ inline CountType size() const
+ {
+ return count;
+ }
+
+ inline bool full() const
+ {
+ return count == capacity;
+ }
+
+
+ inline void addPoint(DistanceType dist, IndexType index)
+ {
+ CountType i;
+ for (i=count; i>0; --i) {
+#ifdef NANOFLANN_FIRST_MATCH // If defined and two points have the same distance, the one with the lowest-index will be returned first.
+ if ( (dists[i-1]>dist) || ((dist==dists[i-1])&&(indices[i-1]>index)) ) {
+#else
+ if (dists[i-1]>dist) {
+#endif
+ if (i
+ class RadiusResultSet
+ {
+ public:
+ const DistanceType radius;
+
+ std::vector >& m_indices_dists;
+
+ inline RadiusResultSet(DistanceType radius_, std::vector >& indices_dists) : radius(radius_), m_indices_dists(indices_dists)
+ {
+ init();
+ }
+
+ inline ~RadiusResultSet() { }
+
+ inline void init() { clear(); }
+ inline void clear() { m_indices_dists.clear(); }
+
+ inline size_t size() const { return m_indices_dists.size(); }
+
+ inline bool full() const { return true; }
+
+ inline void addPoint(DistanceType dist, IndexType index)
+ {
+ if (dist 0
+ */
+ std::pair worst_item() const
+ {
+ if (m_indices_dists.empty()) throw std::runtime_error("Cannot invoke RadiusResultSet::worst_item() on an empty list of results.");
+ typedef typename std::vector >::const_iterator DistIt;
+ DistIt it = std::max_element(m_indices_dists.begin(), m_indices_dists.end());
+ return *it;
+ }
+ };
+
+ /** operator "<" for std::sort() */
+ struct IndexDist_Sorter
+ {
+ /** PairType will be typically: std::pair */
+ template
+ inline bool operator()(const PairType &p1, const PairType &p2) const {
+ return p1.second < p2.second;
+ }
+ };
+
+ /** @} */
+
+
+ /** @addtogroup loadsave_grp Load/save auxiliary functions
+ * @{ */
+ template
+ void save_value(FILE* stream, const T& value, size_t count = 1)
+ {
+ fwrite(&value, sizeof(value),count, stream);
+ }
+
+ template
+ void save_value(FILE* stream, const std::vector& value)
+ {
+ size_t size = value.size();
+ fwrite(&size, sizeof(size_t), 1, stream);
+ fwrite(&value[0], sizeof(T), size, stream);
+ }
+
+ template
+ void load_value(FILE* stream, T& value, size_t count = 1)
+ {
+ size_t read_cnt = fread(&value, sizeof(value), count, stream);
+ if (read_cnt != count) {
+ throw std::runtime_error("Cannot read from file");
+ }
+ }
+
+
+ template
+ void load_value(FILE* stream, std::vector& value)
+ {
+ size_t size;
+ size_t read_cnt = fread(&size, sizeof(size_t), 1, stream);
+ if (read_cnt!=1) {
+ throw std::runtime_error("Cannot read from file");
+ }
+ value.resize(size);
+ read_cnt = fread(&value[0], sizeof(T), size, stream);
+ if (read_cnt!=size) {
+ throw std::runtime_error("Cannot read from file");
+ }
+ }
+ /** @} */
+
+
+ /** @addtogroup metric_grp Metric (distance) classes
+ * @{ */
+
+ /** Manhattan distance functor (generic version, optimized for high-dimensionality data sets).
+ * Corresponding distance traits: nanoflann::metric_L1
+ * \tparam T Type of the elements (e.g. double, float, uint8_t)
+ * \tparam _DistanceType Type of distance variables (must be signed) (e.g. float, double, int64_t)
+ */
+ template
+ struct L1_Adaptor
+ {
+ typedef T ElementType;
+ typedef _DistanceType DistanceType;
+
+ const DataSource &data_source;
+
+ L1_Adaptor(const DataSource &_data_source) : data_source(_data_source) { }
+
+ inline DistanceType operator()(const T* a, const size_t b_idx, size_t size, DistanceType worst_dist = -1) const
+ {
+ DistanceType result = DistanceType();
+ const T* last = a + size;
+ const T* lastgroup = last - 3;
+ size_t d = 0;
+
+ /* Process 4 items with each loop for efficiency. */
+ while (a < lastgroup) {
+ const DistanceType diff0 = std::abs(a[0] - data_source.kdtree_get_pt(b_idx,d++));
+ const DistanceType diff1 = std::abs(a[1] - data_source.kdtree_get_pt(b_idx,d++));
+ const DistanceType diff2 = std::abs(a[2] - data_source.kdtree_get_pt(b_idx,d++));
+ const DistanceType diff3 = std::abs(a[3] - data_source.kdtree_get_pt(b_idx,d++));
+ result += diff0 + diff1 + diff2 + diff3;
+ a += 4;
+ if ((worst_dist>0)&&(result>worst_dist)) {
+ return result;
+ }
+ }
+ /* Process last 0-3 components. Not needed for standard vector lengths. */
+ while (a < last) {
+ result += std::abs( *a++ - data_source.kdtree_get_pt(b_idx,d++) );
+ }
+ return result;
+ }
+
+ template
+ inline DistanceType accum_dist(const U a, const V b, int ) const
+ {
+ return std::abs(a-b);
+ }
+ };
+
+ /** Squared Euclidean distance functor (generic version, optimized for high-dimensionality data sets).
+ * Corresponding distance traits: nanoflann::metric_L2
+ * \tparam T Type of the elements (e.g. double, float, uint8_t)
+ * \tparam _DistanceType Type of distance variables (must be signed) (e.g. float, double, int64_t)
+ */
+ template
+ struct L2_Adaptor
+ {
+ typedef T ElementType;
+ typedef _DistanceType DistanceType;
+
+ const DataSource &data_source;
+
+ L2_Adaptor(const DataSource &_data_source) : data_source(_data_source) { }
+
+ inline DistanceType operator()(const T* a, const size_t b_idx, size_t size, DistanceType worst_dist = -1) const
+ {
+ DistanceType result = DistanceType();
+ const T* last = a + size;
+ const T* lastgroup = last - 3;
+ size_t d = 0;
+
+ /* Process 4 items with each loop for efficiency. */
+ while (a < lastgroup) {
+ const DistanceType diff0 = a[0] - data_source.kdtree_get_pt(b_idx,d++);
+ const DistanceType diff1 = a[1] - data_source.kdtree_get_pt(b_idx,d++);
+ const DistanceType diff2 = a[2] - data_source.kdtree_get_pt(b_idx,d++);
+ const DistanceType diff3 = a[3] - data_source.kdtree_get_pt(b_idx,d++);
+ result += diff0 * diff0 + diff1 * diff1 + diff2 * diff2 + diff3 * diff3;
+ a += 4;
+ if ((worst_dist>0)&&(result>worst_dist)) {
+ return result;
+ }
+ }
+ /* Process last 0-3 components. Not needed for standard vector lengths. */
+ while (a < last) {
+ const DistanceType diff0 = *a++ - data_source.kdtree_get_pt(b_idx,d++);
+ result += diff0 * diff0;
+ }
+ return result;
+ }
+
+ template
+ inline DistanceType accum_dist(const U a, const V b, int ) const
+ {
+ return (a-b)*(a-b);
+ }
+ };
+
+ /** Squared Euclidean (L2) distance functor (suitable for low-dimensionality datasets, like 2D or 3D point clouds)
+ * Corresponding distance traits: nanoflann::metric_L2_Simple
+ * \tparam T Type of the elements (e.g. double, float, uint8_t)
+ * \tparam _DistanceType Type of distance variables (must be signed) (e.g. float, double, int64_t)
+ */
+ template
+ struct L2_Simple_Adaptor
+ {
+ typedef T ElementType;
+ typedef _DistanceType DistanceType;
+
+ const DataSource &data_source;
+
+ L2_Simple_Adaptor(const DataSource &_data_source) : data_source(_data_source) { }
+
+ inline DistanceType operator()(const T* a, const size_t b_idx, size_t size) const {
+ return data_source.kdtree_distance(a,b_idx,size);
+ }
+
+ template
+ inline DistanceType accum_dist(const U a, const V b, int ) const
+ {
+ return (a-b)*(a-b);
+ }
+ };
+
+ /** Metaprogramming helper traits class for the L1 (Manhattan) metric */
+ struct metric_L1 {
+ template
+ struct traits {
+ typedef L1_Adaptor distance_t;
+ };
+ };
+ /** Metaprogramming helper traits class for the L2 (Euclidean) metric */
+ struct metric_L2 {
+ template
+ struct traits {
+ typedef L2_Adaptor distance_t;
+ };
+ };
+ /** Metaprogramming helper traits class for the L2_simple (Euclidean) metric */
+ struct metric_L2_Simple {
+ template
+ struct traits {
+ typedef L2_Simple_Adaptor distance_t;
+ };
+ };
+
+ /** @} */
+
+ /** @addtogroup param_grp Parameter structs
+ * @{ */
+
+ /** Parameters (see README.md) */
+ struct KDTreeSingleIndexAdaptorParams
+ {
+ KDTreeSingleIndexAdaptorParams(size_t _leaf_max_size = 10) :
+ leaf_max_size(_leaf_max_size)
+ {}
+
+ size_t leaf_max_size;
+ };
+
+ /** Search options for KDTreeSingleIndexAdaptor::findNeighbors() */
+ struct SearchParams
+ {
+ /** Note: The first argument (checks_IGNORED_) is ignored, but kept for compatibility with the FLANN interface */
+ SearchParams(int checks_IGNORED_ = 32, float eps_ = 0, bool sorted_ = true ) :
+ checks(checks_IGNORED_), eps(eps_), sorted(sorted_) {}
+
+ int checks; //!< Ignored parameter (Kept for compatibility with the FLANN interface).
+ float eps; //!< search for eps-approximate neighbours (default: 0)
+ bool sorted; //!< only for radius search, require neighbours sorted by distance (default: true)
+ };
+ /** @} */
+
+
+ /** @addtogroup memalloc_grp Memory allocation
+ * @{ */
+
+ /**
+ * Allocates (using C's malloc) a generic type T.
+ *
+ * Params:
+ * count = number of instances to allocate.
+ * Returns: pointer (of type T*) to memory buffer
+ */
+ template
+ inline T* allocate(size_t count = 1)
+ {
+ T* mem = static_cast( ::malloc(sizeof(T)*count));
+ return mem;
+ }
+
+
+ /**
+ * Pooled storage allocator
+ *
+ * The following routines allow for the efficient allocation of storage in
+ * small chunks from a specified pool. Rather than allowing each structure
+ * to be freed individually, an entire pool of storage is freed at once.
+ * This method has two advantages over just using malloc() and free(). First,
+ * it is far more efficient for allocating small objects, as there is
+ * no overhead for remembering all the information needed to free each
+ * object or consolidating fragmented memory. Second, the decision about
+ * how long to keep an object is made at the time of allocation, and there
+ * is no need to track down all the objects to free them.
+ *
+ */
+
+ const size_t WORDSIZE=16;
+ const size_t BLOCKSIZE=8192;
+
+ class PooledAllocator
+ {
+ /* We maintain memory alignment to word boundaries by requiring that all
+ allocations be in multiples of the machine wordsize. */
+ /* Size of machine word in bytes. Must be power of 2. */
+ /* Minimum number of bytes requested at a time from the system. Must be multiple of WORDSIZE. */
+
+
+ size_t remaining; /* Number of bytes left in current block of storage. */
+ void* base; /* Pointer to base of current block of storage. */
+ void* loc; /* Current location in block to next allocate memory. */
+
+ void internal_init()
+ {
+ remaining = 0;
+ base = NULL;
+ usedMemory = 0;
+ wastedMemory = 0;
+ }
+
+ public:
+ size_t usedMemory;
+ size_t wastedMemory;
+
+ /**
+ Default constructor. Initializes a new pool.
+ */
+ PooledAllocator() {
+ internal_init();
+ }
+
+ /**
+ * Destructor. Frees all the memory allocated in this pool.
+ */
+ ~PooledAllocator() {
+ free_all();
+ }
+
+ /** Frees all allocated memory chunks */
+ void free_all()
+ {
+ while (base != NULL) {
+ void *prev = *(static_cast( base)); /* Get pointer to prev block. */
+ ::free(base);
+ base = prev;
+ }
+ internal_init();
+ }
+
+ /**
+ * Returns a pointer to a piece of new memory of the given size in bytes
+ * allocated from the pool.
+ */
+ void* malloc(const size_t req_size)
+ {
+ /* Round size up to a multiple of wordsize. The following expression
+ only works for WORDSIZE that is a power of 2, by masking last bits of
+ incremented size to zero.
+ */
+ const size_t size = (req_size + (WORDSIZE - 1)) & ~(WORDSIZE - 1);
+
+ /* Check whether a new block must be allocated. Note that the first word
+ of a block is reserved for a pointer to the previous block.
+ */
+ if (size > remaining) {
+
+ wastedMemory += remaining;
+
+ /* Allocate new storage. */
+ const size_t blocksize = (size + sizeof(void*) + (WORDSIZE-1) > BLOCKSIZE) ?
+ size + sizeof(void*) + (WORDSIZE-1) : BLOCKSIZE;
+
+ // use the standard C malloc to allocate memory
+ void* m = ::malloc(blocksize);
+ if (!m) {
+ fprintf(stderr,"Failed to allocate memory.\n");
+ return NULL;
+ }
+
+ /* Fill first word of new block with pointer to previous block. */
+ static_cast(m)[0] = base;
+ base = m;
+
+ size_t shift = 0;
+ //int size_t = (WORDSIZE - ( (((size_t)m) + sizeof(void*)) & (WORDSIZE-1))) & (WORDSIZE-1);
+
+ remaining = blocksize - sizeof(void*) - shift;
+ loc = (static_cast(m) + sizeof(void*) + shift);
+ }
+ void* rloc = loc;
+ loc = static_cast(loc) + size;
+ remaining -= size;
+
+ usedMemory += size;
+
+ return rloc;
+ }
+
+ /**
+ * Allocates (using this pool) a generic type T.
+ *
+ * Params:
+ * count = number of instances to allocate.
+ * Returns: pointer (of type T*) to memory buffer
+ */
+ template
+ T* allocate(const size_t count = 1)
+ {
+ T* mem = static_cast(this->malloc(sizeof(T)*count));
+ return mem;
+ }
+
+ };
+ /** @} */
+
+ /** @addtogroup nanoflann_metaprog_grp Auxiliary metaprogramming stuff
+ * @{ */
+
+ // ---------------- CArray -------------------------
+ /** A STL container (as wrapper) for arrays of constant size defined at compile time (class imported from the MRPT project)
+ * This code is an adapted version from Boost, modifed for its integration
+ * within MRPT (JLBC, Dec/2009) (Renamed array -> CArray to avoid possible potential conflicts).
+ * See
+ * http://www.josuttis.com/cppcode
+ * for details and the latest version.
+ * See
+ * http://www.boost.org/libs/array for Documentation.
+ * for documentation.
+ *
+ * (C) Copyright Nicolai M. Josuttis 2001.
+ * Permission to copy, use, modify, sell and distribute this software
+ * is granted provided this copyright notice appears in all copies.
+ * This software is provided "as is" without express or implied
+ * warranty, and with no claim as to its suitability for any purpose.
+ *
+ * 29 Jan 2004 - minor fixes (Nico Josuttis)
+ * 04 Dec 2003 - update to synch with library TR1 (Alisdair Meredith)
+ * 23 Aug 2002 - fix for Non-MSVC compilers combined with MSVC libraries.
+ * 05 Aug 2001 - minor update (Nico Josuttis)
+ * 20 Jan 2001 - STLport fix (Beman Dawes)
+ * 29 Sep 2000 - Initial Revision (Nico Josuttis)
+ *
+ * Jan 30, 2004
+ */
+ template
+ class CArray {
+ public:
+ T elems[N]; // fixed-size array of elements of type T
+
+ public:
+ // type definitions
+ typedef T value_type;
+ typedef T* iterator;
+ typedef const T* const_iterator;
+ typedef T& reference;
+ typedef const T& const_reference;
+ typedef std::size_t size_type;
+ typedef std::ptrdiff_t difference_type;
+
+ // iterator support
+ inline iterator begin() { return elems; }
+ inline const_iterator begin() const { return elems; }
+ inline iterator end() { return elems+N; }
+ inline const_iterator end() const { return elems+N; }
+
+ // reverse iterator support
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_MSVC_STD_ITERATOR) && !defined(BOOST_NO_STD_ITERATOR_TRAITS)
+ typedef std::reverse_iterator reverse_iterator;
+ typedef std::reverse_iterator const_reverse_iterator;
+#elif defined(_MSC_VER) && (_MSC_VER == 1300) && defined(BOOST_DINKUMWARE_STDLIB) && (BOOST_DINKUMWARE_STDLIB == 310)
+ // workaround for broken reverse_iterator in VC7
+ typedef std::reverse_iterator > reverse_iterator;
+ typedef std::reverse_iterator > const_reverse_iterator;
+#else
+ // workaround for broken reverse_iterator implementations
+ typedef std::reverse_iterator reverse_iterator;
+ typedef std::reverse_iterator const_reverse_iterator;
+#endif
+
+ reverse_iterator rbegin() { return reverse_iterator(end()); }
+ const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); }
+ reverse_iterator rend() { return reverse_iterator(begin()); }
+ const_reverse_iterator rend() const { return const_reverse_iterator(begin()); }
+ // operator[]
+ inline reference operator[](size_type i) { return elems[i]; }
+ inline const_reference operator[](size_type i) const { return elems[i]; }
+ // at() with range check
+ reference at(size_type i) { rangecheck(i); return elems[i]; }
+ const_reference at(size_type i) const { rangecheck(i); return elems[i]; }
+ // front() and back()
+ reference front() { return elems[0]; }
+ const_reference front() const { return elems[0]; }
+ reference back() { return elems[N-1]; }
+ const_reference back() const { return elems[N-1]; }
+ // size is constant
+ static inline size_type size() { return N; }
+ static bool empty() { return false; }
+ static size_type max_size() { return N; }
+ enum { static_size = N };
+ /** This method has no effects in this class, but raises an exception if the expected size does not match */
+ inline void resize(const size_t nElements) { if (nElements!=N) throw std::logic_error("Try to change the size of a CArray."); }
+ // swap (note: linear complexity in N, constant for given instantiation)
+ void swap (CArray& y) { std::swap_ranges(begin(),end(),y.begin()); }
+ // direct access to data (read-only)
+ const T* data() const { return elems; }
+ // use array as C array (direct read/write access to data)
+ T* data() { return elems; }
+ // assignment with type conversion
+ template CArray& operator= (const CArray& rhs) {
+ std::copy(rhs.begin(),rhs.end(), begin());
+ return *this;
+ }
+ // assign one value to all elements
+ inline void assign (const T& value) { for (size_t i=0;i= size()) { throw std::out_of_range("CArray<>: index out of range"); } }
+ }; // end of CArray
+
+ /** Used to declare fixed-size arrays when DIM>0, dynamically-allocated vectors when DIM=-1.
+ * Fixed size version for a generic DIM:
+ */
+ template
+ struct array_or_vector_selector
+ {
+ typedef CArray container_t;
+ };
+ /** Dynamic size version */
+ template
+ struct array_or_vector_selector<-1,T> {
+ typedef std::vector container_t;
+ };
+ /** @} */
+
+ /** @addtogroup kdtrees_grp KD-tree classes and adaptors
+ * @{ */
+
+ /** kd-tree index
+ *
+ * Contains the k-d trees and other information for indexing a set of points
+ * for nearest-neighbor matching.
+ *
+ * The class "DatasetAdaptor" must provide the following interface (can be non-virtual, inlined methods):
+ *
+ * \code
+ * // Must return the number of data poins
+ * inline size_t kdtree_get_point_count() const { ... }
+ *
+ * // [Only if using the metric_L2_Simple type] Must return the Euclidean (L2) distance between the vector "p1[0:size-1]" and the data point with index "idx_p2" stored in the class:
+ * inline DistanceType kdtree_distance(const T *p1, const size_t idx_p2,size_t size) const { ... }
+ *
+ * // Must return the dim'th component of the idx'th point in the class:
+ * inline T kdtree_get_pt(const size_t idx, int dim) const { ... }
+ *
+ * // Optional bounding-box computation: return false to default to a standard bbox computation loop.
+ * // Return true if the BBOX was already computed by the class and returned in "bb" so it can be avoided to redo it again.
+ * // Look at bb.size() to find out the expected dimensionality (e.g. 2 or 3 for point clouds)
+ * template
+ * bool kdtree_get_bbox(BBOX &bb) const
+ * {
+ * bb[0].low = ...; bb[0].high = ...; // 0th dimension limits
+ * bb[1].low = ...; bb[1].high = ...; // 1st dimension limits
+ * ...
+ * return true;
+ * }
+ *
+ * \endcode
+ *
+ * \tparam DatasetAdaptor The user-provided adaptor (see comments above).
+ * \tparam Distance The distance metric to use: nanoflann::metric_L1, nanoflann::metric_L2, nanoflann::metric_L2_Simple, etc.
+ * \tparam DIM Dimensionality of data points (e.g. 3 for 3D points)
+ * \tparam IndexType Will be typically size_t or int
+ */
+ template
+ class KDTreeSingleIndexAdaptor
+ {
+ private:
+ /** Hidden copy constructor, to disallow copying indices (Not implemented) */
+ KDTreeSingleIndexAdaptor(const KDTreeSingleIndexAdaptor&);
+ public:
+ typedef typename Distance::ElementType ElementType;
+ typedef typename Distance::DistanceType DistanceType;
+ protected:
+
+ /**
+ * Array of indices to vectors in the dataset.
+ */
+ std::vector vind;
+
+ size_t m_leaf_max_size;
+
+
+ /**
+ * The dataset used by this index
+ */
+ const DatasetAdaptor &dataset; //!< The source of our data
+
+ const KDTreeSingleIndexAdaptorParams index_params;
+
+ size_t m_size; //!< Number of current poins in the dataset
+ size_t m_size_at_index_build; //!< Number of points in the dataset when the index was built
+ int dim; //!< Dimensionality of each data point
+
+
+ /*--------------------- Internal Data Structures --------------------------*/
+ struct Node
+ {
+ /** Union used because a node can be either a LEAF node or a non-leaf node, so both data fields are never used simultaneously */
+ union {
+ struct leaf
+ {
+ IndexType left, right; //!< Indices of points in leaf node
+ } lr;
+ struct nonleaf
+ {
+ int divfeat; //!< Dimension used for subdivision.
+ DistanceType divlow, divhigh; //!< The values used for subdivision.
+ } sub;
+ } node_type;
+ Node* child1, * child2; //!< Child nodes (both=NULL mean its a leaf node)
+ };
+ typedef Node* NodePtr;
+
+
+ struct Interval
+ {
+ ElementType low, high;
+ };
+
+ /** Define "BoundingBox" as a fixed-size or variable-size container depending on "DIM" */
+ typedef typename array_or_vector_selector::container_t BoundingBox;
+
+ /** Define "distance_vector_t" as a fixed-size or variable-size container depending on "DIM" */
+ typedef typename array_or_vector_selector::container_t distance_vector_t;
+
+ /** The KD-tree used to find neighbours */
+ NodePtr root_node;
+ BoundingBox root_bbox;
+
+ /**
+ * Pooled memory allocator.
+ *
+ * Using a pooled memory allocator is more efficient
+ * than allocating memory directly when there is a large
+ * number small of memory allocations.
+ */
+ PooledAllocator pool;
+
+ public:
+
+ Distance distance;
+
+ /**
+ * KDTree constructor
+ *
+ * Refer to docs in README.md or online in https://github.com/jlblancoc/nanoflann
+ *
+ * The KD-Tree point dimension (the length of each point in the datase, e.g. 3 for 3D points)
+ * is determined by means of:
+ * - The \a DIM template parameter if >0 (highest priority)
+ * - Otherwise, the \a dimensionality parameter of this constructor.
+ *
+ * @param inputData Dataset with the input features
+ * @param params Basically, the maximum leaf node size
+ */
+ KDTreeSingleIndexAdaptor(const int dimensionality, const DatasetAdaptor& inputData, const KDTreeSingleIndexAdaptorParams& params = KDTreeSingleIndexAdaptorParams() ) :
+ dataset(inputData), index_params(params), root_node(NULL), distance(inputData)
+ {
+ m_size = dataset.kdtree_get_point_count();
+ m_size_at_index_build = m_size;
+ dim = dimensionality;
+ if (DIM>0) dim=DIM;
+ m_leaf_max_size = params.leaf_max_size;
+
+ // Create a permutable array of indices to the input vectors.
+ init_vind();
+ }
+
+ /** Standard destructor */
+ ~KDTreeSingleIndexAdaptor() { }
+
+ /** Frees the previously-built index. Automatically called within buildIndex(). */
+ void freeIndex()
+ {
+ pool.free_all();
+ root_node=NULL;
+ m_size_at_index_build = 0;
+ }
+
+ /**
+ * Builds the index
+ */
+ void buildIndex()
+ {
+ init_vind();
+ freeIndex();
+ m_size_at_index_build = m_size;
+ if(m_size == 0) return;
+ computeBoundingBox(root_bbox);
+ root_node = divideTree(0, m_size, root_bbox ); // construct the tree
+ }
+
+ /** Returns number of points in dataset */
+ size_t size() const { return m_size; }
+
+ /** Returns the length of each point in the dataset */
+ size_t veclen() const {
+ return static_cast(DIM>0 ? DIM : dim);
+ }
+
+ /**
+ * Computes the inde memory usage
+ * Returns: memory used by the index
+ */
+ size_t usedMemory() const
+ {
+ return pool.usedMemory+pool.wastedMemory+dataset.kdtree_get_point_count()*sizeof(IndexType); // pool memory and vind array memory
+ }
+
+ /** \name Query methods
+ * @{ */
+
+ /**
+ * Find set of nearest neighbors to vec[0:dim-1]. Their indices are stored inside
+ * the result object.
+ *
+ * Params:
+ * result = the result object in which the indices of the nearest-neighbors are stored
+ * vec = the vector for which to search the nearest neighbors
+ *
+ * \tparam RESULTSET Should be any ResultSet
+ * \return True if the requested neighbors could be found.
+ * \sa knnSearch, radiusSearch
+ */
+ template
+ bool findNeighbors(RESULTSET& result, const ElementType* vec, const SearchParams& searchParams) const
+ {
+ assert(vec);
+ if (size() == 0)
+ return false;
+ if (!root_node)
+ throw std::runtime_error("[nanoflann] findNeighbors() called before building the index.");
+ float epsError = 1+searchParams.eps;
+
+ distance_vector_t dists; // fixed or variable-sized container (depending on DIM)
+ dists.assign((DIM>0 ? DIM : dim) ,0); // Fill it with zeros.
+ DistanceType distsq = computeInitialDistances(vec, dists);
+ searchLevel(result, vec, root_node, distsq, dists, epsError); // "count_leaf" parameter removed since was neither used nor returned to the user.
+ return result.full();
+ }
+
+ /**
+ * Find the "num_closest" nearest neighbors to the \a query_point[0:dim-1]. Their indices are stored inside
+ * the result object.
+ * \sa radiusSearch, findNeighbors
+ * \note nChecks_IGNORED is ignored but kept for compatibility with the original FLANN interface.
+ * \return Number `N` of valid points in the result set. Only the first `N` entries in `out_indices` and `out_distances_sq` will be valid.
+ * Return may be less than `num_closest` only if the number of elements in the tree is less than `num_closest`.
+ */
+ size_t knnSearch(const ElementType *query_point, const size_t num_closest, IndexType *out_indices, DistanceType *out_distances_sq, const int /* nChecks_IGNORED */ = 10) const
+ {
+ nanoflann::KNNResultSet resultSet(num_closest);
+ resultSet.init(out_indices, out_distances_sq);
+ this->findNeighbors(resultSet, query_point, nanoflann::SearchParams());
+ return resultSet.size();
+ }
+
+ /**
+ * Find all the neighbors to \a query_point[0:dim-1] within a maximum radius.
+ * The output is given as a vector of pairs, of which the first element is a point index and the second the corresponding distance.
+ * Previous contents of \a IndicesDists are cleared.
+ *
+ * If searchParams.sorted==true, the output list is sorted by ascending distances.
+ *
+ * For a better performance, it is advisable to do a .reserve() on the vector if you have any wild guess about the number of expected matches.
+ *
+ * \sa knnSearch, findNeighbors, radiusSearchCustomCallback
+ * \return The number of points within the given radius (i.e. indices.size() or dists.size() )
+ */
+ size_t radiusSearch(const ElementType *query_point,const DistanceType &radius, std::vector >& IndicesDists, const SearchParams& searchParams) const
+ {
+ RadiusResultSet resultSet(radius,IndicesDists);
+ const size_t nFound = radiusSearchCustomCallback(query_point,resultSet,searchParams);
+ if (searchParams.sorted)
+ std::sort(IndicesDists.begin(),IndicesDists.end(), IndexDist_Sorter() );
+ return nFound;
+ }
+
+ /**
+ * Just like radiusSearch() but with a custom callback class for each point found in the radius of the query.
+ * See the source of RadiusResultSet<> as a start point for your own classes.
+ * \sa radiusSearch
+ */
+ template
+ size_t radiusSearchCustomCallback(const ElementType *query_point,SEARCH_CALLBACK &resultSet, const SearchParams& searchParams = SearchParams() ) const
+ {
+ this->findNeighbors(resultSet, query_point, searchParams);
+ return resultSet.size();
+ }
+
+ /** @} */
+
+ private:
+ /** Make sure the auxiliary list \a vind has the same size than the current dataset, and re-generate if size has changed. */
+ void init_vind()
+ {
+ // Create a permutable array of indices to the input vectors.
+ m_size = dataset.kdtree_get_point_count();
+ if (vind.size()!=m_size) vind.resize(m_size);
+ for (size_t i = 0; i < m_size; i++) vind[i] = i;
+ }
+
+ /// Helper accessor to the dataset points:
+ inline ElementType dataset_get(size_t idx, int component) const {
+ return dataset.kdtree_get_pt(idx,component);
+ }
+
+
+ void save_tree(FILE* stream, NodePtr tree)
+ {
+ save_value(stream, *tree);
+ if (tree->child1!=NULL) {
+ save_tree(stream, tree->child1);
+ }
+ if (tree->child2!=NULL) {
+ save_tree(stream, tree->child2);
+ }
+ }
+
+
+ void load_tree(FILE* stream, NodePtr& tree)
+ {
+ tree = pool.allocate();
+ load_value(stream, *tree);
+ if (tree->child1!=NULL) {
+ load_tree(stream, tree->child1);
+ }
+ if (tree->child2!=NULL) {
+ load_tree(stream, tree->child2);
+ }
+ }
+
+
+ void computeBoundingBox(BoundingBox& bbox)
+ {
+ bbox.resize((DIM>0 ? DIM : dim));
+ if (dataset.kdtree_get_bbox(bbox))
+ {
+ // Done! It was implemented in derived class
+ }
+ else
+ {
+ const size_t N = dataset.kdtree_get_point_count();
+ if (!N) throw std::runtime_error("[nanoflann] computeBoundingBox() called but no data points found.");
+ for (int i=0; i<(DIM>0 ? DIM : dim); ++i) {
+ bbox[i].low =
+ bbox[i].high = dataset_get(0,i);
+ }
+ for (size_t k=1; k0 ? DIM : dim); ++i) {
+ if (dataset_get(k,i)bbox[i].high) bbox[i].high = dataset_get(k,i);
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Create a tree node that subdivides the list of vecs from vind[first]
+ * to vind[last]. The routine is called recursively on each sublist.
+ *
+ * @param left index of the first vector
+ * @param right index of the last vector
+ */
+ NodePtr divideTree(const IndexType left, const IndexType right, BoundingBox& bbox)
+ {
+ NodePtr node = pool.allocate(); // allocate memory
+
+ /* If too few exemplars remain, then make this a leaf node. */
+ if ( (right-left) <= static_cast(m_leaf_max_size) ) {
+ node->child1 = node->child2 = NULL; /* Mark as leaf node. */
+ node->node_type.lr.left = left;
+ node->node_type.lr.right = right;
+
+ // compute bounding-box of leaf points
+ for (int i=0; i<(DIM>0 ? DIM : dim); ++i) {
+ bbox[i].low = dataset_get(vind[left],i);
+ bbox[i].high = dataset_get(vind[left],i);
+ }
+ for (IndexType k=left+1; k0 ? DIM : dim); ++i) {
+ if (bbox[i].low>dataset_get(vind[k],i)) bbox[i].low=dataset_get(vind[k],i);
+ if (bbox[i].highnode_type.sub.divfeat = cutfeat;
+
+ BoundingBox left_bbox(bbox);
+ left_bbox[cutfeat].high = cutval;
+ node->child1 = divideTree(left, left+idx, left_bbox);
+
+ BoundingBox right_bbox(bbox);
+ right_bbox[cutfeat].low = cutval;
+ node->child2 = divideTree(left+idx, right, right_bbox);
+
+ node->node_type.sub.divlow = left_bbox[cutfeat].high;
+ node->node_type.sub.divhigh = right_bbox[cutfeat].low;
+
+ for (int i=0; i<(DIM>0 ? DIM : dim); ++i) {
+ bbox[i].low = std::min(left_bbox[i].low, right_bbox[i].low);
+ bbox[i].high = std::max(left_bbox[i].high, right_bbox[i].high);
+ }
+ }
+
+ return node;
+ }
+
+
+ void computeMinMax(IndexType* ind, IndexType count, int element, ElementType& min_elem, ElementType& max_elem)
+ {
+ min_elem = dataset_get(ind[0],element);
+ max_elem = dataset_get(ind[0],element);
+ for (IndexType i=1; imax_elem) max_elem = val;
+ }
+ }
+
+ void middleSplit_(IndexType* ind, IndexType count, IndexType& index, int& cutfeat, DistanceType& cutval, const BoundingBox& bbox)
+ {
+ const DistanceType EPS=static_cast(0.00001);
+ ElementType max_span = bbox[0].high-bbox[0].low;
+ for (int i=1; i<(DIM>0 ? DIM : dim); ++i) {
+ ElementType span = bbox[i].high-bbox[i].low;
+ if (span>max_span) {
+ max_span = span;
+ }
+ }
+ ElementType max_spread = -1;
+ cutfeat = 0;
+ for (int i=0; i<(DIM>0 ? DIM : dim); ++i) {
+ ElementType span = bbox[i].high-bbox[i].low;
+ if (span>(1-EPS)*max_span) {
+ ElementType min_elem, max_elem;
+ computeMinMax(ind, count, i, min_elem, max_elem);
+ ElementType spread = max_elem-min_elem;;
+ if (spread>max_spread) {
+ cutfeat = i;
+ max_spread = spread;
+ }
+ }
+ }
+ // split in the middle
+ DistanceType split_val = (bbox[cutfeat].low+bbox[cutfeat].high)/2;
+ ElementType min_elem, max_elem;
+ computeMinMax(ind, count, cutfeat, min_elem, max_elem);
+
+ if (split_valmax_elem) cutval = max_elem;
+ else cutval = split_val;
+
+ IndexType lim1, lim2;
+ planeSplit(ind, count, cutfeat, cutval, lim1, lim2);
+
+ if (lim1>count/2) index = lim1;
+ else if (lim2cutval
+ */
+ void planeSplit(IndexType* ind, const IndexType count, int cutfeat, DistanceType &cutval, IndexType& lim1, IndexType& lim2)
+ {
+ /* Move vector indices for left subtree to front of list. */
+ IndexType left = 0;
+ IndexType right = count-1;
+ for (;; ) {
+ while (left<=right && dataset_get(ind[left],cutfeat)=cutval) --right;
+ if (left>right || !right) break; // "!right" was added to support unsigned Index types
+ std::swap(ind[left], ind[right]);
+ ++left;
+ --right;
+ }
+ /* If either list is empty, it means that all remaining features
+ * are identical. Split in the middle to maintain a balanced tree.
+ */
+ lim1 = left;
+ right = count-1;
+ for (;; ) {
+ while (left<=right && dataset_get(ind[left],cutfeat)<=cutval) ++left;
+ while (right && left<=right && dataset_get(ind[right],cutfeat)>cutval) --right;
+ if (left>right || !right) break; // "!right" was added to support unsigned Index types
+ std::swap(ind[left], ind[right]);
+ ++left;
+ --right;
+ }
+ lim2 = left;
+ }
+
+ DistanceType computeInitialDistances(const ElementType* vec, distance_vector_t& dists) const
+ {
+ assert(vec);
+ DistanceType distsq = DistanceType();
+
+ for (int i = 0; i < (DIM>0 ? DIM : dim); ++i) {
+ if (vec[i] < root_bbox[i].low) {
+ dists[i] = distance.accum_dist(vec[i], root_bbox[i].low, i);
+ distsq += dists[i];
+ }
+ if (vec[i] > root_bbox[i].high) {
+ dists[i] = distance.accum_dist(vec[i], root_bbox[i].high, i);
+ distsq += dists[i];
+ }
+ }
+
+ return distsq;
+ }
+
+ /**
+ * Performs an exact search in the tree starting from a node.
+ * \tparam RESULTSET Should be any ResultSet
+ */
+ template
+ void searchLevel(RESULTSET& result_set, const ElementType* vec, const NodePtr node, DistanceType mindistsq,
+ distance_vector_t& dists, const float epsError) const
+ {
+ /* If this is a leaf node, then do check and return. */
+ if ((node->child1 == NULL)&&(node->child2 == NULL)) {
+ //count_leaf += (node->lr.right-node->lr.left); // Removed since was neither used nor returned to the user.
+ DistanceType worst_dist = result_set.worstDist();
+ for (IndexType i=node->node_type.lr.left; inode_type.lr.right; ++i) {
+ const IndexType index = vind[i];// reorder... : i;
+ DistanceType dist = distance(vec, index, (DIM>0 ? DIM : dim));
+ if (distnode_type.sub.divfeat;
+ ElementType val = vec[idx];
+ DistanceType diff1 = val - node->node_type.sub.divlow;
+ DistanceType diff2 = val - node->node_type.sub.divhigh;
+
+ NodePtr bestChild;
+ NodePtr otherChild;
+ DistanceType cut_dist;
+ if ((diff1+diff2)<0) {
+ bestChild = node->child1;
+ otherChild = node->child2;
+ cut_dist = distance.accum_dist(val, node->node_type.sub.divhigh, idx);
+ }
+ else {
+ bestChild = node->child2;
+ otherChild = node->child1;
+ cut_dist = distance.accum_dist( val, node->node_type.sub.divlow, idx);
+ }
+
+ /* Call recursively to search next level down. */
+ searchLevel(result_set, vec, bestChild, mindistsq, dists, epsError);
+
+ DistanceType dst = dists[idx];
+ mindistsq = mindistsq + cut_dist - dst;
+ dists[idx] = cut_dist;
+ if (mindistsq*epsError<=result_set.worstDist()) {
+ searchLevel(result_set, vec, otherChild, mindistsq, dists, epsError);
+ }
+ dists[idx] = dst;
+ }
+
+ public:
+ /** Stores the index in a binary file.
+ * IMPORTANT NOTE: The set of data points is NOT stored in the file, so when loading the index object it must be constructed associated to the same source of data points used while building it.
+ * See the example: examples/saveload_example.cpp
+ * \sa loadIndex */
+ void saveIndex(FILE* stream)
+ {
+ save_value(stream, m_size);
+ save_value(stream, dim);
+ save_value(stream, root_bbox);
+ save_value(stream, m_leaf_max_size);
+ save_value(stream, vind);
+ save_tree(stream, root_node);
+ }
+
+ /** Loads a previous index from a binary file.
+ * IMPORTANT NOTE: The set of data points is NOT stored in the file, so the index object must be constructed associated to the same source of data points used while building the index.
+ * See the example: examples/saveload_example.cpp
+ * \sa loadIndex */
+ void loadIndex(FILE* stream)
+ {
+ load_value(stream, m_size);
+ load_value(stream, dim);
+ load_value(stream, root_bbox);
+ load_value(stream, m_leaf_max_size);
+ load_value(stream, vind);
+ load_tree(stream, root_node);
+ }
+
+ }; // class KDTree
+
+
+ /** An L2-metric KD-tree adaptor for working with data directly stored in an Eigen Matrix, without duplicating the data storage.
+ * Each row in the matrix represents a point in the state space.
+ *
+ * Example of usage:
+ * \code
+ * Eigen::Matrix mat;
+ * // Fill out "mat"...
+ *
+ * typedef KDTreeEigenMatrixAdaptor< Eigen::Matrix > my_kd_tree_t;
+ * const int max_leaf = 10;
+ * my_kd_tree_t mat_index(dimdim, mat, max_leaf );
+ * mat_index.index->buildIndex();
+ * mat_index.index->...
+ * \endcode
+ *
+ * \tparam DIM If set to >0, it specifies a compile-time fixed dimensionality for the points in the data set, allowing more compiler optimizations.
+ * \tparam Distance The distance metric to use: nanoflann::metric_L1, nanoflann::metric_L2, nanoflann::metric_L2_Simple, etc.
+ */
+ template
+ struct KDTreeEigenMatrixAdaptor
+ {
+ typedef KDTreeEigenMatrixAdaptor self_t;
+ typedef typename MatrixType::Scalar num_t;
+ typedef typename MatrixType::Index IndexType;
+ typedef typename Distance::template traits::distance_t metric_t;
+ typedef KDTreeSingleIndexAdaptor< metric_t,self_t,DIM,IndexType> index_t;
+
+ index_t* index; //! The kd-tree index for the user to call its methods as usual with any other FLANN index.
+
+ /// Constructor: takes a const ref to the matrix object with the data points
+ KDTreeEigenMatrixAdaptor(const int dimensionality, const MatrixType &mat, const int leaf_max_size = 10) : m_data_matrix(mat)
+ {
+ const IndexType dims = mat.cols();
+ if (dims!=dimensionality) throw std::runtime_error("Error: 'dimensionality' must match column count in data matrix");
+ if (DIM>0 && static_cast(dims)!=DIM)
+ throw std::runtime_error("Data set dimensionality does not match the 'DIM' template argument");
+ index = new index_t( dims, *this /* adaptor */, nanoflann::KDTreeSingleIndexAdaptorParams(leaf_max_size ) );
+ index->buildIndex();
+ }
+ private:
+ /** Hidden copy constructor, to disallow copying this class (Not implemented) */
+ KDTreeEigenMatrixAdaptor(const self_t&);
+ public:
+
+ ~KDTreeEigenMatrixAdaptor() {
+ delete index;
+ }
+
+ const MatrixType &m_data_matrix;
+
+ /** Query for the \a num_closest closest points to a given point (entered as query_point[0:dim-1]).
+ * Note that this is a short-cut method for index->findNeighbors().
+ * The user can also call index->... methods as desired.
+ * \note nChecks_IGNORED is ignored but kept for compatibility with the original FLANN interface.
+ */
+ inline void query(const num_t *query_point, const size_t num_closest, IndexType *out_indices, num_t *out_distances_sq, const int /* nChecks_IGNORED */ = 10) const
+ {
+ nanoflann::KNNResultSet resultSet(num_closest);
+ resultSet.init(out_indices, out_distances_sq);
+ index->findNeighbors(resultSet, query_point, nanoflann::SearchParams());
+ }
+
+ /** @name Interface expected by KDTreeSingleIndexAdaptor
+ * @{ */
+
+ const self_t & derived() const {
+ return *this;
+ }
+ self_t & derived() {
+ return *this;
+ }
+
+ // Must return the number of data points
+ inline size_t kdtree_get_point_count() const {
+ return m_data_matrix.rows();
+ }
+
+ // Returns the L2 distance between the vector "p1[0:size-1]" and the data point with index "idx_p2" stored in the class:
+ inline num_t kdtree_distance(const num_t *p1, const IndexType idx_p2,IndexType size) const
+ {
+ num_t s=0;
+ for (IndexType i=0; i
+ bool kdtree_get_bbox(BBOX& /*bb*/) const {
+ return false;
+ }
+
+ /** @} */
+
+ }; // end of KDTreeEigenMatrixAdaptor
+ /** @} */
+
+/** @} */ // end of grouping
+} // end of NS
+
+
+#endif /* NANOFLANN_HPP_ */
diff --git a/dependencies/tbb/.appveyor.yml b/dependencies/tbb/.appveyor.yml
new file mode 100644
index 0000000000000000000000000000000000000000..a417e6df29601e7cf14df350b9810afac0400af4
--- /dev/null
+++ b/dependencies/tbb/.appveyor.yml
@@ -0,0 +1,23 @@
+version: 1.0.{build}
+os: Visual Studio 2017
+clone_folder: C:\projects\tbb
+test: off
+configuration:
+ - Debug
+ - Release
+branches:
+ only:
+ - master
+environment:
+ matrix:
+ - CMAKE_PLATFORM: "Visual Studio 15 2017"
+ - CMAKE_PLATFORM: "Visual Studio 15 2017 Win64"
+install:
+ - cinstall: python
+build_script:
+ - echo Running cmake...
+ - cd c:\projects\tbb
+ - cmake -G "%CMAKE_PLATFORM%" -DCMAKE_SUPPRESS_REGENERATION=1 -DTBB_CI_BUILD=ON
+ - set MSBuildLogger="C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll"
+ - cmake --build . --config %Configuration% -- /v:m /logger:%MSBuildLogger%
+ - ctest -C %Configuration% --output-on-failure --timeout 500
diff --git a/dependencies/tbb/.gitattributes b/dependencies/tbb/.gitattributes
new file mode 100644
index 0000000000000000000000000000000000000000..039edb3a9a5c1954f6ea8bcdf748ceb3d6730015
--- /dev/null
+++ b/dependencies/tbb/.gitattributes
@@ -0,0 +1,45 @@
+# Set the default behavior, in case people don't have core.autocrlf set.
+* text=auto
+
+# Explicitly declare text files you want to always be normalized and converted
+# to native line endings on checkout.
+*.c text
+*.h text
+*.cpp text
+*.def text
+*.rc text
+*.i text
+*.sh text
+*.csh text
+*.mk text
+*.java text
+*.csv text
+*.lst text
+*.asm text
+*.cfg text
+*.css text
+*.inc text
+*.js text
+*.rb text
+*.strings text
+*.txt text
+*export.lst text
+*.xml text
+*.py text
+*.md text
+*.classpath text
+*.cproject text
+*.project text
+*.properties text
+*.java text
+*.gradle text
+
+# Declare files that will always have CRLF line endings on checkout.
+*.sln text eol=crlf
+*.bat text eol=crlf
+
+# Denote all files that are truly binary and should not be modified.
+*.png binary
+*.jpg binary
+*.ico binary
+*.spir binary
diff --git a/dependencies/tbb/.gitignore b/dependencies/tbb/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..580b093917eb2f986b19421e9cb20d95f4ae070b
--- /dev/null
+++ b/dependencies/tbb/.gitignore
@@ -0,0 +1,100 @@
+# Ignore the debug and release directories created with Makefile builds #
+#########################################################################
+build/*_debug/
+build/*_release/
+
+# Compiled source #
+###################
+*.com
+*.class
+*.dll
+*.lib
+*.pdb
+*.exe
+*.o
+*.so
+*.so.1
+*.so.2
+*.dylib
+*.a
+*.obj
+*.pyc
+
+*.orig
+*.raw
+*.sample
+*.slo
+*.swp
+*.config
+*.la
+*.lai
+*.lo
+*.nhdr
+*.nii.gz
+*.nrrd
+
+# Packages #
+############
+# it's better to unpack these files and commit the raw source
+# git has its own built in compression methods
+*.7z
+*.dmg
+*.gz
+*.iso
+*.jar
+*.rar
+*.tar
+*.tgz
+*.zip
+
+# Logs and databases #
+######################
+*.log
+*.sql
+*.sqlite
+
+# OS generated files #
+######################
+.DS_Store
+.DS_Store?
+._*
+.Spotlight-V100
+.Trashes
+ehthumbs.db
+Thumbs.db
+
+# IDE generated files #
+######################
+/.ninja_deps
+/.ninja_log
+/build.ninja
+/rules.ninja
+*~
+.emacs.desktop
+
+# Build system generated files #
+################################
+CMakeCache.txt
+CMakeFiles/
+
+*.cmake
+libtbb.dylib
+libtbb.so
+libtbb_static.a
+libtbbmalloc.dylib
+libtbbmalloc.so
+libtbbmalloc_proxy.dylib
+libtbbmalloc_proxy.so
+libtbbmalloc_proxy_static.a
+libtbbmalloc_static.a
+tbb.def
+tbbmalloc.def
+version_string.ver
+
+# Other #
+#########
+.clang_complete
+.idea
+.svn
+crash*
+*.tmp
diff --git a/dependencies/tbb/.travis.yml b/dependencies/tbb/.travis.yml
new file mode 100644
index 0000000000000000000000000000000000000000..1b799c4905be540ba91825de7b4b39cee681ea2d
--- /dev/null
+++ b/dependencies/tbb/.travis.yml
@@ -0,0 +1,49 @@
+language: cpp
+dist: trusty
+sudo: false
+
+matrix:
+ include:
+ - os: linux
+ compiler: gcc-4.8
+ script:
+ - CXXFLAGS="-mno-rtm" cmake -DCMAKE_CXX_COMPILER=g++-4.8 -DTBB_CI_BUILD=ON .
+ - make -j2
+ - ctest -j2 --output-on-failure --timeout 500
+ addons:
+ apt:
+ packages:
+ - g++-4.8
+ - g++-4.8-multilib
+ - g++-multilib
+ - cmake
+ - os: osx
+ compiler: clang
+ script:
+ - cmake -DTBB_CI_BUILD=ON .
+ - make -j2
+ - ctest -j2 --output-on-failure --timeout 500
+ - os: linux
+ compiler: x86_64-w64-mingw32-g++
+ script:
+ - cmake -DCMAKE_CXX_COMPILER=x86_64-w64-mingw32-g++ -DCMAKE_TOOLCHAIN_FILE=build/mingw_cross_toolchain.cmake -DGNU_HOST=x86_64-w64-mingw32 -DTBB_CI_BUILD=ON .
+ - make -j2
+ addons:
+ apt:
+ packages:
+ - g++-mingw-w64-x86-64
+ - gcc-mingw-w64-x86-64
+ - binutils-mingw-w64-x86-64
+ - cmake
+ - os: linux
+ compiler: i686-w64-mingw32-g++
+ script:
+ - cmake -DCMAKE_CXX_COMPILER=i686-w64-mingw32-g++ -DCMAKE_TOOLCHAIN_FILE=build/mingw_cross_toolchain.cmake -DGNU_HOST=i686-w64-mingw32 -DTBB_CI_BUILD=ON .
+ - make -j2
+ addons:
+ apt:
+ packages:
+ - g++-mingw-w64-i686
+ - gcc-mingw-w64-i686
+ - binutils-mingw-w64-i686
+ - cmake
diff --git a/dependencies/tbb/CHANGES b/dependencies/tbb/CHANGES
new file mode 100644
index 0000000000000000000000000000000000000000..ab1d1a135a53df3a7854fe71fa17ee2d8fe15525
--- /dev/null
+++ b/dependencies/tbb/CHANGES
@@ -0,0 +1,2359 @@
+------------------------------------------------------------------------
+The list of most significant changes made over time in
+Intel(R) Threading Building Blocks (Intel(R) TBB).
+
+Intel TBB 2017 Update 7
+TBB_INTERFACE_VERSION == 9107
+
+Changes (w.r.t. Intel TBB 2017 Update 6):
+
+- In the huge pages mode, the memory allocator now is also able to use
+ transparent huge pages.
+
+Preview Features:
+
+- Added support for Intel TBB integration into CMake-aware
+ projects, with valuable guidance and feedback provided by Brad King
+ (Kitware).
+
+Bugs fixed:
+
+- Fixed scalable_allocation_command(TBBMALLOC_CLEAN_ALL_BUFFERS, 0)
+ to process memory left after exited threads.
+
+------------------------------------------------------------------------
+Intel TBB 2017 Update 6
+TBB_INTERFACE_VERSION == 9106
+
+Changes (w.r.t. Intel TBB 2017 Update 5):
+
+- Added support for Android* NDK r14.
+
+Preview Features:
+
+- Added a blocking terminate extension to the task_scheduler_init class
+ that allows an object to wait for termination of worker threads.
+
+Bugs fixed:
+
+- Fixed compilation and testing issues with MinGW (GCC 6).
+- Fixed compilation with /std:c++latest option of VS 2017
+ (https://github.com/01org/tbb/issues/13).
+
+------------------------------------------------------------------------
+Intel TBB 2017 Update 5
+TBB_INTERFACE_VERSION == 9105
+
+Changes (w.r.t. Intel TBB 2017 Update 4):
+
+- Added support for Microsoft* Visual Studio* 2017.
+- Added graph/matmult example to demonstrate support for compute offload
+ to Intel(R) Graphics Technology in the flow graph API.
+- The "compiler" build option now allows to specify a full path to the
+ compiler.
+
+Changes affecting backward compatibility:
+
+- Constructors for many classes, including graph nodes, concurrent
+ containers, thread-local containers, etc., are declared explicit and
+ cannot be used for implicit conversions anymore.
+
+Bugs fixed:
+
+- Added a workaround for bug 16657 in the GNU C Library (glibc)
+ affecting the debug version of tbb::mutex.
+- Fixed a crash in pool_identify() called for an object allocated in
+ another thread.
+
+------------------------------------------------------------------------
+Intel TBB 2017 Update 4
+TBB_INTERFACE_VERSION == 9104
+
+Changes (w.r.t. Intel TBB 2017 Update 3):
+
+- Added support for C++11 move semantics in parallel_do.
+- Added support for FreeBSD* 11.
+
+Changes affecting backward compatibility:
+
+- Minimal compiler versions required for support of C++11 move semantics
+ raised to GCC 4.5, VS 2012, and Intel(R) C++ Compiler 14.0.
+
+Bugs fixed:
+
+- The workaround for crashes in the library compiled with GCC 6
+ (-flifetime-dse=1) was extended to Windows*.
+
+------------------------------------------------------------------------
+Intel TBB 2017 Update 3
+TBB_INTERFACE_VERSION == 9103
+
+Changes (w.r.t. Intel TBB 2017 Update 2):
+
+- Added support for Android* 7.0 and Android* NDK r13, r13b.
+
+Preview Features:
+
+- Added template class gfx_factory to the flow graph API. It implements
+ the Factory concept for streaming_node to offload computations to
+ Intel(R) processor graphics.
+
+Bugs fixed:
+
+- Fixed a possible deadlock caused by missed wakeup signals in
+ task_arena::execute().
+
+Open-source contributions integrated:
+
+- A build fix for Linux* s390x platform by Jerry J.
+
+------------------------------------------------------------------------
+Intel TBB 2017 Update 2
+TBB_INTERFACE_VERSION == 9102
+
+Changes (w.r.t. Intel TBB 2017 Update 1):
+
+- Removed the long-outdated support for Xbox* consoles.
+
+Bugs fixed:
+
+- Fixed the issue with task_arena::execute() not being processed when
+ the calling thread cannot join the arena.
+- Fixed dynamic memory allocation replacement failure on macOS* 10.12.
+
+------------------------------------------------------------------------
+Intel TBB 2017 Update 1
+TBB_INTERFACE_VERSION == 9101
+
+Changes (w.r.t. Intel TBB 2017):
+
+Bugs fixed:
+
+- Fixed dynamic memory allocation replacement failures on Windows* 10
+ Anniversary Update.
+- Fixed emplace() method of concurrent unordered containers to not
+ require a copy constructor.
+
+------------------------------------------------------------------------
+Intel TBB 2017
+TBB_INTERFACE_VERSION == 9100
+
+Changes (w.r.t. Intel TBB 4.4 Update 5):
+
+- static_partitioner class is now a fully supported feature.
+- async_node class is now a fully supported feature.
+- Improved dynamic memory allocation replacement on Windows* OS to skip
+ DLLs for which replacement cannot be done, instead of aborting.
+- Intel TBB no longer performs dynamic memory allocation replacement
+ for Microsoft* Visual Studio* 2008.
+- For 64-bit platforms, quadrupled the worst-case limit on the amount
+ of memory the Intel TBB allocator can handle.
+- Added TBB_USE_GLIBCXX_VERSION macro to specify the version of GNU
+ libstdc++ when it cannot be properly recognized, e.g. when used
+ with Clang on Linux* OS. Inspired by a contribution from David A.
+- Added graph/stereo example to demostrate tbb::flow::async_msg.
+- Removed a few cases of excessive user data copying in the flow graph.
+- Reworked split_node to eliminate unnecessary overheads.
+- Added support for C++11 move semantics to the argument of
+ tbb::parallel_do_feeder::add() method.
+- Added C++11 move constructor and assignment operator to
+ tbb::combinable template class.
+- Added tbb::this_task_arena::max_concurrency() function and
+ max_concurrency() method of class task_arena returning the maximal
+ number of threads that can work inside an arena.
+- Deprecated tbb::task_arena::current_thread_index() static method;
+ use tbb::this_task_arena::current_thread_index() function instead.
+- All examples for commercial version of library moved online:
+ https://software.intel.com/en-us/product-code-samples. Examples are
+ available as a standalone package or as a part of Intel(R) Parallel
+ Studio XE or Intel(R) System Studio Online Samples packages.
+
+Changes affecting backward compatibility:
+
+- Renamed following methods and types in async_node class:
+ Old New
+ async_gateway_type => gateway_type
+ async_gateway() => gateway()
+ async_try_put() => try_put()
+ async_reserve() => reserve_wait()
+ async_commit() => release_wait()
+- Internal layout of some flow graph nodes has changed; recompilation
+ is recommended for all binaries that use the flow graph.
+
+Preview Features:
+
+- Added template class streaming_node to the flow graph API. It allows
+ a flow graph to offload computations to other devices through
+ streaming or offloading APIs.
+- Template class opencl_node reimplemented as a specialization of
+ streaming_node that works with OpenCL*.
+- Added tbb::this_task_arena::isolate() function to isolate execution
+ of a group of tasks or an algorithm from other tasks submitted
+ to the scheduler.
+
+Bugs fixed:
+
+- Added a workaround for GCC bug #62258 in std::rethrow_exception()
+ to prevent possible problems in case of exception propagation.
+- Fixed parallel_scan to provide correct result if the initial value
+ of an accumulator is not the operation identity value.
+- Fixed a memory corruption in the memory allocator when it meets
+ internal limits.
+- Fixed the memory allocator on 64-bit platforms to align memory
+ to 16 bytes by default for all allocations bigger than 8 bytes.
+- As a workaround for crashes in the Intel TBB library compiled with
+ GCC 6, added -flifetime-dse=1 to compilation options on Linux* OS.
+- Fixed a race in the flow graph implementation.
+
+Open-source contributions integrated:
+
+- Enabling use of C++11 'override' keyword by Raf Schietekat.
+
+------------------------------------------------------------------------
+Intel TBB 4.4 Update 6
+TBB_INTERFACE_VERSION == 9006
+
+Changes (w.r.t. Intel TBB 4.4 Update 5):
+
+- For 64-bit platforms, quadrupled the worst-case limit on the amount
+ of memory the Intel TBB allocator can handle.
+
+Bugs fixed:
+
+- Fixed a memory corruption in the memory allocator when it meets
+ internal limits.
+- Fixed the memory allocator on 64-bit platforms to align memory
+ to 16 bytes by default for all allocations bigger than 8 bytes.
+- Fixed parallel_scan to provide correct result if the initial value
+ of an accumulator is not the operation identity value.
+- As a workaround for crashes in the Intel TBB library compiled with
+ GCC 6, added -flifetime-dse=1 to compilation options on Linux* OS.
+
+------------------------------------------------------------------------
+Intel TBB 4.4 Update 5
+TBB_INTERFACE_VERSION == 9005
+
+Changes (w.r.t. Intel TBB 4.4 Update 4):
+
+- Modified graph/fgbzip2 example to remove unnecessary data queuing.
+
+Preview Features:
+
+- Added a Python* module which is able to replace Python's thread pool
+ class with the implementation based on Intel TBB task scheduler.
+
+Bugs fixed:
+
+- Fixed the implementation of 64-bit tbb::atomic for IA-32 architecture
+ to work correctly with GCC 5.2 in C++11/14 mode.
+- Fixed a possible crash when tasks with affinity (e.g. specified via
+ affinity_partitioner) are used simultaneously with task priority
+ changes.
+
+------------------------------------------------------------------------
+Intel TBB 4.4 Update 4
+TBB_INTERFACE_VERSION == 9004
+
+Changes (w.r.t. Intel TBB 4.4 Update 3):
+
+- Removed a few cases of excessive user data copying in the flow graph.
+- Improved robustness of concurrent_bounded_queue::abort() in case of
+ simultaneous push and pop operations.
+
+Preview Features:
+
+- Added tbb::flow::async_msg, a special message type to support
+ communications between the flow graph and external asynchronous
+ activities.
+- async_node modified to support use with C++03 compilers.
+
+Bugs fixed:
+
+- Fixed a bug in dynamic memory allocation replacement for Windows* OS.
+- Fixed excessive memory consumption on Linux* OS caused by enabling
+ zero-copy realloc.
+- Fixed performance regression on Intel(R) Xeon Phi(tm) coprocessor with
+ auto_partitioner.
+
+------------------------------------------------------------------------
+Intel TBB 4.4 Update 3
+TBB_INTERFACE_VERSION == 9003
+
+Changes (w.r.t. Intel TBB 4.4 Update 2):
+
+- Modified parallel_sort to not require a default constructor for values
+ and to use iter_swap() for value swapping.
+- Added support for creating or initializing a task_arena instance that
+ is connected to the arena currently used by the thread.
+- graph/binpack example modified to use multifunction_node.
+- For performance analysis, use Intel(R) VTune(TM) Amplifier XE 2015
+ and higher; older versions are no longer supported.
+- Improved support for compilation with disabled RTTI, by omitting its use
+ in auxiliary code, such as assertions. However some functionality,
+ particularly the flow graph, does not work if RTTI is disabled.
+- The tachyon example for Android* can be built using Android Studio 1.5
+ and higher with experimental Gradle plugin 0.4.0.
+
+Preview Features:
+
+- Added class opencl_subbufer that allows using OpenCL* sub-buffer
+ objects with opencl_node.
+- Class global_control supports the value of 1 for
+ max_allowed_parallelism.
+
+Bugs fixed:
+
+- Fixed a race causing "TBB Warning: setaffinity syscall failed" message.
+- Fixed a compilation issue on OS X* with Intel(R) C++ Compiler 15.0.
+- Fixed a bug in queuing_rw_mutex::downgrade() that could temporarily
+ block new readers.
+- Fixed speculative_spin_rw_mutex to stop using the lazy subscription
+ technique due to its known flaws.
+- Fixed memory leaks in the tool support code.
+
+------------------------------------------------------------------------
+Intel TBB 4.4 Update 2
+TBB_INTERFACE_VERSION == 9002
+
+Changes (w.r.t. Intel TBB 4.4 Update 1):
+
+- Improved interoperability with Intel(R) OpenMP RTL (libiomp) on Linux:
+ OpenMP affinity settings do not affect the default number of threads
+ used in the task scheduler. Intel(R) C++ Compiler 16.0 Update 1
+ or later is required.
+- Added a new flow graph example with different implementations of the
+ Cholesky Factorization algorithm.
+
+Preview Features:
+
+- Added template class opencl_node to the flow graph API. It allows a
+ flow graph to offload computations to OpenCL* devices.
+- Extended join_node to use type-specified message keys. It simplifies
+ the API of the node by obtaining message keys via functions
+ associated with the message type (instead of node ports).
+- Added static_partitioner that minimizes overhead of parallel_for and
+ parallel_reduce for well-balanced workloads.
+- Improved template class async_node in the flow graph API to support
+ user settable concurrency limits.
+
+Bugs fixed:
+
+- Fixed a possible crash in the GUI layer for library examples on Linux.
+
+------------------------------------------------------------------------
+Intel TBB 4.4 Update 1
+TBB_INTERFACE_VERSION == 9001
+
+Changes (w.r.t. Intel TBB 4.4):
+
+- Added support for Microsoft* Visual Studio* 2015.
+- Intel TBB no longer performs dynamic replacement of memory allocation
+ functions for Microsoft Visual Studio 2005 and earlier versions.
+- For GCC 4.7 and higher, the intrinsics-based platform isolation layer
+ uses __atomic_* built-ins instead of the legacy __sync_* ones.
+ This change is inspired by a contribution from Mathieu Malaterre.
+- Improvements in task_arena:
+ Several application threads may join a task_arena and execute tasks
+ simultaneously. The amount of concurrency reserved for application
+ threads at task_arena construction can be set to any value between
+ 0 and the arena concurrency limit.
+- The fractal example was modified to demonstrate class task_arena
+ and moved to examples/task_arena/fractal.
+
+Bugs fixed:
+
+- Fixed a deadlock during destruction of task_scheduler_init objects
+ when one of destructors is set to wait for worker threads.
+- Added a workaround for a possible crash on OS X* when dynamic memory
+ allocator replacement (libtbbmalloc_proxy) is used and memory is
+ released during application startup.
+- Usage of mutable functors with task_group::run_and_wait() and
+ task_arena::enqueue() is disabled. An attempt to pass a functor
+ which operator()() is not const will produce compilation errors.
+- Makefiles and environment scripts now properly recognize GCC 5.0 and
+ higher.
+
+Open-source contributions integrated:
+
+- Improved performance of parallel_for_each for inputs allowing random
+ access, by Raf Schietekat.
+
+------------------------------------------------------------------------
+Intel TBB 4.4
+TBB_INTERFACE_VERSION == 9000
+
+Changes (w.r.t. Intel TBB 4.3 Update 6):
+
+- The following features are now fully supported:
+ tbb::flow::composite_node;
+ additional policies of tbb::flow::graph_node::reset().
+- Platform abstraction layer for Windows* OS updated to use compiler
+ intrinsics for most atomic operations.
+- The tbb/compat/thread header updated to automatically include
+ C++11 where available.
+- Fixes and refactoring in the task scheduler and class task_arena.
+- Added key_matching policy to tbb::flow::join_node, which removes
+ the restriction on the type that can be compared-against.
+- For tag_matching join_node, tag_value is redefined to be 64 bits
+ wide on all architectures.
+- Expanded the documentation for the flow graph with details about
+ node semantics and behavior.
+- Added dynamic replacement of C11 standard function aligned_alloc()
+ under Linux* OS.
+- Added C++11 move constructors and assignment operators to
+ tbb::enumerable_thread_specific container.
+- Added hashing support for tbb::tbb_thread::id.
+- On OS X*, binaries that depend on libstdc++ are not provided anymore.
+ In the makefiles, libc++ is now used by default; for building with
+ libstdc++, specify stdlib=libstdc++ in the make command line.
+
+Preview Features:
+
+- Added a new example, graph/fgbzip2, that shows usage of
+ tbb::flow::async_node.
+- Modification to the low-level API for memory pools:
+ added a function for finding a memory pool by an object allocated
+ from that pool.
+- tbb::memory_pool now does not request memory till the first allocation
+ from the pool.
+
+Changes affecting backward compatibility:
+
+- Internal layout of flow graph nodes has changed; recompilation is
+ recommended for all binaries that use the flow graph.
+- Resetting a tbb::flow::source_node will immediately activate it,
+ unless it was created in inactive state.
+
+Bugs fixed:
+
+- Failure at creation of a memory pool will not cause process
+ termination anymore.
+
+Open-source contributions integrated:
+
+- Supported building TBB with Clang on AArch64 with use of built-in
+ intrinsics by David A.
+
+------------------------------------------------------------------------
+Intel TBB 4.3 Update 6
+TBB_INTERFACE_VERSION == 8006
+
+Changes (w.r.t. Intel TBB 4.3 Update 5):
+
+- Supported zero-copy realloc for objects >1MB under Linux* via
+ mremap system call.
+- C++11 move-aware insert and emplace methods have been added to
+ concurrent_hash_map container.
+- install_name is set to @rpath/ on OS X*.
+
+Preview Features:
+
+- Added template class async_node to the flow graph API. It allows a
+ flow graph to communicate with an external activity managed by
+ the user or another runtime.
+- Improved speed of flow::graph::reset() clearing graph edges.
+ rf_extract flag has been renamed rf_clear_edges.
+- extract() method of graph nodes now takes no arguments.
+
+Bugs fixed:
+
+- concurrent_unordered_{set,map} behaves correctly for degenerate
+ hashes.
+- Fixed a race condition in the memory allocator that may lead to
+ excessive memory consumption under high multithreading load.
+
+------------------------------------------------------------------------
+Intel TBB 4.3 Update 5
+TBB_INTERFACE_VERSION == 8005
+
+Changes (w.r.t. Intel TBB 4.3 Update 4):
+
+- Added add_ref_count() method of class tbb::task.
+
+Preview Features:
+
+- Added class global_control for application-wide control of allowed
+ parallelism and thread stack size.
+- memory_pool_allocator now throws the std::bad_alloc exception on
+ allocation failure.
+- Exceptions thrown for by memory pool constructors changed from
+ std::bad_alloc to std::invalid_argument and std::runtime_error.
+
+Bugs fixed:
+
+- scalable_allocator now throws the std::bad_alloc exception on
+ allocation failure.
+- Fixed a race condition in the memory allocator that may lead to
+ excessive memory consumption under high multithreading load.
+- A new scheduler created right after destruction of the previous one
+ might be unable to modify the number of worker threads.
+
+Open-source contributions integrated:
+
+- (Added but not enabled) push_front() method of class tbb::task_list
+ by Raf Schietekat.
+
+------------------------------------------------------------------------
+Intel TBB 4.3 Update 4
+TBB_INTERFACE_VERSION == 8004
+
+Changes (w.r.t. Intel TBB 4.3 Update 3):
+
+- Added a C++11 variadic constructor for enumerable_thread_specific.
+ The arguments from this constructor are used to construct
+ thread-local values.
+- Improved exception safety for enumerable_thread_specific.
+- Added documentation for tbb::flow::tagged_msg class and
+ tbb::flow::output_port function.
+- Fixed build errors for systems that do not support dynamic linking.
+- C++11 move-aware insert and emplace methods have been added to
+ concurrent unordered containers.
+
+Preview Features:
+
+- Interface-breaking change: typedefs changed for node predecessor and
+ successor lists, affecting copy_predecessors and copy_successors
+ methods.
+- Added template class composite_node to the flow graph API. It packages
+ a subgraph to represent it as a first-class flow graph node.
+- make_edge and remove_edge now accept multiport nodes as arguments,
+ automatically using the node port with index 0 for an edge.
+
+Open-source contributions integrated:
+
+- Draft code for enumerable_thread_specific constructor with multiple
+ arguments (see above) by Adrien Guinet.
+- Fix for GCC invocation on IBM* Blue Gene*
+ by Jeff Hammond and Raf Schietekat.
+- Extended testing with smart pointers for Clang & libc++
+ by Raf Schietekat.
+
+------------------------------------------------------------------------
+Intel TBB 4.3 Update 3
+TBB_INTERFACE_VERSION == 8003
+
+Changes (w.r.t. Intel TBB 4.3 Update 2):
+
+- Move constructor and assignment operator were added to unique_lock.
+
+Preview Features:
+
+- Time overhead for memory pool destruction was reduced.
+
+Open-source contributions integrated:
+
+- Build error fix for iOS* by Raf Schietekat.
+
+------------------------------------------------------------------------
+Intel TBB 4.3 Update 2
+TBB_INTERFACE_VERSION == 8002
+
+Changes (w.r.t. Intel TBB 4.3 Update 1):
+
+- Binary files for 64-bit Android* applications were added as part of the
+ Linux* OS package.
+- Exact exception propagation is enabled for Intel C++ Compiler on OS X*.
+- concurrent_vector::shrink_to_fit was optimized for types that support
+ C++11 move semantics.
+
+Bugs fixed:
+
+- Fixed concurrent unordered containers to insert elements much faster
+ in debug mode.
+- Fixed concurrent priority queue to support types that do not have
+ copy constructors.
+- Fixed enumerable_thread_specific to forbid copying from an instance
+ with a different value type.
+
+Open-source contributions integrated:
+
+- Support for PathScale* EKOPath* Compiler by Erik Lindahl.
+
+------------------------------------------------------------------------
+Intel TBB 4.3 Update 1
+TBB_INTERFACE_VERSION == 8001
+
+Changes (w.r.t. Intel TBB 4.3):
+
+- The ability to split blocked_ranges in a proportion, used by
+ affinity_partitioner since version 4.2 Update 4, became a formal
+ extension of the Range concept.
+- More checks for an incorrect address to release added to the debug
+ version of the memory allocator.
+- Different kind of solutions for each TBB example were merged.
+
+Preview Features:
+
+- Task priorities are re-enabled in preview binaries.
+
+Bugs fixed:
+
+- Fixed a duplicate symbol when TBB_PREVIEW_VARIADIC_PARALLEL_INVOKE is
+ used in multiple compilation units.
+- Fixed a crash in __itt_fini_ittlib seen on Ubuntu 14.04.
+- Fixed a crash in memory release after dynamic replacement of the
+ OS X* memory allocator.
+- Fixed incorrect indexing of arrays in seismic example.
+- Fixed a data race in lazy initialization of task_arena.
+
+Open-source contributions integrated:
+
+- Fix for dumping information about gcc and clang compiler versions
+ by Misty De Meo.
+
+------------------------------------------------------------------------
+Intel TBB 4.3
+TBB_INTERFACE_VERSION == 8000
+
+Changes (w.r.t. Intel TBB 4.2 Update 5):
+
+- The following features are now fully supported: flow::indexer_node,
+ task_arena, speculative_spin_rw_mutex.
+- Compatibility with C++11 standard improved for tbb/compat/thread
+ and tbb::mutex.
+- C++11 move constructors have been added to concurrent_queue and
+ concurrent_bounded_queue.
+- C++11 move constructors and assignment operators have been added to
+ concurrent_vector, concurrent_hash_map, concurrent_priority_queue,
+ concurrent_unordered_{set,multiset,map,multimap}.
+- C++11 move-aware emplace/push/pop methods have been added to
+ concurrent_vector, concurrent_queue, concurrent_bounded_queue,
+ concurrent_priority_queue.
+- Methods to insert a C++11 initializer list have been added:
+ concurrent_vector::grow_by(), concurrent_hash_map::insert(),
+ concurrent_unordered_{set,multiset,map,multimap}::insert().
+- Testing for compatibility of containers with some C++11 standard
+ library types has been added.
+- Dynamic replacement of standard memory allocation routines has been
+ added for OS X*.
+- Microsoft* Visual Studio* projects for Intel TBB examples updated
+ to VS 2010.
+- For open-source packages, debugging information (line numbers) in
+ precompiled binaries now matches the source code.
+- Debug information was added to release builds for OS X*, Solaris*,
+ FreeBSD* operating systems and MinGW*.
+- Various improvements in documentation, debug diagnostics and examples.
+
+Preview Features:
+
+- Additional actions on reset of graphs, and extraction of individual
+ nodes from a graph (TBB_PREVIEW_FLOW_GRAPH_FEATURES).
+- Support for an arbitrary number of arguments in parallel_invoke
+ (TBB_PREVIEW_VARIADIC_PARALLEL_INVOKE).
+
+Changes affecting backward compatibility:
+
+- For compatibility with C++11 standard, copy and move constructors and
+ assignment operators are disabled for all mutex classes. To allow
+ the old behavior, use TBB_DEPRECATED_MUTEX_COPYING macro.
+- flow::sequencer_node rejects messages with repeating sequence numbers.
+- Changed internal interface between tbbmalloc and tbbmalloc_proxy.
+- Following deprecated functionality has been removed:
+ old debugging macros TBB_DO_ASSERT & TBB_DO_THREADING_TOOLS;
+ no-op depth-related methods in class task;
+ tbb::deprecated::concurrent_queue;
+ deprecated variants of concurrent_vector methods.
+- register_successor() and remove_successor() are deprecated as methods
+ to add and remove edges in flow::graph; use make_edge() and
+ remove_edge() instead.
+
+Bugs fixed:
+
+- Fixed incorrect scalable_msize() implementation for aligned objects.
+- Flow graph buffering nodes now destroy their copy of forwarded items.
+- Multiple fixes in task_arena implementation, including for:
+ inconsistent task scheduler state inside executed functions;
+ incorrect floating-point settings and exception propagation;
+ possible stalls in concurrent invocations of execute().
+- Fixed floating-point settings propagation when the same instance of
+ task_group_context is used in different arenas.
+- Fixed compilation error in pipeline.h with Intel Compiler on OS X*.
+- Added missed headers for individual components to tbb.h.
+
+Open-source contributions integrated:
+
+- Range interface addition to parallel_do, parallel_for_each and
+ parallel_sort by Stephan Dollberg.
+- Variadic template implementation of parallel_invoke
+ by Kizza George Mbidde (see Preview Features).
+- Improvement in Seismic example for MacBook Pro* with Retina* display
+ by Raf Schietekat.
+
+------------------------------------------------------------------------
+Intel TBB 4.2 Update 5
+TBB_INTERFACE_VERSION == 7005
+
+Changes (w.r.t. Intel TBB 4.2 Update 4):
+
+- The second template argument of class aligned_space now is set
+ to 1 by default.
+
+Preview Features:
+
+- Better support for exception safety, task priorities and floating
+ point settings in class task_arena.
+- task_arena::current_slot() has been renamed to
+ task_arena::current_thread_index().
+
+Bugs fixed:
+
+- Task priority change possibly ignored by a worker thread entering
+ a nested parallel construct.
+- Memory leaks inside the task scheduler when running on
+ Intel(R) Xeon Phi(tm) coprocessor.
+
+Open-source contributions integrated:
+
+- Improved detection of X Window support for Intel TBB examples
+ and other feedback by Raf Schietekat.
+
+------------------------------------------------------------------------
+Intel TBB 4.2 Update 4
+TBB_INTERFACE_VERSION == 7004
+
+Changes (w.r.t. Intel TBB 4.2 Update 3):
+
+- Added possibility to specify floating-point settings at invocation
+ of most parallel algorithms (including flow::graph) via
+ task_group_context.
+- Added dynamic replacement of malloc_usable_size() under
+ Linux*/Android* and dlmalloc_usable_size() under Android*.
+- Added new methods to concurrent_vector:
+ grow_by() that appends a sequence between two given iterators;
+ grow_to_at_least() that initializes new elements with a given value.
+- Improved affinity_partitioner for better performance on balanced
+ workloads.
+- Improvements in the task scheduler, including better scalability
+ when threads search for a task arena, and better diagnostics.
+- Improved allocation performance for workloads that do intensive
+ allocation/releasing of same-size objects larger than ~8KB from
+ multiple threads.
+- Exception support is enabled by default for 32-bit MinGW compilers.
+- The tachyon example for Android* can be built for all targets
+ supported by the installed NDK.
+- Added Windows Store* version of the tachyon example.
+- GettingStarted/sub_string_finder example ported to offload execution
+ on Windows* for Intel(R) Many Integrated Core Architecture.
+
+Preview Features:
+
+- Removed task_scheduler_observer::on_scheduler_leaving() callback.
+- Added task_scheduler_observer::may_sleep() callback.
+- The CPF or_node has been renamed indexer_node. The input to
+ indexer_node is now a list of types. The output of indexer_node is
+ a tagged_msg type composed of a tag and a value. For indexer_node,
+ the tag is a size_t.
+
+Bugs fixed:
+
+- Fixed data races in preview extensions of task_scheduler_observer.
+- Added noexcept(false) for destructor of task_group_base to avoid
+ crash on cancellation of structured task group in C++11.
+
+Open-source contributions integrated:
+
+- Improved concurrency detection for BG/Q, and other improvements
+ by Raf Schietekat.
+- Fix for crashes in enumerable_thread_specific in case if a contained
+ object is too big to be constructed on the stack by Adrien Guinet.
+
+------------------------------------------------------------------------
+Intel TBB 4.2 Update 3
+TBB_INTERFACE_VERSION == 7003
+
+Changes (w.r.t. Intel TBB 4.2 Update 2):
+
+- Added support for Microsoft* Visual Studio* 2013.
+- Improved Microsoft* PPL-compatible form of parallel_for for better
+ support of auto-vectorization.
+- Added a new example for cancellation and reset in the flow graph:
+ Kohonen self-organizing map (examples/graph/som).
+- Various improvements in source code, tests, and makefiles.
+
+Bugs fixed:
+
+- Added dynamic replacement of _aligned_msize() previously missed.
+- Fixed task_group::run_and_wait() to throw invalid_multiple_scheduling
+ exception if the specified task handle is already scheduled.
+
+Open-source contributions integrated:
+
+- A fix for ARM* processors by Steve Capper.
+- Improvements in std::swap calls by Robert Maynard.
+
+------------------------------------------------------------------------
+Intel TBB 4.2 Update 2
+TBB_INTERFACE_VERSION == 7002
+
+Changes (w.r.t. Intel TBB 4.2 Update 1):
+
+- Enable C++11 features for Microsoft* Visual Studio* 2013 Preview.
+- Added a test for compatibility of TBB containers with C++11
+ range-based for loop.
+
+Changes affecting backward compatibility:
+
+- Internal layout changed for class tbb::flow::limiter_node.
+
+Preview Features:
+
+- Added speculative_spin_rw_mutex, a read-write lock class which uses
+ Intel(R) Transactional Synchronization Extensions.
+
+Bugs fixed:
+
+- When building for Intel(R) Xeon Phi(tm) coprocessor, TBB programs
+ no longer require explicit linking with librt and libpthread.
+
+Open-source contributions integrated:
+
+- Fixes for ARM* processors by Steve Capper, Leif Lindholm
+ and Steven Noonan.
+- Support for Clang on Linux by Raf Schietekat.
+- Typo correction in scheduler.cpp by Julien Schueller.
+
+------------------------------------------------------------------------
+Intel TBB 4.2 Update 1
+TBB_INTERFACE_VERSION == 7001
+
+Changes (w.r.t. Intel TBB 4.2):
+
+- Added project files for Microsoft* Visual Studio* 2010.
+- Initial support of Microsoft* Visual Studio* 2013 Preview.
+- Enable C++11 features available in Intel(R) C++ Compiler 14.0.
+- scalable_allocation_mode(TBBMALLOC_SET_SOFT_HEAP_LIMIT, ) can be
+ used to urge releasing memory from tbbmalloc internal buffers when
+ the given limit is exceeded.
+
+Preview Features:
+
+- Class task_arena no longer requires linking with a preview library,
+ though still remains a community preview feature.
+- The method task_arena::wait_until_empty() is removed.
+- The method task_arena::current_slot() now returns -1 if
+ the task scheduler is not initialized in the thread.
+
+Changes affecting backward compatibility:
+
+- Because of changes in internal layout of graph nodes, the namespace
+ interface number of flow::graph has been incremented from 6 to 7.
+
+Bugs fixed:
+
+- Fixed a race in lazy initialization of task_arena.
+- Fixed flow::graph::reset() to prevent situations where tasks would be
+ spawned in the process of resetting the graph to its initial state.
+- Fixed decrement bug in limiter_node.
+- Fixed a race in arc deletion in the flow graph.
+
+Open-source contributions integrated:
+
+- Improved support for IBM* Blue Gene* by Raf Schietekat.
+
+------------------------------------------------------------------------
+Intel TBB 4.2
+TBB_INTERFACE_VERSION == 7000
+
+Changes (w.r.t. Intel TBB 4.1 Update 4):
+
+- Added speculative_spin_mutex, which uses Intel(R) Transactional
+ Synchronization Extensions when they are supported by hardware.
+- Binary files linked with libc++ (the C++ standard library in Clang)
+ were added on OS X*.
+- For OS X* exact exception propagation is supported with Clang;
+ it requires use of libc++ and corresponding Intel TBB binaries.
+- Support for C++11 initializer lists in constructor and assigment
+ has been added to concurrent_hash_map, concurrent_unordered_set,
+ concurrent_unordered_multiset, concurrent_unordered_map,
+ concurrent_unordered_multimap.
+- The memory allocator may now clean its per-thread memory caches
+ when it cannot get more memory.
+- Added the scalable_allocation_command() function for on-demand
+ cleaning of internal memory caches.
+- Reduced the time overhead for freeing memory objects smaller than ~8K.
+- Simplified linking with the debug library for applications that use
+ Intel TBB in code offloaded to Intel(R) Xeon Phi(tm) coprocessors.
+ See an example in
+ examples/GettingStarted/sub_string_finder/Makefile.
+- Various improvements in source code, scripts and makefiles.
+
+Changes affecting backward compatibility:
+
+- tbb::flow::graph has been modified to spawn its tasks;
+ the old behaviour (task enqueuing) is deprecated. This change may
+ impact applications that expected a flow graph to make progress
+ without calling wait_for_all(), which is no longer guaranteed. See
+ the documentation for more details.
+- Changed the return values of the scalable_allocation_mode() function.
+
+Bugs fixed:
+
+- Fixed a leak of parallel_reduce body objects when execution is
+ cancelled or an exception is thrown, as suggested by Darcy Harrison.
+- Fixed a race in the task scheduler which can lower the effective
+ priority despite the existence of higher priority tasks.
+- On Linux an error during destruction of the internal thread local
+ storage no longer results in an exception.
+
+Open-source contributions integrated:
+
+- Fixed task_group_context state propagation to unrelated context trees
+ by Raf Schietekat.
+
+------------------------------------------------------------------------
+Intel TBB 4.1 Update 4
+TBB_INTERFACE_VERSION == 6105
+
+Changes (w.r.t. Intel TBB 4.1 Update 3):
+
+- Use /volatile:iso option with VS 2012 to disable extended
+ semantics for volatile variables.
+- Various improvements in affinity_partitioner, scheduler,
+ tests, examples, makefiles.
+- Concurrent_priority_queue class now supports initialization/assignment
+ via C++11 initializer list feature (std::initializer_list).
+
+Bugs fixed:
+
+- Fixed more possible stalls in concurrent invocations of
+ task_arena::execute(), especially waiting for enqueued tasks.
+- Fixed requested number of workers for task_arena(P,0).
+- Fixed interoperability with Intel(R) VTune(TM) Amplifier XE in
+ case of using task_arena::enqueue() from a terminating thread.
+
+Open-source contributions integrated:
+
+- Type fixes, cleanups, and code beautification by Raf Schietekat.
+- Improvements in atomic operations for big endian platforms
+ by Raf Schietekat.
+
+------------------------------------------------------------------------
+Intel TBB 4.1 Update 3
+TBB_INTERFACE_VERSION == 6103
+
+Changes (w.r.t. Intel TBB 4.1 Update 2):
+
+- Binary files for Android* applications were added to the Linux* OS
+ package.
+- Binary files for Windows Store* applications were added to the
+ Windows* OS package.
+- Exact exception propagation (exception_ptr) support on Linux OS is
+ now turned on by default for GCC 4.4 and higher.
+- Stopped implicit use of large memory pages by tbbmalloc (Linux-only).
+ Now use of large pages must be explicitly enabled with
+ scalable_allocation_mode() function or TBB_MALLOC_USE_HUGE_PAGES
+ environment variable.
+
+Community Preview Features:
+
+- Extended class task_arena constructor and method initialize() to
+ allow some concurrency to be reserved strictly for application
+ threads.
+- New methods terminate() and is_active() were added to class
+ task_arena.
+
+Bugs fixed:
+
+- Fixed initialization of hashing helper constant in the hash
+ containers.
+- Fixed possible stalls in concurrent invocations of
+ task_arena::execute() when no worker thread is available to make
+ progress.
+- Fixed incorrect calculation of hardware concurrency in the presence
+ of inactive processor groups, particularly on systems running
+ Windows* 8 and Windows* Server 2012.
+
+Open-source contributions integrated:
+
+- The fix for the GUI examples on OS X* systems by Raf Schietekat.
+- Moved some power-of-2 calculations to functions to improve readability
+ by Raf Schietekat.
+- C++11/Clang support improvements by arcata.
+- ARM* platform isolation layer by Steve Capper, Leif Lindholm, Leo Lara
+ (ARM).
+
+------------------------------------------------------------------------
+Intel TBB 4.1 Update 2
+TBB_INTERFACE_VERSION == 6102
+
+Changes (w.r.t. Intel TBB 4.1 Update 1):
+
+- Objects up to 128 MB are now cached by the tbbmalloc. Previously
+ the threshold was 8MB. Objects larger than 128 MB are still
+ processed by direct OS calls.
+- concurrent_unordered_multiset and concurrent_unordered_multimap
+ have been added, based on Microsoft* PPL prototype.
+- Ability to value-initialize a tbb::atomic variable on construction
+ in C++11, with const expressions properly supported.
+
+Community Preview Features:
+
+- Added a possibility to wait until all worker threads terminate.
+ This is necessary before calling fork() from an application.
+
+Bugs fixed:
+
+- Fixed data race in tbbmalloc that might lead to memory leaks
+ for large object allocations.
+- Fixed task_arena::enqueue() to use task_group_context of target arena.
+- Improved implementation of 64 bit atomics on ia32.
+
+------------------------------------------------------------------------
+Intel TBB 4.1 Update 1
+TBB_INTERFACE_VERSION == 6101
+
+Changes (w.r.t. Intel TBB 4.1):
+
+- concurrent_vector class now supports initialization/assignment
+ via C++11 initializer list feature (std::initializer_list)
+- Added implementation of the platform isolation layer based on
+ Intel compiler atomic built-ins; it is supposed to work on
+ any platform supported by compiler version 12.1 and newer.
+- Using GetNativeSystemInfo() instead of GetSystemInfo() to support
+ more than 32 processors for 32-bit applications under WOW64.
+- The following form of parallel_for:
+ parallel_for(first, last, [step,] f[, context]) now accepts an
+ optional partitioner parameter after the function f.
+
+Backward-incompatible API changes:
+
+- The library no longer injects tuple in to namespace std.
+ In previous releases, tuple was injected into namespace std by
+ flow_graph.h when std::tuple was not available. In this release,
+ flow_graph.h now uses tbb::flow::tuple. On platforms where
+ std::tuple is available, tbb::flow::tuple is typedef'ed to
+ std::tuple. On all other platforms, tbb::flow::tuple provides
+ a subset of the functionality defined by std::tuple. Users of
+ flow_graph.h may need to change their uses of std::tuple to
+ tbb::flow::tuple to ensure compatibility with non-C++11 compliant
+ compilers.
+
+Bugs fixed:
+
+- Fixed local observer to be able to override propagated CPU state and
+ to provide correct value of task_arena::current_slot() in callbacks.
+
+------------------------------------------------------------------------
+Intel TBB 4.1
+TBB_INTERFACE_VERSION == 6100
+
+Changes (w.r.t. Intel TBB 4.0 Update 5):
+
+- _WIN32_WINNT must be set to 0x0501 or greater in order to use TBB
+ on Microsoft* Windows*.
+- parallel_deterministic_reduce template function is fully supported.
+- TBB headers can be used with C++0x/C++11 mode (-std=c++0x) of GCC
+ and Intel(R) Compiler.
+- C++11 std::make_exception_ptr is used where available, instead of
+ std::copy_exception from earlier C++0x implementations.
+- Improvements in the TBB allocator to reduce extra memory consumption.
+- Partial refactoring of the task scheduler data structures.
+- TBB examples allow more flexible specification of the thread number,
+ including arithmetic and geometric progression.
+
+Bugs fixed:
+
+- On Linux & OS X*, pre-built TBB binaries do not yet support exact
+ exception propagation via C++11 exception_ptr. To prevent run time
+ errors, by default TBB headers disable exact exception propagation
+ even if the C++ implementation provides exception_ptr.
+
+Community Preview Features:
+
+- Added: class task_arena, for work submission by multiple application
+ threads with thread-independent control of concurrency level.
+- Added: task_scheduler_observer can be created as local to a master
+ thread, to observe threads that work on behalf of that master.
+ Local observers may have new on_scheduler_leaving() callback.
+
+------------------------------------------------------------------------
+Intel TBB 4.0 Update 5
+TBB_INTERFACE_VERSION == 6005
+
+Changes (w.r.t. Intel TBB 4.0 Update 4):
+
+- Parallel pipeline optimization (directly storing small objects in the
+ interstage data buffers) limited to trivially-copyable types for
+ C++11 and a short list of types for earlier compilers.
+- _VARIADIC_MAX switch is honored for TBB tuple implementation
+ and flow::graph nodes based on tuple.
+- Support of Cocoa framework was added to the GUI examples on OS X*
+ systems.
+
+Bugs fixed:
+
+- Fixed a tv_nsec overflow bug in condition_variable::wait_for.
+- Fixed execution order of enqueued tasks with different priorities.
+- Fixed a bug with task priority changes causing lack of progress
+ for fire-and-forget tasks when TBB was initialized to use 1 thread.
+- Fixed duplicate symbol problem when linking multiple compilation
+ units that include flow_graph.h on VC 10.
+
+------------------------------------------------------------------------
+Intel TBB 4.0 Update 4
+TBB_INTERFACE_VERSION == 6004
+
+Changes (w.r.t. Intel TBB 4.0 Update 3):
+
+- The TBB memory allocator transparently supports large pages on Linux.
+- A new flow_graph example, logic_sim, was added.
+- Support for DirectX* 9 was added to GUI examples.
+
+Community Preview Features:
+
+- Added: aggregator, a new concurrency control mechanism.
+
+Bugs fixed:
+
+- The abort operation on concurrent_bounded_queue now leaves the queue
+ in a reusable state. If a bad_alloc or bad_last_alloc exception is
+ thrown while the queue is recovering from an abort, that exception
+ will be reported instead of user_abort on the thread on which it
+ occurred, and the queue will not be reusable.
+- Steal limiting heuristic fixed to avoid premature stealing disabling
+ when large amount of __thread data is allocated on thread stack.
+- Fixed a low-probability leak of arenas in the task scheduler.
+- In STL-compatible allocator classes, the method construct() was fixed
+ to comply with C++11 requirements.
+- Fixed a bug that prevented creation of fixed-size memory pools
+ smaller than 2M.
+- Significantly reduced the amount of warnings from various compilers.
+
+Open-source contributions integrated:
+
+- Multiple improvements by Raf Schietekat.
+- Basic support for Clang on OS X* by Blas Rodriguez Somoza.
+- Fixes for warnings and corner-case bugs by Blas Rodriguez Somoza
+ and Edward Lam.
+
+------------------------------------------------------------------------
+Intel TBB 4.0 Update 3
+TBB_INTERFACE_VERSION == 6003
+
+Changes (w.r.t. Intel TBB 4.0 Update 2):
+
+- Modifications to the low-level API for memory pools:
+ added support for aligned allocations;
+ pool policies reworked to allow backward-compatible extensions;
+ added a policy to not return memory space till destruction;
+ pool_reset() does not return memory space anymore.
+- Class tbb::flow::graph_iterator added to iterate over all nodes
+ registered with a graph instance.
+- multioutput_function_node has been renamed multifunction_node.
+ multifunction_node and split_node are now fully-supported features.
+- For the tagged join node, the policy for try_put of an item with
+ already existing tag has been defined: the item will be rejected.
+- Matching the behavior on Windows, on other platforms the optional
+ shared libraries (libtbbmalloc, libirml) now are also searched
+ only in the directory where libtbb is located.
+- The platform isolation layer based on GCC built-ins is extended.
+
+Backward-incompatible API changes:
+
+- a graph reference parameter is now required to be passed to the
+ constructors of the following flow graph nodes: overwrite_node,
+ write_once_node, broadcast_node, and the CPF or_node.
+- the following tbb::flow node methods and typedefs have been renamed:
+ Old New
+ join_node and or_node:
+ inputs() -> input_ports()
+ input_ports_tuple_type -> input_ports_type
+ multifunction_node and split_node:
+ ports_type -> output_ports_type
+
+Bugs fixed:
+
+- Not all logical processors were utilized on systems with more than
+ 64 cores split by Windows into several processor groups.
+
+------------------------------------------------------------------------
+Intel TBB 4.0 Update 2 commercial-aligned release
+TBB_INTERFACE_VERSION == 6002
+
+Changes (w.r.t. Intel TBB 4.0 Update 1 commercial-aligned release):
+
+- concurrent_bounded_queue now has an abort() operation that releases
+ threads involved in pending push or pop operations. The released
+ threads will receive a tbb::user_abort exception.
+- Added Community Preview Feature: concurrent_lru_cache container,
+ a concurrent implementation of LRU (least-recently-used) cache.
+
+Bugs fixed:
+
+- fixed a race condition in the TBB scalable allocator.
+- concurrent_queue counter wraparound bug was fixed, which occurred when
+ the number of push and pop operations exceeded ~>4 billion on IA32.
+- fixed races in the TBB scheduler that could put workers asleep too
+ early, especially in presence of affinitized tasks.
+
+------------------------------------------------------------------------
+Intel TBB 4.0 Update 1 commercial-aligned release
+TBB_INTERFACE_VERSION == 6000 (forgotten to increment)
+
+Changes (w.r.t. Intel TBB 4.0 commercial-aligned release):
+
+- Memory leaks fixed in binpack example.
+- Improvements and fixes in the TBB allocator.
+
+------------------------------------------------------------------------
+Intel TBB 4.0 commercial-aligned release
+TBB_INTERFACE_VERSION == 6000
+
+Changes (w.r.t. Intel TBB 3.0 Update 8 commercial-aligned release):
+
+- concurrent_priority_queue is now a fully supported feature.
+ Capacity control methods were removed.
+- Flow graph is now a fully supported feature.
+- A new memory backend has been implemented in the TBB allocator.
+ It can reuse freed memory for both small and large objects, and
+ returns unused memory blocks to the OS more actively.
+- Improved partitioning algorithms for parallel_for and parallel_reduce
+ to better handle load imbalance.
+- The convex_hull example has been refactored for reproducible
+ performance results.
+- The major interface version has changed from 5 to 6.
+ Deprecated interfaces might be removed in future releases.
+
+Community Preview Features:
+
+- Added: serial subset, i.e. sequential implementations of TBB generic
+ algorithms (currently, only provided for parallel_for).
+- Preview of new flow graph nodes:
+ or_node (accepts multiple inputs, forwards each input separately
+ to all successors),
+ split_node (accepts tuples, and forwards each element of a tuple
+ to a corresponding successor), and
+ multioutput_function_node (accepts one input, and passes the input
+ and a tuple of output ports to the function body to support outputs
+ to multiple successors).
+- Added: memory pools for more control on memory source, grouping,
+ and collective deallocation.
+
+------------------------------------------------------------------------
+Intel TBB 3.0 Update 8 commercial-aligned release
+TBB_INTERFACE_VERSION == 5008
+
+Changes (w.r.t. Intel TBB 3.0 Update 7 commercial-aligned release):
+
+- Task priorities become an official feature of TBB,
+ not community preview as before.
+- Atomics API extended, and implementation refactored.
+- Added task::set_parent() method.
+- Added concurrent_unordered_set container.
+
+Open-source contributions integrated:
+
+- PowerPC support by Raf Schietekat.
+- Fix of potential task pool overrun and other improvements
+ in the task scheduler by Raf Schietekat.
+- Fix in parallel_for_each to work with std::set in Visual* C++ 2010.
+
+Community Preview Features:
+
+- Graph community preview feature was renamed to flow graph.
+ Multiple improvements in the implementation.
+ Binpack example was added for the feature.
+- A number of improvements to concurrent_priority_queue.
+ Shortpath example was added for the feature.
+- TBB runtime loaded functionality was added (Windows*-only).
+ It allows to specify which versions of TBB should be used,
+ as well as to set directories for the library search.
+- parallel_deterministic_reduce template function was added.
+
+------------------------------------------------------------------------
+Intel TBB 3.0 Update 7 commercial-aligned release
+TBB_INTERFACE_VERSION == 5006 (forgotten to increment)
+
+Changes (w.r.t. Intel TBB 3.0 Update 6 commercial-aligned release):
+
+- Added implementation of the platform isolation layer based on
+ GCC atomic built-ins; it is supposed to work on any platform
+ where GCC has these built-ins.
+
+Community Preview Features:
+
+- Graph's dining_philosophers example added.
+- A number of improvements to graph and concurrent_priority_queue.
+
+
+------------------------------------------------------------------------
+Intel TBB 3.0 Update 6 commercial-aligned release
+TBB_INTERFACE_VERSION == 5006
+
+Changes (w.r.t. Intel TBB 3.0 Update 5 commercial-aligned release):
+
+- Added Community Preview feature: task and task group priority, and
+ Fractal example demonstrating it.
+- parallel_pipeline optimized for data items of small and large sizes.
+- Graph's join_node is now parametrized with a tuple of up to 10 types.
+- Improved performance of concurrent_priority_queue.
+
+Open-source contributions integrated:
+
+- Initial NetBSD support by Aleksej Saushev.
+
+Bugs fixed:
+
+- Failure to enable interoperability with Intel(R) Cilk(tm) Plus runtime
+ library, and a crash caused by invoking the interoperability layer
+ after one of the libraries was unloaded.
+- Data race that could result in concurrent_unordered_map structure
+ corruption after call to clear() method.
+- Stack corruption caused by PIC version of 64-bit CAS compiled by Intel
+ compiler on Linux.
+- Inconsistency of exception propagation mode possible when application
+ built with Microsoft* Visual Studio* 2008 or earlier uses TBB built
+ with Microsoft* Visual Studio* 2010.
+- Affinitizing master thread to a subset of available CPUs after TBB
+ scheduler was initialized tied all worker threads to the same CPUs.
+- Method is_stolen_task() always returned 'false' for affinitized tasks.
+- write_once_node and overwrite_node did not immediately send buffered
+ items to successors
+
+------------------------------------------------------------------------
+Intel TBB 3.0 Update 5 commercial-aligned release
+TBB_INTERFACE_VERSION == 5005
+
+Changes (w.r.t. Intel TBB 3.0 Update 4 commercial-aligned release):
+
+- Added Community Preview feature: graph.
+- Added automatic propagation of master thread FPU settings to
+ TBB worker threads.
+- Added a public function to perform a sequentially consistent full
+ memory fence: tbb::atomic_fence() in tbb/atomic.h.
+
+Bugs fixed:
+
+- Data race that could result in scheduler data structures corruption
+ when using fire-and-forget tasks.
+- Potential referencing of destroyed concurrent_hash_map element after
+ using erase(accessor&A) method with A acquired as const_accessor.
+- Fixed a correctness bug in the convex hull example.
+
+Open-source contributions integrated:
+
+- Patch for calls to internal::atomic_do_once() by Andrey Semashev.
+
+------------------------------------------------------------------------
+Intel TBB 3.0 Update 4 commercial-aligned release
+TBB_INTERFACE_VERSION == 5004
+
+Changes (w.r.t. Intel TBB 3.0 Update 3 commercial-aligned release):
+
+- Added Community Preview feature: concurrent_priority_queue.
+- Fixed library loading to avoid possibility for remote code execution,
+ see http://www.microsoft.com/technet/security/advisory/2269637.mspx.
+- Added support of more than 64 cores for appropriate Microsoft*
+ Windows* versions. For more details, see
+ http://msdn.microsoft.com/en-us/library/dd405503.aspx.
+- Default number of worker threads is adjusted in accordance with
+ process affinity mask.
+
+Bugs fixed:
+
+- Calls of scalable_* functions from inside the allocator library
+ caused issues if the functions were overridden by another module.
+- A crash occurred if methods run() and wait() were called concurrently
+ for an empty tbb::task_group (1736).
+- The tachyon example exhibited build problems associated with
+ bug 554339 on Microsoft* Visual Studio* 2010. Project files were
+ modified as a partial workaround to overcome the problem. See
+ http://connect.microsoft.com/VisualStudio/feedback/details/554339.
+
+------------------------------------------------------------------------
+Intel TBB 3.0 Update 3 commercial-aligned release
+TBB_INTERFACE_VERSION == 5003
+
+Changes (w.r.t. Intel TBB 3.0 Update 2 commercial-aligned release):
+
+- cache_aligned_allocator class reworked to use scalable_aligned_malloc.
+- Improved performance of count() and equal_range() methods
+ in concurrent_unordered_map.
+- Improved implementation of 64-bit atomic loads and stores on 32-bit
+ platforms, including compilation with VC 7.1.
+- Added implementation of atomic operations on top of OSAtomic API
+ provided by OS X*.
+- Removed gratuitous try/catch blocks surrounding thread function calls
+ in tbb_thread.
+- Xcode* projects were added for sudoku and game_of_life examples.
+- Xcode* projects were updated to work without TBB framework.
+
+Bugs fixed:
+
+- Fixed a data race in task scheduler destruction that on rare occasion
+ could result in memory corruption.
+- Fixed idle spinning in thread bound filters in tbb::pipeline (1670).
+
+Open-source contributions integrated:
+
+- MinGW-64 basic support by brsomoza (partially).
+- Patch for atomic.h by Andrey Semashev.
+- Support for AIX & GCC on PowerPC by Giannis Papadopoulos.
+- Various improvements by Raf Schietekat.
+
+------------------------------------------------------------------------
+Intel TBB 3.0 Update 2 commercial-aligned release
+TBB_INTERFACE_VERSION == 5002
+
+Changes (w.r.t. Intel TBB 3.0 Update 1 commercial-aligned release):
+
+- Destructor of tbb::task_group class throws missing_wait exception
+ if there are tasks running when it is invoked.
+- Interoperability layer with Intel Cilk Plus runtime library added
+ to protect TBB TLS in case of nested usage with Intel Cilk Plus.
+- Compilation fix for dependent template names in concurrent_queue.
+- Memory allocator code refactored to ease development and maintenance.
+
+Bugs fixed:
+
+- Improved interoperability with other Intel software tools on Linux in
+ case of dynamic replacement of memory allocator (1700)
+- Fixed install issues that prevented installation on
+ Mac OS* X 10.6.4 (1711).
+
+------------------------------------------------------------------------
+Intel TBB 3.0 Update 1 commercial-aligned release
+TBB_INTERFACE_VERSION == 5000 (forgotten to increment)
+
+Changes (w.r.t. Intel TBB 3.0 commercial-aligned release):
+
+- Decreased memory fragmentation by allocations bigger than 8K.
+- Lazily allocate worker threads, to avoid creating unnecessary stacks.
+
+Bugs fixed:
+
+- TBB allocator used much more memory than malloc (1703) - see above.
+- Deadlocks happened in some specific initialization scenarios
+ of the TBB allocator (1701, 1704).
+- Regression in enumerable_thread_specific: excessive requirements
+ for object constructors.
+- A bug in construction of parallel_pipeline filters when body instance
+ was a temporary object.
+- Incorrect usage of memory fences on PowerPC and XBOX360 platforms.
+- A subtle issue in task group context binding that could result
+ in cancellation signal being missed by nested task groups.
+- Incorrect construction of concurrent_unordered_map if specified
+ number of buckets is not power of two.
+- Broken count() and equal_range() of concurrent_unordered_map.
+- Return type of postfix form of operator++ for hash map's iterators.
+
+------------------------------------------------------------------------
+Intel TBB 3.0 commercial-aligned release
+TBB_INTERFACE_VERSION == 5000
+
+Changes (w.r.t. Intel TBB 2.2 Update 3 commercial-aligned release):
+
+- All open-source-release changes down to TBB 2.2 U3 below
+ were incorporated into this release.
+
+------------------------------------------------------------------------
+20100406 open-source release
+
+Changes (w.r.t. 20100310 open-source release):
+
+- Added support for Microsoft* Visual Studio* 2010, including binaries.
+- Added a PDF file with recommended Design Patterns for TBB.
+- Added parallel_pipeline function and companion classes and functions
+ that provide a strongly typed lambda-friendly pipeline interface.
+- Reworked enumerable_thread_specific to use a custom implementation of
+ hash map that is more efficient for ETS usage models.
+- Added example for class task_group; see examples/task_group/sudoku.
+- Removed two examples, as they were long outdated and superceded:
+ pipeline/text_filter (use pipeline/square);
+ parallel_while/parallel_preorder (use parallel_do/parallel_preorder).
+- PDF documentation updated.
+- Other fixes and changes in code, tests, and examples.
+
+Bugs fixed:
+
+- Eliminated build errors with MinGW32.
+- Fixed post-build step and other issues in VS projects for examples.
+- Fixed discrepancy between scalable_realloc and scalable_msize that
+ caused crashes with malloc replacement on Windows.
+
+------------------------------------------------------------------------
+20100310 open-source release
+
+Changes (w.r.t. Intel TBB 2.2 Update 3 commercial-aligned release):
+
+- Version macros changed in anticipation of a future release.
+- Directory structure aligned with Intel(R) C++ Compiler;
+ now TBB binaries reside in //[bin|lib]
+ (in TBB 2.x, it was [bin|lib]//).
+- Visual Studio projects changed for examples: instead of separate set
+ of files for each VS version, now there is single 'msvs' directory
+ that contains workspaces for MS C++ compiler (_cl.sln) and
+ Intel C++ compiler (_icl.sln). Works with VS 2005 and above.
+- The name versioning scheme for backward compatibility was improved;
+ now compatibility-breaking changes are done in a separate namespace.
+- Added concurrent_unordered_map implementation based on a prototype
+ developed in Microsoft for a future version of PPL.
+- Added PPL-compatible writer-preference RW lock (reader_writer_lock).
+- Added TBB_IMPLEMENT_CPP0X macro to control injection of C++0x names
+ implemented in TBB into namespace std.
+- Added almost-C++0x-compatible std::condition_variable, plus a bunch
+ of other C++0x classes required by condition_variable.
+- With TBB_IMPLEMENT_CPP0X, tbb_thread can be also used as std::thread.
+- task.cpp was split into several translation units to structure
+ TBB scheduler sources layout. Static data layout and library
+ initialization logic were also updated.
+- TBB scheduler reworked to prevent master threads from stealing
+ work belonging to other masters.
+- Class task was extended with enqueue() method, and slightly changed
+ semantics of methods spawn() and destroy(). For exact semantics,
+ refer to TBB Reference manual.
+- task_group_context now allows for destruction by non-owner threads.
+- Added TBB_USE_EXCEPTIONS macro to control use of exceptions in TBB
+ headers. It turns off (i.e. sets to 0) automatically if specified
+ compiler options disable exception handling.
+- TBB is enabled to run on top of Microsoft's Concurrency Runtime
+ on Windows* 7 (via our worker dispatcher known as RML).
+- Removed old unused busy-waiting code in concurrent_queue.
+- Described the advanced build & test options in src/index.html.
+- Warning level for GCC raised with -Wextra and a few other options.
+- Multiple fixes and improvements in code, tests, examples, and docs.
+
+Open-source contributions integrated:
+
+- Xbox support by Roman Lut (Deep Shadows), though further changes are
+ required to make it working; e.g. post-2.1 entry points are missing.
+- "Eventcount" by Dmitry Vyukov evolved into concurrent_monitor,
+ an internal class used in the implementation of concurrent_queue.
+
+------------------------------------------------------------------------
+Intel TBB 2.2 Update 3 commercial-aligned release
+TBB_INTERFACE_VERSION == 4003
+
+Changes (w.r.t. Intel TBB 2.2 Update 2 commercial-aligned release):
+
+- PDF documentation updated.
+
+Bugs fixed:
+
+- concurrent_hash_map compatibility issue exposed on Linux in case
+ two versions of the container were used by different modules.
+- enforce 16 byte stack alignment for consistence with GCC; required
+ to work correctly with 128-bit variables processed by SSE.
+- construct() methods of allocator classes now use global operator new.
+
+------------------------------------------------------------------------
+Intel TBB 2.2 Update 2 commercial-aligned release
+TBB_INTERFACE_VERSION == 4002
+
+Changes (w.r.t. Intel TBB 2.2 Update 1 commercial-aligned release):
+
+- parallel_invoke and parallel_for_each now take function objects
+ by const reference, not by value.
+- Building TBB with /MT is supported, to avoid dependency on particular
+ versions of Visual C++* runtime DLLs. TBB DLLs built with /MT
+ are located in vc_mt directory.
+- Class critical_section introduced.
+- Improvements in exception support: new exception classes introduced,
+ all exceptions are thrown via an out-of-line internal method.
+- Improvements and fixes in the TBB allocator and malloc replacement,
+ including robust memory identification, and more reliable dynamic
+ function substitution on Windows*.
+- Method swap() added to class tbb_thread.
+- Methods rehash() and bucket_count() added to concurrent_hash_map.
+- Added support for Visual Studio* 2010 Beta2. No special binaries
+ provided, but CRT-independent DLLs (vc_mt) should work.
+- Other fixes and improvements in code, tests, examples, and docs.
+
+Open-source contributions integrated:
+
+- The fix to build 32-bit TBB on Mac OS* X 10.6.
+- GCC-based port for SPARC Solaris by Michailo Matijkiw, with use of
+ earlier work by Raf Schietekat.
+
+Bugs fixed:
+
+- 159 - TBB build for PowerPC* running Mac OS* X.
+- 160 - IBM* Java segfault if used with TBB allocator.
+- crash in concurrent_queue (1616).
+
+------------------------------------------------------------------------
+Intel TBB 2.2 Update 1 commercial-aligned release
+TBB_INTERFACE_VERSION == 4001
+
+Changes (w.r.t. Intel TBB 2.2 commercial-aligned release):
+
+- Incorporates all changes from open-source releases below.
+- Documentation was updated.
+- TBB scheduler auto-initialization now covers all possible use cases.
+- concurrent_queue: made argument types of sizeof used in paddings
+ consistent with those actually used.
+- Memory allocator was improved: supported corner case of user's malloc
+ calling scalable_malloc (non-Windows), corrected processing of
+ memory allocation requests during tbb memory allocator startup
+ (Linux).
+- Windows malloc replacement has got better support for static objects.
+- In pipeline setups that do not allow actual parallelism, execution
+ by a single thread is guaranteed, idle spinning eliminated, and
+ performance improved.
+- RML refactoring and clean-up.
+- New constructor for concurrent_hash_map allows reserving space for
+ a number of items.
+- Operator delete() added to the TBB exception classes.
+- Lambda support was improved in parallel_reduce.
+- gcc 4.3 warnings were fixed for concurrent_queue.
+- Fixed possible initialization deadlock in modules using TBB entities
+ during construction of global static objects.
+- Copy constructor in concurrent_hash_map was fixed.
+- Fixed a couple of rare crashes in the scheduler possible before
+ in very specific use cases.
+- Fixed a rare crash in the TBB allocator running out of memory.
+- New tests were implemented, including test_lambda.cpp that checks
+ support for lambda expressions.
+- A few other small changes in code, tests, and documentation.
+
+------------------------------------------------------------------------
+20090809 open-source release
+
+Changes (w.r.t. Intel TBB 2.2 commercial-aligned release):
+
+- Fixed known exception safety issues in concurrent_vector.
+- Better concurrency of simultaneous grow requests in concurrent_vector.
+- TBB allocator further improves performance of large object allocation.
+- Problem with source of text relocations was fixed on Linux
+- Fixed bugs related to malloc replacement under Windows
+- A few other small changes in code and documentation.
+
+------------------------------------------------------------------------
+Intel TBB 2.2 commercial-aligned release
+TBB_INTERFACE_VERSION == 4000
+
+Changes (w.r.t. Intel TBB 2.1 U4 commercial-aligned release):
+
+- Incorporates all changes from open-source releases below.
+- Architecture folders renamed from em64t to intel64 and from itanium
+ to ia64.
+- Major Interface version changed from 3 to 4. Deprecated interfaces
+ might be removed in future releases.
+- Parallel algorithms that use partitioners have switched to use
+ the auto_partitioner by default.
+- Improved memory allocator performance for allocations bigger than 8K.
+- Added new thread-bound filters functionality for pipeline.
+- New implementation of concurrent_hash_map that improves performance
+ significantly.
+- A few other small changes in code and documentation.
+
+------------------------------------------------------------------------
+20090511 open-source release
+
+Changes (w.r.t. previous open-source release):
+
+- Basic support for MinGW32 development kit.
+- Added tbb::zero_allocator class that initializes memory with zeros.
+ It can be used as an adaptor to any STL-compatible allocator class.
+- Added tbb::parallel_for_each template function as alias to parallel_do.
+- Added more overloads for tbb::parallel_for.
+- Added support for exact exception propagation (can only be used with
+ compilers that support C++0x std::exception_ptr).
+- tbb::atomic template class can be used with enumerations.
+- mutex, recursive_mutex, spin_mutex, spin_rw_mutex classes extended
+ with explicit lock/unlock methods.
+- Fixed size() and grow_to_at_least() methods of tbb::concurrent_vector
+ to provide space allocation guarantees. More methods added for
+ compatibility with std::vector, including some from C++0x.
+- Preview of a lambda-friendly interface for low-level use of tasks.
+- scalable_msize function added to the scalable allocator (Windows only).
+- Rationalized internal auxiliary functions for spin-waiting and backoff.
+- Several tests undergo decent refactoring.
+
+Changes affecting backward compatibility:
+
+- Improvements in concurrent_queue, including limited API changes.
+ The previous version is deprecated; its functionality is accessible
+ via methods of the new tbb::concurrent_bounded_queue class.
+- grow* and push_back methods of concurrent_vector changed to return
+ iterators; old semantics is deprecated.
+
+------------------------------------------------------------------------
+Intel TBB 2.1 Update 4 commercial-aligned release
+TBB_INTERFACE_VERSION == 3016
+
+Changes (w.r.t. Intel TBB 2.1 U3 commercial-aligned release):
+
+- Added tests for aligned memory allocations and malloc replacement.
+- Several improvements for better bundling with Intel(R) C++ Compiler.
+- A few other small changes in code and documentaion.
+
+Bugs fixed:
+
+- 150 - request to build TBB examples with debug info in release mode.
+- backward compatibility issue with concurrent_queue on Windows.
+- dependency on VS 2005 SP1 runtime libraries removed.
+- compilation of GUI examples under Xcode* 3.1 (1577).
+- On Windows, TBB allocator classes can be instantiated with const types
+ for compatibility with MS implementation of STL containers (1566).
+
+------------------------------------------------------------------------
+20090313 open-source release
+
+Changes (w.r.t. 20081109 open-source release):
+
+- Includes all changes introduced in TBB 2.1 Update 2 & Update 3
+ commercial-aligned releases (see below for details).
+- Added tbb::parallel_invoke template function. It runs up to 10
+ user-defined functions in parallel and waits for them to complete.
+- Added a special library providing ability to replace the standard
+ memory allocation routines in Microsoft* C/C++ RTL (malloc/free,
+ global new/delete, etc.) with the TBB memory allocator.
+ Usage details are described in include/tbb/tbbmalloc_proxy.h file.
+- Task scheduler switched to use new implementation of its core
+ functionality (deque based task pool, new structure of arena slots).
+- Preview of Microsoft* Visual Studio* 2005 project files for
+ building the library is available in build/vsproject folder.
+- Added tests for aligned memory allocations and malloc replacement.
+- Added parallel_for/game_of_life.net example (for Windows only)
+ showing TBB usage in a .NET application.
+- A number of other fixes and improvements to code, tests, makefiles,
+ examples and documents.
+
+Bugs fixed:
+
+- The same list as in TBB 2.1 Update 4 right above.
+
+------------------------------------------------------------------------
+Intel TBB 2.1 Update 3 commercial-aligned release
+TBB_INTERFACE_VERSION == 3015
+
+Changes (w.r.t. Intel TBB 2.1 U2 commercial-aligned release):
+
+- Added support for aligned allocations to the TBB memory allocator.
+- Added a special library to use with LD_PRELOAD on Linux* in order to
+ replace the standard memory allocation routines in C/C++ with the
+ TBB memory allocator.
+- Added null_mutex and null_rw_mutex: no-op classes interface-compliant
+ to other TBB mutexes.
+- Improved performance of parallel_sort, to close most of the serial gap
+ with std::sort, and beat it on 2 and more cores.
+- A few other small changes.
+
+Bugs fixed:
+
+- the problem where parallel_for hanged after exception throw
+ if affinity_partitioner was used (1556).
+- get rid of VS warnings about mbstowcs deprecation (1560),
+ as well as some other warnings.
+- operator== for concurrent_vector::iterator fixed to work correctly
+ with different vector instances.
+
+------------------------------------------------------------------------
+Intel TBB 2.1 Update 2 commercial-aligned release
+TBB_INTERFACE_VERSION == 3014
+
+Changes (w.r.t. Intel TBB 2.1 U1 commercial-aligned release):
+
+- Incorporates all open-source-release changes down to TBB 2.1 U1,
+ except for:
+ - 20081019 addition of enumerable_thread_specific;
+- Warning level for Microsoft* Visual C++* compiler raised to /W4 /Wp64;
+ warnings found on this level were cleaned or suppressed.
+- Added TBB_runtime_interface_version API function.
+- Added new example: pipeline/square.
+- Added exception handling and cancellation support
+ for parallel_do and pipeline.
+- Added copy constructor and [begin,end) constructor to concurrent_queue.
+- Added some support for beta version of Intel(R) Parallel Amplifier.
+- Added scripts to set environment for cross-compilation of 32-bit
+ applications on 64-bit Linux with Intel(R) C++ Compiler.
+- Fixed semantics of concurrent_vector::clear() to not deallocate
+ internal arrays. Fixed compact() to perform such deallocation later.
+- Fixed the issue with atomic when T is incomplete type.
+- Improved support for PowerPC* Macintosh*, including the fix
+ for a bug in masked compare-and-swap reported by a customer.
+- As usual, a number of other improvements everywhere.
+
+------------------------------------------------------------------------
+20081109 open-source release
+
+Changes (w.r.t. previous open-source release):
+
+- Added new serial out of order filter for tbb::pipeline.
+- Fixed the issue with atomic::operator= reported at the forum.
+- Fixed the issue with using tbb::task::self() in task destructor
+ reported at the forum.
+- A number of other improvements to code, tests, makefiles, examples
+ and documents.
+
+Open-source contributions integrated:
+- Changes in the memory allocator were partially integrated.
+
+------------------------------------------------------------------------
+20081019 open-source release
+
+Changes (w.r.t. previous open-source release):
+
+- Introduced enumerable_thread_specific. This new class provides a
+ wrapper around native thread local storage as well as iterators and
+ ranges for accessing the thread local copies (1533).
+- Improved support for Intel(R) Threading Analysis Tools
+ on Intel(R) 64 architecture.
+- Dependency from Microsoft* CRT was integrated to the libraries using
+ manifests, to avoid issues if called from code that uses different
+ version of Visual C++* runtime than the library.
+- Introduced new defines TBB_USE_ASSERT, TBB_USE_DEBUG,
+ TBB_USE_PERFORMANCE_WARNINGS, TBB_USE_THREADING_TOOLS.
+- A number of other improvements to code, tests, makefiles, examples
+ and documents.
+
+Open-source contributions integrated:
+
+- linker optimization: /incremental:no .
+
+------------------------------------------------------------------------
+20080925 open-source release
+
+Changes (w.r.t. previous open-source release):
+
+- Same fix for a memory leak in the memory allocator as in TBB 2.1 U1.
+- Improved support for lambda functions.
+- Fixed more concurrent_queue issues reported at the forum.
+- A number of other improvements to code, tests, makefiles, examples
+ and documents.
+
+------------------------------------------------------------------------
+Intel TBB 2.1 Update 1 commercial-aligned release
+TBB_INTERFACE_VERSION == 3013
+
+Changes (w.r.t. Intel TBB 2.1 commercial-aligned release):
+
+- Fixed small memory leak in the memory allocator.
+- Incorporates all open-source-release changes since TBB 2.1,
+ except for:
+ - 20080825 changes for parallel_do;
+
+------------------------------------------------------------------------
+20080825 open-source release
+
+Changes (w.r.t. previous open-source release):
+
+- Added exception handling and cancellation support for parallel_do.
+- Added default HashCompare template argument for concurrent_hash_map.
+- Fixed concurrent_queue.clear() issues due to incorrect assumption
+ about clear() being private method.
+- Added the possibility to use TBB in applications that change
+ default calling conventions (Windows* only).
+- Many improvements to code, tests, examples, makefiles and documents.
+
+Bugs fixed:
+
+- 120, 130 - memset declaration missed in concurrent_hash_map.h
+
+------------------------------------------------------------------------
+20080724 open-source release
+
+Changes (w.r.t. previous open-source release):
+
+- Inline assembly for atomic operations improved for gcc 4.3
+- A few more improvements to the code.
+
+------------------------------------------------------------------------
+20080709 open-source release
+
+Changes (w.r.t. previous open-source release):
+
+- operator=() was added to the tbb_thread class according to
+ the current working draft for std::thread.
+- Recognizing SPARC* in makefiles for Linux* and Sun Solaris*.
+
+Bugs fixed:
+
+- 127 - concurrent_hash_map::range fixed to split correctly.
+
+Open-source contributions integrated:
+
+- fix_set_midpoint.diff by jyasskin
+- SPARC* support in makefiles by Raf Schietekat
+
+------------------------------------------------------------------------
+20080622 open-source release
+
+Changes (w.r.t. previous open-source release):
+
+- Fixed a hang that rarely happened on Linux
+ during deinitialization of the TBB scheduler.
+- Improved support for Intel(R) Thread Checker.
+- A few more improvements to the code.
+
+------------------------------------------------------------------------
+Intel TBB 2.1 commercial-aligned release
+TBB_INTERFACE_VERSION == 3011
+
+Changes (w.r.t. Intel TBB 2.0 U3 commercial-aligned release):
+
+- All open-source-release changes down to, and including, TBB 2.0 below,
+ were incorporated into this release.
+
+------------------------------------------------------------------------
+20080605 open-source release
+
+Changes (w.r.t. previous open-source release):
+
+- Explicit control of exported symbols by version scripts added on Linux.
+- Interfaces polished for exception handling & algorithm cancellation.
+- Cache behavior improvements in the scalable allocator.
+- Improvements in text_filter, polygon_overlay, and other examples.
+- A lot of other stability improvements in code, tests, and makefiles.
+- First release where binary packages include headers/docs/examples, so
+ binary packages are now self-sufficient for using TBB.
+
+Open-source contributions integrated:
+
+- atomics patch (partially).
+- tick_count warning patch.
+
+Bugs fixed:
+
+- 118 - fix for boost compatibility.
+- 123 - fix for tbb_machine.h.
+
+------------------------------------------------------------------------
+20080512 open-source release
+
+Changes (w.r.t. previous open-source release):
+
+- Fixed a problem with backward binary compatibility
+ of debug Linux builds.
+- Sun* Studio* support added.
+- soname support added on Linux via linker script. To restore backward
+ binary compatibility, *.so -> *.so.2 softlinks should be created.
+- concurrent_hash_map improvements - added few new forms of insert()
+ method and fixed precondition and guarantees of erase() methods.
+ Added runtime warning reporting about bad hash function used for
+ the container. Various improvements for performance and concurrency.
+- Cancellation mechanism reworked so that it does not hurt scalability.
+- Algorithm parallel_do reworked. Requirement for Body::argument_type
+ definition removed, and work item argument type can be arbitrarily
+ cv-qualified.
+- polygon_overlay example added.
+- A few more improvements to code, tests, examples and Makefiles.
+
+Open-source contributions integrated:
+
+- Soname support patch for Bugzilla #112.
+
+Bugs fixed:
+
+- 112 - fix for soname support.
+
+------------------------------------------------------------------------
+Intel TBB 2.0 U3 commercial-aligned release (package 017, April 20, 2008)
+
+Corresponds to commercial 019 (for Linux*, 020; for Mac OS* X, 018)
+packages.
+
+Changes (w.r.t. Intel TBB 2.0 U2 commercial-aligned release):
+
+- Does not contain open-source-release changes below; this release is
+ only a minor update of TBB 2.0 U2.
+- Removed spin-waiting in pipeline and concurrent_queue.
+- A few more small bug fixes from open-source releases below.
+
+------------------------------------------------------------------------
+20080408 open-source release
+
+Changes (w.r.t. previous open-source release):
+
+- count_strings example reworked: new word generator implemented, hash
+ function replaced, and tbb_allocator is used with std::string class.
+- Static methods of spin_rw_mutex were replaced by normal member
+ functions, and the class name was versioned.
+- tacheon example was renamed to tachyon.
+- Improved support for Intel(R) Thread Checker.
+- A few more minor improvements.
+
+Open-source contributions integrated:
+
+- Two sets of Sun patches for IA Solaris support.
+
+------------------------------------------------------------------------
+20080402 open-source release
+
+Changes (w.r.t. previous open-source release):
+
+- Exception handling and cancellation support for tasks and algorithms
+ fully enabled.
+- Exception safety guaranties defined and fixed for all concurrent
+ containers.
+- User-defined memory allocator support added to all concurrent
+ containers.
+- Performance improvement of concurrent_hash_map, spin_rw_mutex.
+- Critical fix for a rare race condition during scheduler
+ initialization/de-initialization.
+- New methods added for concurrent containers to be closer to STL,
+ as well as automatic filters removal from pipeline
+ and __TBB_AtomicAND function.
+- The volatile keyword dropped from where it is not really needed.
+- A few more minor improvements.
+
+------------------------------------------------------------------------
+20080319 open-source release
+
+Changes (w.r.t. previous open-source release):
+
+- Support for gcc version 4.3 was added.
+- tbb_thread class, near compatible with std::thread expected in C++0x,
+ was added.
+
+Bugs fixed:
+
+- 116 - fix for compilation issues with gcc version 4.2.1.
+- 120 - fix for compilation issues with gcc version 4.3.
+
+------------------------------------------------------------------------
+20080311 open-source release
+
+Changes (w.r.t. previous open-source release):
+
+- An enumerator added for pipeline filter types (serial vs. parallel).
+- New task_scheduler_observer class introduced, to observe when
+ threads start and finish interacting with the TBB task scheduler.
+- task_scheduler_init reverted to not use internal versioned class;
+ binary compatibility guaranteed with stable releases only.
+- Various improvements to code, tests, examples and Makefiles.
+
+------------------------------------------------------------------------
+20080304 open-source release
+
+Changes (w.r.t. previous open-source release):
+
+- Task-to-thread affinity support, previously kept under a macro,
+ now fully legalized.
+- Work-in-progress on cache_aligned_allocator improvements.
+- Pipeline really supports parallel input stage; it's no more serialized.
+- Various improvements to code, tests, examples and Makefiles.
+
+Bugs fixed:
+
+- 119 - fix for scalable_malloc sometimes failing to return a big block.
+- TR575 - fixed a deadlock occurring on Windows in startup/shutdown
+ under some conditions.
+
+------------------------------------------------------------------------
+20080226 open-source release
+
+Changes (w.r.t. previous open-source release):
+
+- Introduced tbb_allocator to select between standard allocator and
+ tbb::scalable_allocator when available.
+- Removed spin-waiting in pipeline and concurrent_queue.
+- Improved performance of concurrent_hash_map by using tbb_allocator.
+- Improved support for Intel(R) Thread Checker.
+- Various improvements to code, tests, examples and Makefiles.
+
+------------------------------------------------------------------------
+Intel TBB 2.0 U2 commercial-aligned release (package 017, February 14, 2008)
+
+Corresponds to commercial 017 (for Linux*, 018; for Mac OS* X, 016)
+packages.
+
+Changes (w.r.t. Intel TBB 2.0 U1 commercial-aligned release):
+
+- Does not contain open-source-release changes below; this release is
+ only a minor update of TBB 2.0 U1.
+- Add support for Microsoft* Visual Studio* 2008, including binary
+ libraries and VS2008 projects for examples.
+- Use SwitchToThread() not Sleep() to yield threads on Windows*.
+- Enhancements to Doxygen-readable comments in source code.
+- A few more small bug fixes from open-source releases below.
+
+Bugs fixed:
+
+- TR569 - Memory leak in concurrent_queue.
+
+------------------------------------------------------------------------
+20080207 open-source release
+
+Changes (w.r.t. previous open-source release):
+
+- Improvements and minor fixes in VS2008 projects for examples.
+- Improvements in code for gating worker threads that wait for work,
+ previously consolidated under #if IMPROVED_GATING, now legalized.
+- Cosmetic changes in code, examples, tests.
+
+Bugs fixed:
+
+- 113 - Iterators and ranges should be convertible to their const
+ counterparts.
+- TR569 - Memory leak in concurrent_queue.
+
+------------------------------------------------------------------------
+20080122 open-source release
+
+Changes (w.r.t. previous open-source release):
+
+- Updated examples/parallel_for/seismic to improve the visuals and to
+ use the affinity_partitioner (20071127 and forward) for better
+ performance.
+- Minor improvements to unittests and performance tests.
+
+------------------------------------------------------------------------
+20080115 open-source release
+
+Changes (w.r.t. previous open-source release):
+
+- Cleanup, simplifications and enhancements to the Makefiles for
+ building the libraries (see build/index.html for high-level
+ changes) and the examples.
+- Use SwitchToThread() not Sleep() to yield threads on Windows*.
+- Engineering work-in-progress on exception safety/support.
+- Engineering work-in-progress on affinity_partitioner for
+ parallel_reduce.
+- Engineering work-in-progress on improved gating for worker threads
+ (idle workers now block in the OS instead of spinning).
+- Enhancements to Doxygen-readable comments in source code.
+
+Bugs fixed:
+
+- 102 - Support for parallel build with gmake -j
+- 114 - /Wp64 build warning on Windows*.
+
+------------------------------------------------------------------------
+20071218 open-source release
+
+Changes (w.r.t. previous open-source release):
+
+- Full support for Microsoft* Visual Studio* 2008 in open-source.
+ Binaries for vc9/ will be available in future stable releases.
+- New recursive_mutex class.
+- Full support for 32-bit PowerMac including export files for builds.
+- Improvements to parallel_do.
+
+------------------------------------------------------------------------
+20071206 open-source release
+
+Changes (w.r.t. previous open-source release):
+
+- Support for Microsoft* Visual Studio* 2008 in building libraries
+ from source as well as in vc9/ projects for examples.
+- Small fixes to the affinity_partitioner first introduced in 20071127.
+- Small fixes to the thread-stack size hook first introduced in 20071127.
+- Engineering work in progress on concurrent_vector.
+- Engineering work in progress on exception behavior.
+- Unittest improvements.
+
+------------------------------------------------------------------------
+20071127 open-source release
+
+Changes (w.r.t. previous open-source release):
+
+- Task-to-thread affinity support (affinity partitioner) first appears.
+- More work on concurrent_vector.
+- New parallel_do algorithm (function-style version of parallel while)
+ and parallel_do/parallel_preorder example.
+- New task_scheduler_init() hooks for getting default_num_threads() and
+ for setting thread stack size.
+- Support for weak memory consistency models in the code base.
+- Futex usage in the task scheduler (Linux).
+- Started adding 32-bit PowerMac support.
+- Intel(R) 9.1 compilers are now the base supported Intel(R) compiler
+ version.
+- TBB libraries added to link line automatically on Microsoft Windows*
+ systems via #pragma comment linker directives.
+
+Open-source contributions integrated:
+
+- FreeBSD platform support patches.
+- AIX weak memory model patch.
+
+Bugs fixed:
+
+- 108 - Removed broken affinity.h reference.
+- 101 - Does not build on Debian Lenny (replaced arch with uname -m).
+
+------------------------------------------------------------------------
+20071030 open-source release
+
+Changes (w.r.t. previous open-source release):
+
+- More work on concurrent_vector.
+- Better support for building with -Wall -Werror (or not) as desired.
+- A few fixes to eliminate extraneous warnings.
+- Begin introduction of versioning hooks so that the internal/API
+ version is tracked via TBB_INTERFACE_VERSION. The newest binary
+ libraries should always work with previously-compiled code when-
+ ever possible.
+- Engineering work in progress on using futex inside the mutexes (Linux).
+- Engineering work in progress on exception behavior.
+- Engineering work in progress on a new parallel_do algorithm.
+- Unittest improvements.
+
+------------------------------------------------------------------------
+20070927 open-source release
+
+Changes (w.r.t. Intel TBB 2.0 U1 commercial-aligned release):
+
+- Minor update to TBB 2.0 U1 below.
+- Begin introduction of new concurrent_vector interfaces not released
+ with TBB 2.0 U1.
+
+------------------------------------------------------------------------
+Intel TBB 2.0 U1 commercial-aligned release (package 014, October 1, 2007)
+
+Corresponds to commercial 014 (for Linux*, 016) packages.
+
+Changes (w.r.t. Intel TBB 2.0 commercial-aligned release):
+
+- All open-source-release changes down to, and including, TBB 2.0
+ below, were incorporated into this release.
+- Made a number of changes to the officially supported OS list:
+ Added Linux* OSs:
+ Asianux* 3, Debian* 4.0, Fedora Core* 6, Fedora* 7,
+ Turbo Linux* 11, Ubuntu* 7.04;
+ Dropped Linux* OSs:
+ Asianux* 2, Fedora Core* 4, Haansoft* Linux 2006 Server,
+ Mandriva/Mandrake* 10.1, Miracle Linux* 4.0,
+ Red Flag* DC Server 5.0;
+ Only Mac OS* X 10.4.9 (and forward) and Xcode* tool suite 2.4.1 (and
+ forward) are now supported.
+- Commercial installers on Linux* fixed to recommend the correct
+ binaries to use in more cases, with less unnecessary warnings.
+- Changes to eliminate spurious build warnings.
+
+Open-source contributions integrated:
+
+- Two small header guard macro patches; it also fixed bug #94.
+- New blocked_range3d class.
+
+Bugs fixed:
+
+- 93 - Removed misleading comments in task.h.
+- 94 - See above.
+
+------------------------------------------------------------------------
+20070815 open-source release
+
+Changes:
+
+- Changes to eliminate spurious build warnings.
+- Engineering work in progress on concurrent_vector allocator behavior.
+- Added hooks to use the Intel(R) compiler code coverage tools.
+
+Open-source contributions integrated:
+
+- Mac OS* X build warning patch.
+
+Bugs fixed:
+
+- 88 - Fixed TBB compilation errors if both VS2005 and Windows SDK are
+ installed.
+
+------------------------------------------------------------------------
+20070719 open-source release
+
+Changes:
+
+- Minor update to TBB 2.0 commercial-aligned release below.
+- Changes to eliminate spurious build warnings.
+
+------------------------------------------------------------------------
+Intel TBB 2.0 commercial-aligned release (package 010, July 19, 2007)
+
+Corresponds to commercial 010 (for Linux*, 012) packages.
+
+- TBB open-source debut release.
+
+------------------------------------------------------------------------
+Intel TBB 1.1 commercial release (April 10, 2007)
+
+Changes (w.r.t. Intel TBB 1.0 commercial release):
+
+- auto_partitioner which offered an automatic alternative to specifying
+ a grain size parameter to estimate the best granularity for tasks.
+- The release was added to the Intel(R) C++ Compiler 10.0 Pro.
+
+------------------------------------------------------------------------
+Intel TBB 1.0 Update 2 commercial release
+
+Changes (w.r.t. Intel TBB 1.0 Update 1 commercial release):
+
+- Mac OS* X 64-bit support added.
+- Source packages for commercial releases introduced.
+
+------------------------------------------------------------------------
+Intel TBB 1.0 Update 1 commercial-aligned release
+
+Changes (w.r.t. Intel TBB 1.0 commercial release):
+
+- Fix for critical package issue on Mac OS* X.
+
+------------------------------------------------------------------------
+Intel TBB 1.0 commercial release (August 29, 2006)
+
+Changes (w.r.t. Intel TBB 1.0 beta commercial release):
+
+- New namespace (and compatibility headers for old namespace).
+ Namespaces are tbb and tbb::internal and all classes are in the
+ underscore_style not the WindowsStyle.
+- New class: scalable_allocator (and cache_aligned_allocator using that
+ if it exists).
+- Added parallel_for/tacheon example.
+- Removed C-style casts from headers for better C++ compliance.
+- Bug fixes.
+- Documentation improvements.
+- Improved performance of the concurrent_hash_map class.
+- Upgraded parallel_sort() to support STL-style random-access iterators
+ instead of just pointers.
+- The Windows vs7_1 directories renamed to vs7.1 in examples.
+- New class: spin version of reader-writer lock.
+- Added push_back() interface to concurrent_vector().
+
+------------------------------------------------------------------------
+Intel TBB 1.0 beta commercial release
+
+Initial release.
+
+Features / APIs:
+
+- Concurrent containers: ConcurrentHashTable, ConcurrentVector,
+ ConcurrentQueue.
+- Parallel algorithms: ParallelFor, ParallelReduce, ParallelScan,
+ ParallelWhile, Pipeline, ParallelSort.
+- Support: AlignedSpace, BlockedRange (i.e., 1D), BlockedRange2D
+- Task scheduler with multi-master support.
+- Atomics: read, write, fetch-and-store, fetch-and-add, compare-and-swap.
+- Locks: spin, reader-writer, queuing, OS-wrapper.
+- Memory allocation: STL-style memory allocator that avoids false
+ sharing.
+- Timers.
+
+Tools Support:
+- Intel(R) Thread Checker 3.0.
+- Intel(R) Thread Profiler 3.0.
+
+Documentation:
+- First Use Documents: README.txt, INSTALL.txt, Release_Notes.txt,
+ Doc_Index.html, Getting_Started.pdf, Tutorial.pdf, Reference.pdf.
+- Class hierarchy HTML pages (Doxygen).
+- Tree of index.html pages for navigating the installed package, esp.
+ for the examples.
+
+Examples:
+- One for each of these TBB features: ConcurrentHashTable, ParallelFor,
+ ParallelReduce, ParallelWhile, Pipeline, Task.
+- Live copies of examples from Getting_Started.pdf.
+- TestAll example that exercises every class and header in the package
+ (i.e., a "liveness test").
+- Compilers: see Release_Notes.txt.
+- APIs: OpenMP, WinThreads, Pthreads.
+
+Packaging:
+- Package for Windows installs IA-32 and EM64T bits.
+- Package for Linux installs IA-32, EM64T and IPF bits.
+- Package for Mac OS* X installs IA-32 bits.
+- All packages support Intel(R) software setup assistant (ISSA) and
+ install-time FLEXlm license checking.
+- ISSA support allows license file to be specified directly in case of
+ no Internet connection or problems with IRC or serial #s.
+- Linux installer allows root or non-root, RPM or non-RPM installs.
+- FLEXlm license servers (for those who need floating/counted licenses)
+ are provided separately on Intel(R) Premier.
+
+------------------------------------------------------------------------
+Intel, the Intel logo, Xeon, Intel Xeon Phi, and Cilk are registered
+trademarks or trademarks of Intel Corporation or its subsidiaries in
+the United States and other countries.
+
+* Other names and brands may be claimed as the property of others.
diff --git a/dependencies/tbb/CMakeLists.txt b/dependencies/tbb/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..1d999ac2a6773f55b7a46c53ac848226ef3c8b09
--- /dev/null
+++ b/dependencies/tbb/CMakeLists.txt
@@ -0,0 +1,531 @@
+cmake_minimum_required (VERSION 2.8.12 FATAL_ERROR)
+project (tbb CXX)
+
+include(CheckCXXCompilerFlag)
+include(CheckCXXSourceRuns)
+
+if(POLICY CMP0058)
+ cmake_policy(SET CMP0058 NEW)
+endif()
+
+if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
+ message(STATUS "Setting build type to 'Release' as none was specified.")
+ set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build." FORCE)
+ set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release"
+ "MinSizeRel" "RelWithDebInfo")
+endif()
+
+if(NOT TBB_INSTALL_RUNTIME_DIR)
+ set(TBB_INSTALL_RUNTIME_DIR bin)
+endif()
+if(NOT TBB_INSTALL_LIBRARY_DIR)
+ set(TBB_INSTALL_LIBRARY_DIR lib)
+endif()
+if(NOT TBB_INSTALL_ARCHIVE_DIR)
+ set(TBB_INSTALL_ARCHIVE_DIR lib)
+endif()
+if(NOT TBB_INSTALL_INCLUDE_DIR)
+ set(TBB_INSTALL_INCLUDE_DIR include)
+endif()
+
+include_directories(include src src/rml/include ${CMAKE_CURRENT_BINARY_DIR})
+
+option(TBB_BUILD_SHARED "Build TBB shared library" OFF)
+option(TBB_BUILD_STATIC "Build TBB static library" ON)
+option(TBB_BUILD_TBBMALLOC "Build TBB malloc library" OFF)
+option(TBB_BUILD_TBBMALLOC_PROXY "Build TBB malloc proxy library" OFF)
+option(TBB_BUILD_TESTS "Build TBB tests and enable testing infrastructure" OFF)
+option(TBB_CI_BUILD "Is this a continuous integration build?" OFF)
+
+if(APPLE)
+ set(CMAKE_MACOSX_RPATH ON)
+endif()
+
+
+if (MSVC)
+ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /NODEFAULTLIB:tbb_debug.lib")
+ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /NODEFAULTLIB:tbb.lib")
+endif()
+
+
+file(GLOB tbb_src "${CMAKE_CURRENT_SOURCE_DIR}/src/tbb/*.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/src/old/*.cpp")
+list(APPEND tbb_src ${CMAKE_CURRENT_SOURCE_DIR}/src/rml/client/rml_tbb.cpp)
+file(GLOB to_remove "${CMAKE_CURRENT_SOURCE_DIR}/src/old/test*.cpp")
+list(REMOVE_ITEM tbb_src ${to_remove})
+
+set(tbbmalloc_static_src
+ src/tbbmalloc/backend.cpp
+ src/tbbmalloc/large_objects.cpp
+ src/tbbmalloc/backref.cpp
+ src/tbbmalloc/tbbmalloc.cpp
+ src/tbbmalloc/frontend.cpp
+ src/tbb/itt_notify.cpp)
+
+set(tbbmalloc_src ${tbbmalloc_static_src})
+
+set(tbbmalloc_proxy_src
+ src/tbbmalloc/proxy.cpp
+ src/tbbmalloc/tbb_function_replacement.cpp)
+
+if (CMAKE_SYSTEM_PROCESSOR MATCHES "(i386|x86_64)")
+ if (NOT APPLE AND NOT MINGW)
+ add_definitions(-DDO_ITT_NOTIFY)
+ endif()
+endif()
+
+if (APPLE)
+ # Disable annoying "has no symbols" warnings
+ set(CMAKE_C_ARCHIVE_CREATE " Scr ")
+ set(CMAKE_CXX_ARCHIVE_CREATE " Scr ")
+ set(CMAKE_C_ARCHIVE_FINISH " -no_warning_for_no_symbols -c ")
+ set(CMAKE_CXX_ARCHIVE_FINISH " -no_warning_for_no_symbols -c ")
+endif()
+
+macro(CHECK_CXX_COMPILER_AND_LINKER_FLAGS _RESULT _CXX_FLAGS _LINKER_FLAGS)
+ set(CMAKE_REQUIRED_FLAGS ${_CXX_FLAGS})
+ set(CMAKE_REQUIRED_LIBRARIES ${_LINKER_FLAGS})
+ set(CMAKE_REQUIRED_QUIET TRUE)
+ check_cxx_source_runs("#include \nint main(int argc, char **argv) { std::cout << \"test\"; return 0; }" ${_RESULT})
+ set(CMAKE_REQUIRED_FLAGS "")
+ set(CMAKE_REQUIRED_LIBRARIES "")
+endmacro()
+
+# Prefer libc++ in conjunction with Clang
+if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
+ if (CMAKE_CXX_FLAGS MATCHES "-stdlib=libc\\+\\+")
+ message(STATUS "TBB: using libc++.")
+ else()
+ CHECK_CXX_COMPILER_AND_LINKER_FLAGS(HAS_LIBCPP "-stdlib=libc++" "-stdlib=libc++")
+ if (HAS_LIBCPP)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++ -D_LIBCPP_VERSION")
+ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stdlib=libc++")
+ set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -stdlib=libc++")
+ message(STATUS "TBB: using libc++.")
+ else()
+ message(STATUS "TBB: NOT using libc++.")
+ endif()
+ endif()
+endif()
+
+if (UNIX)
+ add_definitions (-DUSE_PTHREAD)
+
+ check_cxx_compiler_flag ("-std=c++11" SUPPORTS_STDCXX11)
+ if (SUPPORTS_STDCXX11)
+ set (CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")
+ endif ()
+
+ check_cxx_compiler_flag ("-mrtm -Werror" SUPPORTS_MRTM)
+ if (SUPPORTS_MRTM)
+ set (CMAKE_CXX_FLAGS "-mrtm ${CMAKE_CXX_FLAGS}")
+ endif ()
+
+elseif(WIN32)
+ if (MSVC)
+ cmake_minimum_required (VERSION 3.1)
+ enable_language(ASM_MASM)
+ set(CMAKE_CXX_FLAGS "/GS- /Zc:wchar_t /Zc:forScope /DUSE_WINTHREAD ${CMAKE_CXX_FLAGS}")
+ set(CMAKE_CXX_FLAGS "/D_CRT_SECURE_NO_DEPRECATE /D_WIN32_WINNT=0x0600 ${CMAKE_CXX_FLAGS}")
+ check_cxx_compiler_flag ("/volatile:iso" SUPPORTS_VOLATILE_FLAG)
+ if (SUPPORTS_VOLATILE_FLAG)
+ set(CMAKE_CXX_FLAGS "/volatile:iso ${CMAKE_CXX_FLAGS}")
+ endif ()
+ set(CMAKE_CXX_FLAGS "/wd4267 /wd4800 /wd4146 /wd4244 /wd4577 /wd4018 ${CMAKE_CXX_FLAGS}")
+ if (NOT CMAKE_SIZEOF_VOID_P)
+ message(FATAL_ERROR "'CMAKE_SIZEOF_VOID_P' is undefined. Please delete your build directory and rerun CMake again!")
+ endif()
+
+ if (CMAKE_SIZEOF_VOID_P EQUAL 8)
+ list(APPEND tbb_src src/tbb/intel64-masm/atomic_support.asm
+ src/tbb/intel64-masm/itsx.asm src/tbb/intel64-masm/intel64_misc.asm)
+ list(APPEND tbbmalloc_src src/tbb/intel64-masm/atomic_support.asm)
+ set(CMAKE_ASM_MASM_FLAGS "/DEM64T=1 ${CMAKE_ASM_MASM_FLAGS}")
+ else()
+ list(APPEND tbb_src src/tbb/ia32-masm/atomic_support.asm
+ src/tbb/ia32-masm/itsx.asm src/tbb/ia32-masm/lock_byte.asm)
+ # Enable SAFESEH feature for assembly (x86 builds only).
+ set(CMAKE_ASM_MASM_FLAGS "/safeseh ${CMAKE_ASM_MASM_FLAGS}")
+ endif()
+ elseif (MINGW)
+ add_definitions(-DUSE_WINTHREAD)
+ add_definitions(-D_WIN32_WINNT=0x0502)
+ set(CMAKE_CXX_FLAGS "-mthreads ${CMAKE_CXX_FLAGS}")
+ endif ()
+endif()
+
+if (MSVC)
+ set(ENABLE_RTTI "/EHsc /GR ")
+ set(DISABLE_RTTI "/EHs- /GR- ")
+elseif (UNIX)
+ set(ENABLE_RTTI "-frtti -fexceptions ")
+ set(DISABLE_RTTI "-fno-rtti -fno-exceptions ")
+endif ()
+
+##--------
+# - Added TBB_USE_GLIBCXX_VERSION macro to specify the version of GNU
+# libstdc++ when it cannot be properly recognized, e.g. when used
+# with Clang on Linux* OS. Inspired by a contribution from David A.
+if (NOT TBB_USE_GLIBCXX_VERSION AND UNIX AND NOT APPLE)
+ if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
+ # using Clang
+ string(REPLACE "." "0" TBB_USE_GLIBCXX_VERSION ${CMAKE_CXX_COMPILER_VERSION})
+ endif()
+endif()
+
+if (TBB_USE_GLIBCXX_VERSION)
+ add_definitions(-DTBB_USE_GLIBCXX_VERSION=${TBB_USE_GLIBCXX_VERSION})
+endif()
+
+##-------
+
+if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
+ check_cxx_compiler_flag ("-flifetime-dse=1" SUPPORTS_FLIFETIME)
+ if (SUPPORTS_FLIFETIME)
+ add_definitions(-flifetime-dse=1)
+ endif()
+endif()
+
+# Linker export definitions
+if (APPLE)
+ set (ARCH_PREFIX "mac")
+elseif(WIN32)
+ set (ARCH_PREFIX "win")
+else()
+ set (ARCH_PREFIX "lin")
+endif()
+
+if (CMAKE_SIZEOF_VOID_P EQUAL 8)
+ set(ARCH_PREFIX "${ARCH_PREFIX}64")
+else()
+ set(ARCH_PREFIX "${ARCH_PREFIX}32")
+endif()
+
+if (MINGW)
+ set (ARCH_PREFIX "${ARCH_PREFIX}-gcc")
+ # there's no win32-gcc-tbb-export.def, use lin32-tbb-export.def
+ execute_process (COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/src/tbb/lin32-tbb-export.def ${CMAKE_CURRENT_SOURCE_DIR}/src/tbb/win32-gcc-tbb-export.def)
+endif()
+
+if (MSVC)
+ add_custom_command(OUTPUT tbb.def
+ COMMAND ${CMAKE_CXX_COMPILER} /TC /EP ${CMAKE_CURRENT_SOURCE_DIR}/src/tbb/${ARCH_PREFIX}-tbb-export.def -I ${CMAKE_CURRENT_SOURCE_DIR}/include > tbb.def
+ MAIN_DEPENDENCY ${CMAKE_CURRENT_SOURCE_DIR}/src/tbb/${ARCH_PREFIX}-tbb-export.def
+ COMMENT "Preprocessing tbb.def"
+ )
+
+ add_custom_command(OUTPUT tbbmalloc.def
+ COMMAND ${CMAKE_CXX_COMPILER} /TC /EP ${CMAKE_CURRENT_SOURCE_DIR}/src/tbbmalloc/${ARCH_PREFIX}-tbbmalloc-export.def -I ${CMAKE_CURRENT_SOURCE_DIR}/include > tbbmalloc.def
+ MAIN_DEPENDENCY ${CMAKE_CURRENT_SOURCE_DIR}/src/tbbmalloc/${ARCH_PREFIX}-tbbmalloc-export.def
+ COMMENT "Preprocessing tbbmalloc.def"
+ )
+else()
+ add_custom_command(OUTPUT tbb.def
+ COMMAND ${CMAKE_CXX_COMPILER} -xc++ -E ${CMAKE_CURRENT_SOURCE_DIR}/src/tbb/${ARCH_PREFIX}-tbb-export.def -I ${CMAKE_CURRENT_SOURCE_DIR}/include -o tbb.def
+ MAIN_DEPENDENCY ${CMAKE_CURRENT_SOURCE_DIR}/src/tbb/${ARCH_PREFIX}-tbb-export.def
+ COMMENT "Preprocessing tbb.def"
+ )
+
+ add_custom_command(OUTPUT tbbmalloc.def
+ COMMAND ${CMAKE_CXX_COMPILER} -xc++ -E ${CMAKE_CURRENT_SOURCE_DIR}/src/tbbmalloc/${ARCH_PREFIX}-tbbmalloc-export.def -I ${CMAKE_CURRENT_SOURCE_DIR}/include -o tbbmalloc.def
+ MAIN_DEPENDENCY ${CMAKE_CURRENT_SOURCE_DIR}/src/tbbmalloc/${ARCH_PREFIX}-tbbmalloc-export.def
+ COMMENT "Preprocessing tbbmalloc.def"
+ )
+endif()
+
+add_custom_target(tbb_def_files DEPENDS tbb.def tbbmalloc.def)
+
+# TBB library
+if (TBB_BUILD_STATIC)
+ add_library(tbb_static STATIC ${tbb_src})
+ set_property(TARGET tbb_static APPEND PROPERTY COMPILE_DEFINITIONS "__TBB_BUILD=1")
+ set_property(TARGET tbb_static APPEND_STRING PROPERTY COMPILE_FLAGS ${ENABLE_RTTI})
+ install(TARGETS tbb_static ARCHIVE DESTINATION ${TBB_INSTALL_ARCHIVE_DIR})
+ if (MSVC)
+ target_compile_definitions(tbb_static PUBLIC __TBB_NO_IMPLICIT_LINKAGE=1)
+ endif()
+
+ if (UNIX AND NOT APPLE)
+ target_link_libraries(tbb_static PUBLIC pthread dl)
+ endif()
+endif()
+
+if (TBB_BUILD_SHARED)
+ add_library(tbb SHARED ${tbb_src})
+ set_property(TARGET tbb APPEND PROPERTY COMPILE_DEFINITIONS "__TBB_BUILD=1")
+ set_property(TARGET tbb APPEND_STRING PROPERTY COMPILE_FLAGS ${ENABLE_RTTI})
+ add_dependencies(tbb tbb_def_files)
+
+ if (APPLE)
+ set_property(TARGET tbb APPEND PROPERTY LINK_FLAGS "-Wl,-exported_symbols_list,${CMAKE_CURRENT_BINARY_DIR}/tbb.def")
+ elseif (MSVC)
+ set_property(TARGET tbb APPEND PROPERTY LINK_FLAGS "/DEF:${CMAKE_CURRENT_BINARY_DIR}/tbb.def")
+ else ()
+ set_property(TARGET tbb APPEND PROPERTY LINK_FLAGS "-Wl,-version-script,${CMAKE_CURRENT_BINARY_DIR}/tbb.def")
+ endif()
+
+ install(TARGETS tbb
+ LIBRARY DESTINATION ${TBB_INSTALL_LIBRARY_DIR}
+ ARCHIVE DESTINATION ${TBB_INSTALL_ARCHIVE_DIR}
+ RUNTIME DESTINATION ${TBB_INSTALL_RUNTIME_DIR})
+ if (UNIX AND NOT APPLE)
+ target_link_libraries(tbb PUBLIC pthread dl)
+ endif()
+ if (MSVC)
+ target_compile_definitions(tbb PUBLIC __TBB_NO_IMPLICIT_LINKAGE=1)
+ endif()
+endif()
+
+
+if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
+ # Quench a warning on GCC
+ set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/src/tbb/governor.cpp COMPILE_FLAGS "-Wno-missing-field-initializers ")
+elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
+ # Quench a warning on Clang
+ set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/src/tbb/itt_notify.cpp COMPILE_FLAGS "-Wno-varargs ")
+elseif(MSVC)
+ # Quench a warning on MSVC
+ set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/src/tbb/scheduler.cpp COMPILE_FLAGS "/wd4458 ")
+endif()
+
+if(TBB_BUILD_TBBMALLOC)
+ # TBB malloc library
+ if (TBB_BUILD_STATIC)
+ add_library(tbbmalloc_static STATIC ${tbbmalloc_static_src})
+ set_property(TARGET tbbmalloc_static APPEND PROPERTY COMPILE_DEFINITIONS "__TBBMALLOC_BUILD=1")
+ set_property(TARGET tbbmalloc_static APPEND_STRING PROPERTY COMPILE_FLAGS ${DISABLE_RTTI})
+ if (MSVC)
+ target_compile_definitions(tbbmalloc_static PUBLIC __TBB_NO_IMPLICIT_LINKAGE=1 __TBBMALLOC_NO_IMPLICIT_LINKAGE=1)
+ endif()
+ install(TARGETS tbbmalloc_static ARCHIVE DESTINATION ${TBB_INSTALL_ARCHIVE_DIR})
+ endif()
+
+ if (TBB_BUILD_SHARED)
+ add_library(tbbmalloc SHARED ${tbbmalloc_src})
+ set_property(TARGET tbbmalloc APPEND PROPERTY COMPILE_DEFINITIONS "__TBBMALLOC_BUILD=1")
+ set_property(TARGET tbbmalloc APPEND_STRING PROPERTY COMPILE_FLAGS ${DISABLE_RTTI})
+ add_dependencies(tbbmalloc tbb_def_files)
+ if (APPLE)
+ set_property(TARGET tbbmalloc APPEND PROPERTY LINK_FLAGS "-Wl,-exported_symbols_list,${CMAKE_CURRENT_BINARY_DIR}/tbbmalloc.def")
+ elseif (MSVC)
+ set_property(TARGET tbbmalloc APPEND PROPERTY LINK_FLAGS "/DEF:${CMAKE_CURRENT_BINARY_DIR}/tbbmalloc.def")
+ else ()
+ set_property(TARGET tbbmalloc APPEND PROPERTY LINK_FLAGS "-Wl,-version-script,${CMAKE_CURRENT_BINARY_DIR}/tbbmalloc.def")
+ endif()
+ if (MSVC)
+ target_compile_definitions(tbbmalloc PUBLIC __TBB_NO_IMPLICIT_LINKAGE=1 __TBBMALLOC_NO_IMPLICIT_LINKAGE=1)
+ endif()
+ install(TARGETS tbbmalloc
+ LIBRARY DESTINATION ${TBB_INSTALL_LIBRARY_DIR}
+ ARCHIVE DESTINATION ${TBB_INSTALL_ARCHIVE_DIR}
+ RUNTIME DESTINATION ${TBB_INSTALL_RUNTIME_DIR})
+ if (UNIX AND NOT APPLE)
+ target_link_libraries(tbbmalloc PUBLIC pthread dl)
+ endif()
+ endif()
+endif()
+
+if(TBB_BUILD_TBBMALLOC_PROXY)
+ # TBB malloc proxy library
+ if (TBB_BUILD_STATIC)
+ add_library(tbbmalloc_proxy_static STATIC ${tbbmalloc_proxy_src})
+ set_property(TARGET tbbmalloc_proxy_static APPEND PROPERTY COMPILE_DEFINITIONS "__TBBMALLOC_BUILD=1")
+ set_property(TARGET tbbmalloc_proxy_static APPEND_STRING PROPERTY COMPILE_FLAGS ${DISABLE_RTTI})
+ install(TARGETS tbbmalloc_proxy_static ARCHIVE DESTINATION ${TBB_INSTALL_ARCHIVE_DIR})
+ endif()
+
+ if (TBB_BUILD_SHARED)
+ add_library(tbbmalloc_proxy SHARED ${tbbmalloc_proxy_src})
+ set_property(TARGET tbbmalloc_proxy APPEND PROPERTY COMPILE_DEFINITIONS "__TBBMALLOC_BUILD=1")
+ set_property(TARGET tbbmalloc_proxy APPEND_STRING PROPERTY COMPILE_FLAGS ${DISABLE_RTTI})
+ target_link_libraries(tbbmalloc_proxy PUBLIC tbbmalloc)
+ install(TARGETS tbbmalloc_proxy
+ LIBRARY DESTINATION ${TBB_INSTALL_LIBRARY_DIR}
+ ARCHIVE DESTINATION ${TBB_INSTALL_ARCHIVE_DIR}
+ RUNTIME DESTINATION ${TBB_INSTALL_RUNTIME_DIR})
+ if (UNIX AND NOT APPLE)
+ target_link_libraries(tbbmalloc_proxy PUBLIC pthread dl)
+ endif()
+ endif()
+endif()
+
+install(DIRECTORY include/tbb DESTINATION ${TBB_INSTALL_INCLUDE_DIR})
+
+# version_string.ver
+if (UNIX)
+ execute_process (COMMAND date "+%a, %d %b %Y %H:%M:%S %z"
+ OUTPUT_VARIABLE _configure_date
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+elseif (WIN32)
+ execute_process (COMMAND cmd " /C date /T"
+ OUTPUT_VARIABLE _configure_date
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+else ()
+ set (_configure_date "Unknown")
+endif()
+include_directories (${CMAKE_BINARY_DIR})
+configure_file (build/version_string.ver.in version_string.ver @ONLY)
+
+if (TBB_BUILD_TESTS)
+ enable_language (C)
+ enable_testing ()
+
+ find_library (LIBRT_LIBRARIES rt)
+ find_library (LIDL_LIBRARIES dl)
+ find_package (Threads)
+ if (NOT APPLE)
+ find_package (OpenMP)
+ endif()
+
+ macro (tbb_add_test testname)
+ set (full_testname tbb_test_${testname})
+ add_executable (${full_testname} src/test/test_${testname}.cpp)
+ if (TBB_BUILD_SHARED)
+ target_link_libraries (${full_testname} PRIVATE tbb tbbmalloc)
+ target_compile_definitions (${full_testname} PRIVATE __TBB_LIB_NAME=tbb)
+ else ()
+ target_link_libraries (${full_testname} PRIVATE tbb_static tbbmalloc_static)
+ target_compile_definitions (${full_testname} PRIVATE __TBB_LIB_NAME=tbb_static)
+ endif ()
+ if (LIBRT_LIBRARIES)
+ target_link_libraries (${full_testname} PRIVATE ${LIBRT_LIBRARIES})
+ endif ()
+ if (LIDL_LIBRARIES)
+ target_link_libraries (${full_testname} PRIVATE ${LIDL_LIBRARIES})
+ endif ()
+ if (Threads_FOUND)
+ target_link_libraries (${full_testname} PRIVATE ${CMAKE_THREAD_LIBS_INIT})
+ endif ()
+ if (OPENMP_FOUND AND "${testname}" MATCHES "openmp")
+ set_target_properties (${full_testname} PROPERTIES COMPILE_FLAGS "${OpenMP_CXX_FLAGS}")
+ set_target_properties (${full_testname} PROPERTIES LINK_FLAGS "${OpenMP_CXX_FLAGS}")
+ endif()
+ if (MINGW)
+ target_link_libraries (${full_testname} PRIVATE psapi)
+ endif ()
+ add_test (NAME ${full_testname} COMMAND ${full_testname})
+ endmacro ()
+
+ tbb_add_test (aggregator)
+ tbb_add_test (aligned_space)
+ tbb_add_test (assembly)
+ tbb_add_test (async_msg)
+ tbb_add_test (async_node)
+ # tbb_add_test (atomic) # msvc64/debug timeouts: Compile-time initialization fails for static tbb::atomic variables
+ tbb_add_test (blocked_range2d)
+ tbb_add_test (blocked_range3d)
+ tbb_add_test (blocked_range)
+ tbb_add_test (broadcast_node)
+ tbb_add_test (buffer_node)
+ tbb_add_test (cache_aligned_allocator)
+ if (NOT WIN32)
+ tbb_add_test (cache_aligned_allocator_STL)
+ endif()
+ tbb_add_test (cilk_dynamic_load)
+ tbb_add_test (cilk_interop)
+ tbb_add_test (combinable)
+ tbb_add_test (composite_node)
+ tbb_add_test (concurrent_hash_map)
+ tbb_add_test (concurrent_lru_cache)
+ # tbb_add_test (concurrent_monitor) # too long
+ # tbb_add_test (concurrent_priority_queue)
+ tbb_add_test (concurrent_queue)
+ # tbb_add_test (concurrent_queue_whitebox)
+ tbb_add_test (concurrent_unordered_map)
+ # tbb_add_test (concurrent_unordered_set)
+ tbb_add_test (concurrent_vector)
+ tbb_add_test (continue_node)
+ tbb_add_test (critical_section)
+ tbb_add_test (dynamic_link)
+ # tbb_add_test (eh_algorithms)
+ tbb_add_test (eh_flow_graph)
+ # tbb_add_test (eh_tasks)
+ tbb_add_test (enumerable_thread_specific)
+ tbb_add_test (examples_common_utility)
+ # tbb_add_test (fast_random)
+ tbb_add_test (flow_graph)
+ tbb_add_test (flow_graph_whitebox)
+ # tbb_add_test (fp) # mingw: harness_fp.h:66, assertion !checkConsistency || (ctl.mxcsr & SSE_RND_MODE_MASK) >> 3 == (ctl.x87cw & FE_RND_MODE_MASK): failed
+ # tbb_add_test (function_node) # mingw:random timeout
+ # tbb_add_test (global_control)
+ # tbb_add_test (global_control_whitebox)
+ tbb_add_test (halt)
+ tbb_add_test (handle_perror)
+ # tbb_add_test (hw_concurrency)
+ tbb_add_test (indexer_node)
+ tbb_add_test (inits_loop)
+ tbb_add_test (intrusive_list)
+ tbb_add_test (ittnotify)
+ # tbb_add_test (join_node) #msvc/64: fatal error C1128: number of sections exceeded object file format limit: compile with /bigob
+ tbb_add_test (lambda)
+ tbb_add_test (limiter_node)
+ # tbb_add_test (malloc_atexit)
+ tbb_add_test (malloc_compliance)
+ tbb_add_test (malloc_init_shutdown)
+ # tbb_add_test (malloc_lib_unload)
+ # tbb_add_test (malloc_overload)
+ tbb_add_test (malloc_pools)
+ tbb_add_test (malloc_regression)
+ # tbb_add_test (malloc_used_by_lib)
+ # tbb_add_test (malloc_whitebox)
+ tbb_add_test (model_plugin)
+ # tbb_add_test (multifunction_node) # too long
+ tbb_add_test (mutex)
+ tbb_add_test (mutex_native_threads)
+ # tbb_add_test (opencl_node)
+ if (OPENMP_FOUND)
+ tbb_add_test (openmp)
+ endif ()
+ tbb_add_test (overwrite_node)
+ # tbb_add_test (parallel_do)
+ if (NOT TBB_CI_BUILD)
+ # This seems to fail on CI platforms (AppVeyor/Travis), perhaps because the VM exposes just 1 core?
+ tbb_add_test (parallel_for)
+ endif()
+ tbb_add_test (parallel_for_each)
+ tbb_add_test (parallel_for_vectorization)
+ tbb_add_test (parallel_invoke)
+ tbb_add_test (parallel_pipeline)
+ tbb_add_test (parallel_reduce)
+ tbb_add_test (parallel_scan)
+ tbb_add_test (parallel_sort)
+ tbb_add_test (parallel_while)
+ # tbb_add_test (partitioner_whitebox) # too long
+ tbb_add_test (pipeline)
+ # tbb_add_test (pipeline_with_tbf) # takes forever on appveyor
+ tbb_add_test (priority_queue_node)
+ tbb_add_test (queue_node)
+ tbb_add_test (reader_writer_lock)
+ # tbb_add_test (runtime_loader) # LINK : fatal error LNK1104: cannot open file 'tbbproxy.lib' [C:\projects\tbb\test_runtime_loader.vcxproj]
+ tbb_add_test (rwm_upgrade_downgrade)
+ # tbb_add_test (ScalableAllocator)
+ if (NOT WIN32)
+ tbb_add_test (ScalableAllocator_STL)
+ endif()
+ tbb_add_test (semaphore)
+ # tbb_add_test (sequencer_node) # msvc: timeout
+ tbb_add_test (source_node)
+ tbb_add_test (split_node)
+ tbb_add_test (static_assert)
+ tbb_add_test (std_thread)
+ tbb_add_test (tagged_msg)
+ # tbb_add_test (task_arena) # LINK : fatal error LNK1104: cannot open file '__TBB_LIB_NAME.lib' [C:\projects\tbb\test_task_arena.vcxproj]
+ # tbb_add_test (task_assertions)
+ tbb_add_test (task_auto_init)
+ tbb_add_test (task)
+ # tbb_add_test (task_enqueue) # too long
+ tbb_add_test (task_group)
+ # tbb_add_test (task_leaks)
+ # tbb_add_test (task_priority)
+ # tbb_add_test (task_scheduler_init) # msvc: test_task_scheduler_init.cpp:68, assertion !test_mandatory_parallelism || Harness::CanReachConcurrencyLevel(threads): failed
+ tbb_add_test (task_scheduler_observer)
+ tbb_add_test (task_steal_limit)
+ tbb_add_test (tbb_condition_variable)
+ tbb_add_test (tbb_fork)
+ # tbb_add_test (tbb_header)
+ tbb_add_test (tbb_thread)
+ # tbb_add_test (tbb_version)
+ tbb_add_test (tick_count)
+ tbb_add_test (tuple)
+ tbb_add_test (write_once_node)
+ tbb_add_test (yield)
+endif ()
diff --git a/dependencies/tbb/LICENSE b/dependencies/tbb/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..261eeb9e9f8b2b4b0d119366dda99c6fd7d35c64
--- /dev/null
+++ b/dependencies/tbb/LICENSE
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/dependencies/tbb/Makefile.old b/dependencies/tbb/Makefile.old
new file mode 100644
index 0000000000000000000000000000000000000000..40ca412a4389bde7ff1f9057946a35c4cdcd92ec
--- /dev/null
+++ b/dependencies/tbb/Makefile.old
@@ -0,0 +1,84 @@
+# Copyright (c) 2005-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#
+#
+#
+
+tbb_root?=.
+include $(tbb_root)/build/common.inc
+.PHONY: default all tbb tbbmalloc tbbproxy test examples
+
+#workaround for non-depend targets tbb and tbbmalloc which both depend on version_string.ver
+#According to documentation, recursively invoked make commands can process their targets in parallel
+.NOTPARALLEL: tbb tbbmalloc tbbproxy
+
+default: tbb tbbmalloc $(if $(use_proxy),tbbproxy)
+
+all: tbb tbbmalloc tbbproxy test examples
+
+tbb: mkdir
+ $(MAKE) -C "$(work_dir)_debug" -r -f $(tbb_root)/build/Makefile.tbb cfg=debug
+ $(MAKE) -C "$(work_dir)_release" -r -f $(tbb_root)/build/Makefile.tbb cfg=release
+
+tbbmalloc: mkdir
+ $(MAKE) -C "$(work_dir)_debug" -r -f $(tbb_root)/build/Makefile.tbbmalloc cfg=debug malloc
+ $(MAKE) -C "$(work_dir)_release" -r -f $(tbb_root)/build/Makefile.tbbmalloc cfg=release malloc
+
+tbbproxy: mkdir
+ $(MAKE) -C "$(work_dir)_debug" -r -f $(tbb_root)/build/Makefile.tbbproxy cfg=debug tbbproxy
+ $(MAKE) -C "$(work_dir)_release" -r -f $(tbb_root)/build/Makefile.tbbproxy cfg=release tbbproxy
+
+test: tbb tbbmalloc $(if $(use_proxy),tbbproxy)
+ -$(MAKE) -C "$(work_dir)_debug" -r -f $(tbb_root)/build/Makefile.tbbmalloc cfg=debug malloc_test
+ -$(MAKE) -C "$(work_dir)_debug" -r -f $(tbb_root)/build/Makefile.test cfg=debug
+ -$(MAKE) -C "$(work_dir)_release" -r -f $(tbb_root)/build/Makefile.tbbmalloc cfg=release malloc_test
+ -$(MAKE) -C "$(work_dir)_release" -r -f $(tbb_root)/build/Makefile.test cfg=release
+
+rml: mkdir
+ $(MAKE) -C "$(work_dir)_debug" -r -f $(tbb_root)/build/Makefile.rml cfg=debug
+ $(MAKE) -C "$(work_dir)_release" -r -f $(tbb_root)/build/Makefile.rml cfg=release
+
+
+examples: tbb tbbmalloc
+ $(MAKE) -C examples -r -f Makefile tbb_root=.. release test
+
+python: mkdir
+ $(MAKE) -C "$(work_dir)_release" -r -f $(tbb_root)/build/Makefile.tbb cfg=release
+ bash -c ". $(work_dir)_release$(SLASH)tbbvars.sh && $(MAKE) -rC '$(full_tbb_root)/python' CXX=$(compiler) install test-install"
+
+.PHONY: clean clean_examples mkdir info
+
+clean: clean_examples
+ $(shell $(RM) $(work_dir)_release$(SLASH)*.* >$(NUL) 2>$(NUL))
+ $(shell $(RD) $(work_dir)_release >$(NUL) 2>$(NUL))
+ $(shell $(RM) $(work_dir)_debug$(SLASH)*.* >$(NUL) 2>$(NUL))
+ $(shell $(RD) $(work_dir)_debug >$(NUL) 2>$(NUL))
+ @echo clean done
+
+clean_examples:
+ $(shell $(MAKE) -s -i -r -C examples -f Makefile tbb_root=.. clean >$(NUL) 2>$(NUL))
+
+mkdir:
+ $(shell $(MD) "$(work_dir)_release" >$(NUL) 2>$(NUL))
+ $(shell $(MD) "$(work_dir)_debug" >$(NUL) 2>$(NUL))
+ @echo Created $(work_dir)_release and ..._debug directories
+
+info:
+ @echo OS: $(tbb_os)
+ @echo arch=$(arch)
+ @echo compiler=$(compiler)
+ @echo runtime=$(runtime)
+ @echo tbb_build_prefix=$(tbb_build_prefix)
+
diff --git a/dependencies/tbb/README b/dependencies/tbb/README
new file mode 100644
index 0000000000000000000000000000000000000000..fcc87af0c92961bd0db40493877addecc4efcae3
--- /dev/null
+++ b/dependencies/tbb/README
@@ -0,0 +1,11 @@
+Intel(R) Threading Building Blocks - README
+
+See index.html for directions and documentation.
+
+If source is present (./Makefile and src/ directories),
+type 'gmake' in this directory to build and test.
+
+See examples/index.html for runnable examples and directions.
+
+See http://threadingbuildingblocks.org for full documentation
+and software information.
diff --git a/dependencies/tbb/README.md b/dependencies/tbb/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..42bb100a7c955df97056744e5597693780ad487b
--- /dev/null
+++ b/dependencies/tbb/README.md
@@ -0,0 +1,35 @@
+### Intel(R) Threading Building Blocks
+
+[](https://github.com/01org/tbb/releases/tag/2017_U7)
+[](LICENSE)
+[](https://travis-ci.org/wjakob/tbb)
+[](https://ci.appveyor.com/project/wjakob/tbb/branch/master)
+
+This is git repository is currently based on TBB 2017 Update 7 and will be
+updated from time to time to track the most recent release. The only
+modification is the addition of a CMake-based build system.
+
+This is convenient for other projects that use CMake and TBB because TBB can be
+easily incorporated into their build process using git submodules and a simple
+``add_subdirectory`` command.
+
+Currently, the CMake-based build can create shared and static versions of
+`libtbb`, `libtbbmalloc` and `libtbbmalloc_proxy` for the Intel `i386` and
+`x86_64` architectures on Windows (Visual Studio, MinGW), MacOS (Clang) and
+Linux (GCC & Clang). The `armv7` and `armv8` architectures are supported on
+Linux (GCC & Clang). Other combinations may work but have not been tested.
+
+See index.html for general directions and documentation regarding TBB.
+
+See examples/index.html for runnable examples and directions.
+
+See http://threadingbuildingblocks.org for full documentation
+and software information.
+
+Note: Intel, Thread Building Blocks, and TBB are either registered trademarks or
+trademarks of Intel Corporation in the United States and/or other countries.
+
+The CMake build contains the following additional/changed files that are not
+part of the regular release: ``build/mingw_cross_toolchain.cmake``,
+``build/version_string.ver.in``, ``.gitignore`` (modified), ``README.md`` (this
+file), and ``Makefile.old`` (renamed from ``Makefile``).
diff --git a/dependencies/tbb/build/AIX.gcc.inc b/dependencies/tbb/build/AIX.gcc.inc
new file mode 100644
index 0000000000000000000000000000000000000000..18e6e6ad9ce4eb2739df9e68f145048ee340af1d
--- /dev/null
+++ b/dependencies/tbb/build/AIX.gcc.inc
@@ -0,0 +1,75 @@
+# Copyright (c) 2005-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#
+#
+#
+
+COMPILE_ONLY = -c -MMD
+PREPROC_ONLY = -E -x c++
+INCLUDE_KEY = -I
+DEFINE_KEY = -D
+OUTPUT_KEY = -o #
+OUTPUTOBJ_KEY = -o #
+PIC_KEY = -fPIC
+WARNING_AS_ERROR_KEY = -Werror
+WARNING_KEY = -Wall
+DYLIB_KEY = -shared
+LIBDL = -ldl
+
+CPLUS = g++
+CONLY = gcc
+LIB_LINK_FLAGS = -shared
+LIBS = -lpthread -ldl
+C_FLAGS = $(CPLUS_FLAGS) -x c
+
+ifeq ($(cfg), release)
+ CPLUS_FLAGS = -O2 -DUSE_PTHREAD -pthread
+endif
+ifeq ($(cfg), debug)
+ CPLUS_FLAGS = -DTBB_USE_DEBUG -g -O0 -DUSE_PTHREAD -pthread
+endif
+
+ASM=
+ASM_FLAGS=
+
+TBB_ASM.OBJ=
+
+ifeq (powerpc,$(arch))
+ CPLUS_FLAGS += -maix64 -Wl,-G
+ LIB_LINK_FLAGS += -maix64 -Wl,-b64 -Wl,-brtl -Wl,-G
+endif
+
+#------------------------------------------------------------------------------
+# Setting assembler data.
+#------------------------------------------------------------------------------
+
+ASSEMBLY_SOURCE=ibm_aix51
+ifeq (powerpc,$(arch))
+ TBB_ASM.OBJ = atomic_support.o
+endif
+
+#------------------------------------------------------------------------------
+# End of setting assembler data.
+#------------------------------------------------------------------------------
+
+#------------------------------------------------------------------------------
+# Setting tbbmalloc data.
+#------------------------------------------------------------------------------
+
+M_CPLUS_FLAGS = $(CPLUS_FLAGS) -fno-rtti -fno-exceptions
+
+#------------------------------------------------------------------------------
+# End of setting tbbmalloc data.
+#------------------------------------------------------------------------------
diff --git a/dependencies/tbb/build/AIX.inc b/dependencies/tbb/build/AIX.inc
new file mode 100644
index 0000000000000000000000000000000000000000..abe12d52a0f57e6c26719869cda590ea4f7e2f0a
--- /dev/null
+++ b/dependencies/tbb/build/AIX.inc
@@ -0,0 +1,66 @@
+# Copyright (c) 2005-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#
+#
+#
+
+ifndef arch
+ arch:=$(shell uname -p)
+ export arch
+endif
+
+ifndef runtime
+ gcc_version:=$(shell gcc -dumpversion)
+ os_version:=$(shell uname -r)
+ os_kernel_version:=$(shell uname -r | sed -e 's/-.*$$//')
+ export runtime:=cc$(gcc_version)_kernel$(os_kernel_version)
+endif
+
+native_compiler := gcc
+export compiler ?= gcc
+debugger ?= gdb
+
+CMD=$(SHELL) -c
+CWD=$(shell pwd)
+RM?=rm -f
+RD?=rmdir
+MD?=mkdir -p
+NUL= /dev/null
+SLASH=/
+MAKE_VERSIONS=sh $(tbb_root)/build/version_info_aix.sh $(VERSION_FLAGS) >version_string.ver
+MAKE_TBBVARS=sh $(tbb_root)/build/generate_tbbvars.sh
+
+ifdef LIBPATH
+ export LIBPATH := .:$(LIBPATH)
+else
+ export LIBPATH := .
+endif
+
+####### Build settings ########################################################
+
+OBJ = o
+DLL = so
+
+TBB.LST =
+TBB.DEF =
+TBB.DLL = libtbb$(CPF_SUFFIX)$(DEBUG_SUFFIX).$(DLL)
+TBB.LIB = $(TBB.DLL)
+LINK_TBB.LIB = $(TBB.LIB)
+
+MALLOC.DLL = libtbbmalloc$(DEBUG_SUFFIX).$(DLL)
+MALLOC.LIB = $(MALLOC.DLL)
+LINK_MALLOC.LIB = $(MALLOC.LIB)
+
+TEST_LAUNCHER=sh $(tbb_root)/build/test_launcher.sh $(largs)
diff --git a/dependencies/tbb/build/FreeBSD.clang.inc b/dependencies/tbb/build/FreeBSD.clang.inc
new file mode 100644
index 0000000000000000000000000000000000000000..3579603db989b07f6abb1e725014aa306a8504e0
--- /dev/null
+++ b/dependencies/tbb/build/FreeBSD.clang.inc
@@ -0,0 +1,110 @@
+# Copyright (c) 2005-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#
+#
+#
+
+COMPILE_ONLY = -c -MMD
+PREPROC_ONLY = -E -x c++
+INCLUDE_KEY = -I
+DEFINE_KEY = -D
+OUTPUT_KEY = -o #
+OUTPUTOBJ_KEY = -o #
+PIC_KEY = -fPIC
+WARNING_AS_ERROR_KEY = -Werror
+WARNING_KEY = -Wall
+TEST_WARNING_KEY = -Wextra -Wshadow -Wcast-qual -Woverloaded-virtual -Wnon-virtual-dtor
+WARNING_SUPPRESS = -Wno-parentheses -Wno-non-virtual-dtor -Wno-dangling-else
+DYLIB_KEY = -shared
+EXPORT_KEY = -Wl,--version-script,
+LIBDL =
+
+CPLUS = clang++
+CONLY = clang
+LIB_LINK_FLAGS = $(DYLIB_KEY) -Wl,-soname=$(BUILDING_LIBRARY)
+LIBS += -lpthread -lrt
+LINK_FLAGS = -Wl,-rpath-link=. -Wl,-rpath=. -rdynamic
+C_FLAGS = $(CPLUS_FLAGS)
+
+ifeq ($(cfg), release)
+ CPLUS_FLAGS = $(ITT_NOTIFY) -g -O2 -DUSE_PTHREAD
+endif
+ifeq ($(cfg), debug)
+ CPLUS_FLAGS = -DTBB_USE_DEBUG $(ITT_NOTIFY) -g -O0 -DUSE_PTHREAD
+endif
+
+ifneq (,$(stdlib))
+ CPLUS_FLAGS += -stdlib=$(stdlib)
+ LIB_LINK_FLAGS += -stdlib=$(stdlib)
+endif
+
+TBB_ASM.OBJ=
+MALLOC_ASM.OBJ=
+
+ifeq (intel64,$(arch))
+ ITT_NOTIFY = -DDO_ITT_NOTIFY
+ CPLUS_FLAGS += -m64
+ LIB_LINK_FLAGS += -m64
+endif
+
+ifeq (ia32,$(arch))
+ ITT_NOTIFY = -DDO_ITT_NOTIFY
+ CPLUS_FLAGS += -m32 -march=pentium4
+ LIB_LINK_FLAGS += -m32
+endif
+
+ifeq (ppc64,$(arch))
+ CPLUS_FLAGS += -m64
+ LIB_LINK_FLAGS += -m64
+endif
+
+ifeq (ppc32,$(arch))
+ CPLUS_FLAGS += -m32
+ LIB_LINK_FLAGS += -m32
+endif
+
+ifeq (bg,$(arch))
+ CPLUS = bgclang++
+ CONLY = bgclang
+endif
+
+#------------------------------------------------------------------------------
+# Setting assembler data.
+#------------------------------------------------------------------------------
+ASM = as
+ifeq (intel64,$(arch))
+ ASM_FLAGS += --64
+endif
+ifeq (ia32,$(arch))
+ ASM_FLAGS += --32
+endif
+ifeq ($(cfg),debug)
+ ASM_FLAGS += -g
+endif
+
+ASSEMBLY_SOURCE=$(arch)-gas
+#------------------------------------------------------------------------------
+# End of setting assembler data.
+#------------------------------------------------------------------------------
+
+#------------------------------------------------------------------------------
+# Setting tbbmalloc data.
+#------------------------------------------------------------------------------
+
+M_CPLUS_FLAGS = $(CPLUS_FLAGS) -fno-rtti -fno-exceptions
+
+#------------------------------------------------------------------------------
+# End of setting tbbmalloc data.
+#------------------------------------------------------------------------------
diff --git a/dependencies/tbb/build/FreeBSD.gcc.inc b/dependencies/tbb/build/FreeBSD.gcc.inc
new file mode 100644
index 0000000000000000000000000000000000000000..794cb7c4103848f706c5d17a2d21b5a11619cccf
--- /dev/null
+++ b/dependencies/tbb/build/FreeBSD.gcc.inc
@@ -0,0 +1,93 @@
+# Copyright (c) 2005-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#
+#
+#
+
+COMPILE_ONLY = -c -MMD
+PREPROC_ONLY = -E -x c++
+INCLUDE_KEY = -I
+DEFINE_KEY = -D
+OUTPUT_KEY = -o #
+OUTPUTOBJ_KEY = -o #
+PIC_KEY = -fPIC
+WARNING_AS_ERROR_KEY = -Werror
+WARNING_KEY = -Wall
+DYLIB_KEY = -shared
+WARNING_SUPPRESS = -Wno-parentheses
+
+CPLUS = g++
+CONLY = gcc
+LIB_LINK_FLAGS = -shared
+LIBS = -lpthread
+C_FLAGS = $(CPLUS_FLAGS)
+
+# gcc 6.0 and later have -flifetime-dse option that controls
+# elimination of stores done outside the object lifetime
+ifneq (,$(shell gcc -dumpversion | egrep "^([6-9])"))
+ # keep pre-contruction stores for zero initialization
+ DSE_KEY = -flifetime-dse=1
+endif
+
+ifeq ($(cfg), release)
+ CPLUS_FLAGS = -g -O2 -DUSE_PTHREAD
+endif
+ifeq ($(cfg), debug)
+ CPLUS_FLAGS = -DTBB_USE_DEBUG -g -O0 -DUSE_PTHREAD
+endif
+
+ASM=
+ASM_FLAGS=
+
+TBB_ASM.OBJ=
+MALLOC_ASM.OBJ=
+
+ifeq (ia64,$(arch))
+# Position-independent code (PIC) is a must on IA-64 architecture, even for regular (not shared) executables
+ CPLUS_FLAGS += $(PIC_KEY)
+endif
+
+ifeq (intel64,$(arch))
+ CPLUS_FLAGS += -m64
+ LIB_LINK_FLAGS += -m64
+endif
+
+ifeq (ia32,$(arch))
+ CPLUS_FLAGS += -m32
+ LIB_LINK_FLAGS += -m32
+endif
+
+#------------------------------------------------------------------------------
+# Setting assembler data.
+#------------------------------------------------------------------------------
+ASSEMBLY_SOURCE=$(arch)-gas
+ifeq (ia64,$(arch))
+ ASM=as
+ TBB_ASM.OBJ = atomic_support.o lock_byte.o log2.o pause.o
+ MALLOC_ASM.OBJ = atomic_support.o lock_byte.o pause.o
+endif
+#------------------------------------------------------------------------------
+# End of setting assembler data.
+#------------------------------------------------------------------------------
+
+#------------------------------------------------------------------------------
+# Setting tbbmalloc data.
+#------------------------------------------------------------------------------
+
+M_CPLUS_FLAGS = $(CPLUS_FLAGS) -fno-rtti -fno-exceptions
+
+#------------------------------------------------------------------------------
+# End of setting tbbmalloc data.
+#------------------------------------------------------------------------------
diff --git a/dependencies/tbb/build/FreeBSD.inc b/dependencies/tbb/build/FreeBSD.inc
new file mode 100644
index 0000000000000000000000000000000000000000..3bd6a06403e4fdc6c4989543c0d94b6779abe2a6
--- /dev/null
+++ b/dependencies/tbb/build/FreeBSD.inc
@@ -0,0 +1,74 @@
+# Copyright (c) 2005-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#
+#
+#
+
+ifndef arch
+ ifeq ($(shell uname -m),i386)
+ export arch:=ia32
+ endif
+ ifeq ($(shell uname -m),ia64)
+ export arch:=ia64
+ endif
+ ifeq ($(shell uname -m),amd64)
+ export arch:=intel64
+ endif
+endif
+
+ifndef runtime
+ clang_version:=$(shell clang -v 2>&1 | grep version | sed "s/.*version \([0-9]*\.[0-9]*\).*/\1/")
+ os_version:=$(shell uname -r)
+ os_kernel_version:=$(shell uname -r | sed -e 's/-.*$$//')
+ export runtime:=cc$(clang_version)_kernel$(os_kernel_version)
+endif
+
+native_compiler := clang
+export compiler ?= clang
+debugger ?= gdb
+
+CMD=$(SHELL) -c
+CWD=$(shell pwd)
+RM?=rm -f
+RD?=rmdir
+MD?=mkdir -p
+NUL= /dev/null
+SLASH=/
+MAKE_VERSIONS=sh $(tbb_root)/build/version_info_linux.sh $(VERSION_FLAGS) >version_string.ver
+MAKE_TBBVARS=sh $(tbb_root)/build/generate_tbbvars.sh
+
+ifdef LD_LIBRARY_PATH
+ export LD_LIBRARY_PATH := .:$(LD_LIBRARY_PATH)
+else
+ export LD_LIBRARY_PATH := .
+endif
+
+####### Build settings ########################################################
+
+OBJ = o
+DLL = so
+LIBEXT=so
+
+TBB.LST =
+TBB.DEF =
+TBB.DLL = libtbb$(CPF_SUFFIX)$(DEBUG_SUFFIX).$(DLL)
+TBB.LIB = $(TBB.DLL)
+LINK_TBB.LIB = $(TBB.LIB)
+
+MALLOC.DLL = libtbbmalloc$(DEBUG_SUFFIX).$(DLL)
+MALLOC.LIB = $(MALLOC.DLL)
+LINK_MALLOC.LIB = $(MALLOC.LIB)
+
+TEST_LAUNCHER=sh $(tbb_root)/build/test_launcher.sh $(largs)
diff --git a/dependencies/tbb/build/Makefile.rml b/dependencies/tbb/build/Makefile.rml
new file mode 100644
index 0000000000000000000000000000000000000000..241d4bfbbf342875e4cc95928bea4394da8a98b5
--- /dev/null
+++ b/dependencies/tbb/build/Makefile.rml
@@ -0,0 +1,166 @@
+# Copyright (c) 2005-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#
+#
+#
+
+# TODO: investigate why version_string.ver is not complete when $(RML_SERVER.OBJ) is being compiled.
+.NOTPARALLEL:
+
+tbb_root ?= $(TBBROOT)
+BUILDING_PHASE=1
+TEST_RESOURCE = $(RML.RES)
+include $(tbb_root)/build/common.inc
+DEBUG_SUFFIX=$(findstring _debug,_$(cfg))
+
+ifeq (android,$(target))
+$(error "RML is not supported on Android")
+endif
+
+# default target
+default_rml: rml rml_test
+
+RML_ROOT ?= $(tbb_root)/src/rml
+RML_SERVER_ROOT = $(RML_ROOT)/server
+
+VPATH = $(tbb_root)/src/tbb $(tbb_root)/src/tbb/$(ASSEMBLY_SOURCE)
+VPATH += $(RML_ROOT)/server $(RML_ROOT)/client $(RML_ROOT)/test $(tbb_root)/src/test
+
+include $(tbb_root)/build/common_rules.inc
+
+#--------------------------------------------------------------------------
+# Define rules for making the RML server shared library and client objects.
+#--------------------------------------------------------------------------
+
+# Object files that make up RML server
+RML_SERVER.OBJ = rml_server.$(OBJ)
+
+# Object files that RML clients need
+RML_TBB_CLIENT.OBJ ?= rml_tbb.$(OBJ) dynamic_link_rml.$(OBJ)
+RML_OMP_CLIENT.OBJ ?= rml_omp.$(OBJ) omp_dynamic_link.$(OBJ)
+
+RML.OBJ = $(RML_SERVER.OBJ) $(RML_TBB_CLIENT.OBJ) $(RML_OMP_CLIENT.OBJ)
+ifeq (windows,$(tbb_os))
+RML_ASM.OBJ = $(if $(findstring intel64,$(arch)),$(TBB_ASM.OBJ))
+endif
+ifeq (linux,$(tbb_os))
+RML_ASM.OBJ = $(if $(findstring ia64,$(arch)),$(TBB_ASM.OBJ))
+endif
+
+RML_TBB_DEP= cache_aligned_allocator_rml.$(OBJ) dynamic_link_rml.$(OBJ) concurrent_vector_rml.$(OBJ) semaphore_rml.$(OBJ) tbb_misc_rml.$(OBJ) tbb_misc_ex_rml.$(OBJ)
+TBB_DEP_NON_RML_TEST?= cache_aligned_allocator_rml.$(OBJ) dynamic_link_rml.$(OBJ) $(RML_ASM.OBJ) tbb_misc_rml.$(OBJ) tbb_misc_ex_rml.$(OBJ)
+ifeq ($(cfg),debug)
+RML_TBB_DEP+= spin_mutex_rml.$(OBJ)
+TBB_DEP_RML_TEST?= $(RML_ASM.OBJ) tbb_misc_rml.$(OBJ)
+else
+TBB_DEP_RML_TEST?= $(RML_ASM.OBJ)
+endif
+LIBS += $(LIBDL)
+
+INCLUDES += $(INCLUDE_KEY)$(RML_ROOT)/include $(INCLUDE_KEY).
+T_INCLUDES = $(INCLUDES) $(INCLUDE_KEY)$(tbb_root)/src/test $(INCLUDE_KEY)$(RML_SERVER_ROOT)
+
+ifeq ($(rml_wcrm),1)
+CPLUS_FLAGS+=/DRML_USE_WCRM
+endif
+
+# Suppress superfluous warnings for RML compilation
+R_CPLUS_FLAGS = $(subst DO_ITT_NOTIFY,DO_ITT_NOTIFY=0,$(CPLUS_FLAGS)) $(WARNING_SUPPRESS) \
+ $(DEFINE_KEY)TBB_USE_THREADING_TOOLS=0 $(DEFINE_KEY)__TBB_RML_STATIC=1 $(DEFINE_KEY)__TBB_NO_IMPLICIT_LINKAGE=1
+
+%.$(OBJ): %.cpp
+ $(CPLUS) $(COMPILE_ONLY) $(R_CPLUS_FLAGS) $(PIC_KEY) $(DSE_KEY) $(INCLUDES) $<
+
+ifeq (linux,$(tbb_os))
+omp_dynamic_link.$(OBJ): CPLUS_FLAGS+=-fno-exceptions
+endif
+
+tbb_misc_rml.$(OBJ) $(RML_SERVER.OBJ): version_string.ver
+
+RML_TEST.OBJ = test_job_automaton.$(OBJ) test_thread_monitor.$(OBJ) test_rml_tbb.$(OBJ) test_rml_omp.$(OBJ) test_rml_mixed.$(OBJ)
+
+$(RML_TBB_DEP): %_rml.$(OBJ): %.cpp
+ $(CPLUS) $(COMPILE_ONLY) $(OUTPUTOBJ_KEY)$@ $(R_CPLUS_FLAGS) $(PIC_KEY) $(DSE_KEY) $(INCLUDES) $<
+
+$(RML_TEST.OBJ): %.$(OBJ): %.cpp
+ $(CPLUS) $(COMPILE_ONLY) $(R_CPLUS_FLAGS) $(PIC_KEY) $(T_INCLUDES) $<
+
+ifneq (,$(RML.DEF))
+rml.def: $(RML.DEF)
+ $(CPLUS) $(PREPROC_ONLY) $< $(CPLUS_FLAGS) $(INCLUDES) > $@
+
+LIB_LINK_FLAGS += $(EXPORT_KEY)rml.def
+$(RML.DLL): rml.def
+endif
+
+$(RML.DLL): CPLUS_FLAGS += $(SDL_FLAGS)
+$(RML.DLL): BUILDING_LIBRARY = $(RML.DLL)
+$(RML.DLL): $(RML_TBB_DEP) $(RML_SERVER.OBJ) $(RML.RES) $(RML_NO_VERSION.DLL) $(RML_ASM.OBJ)
+ $(LIB_LINK_CMD) $(LIB_OUTPUT_KEY)$(RML.DLL) $(RML_SERVER.OBJ) $(RML_TBB_DEP) $(RML_ASM.OBJ) $(RML.RES) $(LIB_LINK_LIBS) $(LIB_LINK_FLAGS)
+
+ifneq (,$(RML_NO_VERSION.DLL))
+$(RML_NO_VERSION.DLL):
+ echo "INPUT ($(RML.DLL))" > $(RML_NO_VERSION.DLL)
+endif
+
+rml: $(RML.DLL) $(RML_TBB_CLIENT.OBJ) $(RML_OMP_CLIENT.OBJ)
+
+#------------------------------------------------------
+# End of rules for making the RML server shared library
+#------------------------------------------------------
+
+#------------------------------------------------------
+# Define rules for making the RML unit tests
+#------------------------------------------------------
+
+add_debug=$(basename $(1))_debug$(suffix $(1))
+cross_suffix=$(if $(crosstest),$(if $(DEBUG_SUFFIX),$(subst _debug,,$(1)),$(call add_debug,$(1))),$(1))
+
+RML_TESTS = test_job_automaton.$(TEST_EXT) test_thread_monitor.$(TEST_EXT)
+RML_CUSTOM_TESTS = test_rml_tbb.$(TEST_EXT) test_rml_omp.$(TEST_EXT) test_rml_mixed.$(TEST_EXT) test_rml_omp_c_linkage.$(TEST_EXT)
+
+test_rml_tbb.$(TEST_EXT): test_rml_tbb.$(OBJ) $(RML_TBB_CLIENT.OBJ) $(TBB_DEP_RML_TEST)
+ $(CPLUS) $(OUTPUT_KEY)$@ $(CPLUS_FLAGS) test_rml_tbb.$(OBJ) $(RML_TBB_CLIENT.OBJ) $(TBB_DEP_RML_TEST) $(LIBS) $(LINK_FLAGS)
+
+test_rml_omp.$(TEST_EXT): test_rml_omp.$(OBJ) $(RML_OMP_CLIENT.OBJ) $(TBB_DEP_NON_RML_TEST)
+ $(CPLUS) $(OUTPUT_KEY)$@ $(CPLUS_FLAGS) test_rml_omp.$(OBJ) $(RML_OMP_CLIENT.OBJ) $(TBB_DEP_NON_RML_TEST) $(LIBS) $(LINK_FLAGS)
+
+test_rml_mixed.$(TEST_EXT): test_rml_mixed.$(OBJ) $(RML_TBB_CLIENT.OBJ) $(RML_OMP_CLIENT.OBJ) $(TBB_DEP_RML_TEST)
+ $(CPLUS) $(OUTPUT_KEY)$@ $(CPLUS_FLAGS) test_rml_mixed.$(OBJ) $(RML_TBB_CLIENT.OBJ) $(RML_OMP_CLIENT.OBJ) $(TBB_DEP_RML_TEST) $(LIBS) $(LINK_FLAGS)
+
+rml_omp_stub.$(OBJ): rml_omp_stub.cpp
+ $(CPLUS) $(COMPILE_ONLY) $(M_CPLUS_FLAGS) $(WARNING_SUPPRESS) $(T_INCLUDES) $(PIC_KEY) $<
+
+test_rml_omp_c_linkage.$(TEST_EXT): test_rml_omp_c_linkage.$(OBJ) rml_omp_stub.$(OBJ) omp_dynamic_link.$(OBJ)
+ $(CONLY) $(C_FLAGS) $(OUTPUT_KEY)$@ test_rml_omp_c_linkage.$(OBJ) rml_omp_stub.$(OBJ) omp_dynamic_link.$(OBJ) $(LIBS) $(LINK_FLAGS)
+
+$(RML_TESTS): %.$(TEST_EXT): %.$(OBJ) $(TBB_DEP_NON_RML_TEST)
+ $(CPLUS) $(OUTPUT_KEY)$@ $(CPLUS_FLAGS) $< $(TBB_DEP_NON_RML_TEST) $(LIBS) $(LINK_FLAGS)
+
+### run_cmd is usually empty
+rml_test: $(call cross_suffix,$(RML.DLL)) $(TEST_PREREQUISITE) $(RML_TESTS) $(RML_CUSTOM_TESTS)
+ $(run_cmd) ./test_job_automaton.$(TEST_EXT) $(args)
+ $(run_cmd) ./test_thread_monitor.$(TEST_EXT) $(args)
+ $(run_cmd) ./test_rml_tbb.$(TEST_EXT) $(args)
+ $(run_cmd) ./test_rml_omp.$(TEST_EXT) $(args)
+ $(run_cmd) ./test_rml_mixed.$(TEST_EXT) $(args)
+ $(run_cmd) ./test_rml_omp_c_linkage.$(TEST_EXT) $(args)
+
+#------------------------------------------------------
+# End of rules for making the TBBMalloc unit tests
+#------------------------------------------------------
+
+# Include automatically generated dependencies
+-include *.d
diff --git a/dependencies/tbb/build/Makefile.tbb b/dependencies/tbb/build/Makefile.tbb
new file mode 100644
index 0000000000000000000000000000000000000000..857aacc76637608ebfaa9e1868a871226a3eb12a
--- /dev/null
+++ b/dependencies/tbb/build/Makefile.tbb
@@ -0,0 +1,118 @@
+# Copyright (c) 2005-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#
+#
+#
+
+#------------------------------------------------------------------------------
+# Define rules for making the TBB shared library.
+#------------------------------------------------------------------------------
+
+tbb_root ?= "$(TBBROOT)"
+BUILDING_PHASE=1
+include $(tbb_root)/build/common.inc
+CPLUS_FLAGS += $(SDL_FLAGS)
+DEBUG_SUFFIX=$(findstring _debug,_$(cfg))
+
+#------------------------------------------------------------
+# Define static pattern rules dealing with .cpp source files
+#------------------------------------------------------------
+$(warning CONFIG: cfg=$(cfg) arch=$(arch) compiler=$(compiler) target=$(target) runtime=$(runtime))
+
+default_tbb: $(TBB.DLL)
+.PHONY: default_tbb tbbvars clean
+.PRECIOUS: %.$(OBJ)
+
+VPATH = $(tbb_root)/src/tbb/$(ASSEMBLY_SOURCE) $(tbb_root)/src/tbb $(tbb_root)/src/old $(tbb_root)/src/rml/client
+
+CPLUS_FLAGS += $(PIC_KEY) $(DSE_KEY) $(DEFINE_KEY)__TBB_BUILD=1
+
+# Object files (that were compiled from C++ code) that gmake up TBB
+TBB_CPLUS.OBJ = concurrent_hash_map.$(OBJ) \
+ concurrent_queue.$(OBJ) \
+ concurrent_vector.$(OBJ) \
+ dynamic_link.$(OBJ) \
+ itt_notify.$(OBJ) \
+ cache_aligned_allocator.$(OBJ) \
+ pipeline.$(OBJ) \
+ queuing_mutex.$(OBJ) \
+ queuing_rw_mutex.$(OBJ) \
+ reader_writer_lock.$(OBJ) \
+ spin_rw_mutex.$(OBJ) \
+ x86_rtm_rw_mutex.$(OBJ) \
+ spin_mutex.$(OBJ) \
+ critical_section.$(OBJ) \
+ mutex.$(OBJ) \
+ recursive_mutex.$(OBJ) \
+ condition_variable.$(OBJ) \
+ tbb_thread.$(OBJ) \
+ concurrent_monitor.$(OBJ) \
+ semaphore.$(OBJ) \
+ private_server.$(OBJ) \
+ rml_tbb.$(OBJ) \
+ tbb_misc.$(OBJ) \
+ tbb_misc_ex.$(OBJ) \
+ task.$(OBJ) \
+ task_group_context.$(OBJ) \
+ governor.$(OBJ) \
+ market.$(OBJ) \
+ arena.$(OBJ) \
+ scheduler.$(OBJ) \
+ observer_proxy.$(OBJ) \
+ tbb_statistics.$(OBJ) \
+ tbb_main.$(OBJ)
+
+# OLD/Legacy object files for backward binary compatibility
+ifeq (,$(findstring $(DEFINE_KEY)TBB_NO_LEGACY,$(CPLUS_FLAGS)))
+TBB_CPLUS_OLD.OBJ = \
+ concurrent_vector_v2.$(OBJ) \
+ concurrent_queue_v2.$(OBJ) \
+ spin_rw_mutex_v2.$(OBJ) \
+ task_v2.$(OBJ)
+endif
+
+# Object files that gmake up TBB (TBB_ASM.OBJ is platform-specific)
+TBB.OBJ = $(TBB_CPLUS.OBJ) $(TBB_CPLUS_OLD.OBJ) $(TBB_ASM.OBJ)
+
+# Suppress superfluous warnings for TBB compilation
+WARNING_KEY += $(WARNING_SUPPRESS)
+
+include $(tbb_root)/build/common_rules.inc
+
+ifneq (,$(TBB.DEF))
+tbb.def: $(TBB.DEF) $(TBB.LST)
+ $(CPLUS) $(PREPROC_ONLY) $< $(CPLUS_FLAGS) $(INCLUDES) > $@
+
+LIB_LINK_FLAGS += $(EXPORT_KEY)tbb.def
+$(TBB.DLL): tbb.def
+endif
+
+tbbvars.sh:
+ $(MAKE_TBBVARS)
+
+$(TBB.DLL): BUILDING_LIBRARY = $(TBB.DLL)
+$(TBB.DLL): $(TBB.OBJ) $(TBB.RES) tbbvars.sh $(TBB_NO_VERSION.DLL)
+ $(LIB_LINK_CMD) $(LIB_OUTPUT_KEY)$(TBB.DLL) $(TBB.OBJ) $(TBB.RES) $(LIB_LINK_LIBS) $(LIB_LINK_FLAGS)
+
+ifneq (,$(TBB_NO_VERSION.DLL))
+$(TBB_NO_VERSION.DLL):
+ echo "INPUT ($(TBB.DLL))" > $(TBB_NO_VERSION.DLL)
+endif
+
+#clean:
+# $(RM) *.$(OBJ) *.$(DLL) *.res *.map *.ilk *.pdb *.exp *.manifest *.tmp *.d core core.*[0-9][0-9] *.ver
+
+# Include automatically generated dependencies
+-include *.d
diff --git a/dependencies/tbb/build/Makefile.tbbmalloc b/dependencies/tbb/build/Makefile.tbbmalloc
new file mode 100644
index 0000000000000000000000000000000000000000..d4b84b3749df53700ad2f4d3d37d45ad50ad394a
--- /dev/null
+++ b/dependencies/tbb/build/Makefile.tbbmalloc
@@ -0,0 +1,236 @@
+# Copyright (c) 2005-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#
+#
+#
+
+# default target
+default_malloc: malloc malloc_test
+
+tbb_root ?= $(TBBROOT)
+BUILDING_PHASE=1
+TEST_RESOURCE = $(MALLOC.RES)
+TESTFILE=tbbmalloc
+include $(tbb_root)/build/common.inc
+DEBUG_SUFFIX=$(findstring _debug,$(call cross_cfg,_$(cfg)))
+
+MALLOC_ROOT ?= $(tbb_root)/src/tbbmalloc
+MALLOC_SOURCE_ROOT ?= $(MALLOC_ROOT)
+
+VPATH = $(tbb_root)/src/tbb/$(ASSEMBLY_SOURCE) $(tbb_root)/src/tbb $(tbb_root)/src/test
+VPATH += $(MALLOC_ROOT) $(MALLOC_SOURCE_ROOT)
+
+CPLUS_FLAGS += $(if $(crosstest),$(DEFINE_KEY)__TBBMALLOC_NO_IMPLICIT_LINKAGE=1)
+
+TEST_SUFFIXES=proxy
+TEST_PREREQUISITE+=$(MALLOC.LIB)
+LINK_FILES+=$(LINK_MALLOC.LIB)
+include $(tbb_root)/build/common_rules.inc
+
+ORIG_CPLUS_FLAGS:=$(CPLUS_FLAGS)
+ORIG_INCLUDES:=$(INCLUDES)
+ORIG_LINK_MALLOC.LIB:=$(LINK_MALLOC.LIB)
+
+#------------------------------------------------------
+# Define rules for making the TBBMalloc shared library.
+#------------------------------------------------------
+
+# Object files that make up TBBMalloc
+MALLOC_CPLUS.OBJ = backend.$(OBJ) large_objects.$(OBJ) backref.$(OBJ) tbbmalloc.$(OBJ)
+MALLOC.OBJ := $(MALLOC_CPLUS.OBJ) $(MALLOC_ASM.OBJ) itt_notify_malloc.$(OBJ) frontend.$(OBJ)
+PROXY.OBJ := proxy.$(OBJ) tbb_function_replacement.$(OBJ)
+M_CPLUS_FLAGS := $(subst $(WARNING_KEY),,$(M_CPLUS_FLAGS)) $(DEFINE_KEY)__TBBMALLOC_BUILD=1
+M_INCLUDES := $(INCLUDES) $(INCLUDE_KEY)$(MALLOC_ROOT) $(INCLUDE_KEY)$(MALLOC_SOURCE_ROOT)
+
+# Suppress superfluous warnings for TBBMalloc compilation
+$(MALLOC.OBJ): M_CPLUS_FLAGS += $(WARNING_SUPPRESS)
+# Suppress superfluous warnings for TBBMalloc proxy compilation
+$(PROXY.OBJ): CPLUS_FLAGS += $(WARNING_SUPPRESS)
+
+frontend.$(OBJ): frontend.cpp version_string.ver
+ $(CPLUS) $(COMPILE_ONLY) $(M_CPLUS_FLAGS) $(PIC_KEY) $(DSE_KEY) $(M_INCLUDES) $(INCLUDE_KEY). $<
+
+$(PROXY.OBJ): %.$(OBJ): %.cpp
+ $(CPLUS) $(COMPILE_ONLY) $(CPLUS_FLAGS) $(PIC_KEY) $(DSE_KEY) $(DEFINE_KEY)__TBBMALLOC_BUILD=1 $(M_INCLUDES) $<
+
+$(MALLOC_CPLUS.OBJ): %.$(OBJ): %.cpp
+ $(CPLUS) $(COMPILE_ONLY) $(M_CPLUS_FLAGS) $(PIC_KEY) $(DSE_KEY) $(M_INCLUDES) $<
+
+itt_notify_malloc.$(OBJ): itt_notify.cpp
+ $(CPLUS) $(COMPILE_ONLY) $(M_CPLUS_FLAGS) $(PIC_KEY) $(DSE_KEY) $(OUTPUTOBJ_KEY)$@ $(INCLUDES) $<
+
+MALLOC_LINK_FLAGS = $(LIB_LINK_FLAGS)
+PROXY_LINK_FLAGS = $(LIB_LINK_FLAGS)
+
+ifneq (,$(MALLOC.DEF))
+tbbmalloc.def: $(MALLOC.DEF)
+ $(CPLUS) $(PREPROC_ONLY) $< $(M_CPLUS_FLAGS) $(WARNING_SUPPRESS) $(INCLUDES) > $@
+
+MALLOC_LINK_FLAGS += $(EXPORT_KEY)tbbmalloc.def
+$(MALLOC.DLL): tbbmalloc.def
+endif
+
+$(MALLOC.DLL) $(MALLOCPROXY.DLL): CPLUS_FLAGS += $(SDL_FLAGS)
+$(MALLOC.DLL) $(MALLOCPROXY.DLL): M_CPLUS_FLAGS += $(SLD_FLAGS)
+$(MALLOC.DLL): BUILDING_LIBRARY = $(MALLOC.DLL)
+$(MALLOC.DLL): $(MALLOC.OBJ) $(MALLOC.RES) $(MALLOC_NO_VERSION.DLL)
+ $(subst $(CPLUS),$(CONLY),$(LIB_LINK_CMD)) $(LIB_OUTPUT_KEY)$(MALLOC.DLL) $(MALLOC.OBJ) $(MALLOC.RES) $(LIB_LINK_LIBS) $(MALLOC_LINK_FLAGS)
+
+ifneq (,$(MALLOCPROXY.DEF))
+tbbmallocproxy.def: $(MALLOCPROXY.DEF)
+ $(CPLUS) $(PREPROC_ONLY) $< $(CPLUS_FLAGS) $(WARNING_SUPPRESS) $(INCLUDES) > $@
+
+PROXY_LINK_FLAGS += $(EXPORT_KEY)tbbmallocproxy.def
+$(MALLOCPROXY.DLL): tbbmallocproxy.def
+endif
+
+ifneq (,$(MALLOCPROXY.DLL))
+$(MALLOCPROXY.DLL): BUILDING_LIBRARY = $(MALLOCPROXY.DLL)
+$(MALLOCPROXY.DLL): $(PROXY.OBJ) $(MALLOCPROXY_NO_VERSION.DLL) $(MALLOC.DLL) $(MALLOC.RES)
+ $(LIB_LINK_CMD) $(LIB_OUTPUT_KEY)$(MALLOCPROXY.DLL) $(PROXY.OBJ) $(MALLOC.RES) $(LIB_LINK_LIBS) $(LINK_MALLOC.LIB) $(PROXY_LINK_FLAGS)
+endif
+
+ifneq (,$(MALLOC_NO_VERSION.DLL))
+$(MALLOC_NO_VERSION.DLL):
+ echo "INPUT ($(MALLOC.DLL))" > $(MALLOC_NO_VERSION.DLL)
+endif
+
+ifneq (,$(MALLOCPROXY_NO_VERSION.DLL))
+$(MALLOCPROXY_NO_VERSION.DLL):
+ echo "INPUT ($(MALLOCPROXY.DLL))" > $(MALLOCPROXY_NO_VERSION.DLL)
+endif
+
+malloc: $(MALLOC.DLL) $(MALLOCPROXY.DLL)
+
+malloc_dll: $(MALLOC.DLL)
+
+malloc_proxy_dll: $(MALLOCPROXY.DLL)
+
+.PHONY: malloc malloc_dll malloc_proxy_dll
+
+#------------------------------------------------------
+# End of rules for making the TBBMalloc shared library
+#------------------------------------------------------
+
+#------------------------------------------------------
+# Define rules for making the TBBMalloc unit tests
+#------------------------------------------------------
+
+# --------- The list of TBBMalloc unit tests ----------
+MALLOC_TESTS = test_ScalableAllocator.$(TEST_EXT) \
+ test_ScalableAllocator_STL.$(TEST_EXT) \
+ test_malloc_compliance.$(TEST_EXT) \
+ test_malloc_regression.$(TEST_EXT) \
+ test_malloc_init_shutdown.$(TEST_EXT) \
+ test_malloc_pools.$(TEST_EXT) \
+ test_malloc_pure_c.$(TEST_EXT) \
+ test_malloc_whitebox.$(TEST_EXT) \
+ test_malloc_used_by_lib.$(TEST_EXT) \
+ test_malloc_lib_unload.$(TEST_EXT)
+ifneq (,$(MALLOCPROXY.DLL))
+MALLOC_TESTS += test_malloc_overload.$(TEST_EXT) \
+ test_malloc_overload_proxy.$(TEST_EXT) \
+ test_malloc_atexit.$(TEST_EXT)
+endif
+# -----------------------------------------------------
+
+# ------------ Set test specific variables ------------
+ifeq (windows.gcc,$(tbb_os).$(compiler))
+test_malloc_overload.$(TEST_EXT): LIBS += $(MALLOCPROXY.LIB)
+endif
+
+MALLOC_M_CPLUS_TESTS = test_malloc_whitebox.$(TEST_EXT) test_malloc_lib_unload.$(TEST_EXT) \
+ test_malloc_used_by_lib.$(TEST_EXT)
+MALLOC_NO_LIB_TESTS = test_malloc_whitebox.$(TEST_EXT) test_malloc_lib_unload.$(TEST_EXT) \
+ test_malloc_used_by_lib.$(TEST_EXT) test_malloc_overload.$(TEST_EXT)
+MALLOC_LINK_PROXY_TESTS = test_malloc_overload_proxy.$(TEST_EXT)
+MALLOC_ADD_DLL_TESTS = test_malloc_lib_unload.$(TEST_EXT) test_malloc_used_by_lib.$(TEST_EXT) \
+ test_malloc_atexit.$(TEST_EXT)
+
+# TODO: implement accurate warning suppression for tests to unify with Makefile.test.
+
+$(MALLOC_M_CPLUS_TESTS): CPLUS_FLAGS=$(M_CPLUS_FLAGS)
+$(MALLOC_M_CPLUS_TESTS): INCLUDES=$(M_INCLUDES)
+$(MALLOC_NO_LIB_TESTS): LINK_MALLOC.LIB=
+$(MALLOC_NO_LIB_TESTS): LINK_FLAGS+=$(LIBDL)
+$(MALLOC_LINK_PROXY_TESTS): LINK_MALLOC.LIB=$(LINK_MALLOCPROXY.LIB)
+ifneq (,$(DYLIB_KEY))
+$(MALLOC_ADD_DLL_TESTS): %.$(TEST_EXT): %_dll.$(DLL)
+$(MALLOC_ADD_DLL_TESTS): TEST_LIBS+=$(@:.$(TEST_EXT)=_dll.$(LIBEXT))
+endif
+
+test_malloc_over%.$(TEST_EXT): CPLUS_FLAGS=$(subst /MT,/MD,$(M_CPLUS_FLAGS))
+test_malloc_over%.$(TEST_EXT): INCLUDES=$(M_INCLUDES)
+test_malloc_overload_proxy.$(TEST_EXT): LINK_FLAGS+=$(LIBDL)
+
+test_malloc_atexit_dll.$(DLL): CPLUS_FLAGS=$(subst /MT,/MD,$(M_CPLUS_FLAGS))
+test_malloc_atexit.$(TEST_EXT): CPLUS_FLAGS=$(subst /MT,/MD,$(M_CPLUS_FLAGS))
+test_malloc_atexit.$(TEST_EXT): LINK_FLAGS+=$(LIBDL)
+# on Ubuntu 11.10 linker called with --as-needed, so dependency on libtbbmalloc_proxy
+# is not created, and malloc overload via linking with -ltbbmalloc_proxy is not working.
+# Overcome with --no-as-needed.
+ifeq (linux.gcc,$(tbb_os).$(compiler))
+test_malloc_atexit.$(TEST_EXT): MALLOCPROXY.LIB := -Wl,--no-as-needed $(MALLOCPROXY.LIB)
+endif
+# The test isn't added to MALLOC_LINK_PROXY_TESTS, because we need both
+# tbbmalloc and proxy libs. For platforms other than Android it's enough
+# to modify LINK_MALLOC.LIB for TEST_EXT target only. But under Android build
+# of DLL and TEST_EXT can be requested independently, so there is no chance
+# to set LINK_MALLOC.LIB in TEST_EXT build rule, and affect DLL build.
+test_malloc_atexit.$(TEST_EXT): LINK_MALLOC.LIB := $(LINK_MALLOC.LIB) $(LINK_MALLOCPROXY.LIB)
+test_malloc_atexit_dll.$(DLL): LINK_MALLOC.LIB := $(LINK_MALLOC.LIB) $(LINK_MALLOCPROXY.LIB)
+
+test_malloc_whitebox.$(TEST_EXT): $(MALLOC_ASM.OBJ) version_string.ver
+test_malloc_whitebox.$(TEST_EXT): INCLUDES+=$(INCLUDE_KEY).
+test_malloc_whitebox.$(TEST_EXT): LINK_FILES+=$(MALLOC_ASM.OBJ)
+
+# Some _dll targets need to restore variables since they are changed by parent
+# target-specific rule of its .exe targets
+test_malloc_lib_unload_dll.$(DLL): CPLUS_FLAGS=$(ORIG_CPLUS_FLAGS)
+test_malloc_lib_unload_dll.$(DLL): INCLUDES=$(ORIG_INCLUDES)
+
+test_malloc_used_by_lib_dll.$(DLL): CPLUS_FLAGS=$(subst /MT,/LD,$(M_CPLUS_FLAGS))
+test_malloc_used_by_lib_dll.$(DLL): LINK_FILES+=$(ORIG_LINK_MALLOC.LIB)
+test_malloc_used_by_lib_dll.$(DLL): LIBDL=
+# -----------------------------------------------------
+
+# ---- The list of TBBMalloc test running commands ----
+# run_cmd is usually empty
+malloc_test: $(MALLOC.DLL) malloc_test_no_depends
+
+malloc_test_no_depends: $(TEST_PREREQUISITE) $(MALLOC_TESTS)
+ $(run_cmd) ./test_malloc_pools.$(TEST_EXT) $(args) 1:4
+ifneq (,$(MALLOCPROXY.DLL))
+ $(run_cmd) ./test_malloc_atexit.$(TEST_EXT) $(args)
+ $(run_cmd) $(TEST_LAUNCHER) -l $(MALLOCPROXY.DLL) ./test_malloc_overload.$(TEST_EXT) $(args)
+ $(run_cmd) $(TEST_LAUNCHER) ./test_malloc_overload_proxy.$(TEST_EXT) $(args)
+endif
+ $(run_cmd) $(TEST_LAUNCHER) ./test_malloc_lib_unload.$(TEST_EXT) $(args)
+ $(run_cmd) $(TEST_LAUNCHER) ./test_malloc_used_by_lib.$(TEST_EXT)
+ $(run_cmd) ./test_malloc_whitebox.$(TEST_EXT) $(args) 1:4
+ $(run_cmd) $(TEST_LAUNCHER) -u ./test_malloc_compliance.$(TEST_EXT) $(args) 1:4
+ $(run_cmd) ./test_ScalableAllocator.$(TEST_EXT) $(args)
+ $(run_cmd) ./test_ScalableAllocator_STL.$(TEST_EXT) $(args)
+ $(run_cmd) ./test_malloc_regression.$(TEST_EXT) $(args)
+ $(run_cmd) ./test_malloc_init_shutdown.$(TEST_EXT) $(args)
+ $(run_cmd) ./test_malloc_pure_c.$(TEST_EXT) $(args)
+# -----------------------------------------------------
+
+#------------------------------------------------------
+# End of rules for making the TBBMalloc unit tests
+#------------------------------------------------------
+
+# Include automatically generated dependencies
+-include *.d
diff --git a/dependencies/tbb/build/Makefile.tbbproxy b/dependencies/tbb/build/Makefile.tbbproxy
new file mode 100644
index 0000000000000000000000000000000000000000..eb2e0fd6520dec2d350d36b61e3babeeb6b11acb
--- /dev/null
+++ b/dependencies/tbb/build/Makefile.tbbproxy
@@ -0,0 +1,109 @@
+# Copyright (c) 2005-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#
+#
+#
+
+# default target
+default_tbbproxy: tbbproxy tbbproxy_test
+
+tbb_root ?= $(TBBROOT)
+BUILDING_PHASE=1
+include $(tbb_root)/build/common.inc
+DEBUG_SUFFIX=$(findstring _debug,_$(cfg))
+
+PROXY_ROOT ?= $(tbb_root)/src/tbbproxy
+PROXY_SOURCE_ROOT ?= $(PROXY_ROOT)
+
+VPATH = $(tbb_root)/src/tbb/$(ASSEMBLY_SOURCE) $(tbb_root)/src/tbb $(tbb_root)/src/test
+VPATH += $(PROXY_ROOT) $(PROXY_SOURCE_ROOT)
+
+CPLUS_FLAGS += $(DEFINE_KEY)__TBB_DLL_NAME=$(TBB.DLL)
+CPLUS_FLAGS += $(DEFINE_KEY)__TBB_LST=$(TBB.LST)
+CPLUS_FLAGS += $(foreach dir,$(VPATH),$(INCLUDE_KEY)$(dir))
+CPLUS_FLAGS += $(PIC_KEY) $(DSE_KEY)
+
+include $(tbb_root)/build/common_rules.inc
+
+#------------------------------------------------------
+# Define rules for making the TBB Proxy static library.
+#------------------------------------------------------
+
+# Object files that make up TBB Proxy
+PROXY_CPLUS.OBJ = tbbproxy.$(OBJ)
+PROXY_ASM.OBJ = tbbproxy-asm.$(OBJ)
+PROXY.OBJ := $(PROXY_CPLUS.OBJ) $(PROXY_ASM.OBJ)
+
+# Not using intrinsics prevents undesired dependence on ICL libraries (e.g. libirc).
+# Not using default libs prevents link issues caused by different CRT versions in tbbproxy and in an app.
+$(PROXY.OBJ): CPLUS_FLAGS += $(DEFINE_KEY)ARCH_$(arch) $(DEFINE_KEY)OS_$(tbb_os) $(NOINTRINSIC_KEY) $(NODEFAULTLIB_KEY)
+
+$(PROXY_CPLUS.OBJ): CPLUS_FLAGS+=$(if $(filter windows.%cl,$(tbb_os).$(compiler)),/Fdtbbproxy$(DEBUG_SUFFIX).pdb)
+$(PROXY_CPLUS.OBJ): %.$(OBJ): %.cpp
+ $(CPLUS) $(COMPILE_ONLY) $(CPLUS_FLAGS) $(INCLUDES) $<
+
+$(PROXY.LIB): $(PROXY.OBJ)
+ $(AR) $(AR_FLAGS) $(AR_OUTPUT_KEY)$@ $^
+
+.PRECIOUS : %.$(ASMEXT)
+tbbproxy-asm.$(ASMEXT) : tbbproxy-$(tbb_os).$(ASMEXT) $(TBB.LST) $(TBB-OBJECTS.LST)
+ $(CPLUS) $(PREPROC_ONLY) $< $(INCLUDES) $(CPLUS_FLAGS) $(DEFINE_KEY)__TBB_BUILD=1 > $@
+
+.PHONY: tbbproxy
+ifeq (windows,$(tbb_os))
+tbbproxy: $(PROXY.LIB)
+else
+tbbproxy:
+endif
+
+#------------------------------------------------------
+# End of rules for making the TBB Proxy static library
+#------------------------------------------------------
+
+#------------------------------------------------------
+# Define rules for making the TBB Proxy unit tests
+#------------------------------------------------------
+
+add_debug=$(basename $(1))_debug$(suffix $(1))
+cross_suffix=$(if $(crosstest),$(if $(DEBUG_SUFFIX),$(subst _debug,,$(1)),$(call add_debug,$(1))),$(1))
+
+PROXY_LIB = $(call cross_suffix,$(PROXY.LIB))
+PROXY_TESTS_SRCS = test_runtime_loader.cpp
+PROXY_TESTS_OBJS = $(PROXY_TESTS_SRCS:.cpp=.$(OBJ))
+PROXY_TESTS_EXES = $(PROXY_TESTS_OBJS:.$(OBJ)=.$(TEST_EXT))
+
+# Run rules.
+.PHONY: tbbproxy_test
+ifeq (windows,$(tbb_os))
+tbbproxy_test: $(call cross_suffix,$(PROXY.LIB)) $(TEST_PREREQUISITE) $(PROXY_TESTS_EXES)
+ $(run_cmd) ./test_runtime_loader.$(TEST_EXT) $(args)
+else
+tbbproxy_test:
+endif
+
+# Link rules.
+$(PROXY_TESTS_EXES): %.$(TEST_EXT): %.$(OBJ) $(PROXY_LIB)
+ $(CPLUS) $(OUTPUT_KEY)$@ $(CPLUS_FLAGS) $< $(PROXY_LIB) $(LIBS) $(LIBDL) $(LINK_FLAGS)
+
+# Compilation rules.
+$(PROXY_TESTS_OBJS): %.$(OBJ): %.cpp
+ $(CPLUS) $(COMPILE_ONLY) $(CPLUS_FLAGS) $(CXX_ONLY_FLAGS) $(CXX_WARN_SUPPRESS) $(INCLUDES) $(OUTPUT_KEY)$@ $<
+
+#------------------------------------------------------
+# End of rules for making the TBB Proxy unit tests
+#------------------------------------------------------
+
+# Include automatically generated dependencies
+-include *.d
diff --git a/dependencies/tbb/build/Makefile.test b/dependencies/tbb/build/Makefile.test
new file mode 100644
index 0000000000000000000000000000000000000000..b96fa4d0beca70d41c965904c58f8bb7ef2124b6
--- /dev/null
+++ b/dependencies/tbb/build/Makefile.test
@@ -0,0 +1,306 @@
+# Copyright (c) 2005-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#
+#
+#
+
+#------------------------------------------------------------------------------
+# Define rules for making the TBB tests.
+#------------------------------------------------------------------------------
+.PHONY: default test_tbb_plain test_tbb_openmp test_tbb_cilk test_tbb_old clean
+
+default: test_tbb_plain test_tbb_openmp test_tbb_cilk test_tbb_old
+
+tbb_root ?= $(TBBROOT)
+BUILDING_PHASE=1
+TEST_RESOURCE = $(TBB.RES)
+TESTFILE=test
+include $(tbb_root)/build/common.inc
+DEBUG_SUFFIX=$(findstring _debug,$(call cross_cfg,_$(cfg)))
+
+#------------------------------------------------------------
+# Define static pattern rules dealing with .cpp source files
+#------------------------------------------------------------
+
+VPATH = $(tbb_root)/src/tbb/$(ASSEMBLY_SOURCE) $(tbb_root)/src/tbb $(tbb_root)/src/rml/client $(tbb_root)/src/old $(tbb_root)/src/test $(tbb_root)/src/perf
+CPLUS_FLAGS += $(if $(crosstest),$(DEFINE_KEY)__TBB_NO_IMPLICIT_LINKAGE=1) $(if $(LINK_TBB.LIB),$(DEFINE_KEY)TEST_USES_TBB=1)
+
+TEST_PREREQUISITE+=$(TBB.LIB)
+LINK_FILES+=$(LINK_TBB.LIB)
+
+ifdef use_proxy
+ USE_PROXY_FLAG = $(DEFINE_KEY)HARNESS_USE_RUNTIME_LOADER
+ CPLUS_FLAGS += $(USE_PROXY_FLAG)
+ LINK_TBB.LIB = $(PROXY.LIB)
+ LIBS += $(LIBDL)
+endif
+
+TEST_SUFFIXES=secondary compiler_builtins pic
+include $(tbb_root)/build/common_rules.inc
+
+# Rules for the tests, which use TBB in a dynamically loadable library
+test_model_plugin.$(TEST_EXT): LINK_TBB.LIB =
+test_model_plugin.$(TEST_EXT): CPLUS_FLAGS := $(CPLUS_FLAGS:$(USE_PROXY_FLAG)=)
+test_model_plugin.$(TEST_EXT): LIBS += $(LIBDL)
+ifneq (,$(DYLIB_KEY))
+test_model_plugin.$(TEST_EXT): test_model_plugin_dll.$(DLL)
+endif
+
+# tbb_misc.$(OBJ) has to be specified here (instead of harness_inject_scheduler.h) because it carries dependency on version_string.ver
+SCHEDULER_DEPENDENCIES = $(TBB_ASM.OBJ) tbb_misc.$(OBJ)
+
+# These executables don't depend on the TBB library, but include core .cpp files directly
+SCHEDULER_DIRECTLY_INCLUDED = test_task_leaks.$(TEST_EXT) \
+ test_task_assertions.$(TEST_EXT) \
+ test_fast_random.$(TEST_EXT) \
+ test_global_control_whitebox.$(TEST_EXT) \
+ test_concurrent_queue_whitebox.$(TEST_EXT)
+
+# Necessary to locate version_string.ver referenced from directly included tbb_misc.cpp
+INCLUDES += $(INCLUDE_KEY). $(INCLUDE_TEST_HEADERS)
+
+$(SCHEDULER_DIRECTLY_INCLUDED): CPLUS_FLAGS += $(DSE_KEY)
+$(SCHEDULER_DIRECTLY_INCLUDED): WARNING_KEY += $(WARNING_SUPPRESS)
+$(SCHEDULER_DIRECTLY_INCLUDED): LIBS += $(LIBDL)
+#tbb.lib must not be linked to scheduler white box tests in order to not violate ODR
+$(SCHEDULER_DIRECTLY_INCLUDED): LINK_TBB.LIB =
+$(SCHEDULER_DIRECTLY_INCLUDED): LINK_FILES += $(SCHEDULER_DEPENDENCIES)
+$(SCHEDULER_DIRECTLY_INCLUDED): $(SCHEDULER_DEPENDENCIES)
+
+# test_tbb_header detects "multiple definition" linker error using the test that covers the whole library
+TWICE_LINKED_TESTS = test_tbb_header.$(TEST_EXT) \
+ test_concurrent_unordered_set.$(TEST_EXT)
+
+%_secondary.$(OBJ): CPLUS_FLAGS+=$(DEFINE_KEY)__TBB_TEST_SECONDARY=1
+
+# Detecting "multiple definition" linker error using the test that covers the whole library
+$(TWICE_LINKED_TESTS): %.$(TEST_EXT): %.$(OBJ) %_secondary.$(OBJ)
+$(TWICE_LINKED_TESTS): LINK_FILES+=$(@:.$(TEST_EXT)=_secondary.$(OBJ))
+
+# Checks that TBB works correctly in position independent code
+%_pic.$(OBJ): CPLUS_FLAGS+=$(PIC_KEY)
+%_pic.$(OBJ): CPLUS_FLAGS+=$(DEFINE_KEY)__TBB_TEST_PIC=1
+
+# Test of generic gcc port and icc intrinsics port
+%_compiler_builtins.$(TEST_EXT): LINK_TBB.LIB =
+%_compiler_builtins.$(OBJ): CPLUS_FLAGS+=$(DEFINE_KEY)__TBB_TEST_BUILTINS=1 $(DEFINE_KEY)TBB_USE_ASSERT=0
+
+# dynamic_link tests don't depend on the TBB library
+test_dynamic_link%.$(TEST_EXT): LINK_TBB.LIB =
+test_dynamic_link.$(TEST_EXT): LIBS += $(LIBDL)
+
+# Resolving issue with the number of sections that an object file can contain
+ifneq (,$(BIGOBJ_KEY))
+TEST_BIGOBJ = test_opencl_node.$(TEST_EXT) \
+ test_join_node.$(TEST_EXT) \
+ test_atomic.$(TEST_EXT) \
+ test_concurrent_unordered_set.$(TEST_EXT) \
+ test_concurrent_unordered_map.$(TEST_EXT) \
+ test_join_node.$(TEST_EXT)
+$(TEST_BIGOBJ): override CXXFLAGS += $(BIGOBJ_KEY)
+endif
+
+# TODO: remove repetition of .$(TEST_EXT) in the list bellow
+# The main list of TBB tests
+TEST_TBB_PLAIN.EXE = test_assembly.$(TEST_EXT) \
+ test_global_control.$(TEST_EXT) \
+ test_tbb_fork.$(TEST_EXT) \
+ test_assembly_compiler_builtins.$(TEST_EXT) \
+ test_aligned_space.$(TEST_EXT) \
+ test_atomic.$(TEST_EXT) \
+ test_atomic_pic.$(TEST_EXT) \
+ test_atomic_compiler_builtins.$(TEST_EXT) \
+ test_blocked_range.$(TEST_EXT) \
+ test_blocked_range2d.$(TEST_EXT) \
+ test_blocked_range3d.$(TEST_EXT) \
+ test_concurrent_queue.$(TEST_EXT) \
+ test_concurrent_vector.$(TEST_EXT) \
+ test_concurrent_unordered_set.$(TEST_EXT) \
+ test_concurrent_unordered_map.$(TEST_EXT) \
+ test_concurrent_hash_map.$(TEST_EXT) \
+ test_enumerable_thread_specific.$(TEST_EXT) \
+ test_handle_perror.$(TEST_EXT) \
+ test_halt.$(TEST_EXT) \
+ test_model_plugin.$(TEST_EXT) \
+ test_mutex.$(TEST_EXT) \
+ test_mutex_native_threads.$(TEST_EXT) \
+ test_rwm_upgrade_downgrade.$(TEST_EXT) \
+ test_cache_aligned_allocator.$(TEST_EXT) \
+ test_cache_aligned_allocator_STL.$(TEST_EXT) \
+ test_parallel_for.$(TEST_EXT) \
+ test_parallel_reduce.$(TEST_EXT) \
+ test_parallel_sort.$(TEST_EXT) \
+ test_parallel_scan.$(TEST_EXT) \
+ test_parallel_while.$(TEST_EXT) \
+ test_parallel_do.$(TEST_EXT) \
+ test_pipeline.$(TEST_EXT) \
+ test_pipeline_with_tbf.$(TEST_EXT) \
+ test_parallel_pipeline.$(TEST_EXT) \
+ test_lambda.$(TEST_EXT) \
+ test_task_scheduler_init.$(TEST_EXT) \
+ test_task_scheduler_observer.$(TEST_EXT) \
+ test_task.$(TEST_EXT) \
+ test_tbb_thread.$(TEST_EXT) \
+ test_std_thread.$(TEST_EXT) \
+ test_tick_count.$(TEST_EXT) \
+ test_inits_loop.$(TEST_EXT) \
+ test_yield.$(TEST_EXT) \
+ test_eh_tasks.$(TEST_EXT) \
+ test_eh_algorithms.$(TEST_EXT) \
+ test_eh_flow_graph.$(TEST_EXT) \
+ test_parallel_invoke.$(TEST_EXT) \
+ test_task_group.$(TEST_EXT) \
+ test_ittnotify.$(TEST_EXT) \
+ test_parallel_for_each.$(TEST_EXT) \
+ test_tbb_header.$(TEST_EXT) \
+ test_combinable.$(TEST_EXT) \
+ test_task_auto_init.$(TEST_EXT) \
+ test_task_arena.$(TEST_EXT) \
+ test_concurrent_monitor.$(TEST_EXT) \
+ test_semaphore.$(TEST_EXT) \
+ test_critical_section.$(TEST_EXT) \
+ test_reader_writer_lock.$(TEST_EXT) \
+ test_tbb_condition_variable.$(TEST_EXT) \
+ test_intrusive_list.$(TEST_EXT) \
+ test_concurrent_priority_queue.$(TEST_EXT) \
+ test_task_priority.$(TEST_EXT) \
+ test_task_enqueue.$(TEST_EXT) \
+ test_task_steal_limit.$(TEST_EXT) \
+ test_hw_concurrency.$(TEST_EXT) \
+ test_fp.$(TEST_EXT) \
+ test_tuple.$(TEST_EXT) \
+ test_flow_graph.$(TEST_EXT) \
+ test_broadcast_node.$(TEST_EXT) \
+ test_continue_node.$(TEST_EXT) \
+ test_function_node.$(TEST_EXT) \
+ test_limiter_node.$(TEST_EXT) \
+ test_join_node.$(TEST_EXT) \
+ test_buffer_node.$(TEST_EXT) \
+ test_queue_node.$(TEST_EXT) \
+ test_priority_queue_node.$(TEST_EXT) \
+ test_sequencer_node.$(TEST_EXT) \
+ test_source_node.$(TEST_EXT) \
+ test_overwrite_node.$(TEST_EXT) \
+ test_write_once_node.$(TEST_EXT) \
+ test_indexer_node.$(TEST_EXT) \
+ test_multifunction_node.$(TEST_EXT) \
+ test_split_node.$(TEST_EXT) \
+ test_static_assert.$(TEST_EXT) \
+ test_aggregator.$(TEST_EXT) \
+ test_concurrent_lru_cache.$(TEST_EXT) \
+ test_examples_common_utility.$(TEST_EXT) \
+ test_dynamic_link.$(TEST_EXT) \
+ test_parallel_for_vectorization.$(TEST_EXT) \
+ test_tagged_msg.$(TEST_EXT) \
+ test_partitioner_whitebox.$(TEST_EXT) \
+ test_flow_graph_whitebox.$(TEST_EXT) \
+ test_composite_node.$(TEST_EXT) \
+ test_async_node.$(TEST_EXT) \
+ test_async_msg.$(TEST_EXT) \
+ test_tbb_version.$(TEST_EXT) # insert new files right above
+
+# skip mode_plugin for now
+skip_tests += test_model_plugin
+
+ifdef OPENMP_FLAG
+test_openmp.$(TEST_EXT): CPLUS_FLAGS += $(OPENMP_FLAG)
+
+test_tbb_openmp: $(TEST_PREREQUISITE) test_openmp.$(TEST_EXT)
+ $(run_cmd) ./test_openmp.$(TEST_EXT) 1:4
+else
+test_tbb_openmp:
+ @echo "OpenMP is not available"
+endif
+
+ifdef CILK_AVAILABLE
+# Workaround on cilkrts linkage known issue (see Intel(R) C++ Composer XE 2011 Release Notes)
+# The issue reveals itself if a version of binutils is prior to 2.17
+ifeq (linux_icc,$(tbb_os)_$(compiler))
+test_cilk_interop.$(TEST_EXT): LIBS += -lcilkrts
+test_gfx_factory.$(TEST_EXT): LIBS += -lcilkrts
+endif
+test_tbb_cilk: test_cilk_interop.$(TEST_EXT)
+ $(run_cmd) ./test_cilk_interop.$(TEST_EXT) $(args)
+else
+test_tbb_cilk:
+ @echo "Intel(R) Cilk(TM) Plus is not available"
+endif
+
+test_opencl_node.$(TEST_EXT): LIBS += $(OPENCL.LIB)
+
+$(TEST_TBB_PLAIN.EXE): WARNING_KEY += $(TEST_WARNING_KEY)
+
+# Run tests that are in SCHEDULER_DIRECTLY_INCLUDED and TEST_TBB_PLAIN.EXE but not in skip_tests (which is specified by user)
+TESTS_TO_RUN := $(filter-out $(addsuffix .$(TEST_EXT),$(skip_tests)),$(TEST_TBB_PLAIN.EXE) $(SCHEDULER_DIRECTLY_INCLUDED))
+
+# This definition intentionally consists of two blank lines
+define eol
+
+
+endef
+
+# First build the targets, then run them
+# Form a list of commands separated with end of line
+# Note that usually run_cmd is empty, and tests run directly
+
+test_tbb_plain: $(TEST_PREREQUISITE) $(TESTS_TO_RUN)
+ $(foreach test, $(TESTS_TO_RUN), $(run_cmd) ./$(test) $(args) $(eol))
+
+
+# For deprecated files, we don't mind warnings etc., thus compilation rules are most relaxed
+CPLUS_FLAGS_DEPRECATED = $(DEFINE_KEY)TBB_DEPRECATED=1 $(subst $(WARNING_KEY),,$(CPLUS_FLAGS)) $(WARNING_SUPPRESS) $(INCLUDE_KEY)$(tbb_root)/src/test
+TEST_TBB_OLD.OBJ = test_concurrent_vector_v2.$(OBJ) test_concurrent_queue_v2.$(OBJ) test_mutex_v2.$(OBJ) test_task_scheduler_observer_v3.$(OBJ)
+
+$(TEST_TBB_OLD.OBJ): CPLUS_FLAGS := $(CPLUS_FLAGS_DEPRECATED)
+
+TEST_TBB_OLD.EXE = $(subst .$(OBJ),.$(TEST_EXT),$(TEST_TBB_OLD.OBJ))
+
+ifeq (,$(NO_LEGACY_TESTS))
+test_tbb_old: $(TEST_PREREQUISITE) $(TEST_TBB_OLD.EXE)
+ $(run_cmd) ./test_concurrent_vector_v2.$(TEST_EXT) $(args) 1:4
+ $(run_cmd) ./test_concurrent_queue_v2.$(TEST_EXT) $(args) 1:4
+ $(run_cmd) ./test_mutex_v2.$(TEST_EXT) $(args) 1
+ $(run_cmd) ./test_mutex_v2.$(TEST_EXT) $(args) 2
+ $(run_cmd) ./test_mutex_v2.$(TEST_EXT) $(args) 4
+ $(run_cmd) ./test_task_scheduler_observer_v3.$(TEST_EXT) $(args) 1:4
+else
+test_tbb_old:
+ @echo Legacy tests skipped
+endif
+
+ifneq (,$(codecov))
+codecov_gen:
+ profmerge
+ codecov $(if $(findstring -,$(codecov)),$(codecov),) -demang -comp $(tbb_root)/build/codecov.txt
+endif
+
+time_%: time_%.$(TEST_EXT) $(TEST_PREREQUISITE)
+ $(run_cmd) ./$< $(args)
+
+
+# for some reason, "perf_%.$(TEST_EXT): perf_dll.$(DLL)" does not work TODO: find out how to apply pattern here
+perf_sched.$(TEST_EXT): perf_dll.$(DLL)
+perf_%.$(TEST_EXT): TEST_LIBS = perf_dll.$(LIBEXT)
+perf_%: perf_%.$(TEST_EXT) $(TEST_PREREQUISITE)
+ $(run_cmd) ./$< $(args)
+
+clean_%:
+ $(RM) $*.$(OBJ) $*.exe $*.$(DLL) $*.$(LIBEXT) $*.res $*.map $*.ilk $*.pdb $*.exp $*.*manifest $*.tmp $*.d *.ver
+
+clean:
+ $(RM) *.$(OBJ) *.exe *.$(DLL) *.$(LIBEXT) *.res *.map *.ilk *.pdb *.exp *.manifest *.tmp *.d pgopti.* *.dyn core core.*[0-9][0-9] *.ver
+
+# Include automatically generated dependencies
+-include *.d
diff --git a/dependencies/tbb/build/SunOS.gcc.inc b/dependencies/tbb/build/SunOS.gcc.inc
new file mode 100644
index 0000000000000000000000000000000000000000..d487015dcebd89b8340c8b662b6617f87c5c7ca2
--- /dev/null
+++ b/dependencies/tbb/build/SunOS.gcc.inc
@@ -0,0 +1,92 @@
+# Copyright (c) 2005-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#
+#
+#
+
+COMPILE_ONLY = -c -MMD
+PREPROC_ONLY = -E -x c++
+INCLUDE_KEY = -I
+DEFINE_KEY = -D
+OUTPUT_KEY = -o #
+OUTPUTOBJ_KEY = -o #
+PIC_KEY = -fPIC
+WARNING_AS_ERROR_KEY = -Werror
+WARNING_KEY = -Wall
+TEST_WARNING_KEY = -Wshadow -Wcast-qual -Woverloaded-virtual -Wnon-virtual-dtor -Wextra
+WARNING_SUPPRESS = -Wno-parentheses -Wno-non-virtual-dtor
+DYLIB_KEY = -shared
+LIBDL = -ldl
+
+CPLUS = g++
+CONLY = gcc
+LIB_LINK_FLAGS = -shared
+LIBS = -lpthread -lrt -ldl
+C_FLAGS = $(CPLUS_FLAGS) -x c
+
+ifeq ($(cfg), release)
+ CPLUS_FLAGS = -g -O2 -DUSE_PTHREAD
+endif
+ifeq ($(cfg), debug)
+ CPLUS_FLAGS = -DTBB_USE_DEBUG -g -O0 -DUSE_PTHREAD
+endif
+
+ASM=
+ASM_FLAGS=
+
+TBB_ASM.OBJ=
+
+ifeq (ia64,$(arch))
+# Position-independent code (PIC) is a must for IA-64
+ CPLUS_FLAGS += $(PIC_KEY)
+endif
+
+ifeq (intel64,$(arch))
+ CPLUS_FLAGS += -m64
+ LIB_LINK_FLAGS += -m64
+endif
+
+ifeq (ia32,$(arch))
+ CPLUS_FLAGS += -m32
+ LIB_LINK_FLAGS += -m32
+endif
+
+# for some gcc versions on Solaris, -m64 may imply V9, but perhaps not everywhere (TODO: verify)
+ifeq (sparc,$(arch))
+ CPLUS_FLAGS += -mcpu=v9 -m64
+ LIB_LINK_FLAGS += -mcpu=v9 -m64
+endif
+
+#------------------------------------------------------------------------------
+# Setting assembler data.
+#------------------------------------------------------------------------------
+ASSEMBLY_SOURCE=$(arch)-gas
+ifeq (ia64,$(arch))
+ ASM=ias
+ TBB_ASM.OBJ = atomic_support.o lock_byte.o log2.o pause.o
+endif
+#------------------------------------------------------------------------------
+# End of setting assembler data.
+#------------------------------------------------------------------------------
+
+#------------------------------------------------------------------------------
+# Setting tbbmalloc data.
+#------------------------------------------------------------------------------
+
+M_CPLUS_FLAGS = $(CPLUS_FLAGS) -fno-rtti -fno-exceptions
+
+#------------------------------------------------------------------------------
+# End of setting tbbmalloc data.
+#------------------------------------------------------------------------------
diff --git a/dependencies/tbb/build/SunOS.inc b/dependencies/tbb/build/SunOS.inc
new file mode 100644
index 0000000000000000000000000000000000000000..447e059e1af1e98beac9a3fc912ae63e0ceca5e6
--- /dev/null
+++ b/dependencies/tbb/build/SunOS.inc
@@ -0,0 +1,83 @@
+# Copyright (c) 2005-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#
+#
+#
+
+ifndef arch
+ arch:=$(shell uname -p)
+ ifeq ($(arch),i386)
+ ifeq ($(shell isainfo -b),64)
+ arch:=intel64
+ else
+ arch:=ia32
+ endif
+ endif
+ export arch
+# For non-IA systems running Sun OS, 'arch' will contain whatever is printed by uname -p.
+# In particular, for SPARC architecture it will contain "sparc".
+endif
+
+ifndef runtime
+ gcc_version:=$(shell gcc -dumpversion)
+ os_version:=$(shell uname -r)
+ os_kernel_version:=$(shell uname -r | sed -e 's/-.*$$//')
+ export runtime:=cc$(gcc_version)_kernel$(os_kernel_version)
+endif
+
+ifeq ($(arch),sparc)
+ native_compiler := gcc
+ export compiler ?= gcc
+else
+ native_compiler := suncc
+ export compiler ?= suncc
+endif
+# debugger ?= gdb
+
+CMD=$(SHELL) -c
+CWD=$(shell pwd)
+RM?=rm -f
+RD?=rmdir
+MD?=mkdir -p
+NUL= /dev/null
+SLASH=/
+MAKE_VERSIONS=bash $(tbb_root)/build/version_info_sunos.sh $(VERSION_FLAGS) >version_string.ver
+MAKE_TBBVARS=bash $(tbb_root)/build/generate_tbbvars.sh
+
+ifdef LD_LIBRARY_PATH
+ export LD_LIBRARY_PATH := .:$(LD_LIBRARY_PATH)
+else
+ export LD_LIBRARY_PATH := .
+endif
+
+####### Build settings ########################################################
+
+OBJ = o
+DLL = so
+LIBEXT=so
+
+TBB.LST =
+TBB.DEF =
+TBB.DLL = libtbb$(CPF_SUFFIX)$(DEBUG_SUFFIX).$(DLL)
+TBB.LIB = $(TBB.DLL)
+LINK_TBB.LIB = $(TBB.LIB)
+
+MALLOC.DLL = libtbbmalloc$(DEBUG_SUFFIX).$(DLL)
+MALLOC.LIB = $(MALLOC.DLL)
+LINK_MALLOC.LIB = $(MALLOC.LIB)
+
+MALLOCPROXY.DLL = libtbbmalloc_proxy$(DEBUG_SUFFIX).$(DLL)
+
+TEST_LAUNCHER=sh $(tbb_root)/build/test_launcher.sh $(largs)
diff --git a/dependencies/tbb/build/SunOS.suncc.inc b/dependencies/tbb/build/SunOS.suncc.inc
new file mode 100644
index 0000000000000000000000000000000000000000..a99e86b502a9a962aae8505941fc945099e59a13
--- /dev/null
+++ b/dependencies/tbb/build/SunOS.suncc.inc
@@ -0,0 +1,92 @@
+# Copyright (c) 2005-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#
+#
+#
+
+COMPILE_ONLY = -c -xMMD -errtags
+PREPROC_ONLY = -E -xMMD
+INCLUDE_KEY = -I
+DEFINE_KEY = -D
+OUTPUT_KEY = -o #
+OUTPUTOBJ_KEY = -o #
+PIC_KEY = -KPIC
+DYLIB_KEY = -G
+LIBDL = -ldl
+# WARNING_AS_ERROR_KEY = -errwarn=%all
+WARNING_AS_ERROR_KEY = Warning as error
+# Supported Solaris Studio* 12.2 and above, remove ',inlasmpnu' in the line below to build by compiler prior Solaris Studio* 12.2
+WARNING_SUPPRESS = -erroff=unassigned,attrskipunsup,badargtype2w,badbinaryopw,wbadasg,wvarhidemem,inlasmpnu
+tbb_strict=0
+
+CPLUS = CC
+CONLY = cc
+
+OPENMP_FLAG = -xopenmp
+LIB_LINK_FLAGS = -G -R . -M$(tbb_root)/build/suncc.map.pause
+LINK_FLAGS += -M$(tbb_root)/build/suncc.map.pause
+LIBS = -lpthread -lrt -R .
+C_FLAGS = $(CPLUS_FLAGS)
+
+#TODO: the $(stdlib) instead of hard-wiring STLPort
+ifeq ($(cfg), release)
+ CPLUS_FLAGS = -mt -xO2 -g -library=stlport4 -DUSE_PTHREAD $(WARNING_SUPPRESS)
+endif
+ifeq ($(cfg), debug)
+ CPLUS_FLAGS = -mt -DTBB_USE_DEBUG -g -library=stlport4 -DUSE_PTHREAD $(WARNING_SUPPRESS)
+endif
+
+ASM=
+ASM_FLAGS=
+
+TBB_ASM.OBJ=
+
+ifeq (intel64,$(arch))
+ CPLUS_FLAGS += -m64
+ ASM_FLAGS += -m64
+ LIB_LINK_FLAGS += -m64
+endif
+
+ifeq (ia32,$(arch))
+ CPLUS_FLAGS += -m32
+ LIB_LINK_FLAGS += -m32
+endif
+
+# TODO: verify whether -m64 implies V9 on relevant Sun Studio versions
+# (those that handle gcc assembler syntax)
+ifeq (sparc,$(arch))
+ CPLUS_FLAGS += -m64
+ LIB_LINK_FLAGS += -m64
+endif
+
+export TBB_CUSTOM_VARS_SH=export CXXFLAGS="-I$${TBBROOT}/include -library=stlport4 $(CXXFLAGS) -M$${TBBROOT}/build/suncc.map.pause"
+export TBB_CUSTOM_VARS_CSH=setenv CXXFLAGS "-I$${TBBROOT}/include -library=stlport4 $(CXXFLAGS) -M$${TBBROOT}/build/suncc.map.pause"
+
+#------------------------------------------------------------------------------
+# Setting assembler data.
+#------------------------------------------------------------------------------
+ASSEMBLY_SOURCE=$(arch)-fbe
+#------------------------------------------------------------------------------
+# End of setting assembler data.
+#------------------------------------------------------------------------------
+
+#------------------------------------------------------------------------------
+# Setting tbbmalloc data.
+#------------------------------------------------------------------------------
+M_INCLUDES = $(INCLUDES) -I$(MALLOC_ROOT) -I$(MALLOC_SOURCE_ROOT)
+M_CPLUS_FLAGS = $(CPLUS_FLAGS)
+#------------------------------------------------------------------------------
+# End of setting tbbmalloc data.
+#------------------------------------------------------------------------------
diff --git a/dependencies/tbb/build/android.clang.inc b/dependencies/tbb/build/android.clang.inc
new file mode 100644
index 0000000000000000000000000000000000000000..89c03d23220db76b8dda14fbb05ef2537d0e17b0
--- /dev/null
+++ b/dependencies/tbb/build/android.clang.inc
@@ -0,0 +1,118 @@
+# Copyright (c) 2005-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#
+#
+#
+
+
+COMPILE_ONLY = -c -MMD
+PREPROC_ONLY = -E -x c++
+INCLUDE_KEY = -I
+DEFINE_KEY = -D
+OUTPUT_KEY = -o #
+OUTPUTOBJ_KEY = -o #
+PIC_KEY = -fPIC
+WARNING_AS_ERROR_KEY = -Werror
+WARNING_KEY = -Wall
+SDL_FLAGS = -fPIE -fPIC -fstack-protector -Wformat -Wformat-security
+TEST_WARNING_KEY = -Wshadow -Wcast-qual -Woverloaded-virtual -Wnon-virtual-dtor -Wextra
+
+WARNING_SUPPRESS = -Wno-parentheses -Wno-non-virtual-dtor
+DYLIB_KEY = -shared
+EXPORT_KEY = -Wl,--version-script,
+LIBDL = -ldl
+
+CPLUS = $(TARGET_CXX)
+CONLY = $(TARGET_CC)
+
+# -soname is necessary for proper linkage to TBB prebuilt libraries when building application with Android SDK
+LIB_LINK_FLAGS = $(DYLIB_KEY) -Wl,-soname=$(BUILDING_LIBRARY) -z relro -z now
+
+# pie is necessary for test executables to work and might be removed if newer NDK will add it implicitly
+PIE_FLAG = -pie
+ifeq ($(APP_PIE), false)
+ PIE_FLAG=
+endif
+
+LINK_FLAGS = -Wl,-rpath-link=. -rdynamic
+C_FLAGS = $(CPLUS_FLAGS)
+
+ifeq ($(cfg), release)
+ SDL_FLAGS += -D_FORTIFY_SOURCE=2
+ CPLUS_FLAGS = -O2
+endif
+ifeq ($(cfg), debug)
+ CPLUS_FLAGS = -g -O0 $(DEFINE_KEY)TBB_USE_DEBUG
+endif
+
+CPLUS_FLAGS += $(DEFINE_KEY)USE_PTHREAD $(DEFINE_KEY)_GLIBCXX_HAVE_FENV_H
+
+ifneq (,$(findstring $(arch),ia32 intel64))
+ CPLUS_FLAGS += $(DEFINE_KEY)DO_ITT_NOTIFY
+endif
+
+ifeq (0, $(dynamic_load))
+ CPLUS_FLAGS += $(DEFINE_KEY)__TBB_DYNAMIC_LOAD_ENABLED=0
+endif
+
+# Paths to the NDK prebuilt tools and libraries
+CPLUS_FLAGS += --sysroot=$(SYSROOT)
+LIB_LINK_FLAGS += --sysroot=$(SYSROOT)
+LIBS = -L$(CPLUS_LIB_PATH) -lc++_shared
+ifneq (,$(findstring $(ndk_version),r12 r12b r13 r13b r14 r14b))
+ LIBS += -lc++abi
+ ifeq (arm,$(arch))
+ LIBS += -lunwind
+ endif
+endif
+
+ifeq (arm,$(arch))
+ CPLUS_FLAGS += $(DEFINE_KEY)__TBB_64BIT_ATOMICS=0
+endif
+
+CPLUS_FLAGS += $(TARGET_CFLAGS)
+LIB_LINK_FLAGS += $(TARGET_CFLAGS) $(TARGET_LDFLAGS) -L$(CPLUS_LIB_PATH)
+
+#------------------------------------------------------------------------------
+# Setting assembler data.
+#------------------------------------------------------------------------------
+TBB_ASM.OBJ=
+MALLOC_ASM.OBJ=
+
+ASM = $(tbb_tool_prefix)as
+ifeq (intel64,$(arch))
+ ASM_FLAGS += --64
+endif
+ifeq (ia32,$(arch))
+ ASM_FLAGS += --32
+endif
+ifeq ($(cfg),debug)
+ ASM_FLAGS += -g
+endif
+
+ASSEMBLY_SOURCE=$(arch)-gas
+#------------------------------------------------------------------------------
+# End of setting assembler data.
+#------------------------------------------------------------------------------
+
+#------------------------------------------------------------------------------
+# Setting tbbmalloc data.
+#------------------------------------------------------------------------------
+
+M_CPLUS_FLAGS = $(CPLUS_FLAGS) -fno-rtti -fno-exceptions
+
+#------------------------------------------------------------------------------
+# End of setting tbbmalloc data.
+#------------------------------------------------------------------------------
diff --git a/dependencies/tbb/build/android.gcc.inc b/dependencies/tbb/build/android.gcc.inc
new file mode 100644
index 0000000000000000000000000000000000000000..973ca3f0aec431855bc608f9e33007b26453436b
--- /dev/null
+++ b/dependencies/tbb/build/android.gcc.inc
@@ -0,0 +1,117 @@
+# Copyright (c) 2005-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#
+#
+#
+
+
+COMPILE_ONLY = -c -MMD
+PREPROC_ONLY = -E -x c++
+INCLUDE_KEY = -I
+DEFINE_KEY = -D
+OUTPUT_KEY = -o #
+OUTPUTOBJ_KEY = -o #
+PIC_KEY = -fPIC
+WARNING_AS_ERROR_KEY = -Werror
+WARNING_KEY = -Wall
+TEST_WARNING_KEY = -Wshadow -Wcast-qual -Woverloaded-virtual -Wnon-virtual-dtor -Wextra
+
+WARNING_SUPPRESS = -Wno-parentheses -Wno-non-virtual-dtor
+DYLIB_KEY = -shared
+EXPORT_KEY = -Wl,--version-script,
+LIBDL = -ldl
+
+CPLUS = $(tbb_tool_prefix)g++
+CONLY = $(tbb_tool_prefix)gcc
+
+# -soname is necessary for proper linkage to TBB prebuilt libraries when building application with Android SDK
+LIB_LINK_FLAGS = $(DYLIB_KEY) -Wl,-soname=$(BUILDING_LIBRARY)
+
+# pie is necessary for test executables to work and might be removed if newer NDK will add it implicitly
+PIE_FLAG = -pie
+ifeq ($(APP_PIE), false)
+ PIE_FLAG=
+endif
+
+LINK_FLAGS = -Wl,-rpath-link=. -rdynamic
+C_FLAGS = $(CPLUS_FLAGS)
+
+ifeq ($(cfg), release)
+ CPLUS_FLAGS = -O2
+endif
+ifeq ($(cfg), debug)
+ CPLUS_FLAGS = -g -O0 $(DEFINE_KEY)TBB_USE_DEBUG
+endif
+
+CPLUS_FLAGS += $(DEFINE_KEY)USE_PTHREAD $(DEFINE_KEY)_GLIBCXX_HAVE_FENV_H
+
+ifneq (,$(findstring $(arch),ia32 intel64))
+ CPLUS_FLAGS += $(DEFINE_KEY)DO_ITT_NOTIFY
+endif
+
+ifeq (0, $(dynamic_load))
+ CPLUS_FLAGS += $(DEFINE_KEY)__TBB_DYNAMIC_LOAD_ENABLED=0
+endif
+
+
+# Paths to the NDK prebuilt tools and libraries
+CPLUS_FLAGS += --sysroot=$(SYSROOT)
+LIB_LINK_FLAGS += --sysroot=$(SYSROOT)
+LIBS = -L$(CPLUS_LIB_PATH) -lgnustl_shared
+
+ifeq (ia32,$(arch))
+ # TODO: Determine best setting of -march and add to CPLUS_FLAGS
+ CPLUS_FLAGS += -m32
+ LIB_LINK_FLAGS += -m32
+else ifeq (intel64,$(arch))
+ CPLUS_FLAGS += -m64
+ LIB_LINK_FLAGS += -m64
+else ifeq (arm,$(arch))
+ CPLUS_FLAGS += -march=armv7-a $(DEFINE_KEY)TBB_USE_GCC_BUILTINS=1 $(DEFINE_KEY)__TBB_64BIT_ATOMICS=0
+else ifeq (arm64,$(arch))
+ CPLUS_FLAGS += -march=armv8-a
+endif
+
+#------------------------------------------------------------------------------
+# Setting assembler data.
+#------------------------------------------------------------------------------
+TBB_ASM.OBJ=
+MALLOC_ASM.OBJ=
+
+ASM = $(tbb_tool_prefix)as
+ifeq (intel64,$(arch))
+ ASM_FLAGS += --64
+endif
+ifeq (ia32,$(arch))
+ ASM_FLAGS += --32
+endif
+ifeq ($(cfg),debug)
+ ASM_FLAGS += -g
+endif
+
+ASSEMBLY_SOURCE=$(arch)-gas
+#------------------------------------------------------------------------------
+# End of setting assembler data.
+#------------------------------------------------------------------------------
+
+#------------------------------------------------------------------------------
+# Setting tbbmalloc data.
+#------------------------------------------------------------------------------
+
+M_CPLUS_FLAGS = $(CPLUS_FLAGS) -fno-rtti -fno-exceptions
+
+#------------------------------------------------------------------------------
+# End of setting tbbmalloc data.
+#------------------------------------------------------------------------------
diff --git a/dependencies/tbb/build/android.icc.inc b/dependencies/tbb/build/android.icc.inc
new file mode 100644
index 0000000000000000000000000000000000000000..64da9fd169e741cd09a02d809e800777299e817b
--- /dev/null
+++ b/dependencies/tbb/build/android.icc.inc
@@ -0,0 +1,120 @@
+# Copyright (c) 2005-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#
+#
+#
+
+
+COMPILE_ONLY = -c -MMD
+PREPROC_ONLY = -E -x c++
+INCLUDE_KEY = -I
+DEFINE_KEY = -D
+OUTPUT_KEY = -o #
+OUTPUTOBJ_KEY = -o #
+PIC_KEY = -fPIC
+WARNING_AS_ERROR_KEY = -Werror
+WARNING_KEY =
+TEST_WARNING_KEY = -Wshadow -Woverloaded-virtual -Wextra
+
+WARNING_SUPPRESS = -Wno-parentheses -Wno-non-virtual-dtor
+DYLIB_KEY = -shared
+EXPORT_KEY = -Wl,--version-script,
+LIBDL = -ldl
+
+CPLUS = icpc
+CONLY = icc
+
+# -soname is necessary for proper linkage to TBB prebuilt libraries when building application with Android SDK
+LIB_LINK_FLAGS = $(DYLIB_KEY) -Wl,-soname=$(BUILDING_LIBRARY)
+
+# pie is necessary for test executables to work and might be removed if newer NDK will add it implicitly
+PIE_FLAG = -pie
+ifeq ($(APP_PIE), false)
+ PIE_FLAG=
+endif
+
+LINK_FLAGS = -Wl,-rpath-link=. -rdynamic
+C_FLAGS = $(CPLUS_FLAGS)
+
+ifeq ($(cfg), release)
+ CPLUS_FLAGS = -O2
+endif
+ifeq ($(cfg), debug)
+ CPLUS_FLAGS = -g -O0 $(DEFINE_KEY)TBB_USE_DEBUG
+endif
+
+CPLUS_FLAGS += $(DEFINE_KEY)USE_PTHREAD $(DEFINE_KEY)_GLIBCXX_HAVE_FENV_H
+
+ifneq (,$(findstring $(arch),ia32 intel64))
+ CPLUS_FLAGS += $(DEFINE_KEY)DO_ITT_NOTIFY
+endif
+
+ifeq (0, $(dynamic_load))
+ CPLUS_FLAGS += $(DEFINE_KEY)__TBB_DYNAMIC_LOAD_ENABLED=0
+endif
+
+
+# Paths to the NDK prebuilt tools and libraries
+CPLUS_FLAGS += --sysroot=$(SYSROOT)
+LIB_LINK_FLAGS += --sysroot=$(SYSROOT)
+# the -static-intel flag is to remove the need to copy Intel-specific libs to the device.
+LIBS = -L$(CPLUS_LIB_PATH) -lgnustl_shared -static-intel
+
+ifeq (ia32,$(arch))
+ # TODO: Determine best setting of -march and add to CPLUS_FLAGS
+ CPLUS_FLAGS += -m32 -march=pentium4 -falign-stack=maintain-16-byte
+ LIB_LINK_FLAGS += -m32
+else
+ ifeq (intel64,$(arch))
+ CPLUS_FLAGS += -m64
+ LIB_LINK_FLAGS += -m64
+ endif
+endif
+
+ifeq (arm,$(findstring arm,$(arch)))
+ $(error "Unsupported architecture $(arch) for icc compiler")
+endif
+
+#------------------------------------------------------------------------------
+# Setting assembler data.
+#------------------------------------------------------------------------------
+TBB_ASM.OBJ=
+MALLOC_ASM.OBJ=
+
+ASM = $(tbb_tool_prefix)as
+ifeq (intel64,$(arch))
+ ASM_FLAGS += --64
+endif
+ifeq (ia32,$(arch))
+ ASM_FLAGS += --32
+endif
+ifeq ($(cfg),debug)
+ ASM_FLAGS += -g
+endif
+
+ASSEMBLY_SOURCE=$(arch)-gas
+#------------------------------------------------------------------------------
+# End of setting assembler data.
+#------------------------------------------------------------------------------
+
+#------------------------------------------------------------------------------
+# Setting tbbmalloc data.
+#------------------------------------------------------------------------------
+
+M_CPLUS_FLAGS = $(CPLUS_FLAGS) -fno-rtti -fno-exceptions
+
+#------------------------------------------------------------------------------
+# End of setting tbbmalloc data.
+#------------------------------------------------------------------------------
diff --git a/dependencies/tbb/build/android.inc b/dependencies/tbb/build/android.inc
new file mode 100644
index 0000000000000000000000000000000000000000..aeeb68c5f75e7866bf5ad217e0182dda779a69a4
--- /dev/null
+++ b/dependencies/tbb/build/android.inc
@@ -0,0 +1,63 @@
+# Copyright (c) 2005-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#
+#
+#
+
+#
+# Extra gmake command-line parameters for use with Android:
+#
+# dlopen_workaround: Some OS versions need workaround for dlopen to avoid recursive calls.
+#
+
+####### Detections and Commands ###############################################
+
+ifeq (android,$(findstring android,$(tbb_os)))
+ $(error TBB only supports cross-compilation for Android. Specify "target=android" instead.)
+endif
+
+ifndef BUILDING_PHASE
+ ifneq ("command line","$(origin arch)")
+ ifeq (icc,$(compiler))
+ export COMPILER_VERSION := ICC: $(shell icc -V &1 | grep 'Version')
+ ifneq (,$(findstring running on IA-32, $(COMPILER_VERSION)))
+ export arch:=ia32
+ else ifneq (,$(findstring running on Intel(R) 64, $(COMPILER_VERSION)))
+ export arch:=intel64
+ else
+ $(error "No support for Android in $(COMPILER_VERSION)")
+ endif
+
+ else
+ ifdef ANDROID_SERIAL
+ uname_m:=$(shell adb shell uname -m)
+ ifeq (i686,$(uname_m))
+ export arch:=ia32
+ else
+ export arch:=$(uname_m)
+ endif
+ endif
+ endif
+ endif
+endif
+
+ifeq ("$(arch)","")
+ $(error "No target architecture specified and \'ANDROID_SERIAL\' environment variable specifying target device not set")
+endif
+
+# Android platform only supported from TBB 4.1 forward
+NO_LEGACY_TESTS = 1
+
+
diff --git a/dependencies/tbb/build/android.linux.inc b/dependencies/tbb/build/android.linux.inc
new file mode 100644
index 0000000000000000000000000000000000000000..7d022434aa5e74f3b3f8679be7d8ae714e1822a5
--- /dev/null
+++ b/dependencies/tbb/build/android.linux.inc
@@ -0,0 +1,67 @@
+# Copyright (c) 2005-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#
+#
+#
+
+####### Detections and Commands ###############################################
+
+# Must set def_prefix according to target architecture detected above
+ifeq (ia32,$(arch))
+ def_prefix = lin32
+endif
+ifeq (arm,$(findstring arm,$(arch)))
+ def_prefix = lin32
+endif
+ifeq (64,$(findstring 64,$(arch)))
+ def_prefix = lin64
+endif
+
+ifdef ndk_version
+ $(warning "NDK version $(ndk_version)")
+else
+ $(warning "NDK version not set in environment, using \'unknown\' instead.")
+ ndk_version:=unknown
+endif
+
+export runtime:=$(target)_NDK$(ndk_version)_version_$(target_os_version)
+
+AR = $(tbb_tool_prefix)ar
+MAKE_VERSIONS=sh $(tbb_root)/build/version_info_android.sh $(VERSION_FLAGS) >version_string.ver
+
+####### Build settings ########################################################
+
+# No SONAME_SUFFIX for Android allowed in library names
+TBB.LST = $(tbb_root)/src/tbb/$(def_prefix)-tbb-export.lst
+TBB.DEF = $(TBB.LST:.lst=.def)
+TBB.DLL = libtbb$(CPF_SUFFIX)$(DEBUG_SUFFIX).$(DLL)
+TBB.LIB = $(TBB.DLL)
+TBB_NO_VERSION.DLL=
+LINK_TBB.LIB = $(TBB.LIB)
+
+MALLOC.DEF = $(MALLOC_ROOT)/$(def_prefix)-tbbmalloc-export.def
+MALLOC.DLL = libtbbmalloc$(DEBUG_SUFFIX).$(DLL)
+MALLOC.LIB = $(MALLOC.DLL)
+MALLOC_NO_VERSION.DLL=
+LINK_MALLOC.LIB = $(MALLOC.LIB)
+
+MALLOCPROXY.DEF = $(MALLOC_ROOT)/$(def_prefix)-proxy-export.def
+MALLOCPROXY.DLL = libtbbmalloc_proxy$(DEBUG_SUFFIX).$(DLL)
+MALLOCPROXY_NO_VERSION.DLL=
+MALLOCPROXY.LIB = $(MALLOCPROXY.DLL)
+LINK_MALLOCPROXY.LIB = $(MALLOCPROXY.LIB)
+
+TEST_LAUNCHER=
+run_cmd ?= -sh $(tbb_root)/build/android.linux.launcher.sh $(largs)
diff --git a/dependencies/tbb/build/android.linux.launcher.sh b/dependencies/tbb/build/android.linux.launcher.sh
new file mode 100644
index 0000000000000000000000000000000000000000..b3cf87645754d6031505d0f6010608c8b8978083
--- /dev/null
+++ b/dependencies/tbb/build/android.linux.launcher.sh
@@ -0,0 +1,148 @@
+#!/bin/sh
+#
+# Copyright (c) 2005-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#
+#
+#
+
+# Usage:
+# android.linux.launcher.sh [-v] [-q] [-s] [-r ] [-u] [-l ]
+# where: -v enables verbose output
+# where: -q enables quiet mode
+# where: -s runs the test in stress mode (until non-zero exit code or ctrl-c pressed)
+# where: -r specifies number of times to repeat execution
+# where: -u is ignored on Android
+# where: -l specifies the library name to be assigned to LD_PRELOAD
+#
+# Libs and executable necessary for testing should be present in the current directory before running.
+# ANDROID_SERIAL must be set to the connected Android target device name for file transfer and test runs.
+# ANDROID_TEST_DIRECTORY may be set to the directory used for testing on the Android target device; otherwise,
+# the default directory used is "/data/local/tmp/$(basename $PWD)".
+# Note: Do not remove the redirections to '/dev/null' in the script, otherwise the nightly test system will fail.
+
+do_cleanup() #
+{ #
+ adb pull $targetdir/events.txt events.txt > /dev/null 2>&1 #
+ # Remove target directory on the device
+ adb shell "rm -r ${targetdir}; mkdir -p ${targetdir}" > /dev/null 2>&1 #
+} #
+do_trap_cleanup() #
+{ #
+ do_cleanup #
+ exit -1 #
+} #
+while getopts "qvsr:ul:" flag #
+do case $flag in #
+ s ) # Stress testing mode
+ echo Doing stress testing. Press Ctrl-C to terminate
+ run_env='stressed() { while $*; do :; done; }; ' #
+ run_prefix="stressed $run_prefix" ;; #
+ r ) # Repeats test n times
+ run_env="repeated() { for i in $(seq -s ' ' 1 $OPTARG) ; do echo \$i of $OPTARG:; \$*; done; }; " #
+ run_prefix="repeated $run_prefix" ;; #
+ l ) # Additional library
+ ldpreload="$OPTARG " ;; #
+ u ) # Stack limit
+ ;; #
+ q ) # Quiet mode, removes 'done' but prepends any other output by test name
+ OUTPUT='2>&1 | sed -e "s/done//;/^[[:space:]]*$/d;s!^!$exename: !"' ;; #
+ v ) # Verbose mode
+ SUPPRESS='' #
+ verbose=1 ;; #
+esac done #
+shift `expr $OPTIND - 1` #
+[ -z "$OUTPUT" ] && OUTPUT='| sed -e "s/\\r$//"' #
+[ $verbose ] || SUPPRESS='>/dev/null' #
+# Collect the executable name
+exename=$(basename $1) #
+shift #
+# Prepare the target directory on the device
+currentdir=$(basename $PWD) #
+targetdir=${ANDROID_TEST_DIRECTORY:-/data/local/tmp/$currentdir} #
+do_cleanup #
+trap do_trap_cleanup INT # if someone hits control-c, cleanup the device
+# Collect the list of files to transfer to the target device, starting with executable itself.
+fnamelist="$exename" #
+# Add the C++ standard library from the NDK, which is required for all tests on Android.
+if [ ! -z "${LIB_STL_ANDROID}" ]; then #
+ fnamelist="$fnamelist ${LIB_STL_ANDROID}" #
+else #
+ fnamelist="$fnamelist libc++_shared.so" #
+fi #
+# Find the TBB libraries and add them to the list.
+# Add TBB libraries from the current directory that contains libtbb* files
+files="$(ls libtbb* 2> /dev/null)" #
+[ -z "$files" ] || fnamelist="$fnamelist $files" #
+# Add any libraries built for specific tests.
+exeroot=${exename%\.*} #
+files="$(ls ${exeroot}*.so ${exeroot}*.so.* 2> /dev/null)" #
+[ -z "$files" ] || fnamelist="$fnamelist $files" #
+# TODO: Add extra libraries from the Intel(R) Compiler for certain tests
+# found=$(echo $exename | egrep 'test_malloc_atexit\|test_malloc_lib_unload' 2> /dev/null)
+# if [ ! -z $found ] ; then
+# fnamelist="$fnamelist ${compiler_path_lib}/libimf.so \
+# ${compiler_path_lib}/libsvml.so \
+# ${compiler_path_lib}/libintlc.so.5"
+# fi
+
+# Transfer collected executable and library files to the target device.
+transfers_ok=1 #
+for fullname in $fnamelist; do { #
+ if [ -r $fullname ]; then { #
+ # Transfer the executable and libraries to top-level target directory
+ [ $verbose ] && echo -n "Pushing $fullname: " #
+ eval "adb push $fullname ${targetdir}/$(basename $fullname) $SUPPRESS 2>&1" #
+ }; else { #
+ echo "Error: required file ${currentdir}/${fullname} for test $exename not available for transfer." #
+ transfers_ok=0 #
+ }; fi #
+}; done #
+if [ "${transfers_ok}" = "0" ]; then { #
+ do_cleanup #
+ exit -1 #
+}; fi #
+# Transfer input files used by example codes by scanning the executable argument list.
+for fullname in "$@"; do { #
+ if [ -r $fullname ]; then { #
+ directory=$(dirname $fullname) #
+ filename=$(basename $fullname) #
+ # strip leading "." from fullname if present
+ if [ "$directory" = "\." ]; then { #
+ directory="" #
+ fullname=$filename #
+ }; fi #
+ # Create the target directory to hold input file if necessary
+ if [ ! -z $directory ]; then { #
+ eval "adb shell 'mkdir $directory' $SUPPRESS 2>&1" #
+ }; fi #
+ # Transfer the input file to corresponding directory on target device
+ [ $verbose ] && echo -n "Pushing $fullname: " #
+ eval "adb push $fullname ${targetdir}/$fullname $SUPPRESS 2>&1" #
+ }; fi #
+}; done #
+# Set LD_PRELOAD if necessary
+[ -z "$ldpreload" ] || run_prefix="LD_PRELOAD='$ldpreload' $run_prefix" #
+[ $verbose ] && echo Running $run_prefix ./$exename $* #
+run_env="$run_env cd $targetdir; export LD_LIBRARY_PATH=." #
+[ -z "$VIRTUAL_MACHINE" ] || run_env="$run_env; export VIRTUAL_MACHINE=$VIRTUAL_MACHINE" #
+# The return_code file is the best way found to return the status of the test execution when using adb shell.
+eval 'adb shell "$run_env; $run_prefix ./$exename $* || echo -n \$? >error_code"' "${OUTPUT}" #
+# Capture the return code string and remove the trailing \r from the return_code file contents
+err=`adb shell "cat $targetdir/error_code 2>/dev/null"` #
+[ -z $err ] || echo $exename: exited with error $err #
+do_cleanup #
+# Return the exit code of the test.
+exit $err #
diff --git a/dependencies/tbb/build/android.macos.inc b/dependencies/tbb/build/android.macos.inc
new file mode 100644
index 0000000000000000000000000000000000000000..bf84578a43d1a96b9764850b6f0955017ef6eeb2
--- /dev/null
+++ b/dependencies/tbb/build/android.macos.inc
@@ -0,0 +1,76 @@
+# Copyright (c) 2005-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#
+#
+#
+
+####### Detections and Commands ###############################################
+
+# Must set def_prefix according to target architecture detected above
+ifeq (ia32,$(arch))
+ def_prefix = lin32
+endif
+ifeq (arm,$(findstring arm,$(arch)))
+ def_prefix = lin32
+endif
+ifeq (64,$(findstring 64,$(arch)))
+ def_prefix = lin64
+endif
+
+ifdef ndk_version
+ $(warning "NDK version $(ndk_version)")
+else
+ $(warning "NDK version not set in environment, using \'unknown\' instead.")
+ ndk_version:=unknown
+endif
+
+export runtime:=$(target)_NDK$(ndk_version)_version_$(target_os_version)
+
+AR = $(tbb_tool_prefix)ar
+MAKE_VERSIONS=sh $(tbb_root)/build/version_info_android.sh $(VERSION_FLAGS) >version_string.ver
+
+####### Build settings ########################################################
+
+# No SONAME_SUFFIX for Android allowed in library names
+TBB.LST = $(tbb_root)/src/tbb/$(def_prefix)-tbb-export.lst
+TBB.DEF = $(TBB.LST:.lst=.def)
+TBB.DLL = libtbb$(CPF_SUFFIX)$(DEBUG_SUFFIX).$(DLL)
+TBB.LIB = $(TBB.DLL)
+TBB_NO_VERSION.DLL=
+LINK_TBB.LIB = $(TBB.LIB)
+
+MALLOC.DEF = $(MALLOC_ROOT)/$(def_prefix)-tbbmalloc-export.def
+MALLOC.DLL = libtbbmalloc$(DEBUG_SUFFIX).$(DLL)
+MALLOC.LIB = $(MALLOC.DLL)
+MALLOC_NO_VERSION.DLL=
+LINK_MALLOC.LIB = $(MALLOC.LIB)
+
+MALLOCPROXY.DEF = $(MALLOC_ROOT)/$(def_prefix)-proxy-export.def
+MALLOCPROXY.DLL = libtbbmalloc_proxy$(DEBUG_SUFFIX).$(DLL)
+MALLOCPROXY_NO_VERSION.DLL=
+MALLOCPROXY.LIB = $(MALLOCPROXY.DLL)
+LINK_MALLOCPROXY.LIB = $(MALLOCPROXY.LIB)
+
+TBB.RES =
+MALLOC.RES =
+RML.RES =
+TBB.MANIFEST =
+MALLOC.MANIFEST =
+RML.MANIFEST =
+OBJ = o
+DLL = so
+
+TEST_LAUNCHER=
+run_cmd ?= -sh $(tbb_root)/build/android.linux.launcher.sh $(largs)
diff --git a/dependencies/tbb/build/android.windows.inc b/dependencies/tbb/build/android.windows.inc
new file mode 100644
index 0000000000000000000000000000000000000000..fec1dbef30b3f06ca16405568c583f7c76890666
--- /dev/null
+++ b/dependencies/tbb/build/android.windows.inc
@@ -0,0 +1,75 @@
+# Copyright (c) 2005-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#
+#
+#
+
+####### Detections and Commands ###############################################
+
+# Must set def_prefix according to target architecture detected above
+ifeq (ia32,$(arch))
+ def_prefix = lin32
+endif
+ifeq (arm,$(findstring arm,$(arch)))
+ def_prefix = lin32
+endif
+ifeq (64,$(findstring 64,$(arch)))
+ def_prefix = lin64
+endif
+
+ifdef ndk_version
+ $(warning "NDK version $(ndk_version)")
+else
+ $(warning "NDK version not set in environment, using \'unknown\' instead.")
+ ndk_version:=unknown
+endif
+
+export runtime:=$(target)_NDK$(ndk_version)_version_$(target_os_version)
+
+AR = $(tbb_tool_prefix)ar
+MAKE_VERSIONS = cmd /C cscript /nologo /E:jscript $(subst \,/,$(tbb_root))/build/version_info_windows.js $(CONLY) $(arch) $(subst \,/,"$(VERSION_FLAGS)") > version_string.ver
+
+####### Build settings ########################################################
+
+# No SONAME_SUFFIX for Android allowed in library names
+TBB.LST = $(tbb_root)/src/tbb/$(def_prefix)-tbb-export.lst
+TBB.DEF = $(TBB.LST:.lst=.def)
+TBB.DLL = libtbb$(CPF_SUFFIX)$(DEBUG_SUFFIX).$(DLL)
+TBB.LIB = $(TBB.DLL)
+TBB_NO_VERSION.DLL=
+LINK_TBB.LIB = $(TBB.LIB)
+
+MALLOC.DEF = $(MALLOC_ROOT)/$(def_prefix)-tbbmalloc-export.def
+MALLOC.DLL = libtbbmalloc$(DEBUG_SUFFIX).$(DLL)
+MALLOC.LIB = $(MALLOC.DLL)
+MALLOC_NO_VERSION.DLL=
+LINK_MALLOC.LIB = $(MALLOC.LIB)
+
+MALLOCPROXY.DEF = $(MALLOC_ROOT)/$(def_prefix)-proxy-export.def
+MALLOCPROXY.DLL = libtbbmalloc_proxy$(DEBUG_SUFFIX).$(DLL)
+MALLOCPROXY_NO_VERSION.DLL=
+MALLOCPROXY.LIB = $(MALLOCPROXY.DLL)
+
+TBB.RES =
+MALLOC.RES =
+RML.RES =
+TBB.MANIFEST =
+MALLOC.MANIFEST =
+RML.MANIFEST =
+OBJ = o
+DLL = so
+
+TEST_LAUNCHER=
+run_cmd ?= -sh $(tbb_root)/build/android.linux.launcher.sh $(largs)
diff --git a/dependencies/tbb/build/big_iron.inc b/dependencies/tbb/build/big_iron.inc
new file mode 100644
index 0000000000000000000000000000000000000000..efed21253676bcbaa8d26ed07b076e105dc38cb4
--- /dev/null
+++ b/dependencies/tbb/build/big_iron.inc
@@ -0,0 +1,76 @@
+# Copyright (c) 2005-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#
+#
+#
+
+#------------------------------------------------------------------------------
+# Defines settings for building the TBB run-time as a static library.
+# Use these only on platforms where dynamic linking is impractical.
+#
+# IF YOU USE TBB AS A STATIC LIBRARY, YOU MUST GUARANTEE THAT ONLY ONE COPY OF
+# THE TBB RUN-TIME IS LINKED INTO AN APPLICATION! LINKING IN MULTIPLE COPIES
+# OF THE TBB RUN-TIME, DIRECTLY OR INDIRECTLY, MAY CAUSE PROGRAM FAILURE!
+#------------------------------------------------------------------------------
+
+# Note that ITT_NOTIFY allows to selectively remove the definition of
+# DO_ITT_NOTIFY without sabotaging deferred expansion of CPLUS_FLAGS.
+# TODO: currently only in linux.{gcc,xl}.inc
+
+# Note that -pthread with xl gives "1501-210 (W) command option t contains an incorrect subargument";
+# multithreading is instead achieved by using the _r affix in the compiler name.
+# TODO: is -lpthread still relevant/needed with XL and _r affix?
+
+# Note that usage of dynamic (shared) libraries is disabled
+# (via -D__TBB_DYNAMIC_LOAD_ENABLED=0 and LIBDL emptied) primarily for performance.
+
+# OS specific settings =>
+ LIB_LINK_CMD = ar rcs
+ LIB_LINK_FLAGS =
+ LIB_LINK_LIBS =
+ LIB_OUTPUT_KEY =
+ DYLIB_KEY =
+ ifeq ($(tbb_os),linux)
+ ifeq ($(compiler),clang)
+ LIBS = -pthread -lrt
+ endif
+ ifeq ($(compiler),gcc)
+ LIBS = -pthread -lrt
+ endif
+ ifeq ($(compiler),xl)
+ LIBS = -lpthread -lrt
+ endif
+ LINK_FLAGS =
+ endif
+ override CXXFLAGS += -D__TBB_DYNAMIC_LOAD_ENABLED=0 -D__TBB_SOURCE_DIRECTLY_INCLUDED=1
+ ITT_NOTIFY =
+ DLL = a
+ LIBEXT = a
+ LIBPREF = lib
+ LIBDL =
+# <= OS specific settings
+
+TBB.DLL = $(LIBPREF)tbb$(DEBUG_SUFFIX).$(LIBEXT)
+LINK_TBB.LIB = $(TBB.DLL)
+TBB.LST =
+TBB.DEF =
+TBB_NO_VERSION.DLL =
+
+MALLOC.DLL = $(LIBPREF)tbbmalloc$(DEBUG_SUFFIX).$(LIBEXT)
+LINK_MALLOC.LIB = $(MALLOC.DLL)
+MALLOC.DEF =
+MALLOC_NO_VERSION.DLL =
+MALLOCPROXY.DLL =
+MALLOCPROXY.DEF =
diff --git a/dependencies/tbb/build/codecov.txt b/dependencies/tbb/build/codecov.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e22f8059a2f48df0e0622a57cd52969ed69ed0ec
--- /dev/null
+++ b/dependencies/tbb/build/codecov.txt
@@ -0,0 +1,7 @@
+src/tbb
+src/tbbmalloc
+include/tbb
+src/rml/server
+src/rml/client
+src/rml/include
+source/malloc
diff --git a/dependencies/tbb/build/common.inc b/dependencies/tbb/build/common.inc
new file mode 100644
index 0000000000000000000000000000000000000000..bbffa71769023bceb41c494666526dcf5f1e93e8
--- /dev/null
+++ b/dependencies/tbb/build/common.inc
@@ -0,0 +1,162 @@
+# Copyright (c) 2005-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#
+#
+#
+
+ifndef tbb_os
+
+ # Windows sets environment variable OS; for other systems, ask uname
+ ifeq ($(OS),)
+ OS:=$(shell uname)
+ ifeq ($(OS),)
+ $(error "Cannot detect operating system")
+ endif
+ export tbb_os=$(OS)
+ endif
+
+ ifeq ($(OS), Windows_NT)
+ export tbb_os=windows
+ endif
+ ifeq ($(OS), Linux)
+ export tbb_os=linux
+ endif
+ ifeq ($(OS), Darwin)
+ export tbb_os=macos
+ endif
+
+endif # !tbb_os
+
+ifeq ($(tbb_cpf),1)
+ export CPF_SUFFIX ?=_preview
+endif
+
+ifdef cpp0x
+ $(warning "Warning: deprecated cpp0x=$(cpp0x) is used, stdver must be used instead. Building in stdver=c++0x mode.")
+ export stdver?=c++0x
+ override cpp0x=
+endif
+
+ifneq (,$(stdver))
+ ifeq (,$(findstring ++, $(stdver)))
+ $(warning "Warning: unexpected stdver=$(stdver) is used.")
+ endif
+
+ CXX_STD_FLAGS=-std=$(stdver) -D_TBB_CPP0X
+endif
+
+# The requested option is added unconditionally.
+# If it is not supported, a compiler warning or error is expected.
+# Note that CXX_STD_FLAGS can be changed in ..inc.
+CXX_ONLY_FLAGS+=$(CXX_STD_FLAGS)
+
+ifeq (,$(wildcard $(tbb_root)/build/$(tbb_os).inc))
+ $(error "$(tbb_os)" is not supported. Add build/$(tbb_os).inc file with os-specific settings )
+endif
+
+# detect arch and runtime versions, provide common host-specific definitions
+include $(tbb_root)/build/$(tbb_os).inc
+
+ifeq ($(arch),)
+ $(error Architecture not detected)
+endif
+ifeq ($(runtime),)
+ $(error Runtime version not detected)
+endif
+
+# process target-dependent compilation and testing configurations
+ifdef target
+ # optionally process target-dependent options for compilation and testing
+ ifneq (,$(wildcard $(tbb_root)/build/$(target).inc))
+ include $(tbb_root)/build/$(target).inc
+ endif
+
+ # optionally process host-dependent environment for target-dependent compilation and testing
+ ifneq (,$(wildcard $(tbb_root)/build/$(target).$(tbb_os).inc))
+ include $(tbb_root)/build/$(target).$(tbb_os).inc
+ endif
+
+ # insure at least one target-dependent configuration file was found for compilation and testing
+ ifeq (,$(wildcard $(tbb_root)/build/$(target).inc)$(wildcard $(tbb_root)/build/$(target).$(tbb_os).inc))
+ $(error "$(target)" is not supported. Add build/$(target).inc or build/$(target).$(tbb_os).inc file)
+ endif
+endif #target
+
+# Support for running debug tests to release library and vice versa
+flip_cfg=$(subst _flipcfg,_release,$(subst _release,_debug,$(subst _debug,_flipcfg,$(1))))
+cross_cfg = $(if $(crosstest),$(call flip_cfg,$(1)),$(1))
+# Setting default configuration to release
+cfg?=release
+
+compiler_name=$(notdir $(compiler))
+ifdef BUILDING_PHASE
+ ifndef target
+ target:=$(tbb_os)
+ endif
+ # process host/target compiler-dependent build configuration
+ ifeq (,$(wildcard $(tbb_root)/build/$(target).$(compiler_name).inc))
+ $(error "$(compiler_name)" is not supported on $(target). Add build/$(target).$(compiler_name).inc file with compiler-specific settings. )
+ endif
+ include $(tbb_root)/build/$(target).$(compiler_name).inc
+endif
+
+ifneq ($(BUILDING_PHASE),1)
+ # definitions for top-level Makefiles
+ origin_build_dir:=$(origin tbb_build_dir)
+ tbb_build_dir?=$(tbb_root)$(SLASH)build
+ export tbb_build_prefix?=$(tbb_os)_$(arch)_$(compiler_name)_$(runtime)$(CPF_SUFFIX)
+ work_dir=$(tbb_build_dir)$(SLASH)$(tbb_build_prefix)
+endif # BUILDING_PHASE != 1
+
+ifdef offload
+ extra_inc=$(offload).offload.inc
+endif
+ifdef extra_inc
+ ifneq (,$(wildcard $(tbb_root)/build/$(extra_inc)))
+ include $(tbb_root)/build/$(extra_inc)
+ else
+ $(error specified build file: "build/$(extra_inc)" is not found. )
+ endif
+endif
+
+ifndef BUILDING_PHASE
+ work_dir:=$(work_dir)
+ # assign new value for tbb_root if path is not absolute (the filter keeps only /* paths)
+ ifeq ($(filter /% $(SLASH)%, $(subst :, ,$(tbb_root)) ),)
+ full_tbb_root:=$(CURDIR)/$(tbb_root)
+ ifeq ($(origin_build_dir),undefined)
+ #relative path are needed here as a workaround to support whitespaces in path
+ override tbb_root:=../..
+ else
+ override tbb_root:=$(full_tbb_root)
+ endif
+ export tbb_root
+ endif
+ endif # !BUILDING_PHASE
+
+.DELETE_ON_ERROR: # Make will delete target if error occurred when building it.
+
+# MAKEOVERRIDES contains the command line variable definitions. Reseting it to
+# empty allows propogating all exported overridden variables to nested makes.
+# NOTEs:
+# 1. All variable set in command line are propagated to nested makes.
+# 2. All variables declared with the "export" keyword are propagated to
+# nested makes.
+# 3. "override" allows changing variables set in command line. But it doesn't
+# propagate new values to nested makes. For propagation, the "export" keyword
+# should be used.
+# 4. gmake v3.80 doesn't support exporting of target-specific variables using
+# the "export" keyword
+MAKEOVERRIDES =
diff --git a/dependencies/tbb/build/common_rules.inc b/dependencies/tbb/build/common_rules.inc
new file mode 100644
index 0000000000000000000000000000000000000000..8e758a41a1a2c793f8861517b1eb3a851b2a4a45
--- /dev/null
+++ b/dependencies/tbb/build/common_rules.inc
@@ -0,0 +1,165 @@
+# Copyright (c) 2005-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#
+#
+#
+
+
+ifeq ($(tbb_strict),1)
+ ifeq ($(WARNING_AS_ERROR_KEY),)
+ $(error WARNING_AS_ERROR_KEY is empty)
+ endif
+ # Do not remove line below!
+ WARNING_KEY += $(WARNING_AS_ERROR_KEY)
+endif
+
+ifneq (,$(findstring s,$(MAKEFLAGS)))
+ override largs+=-q
+endif
+ifneq (,$(repeat))
+ override largs+=-r $(repeat)
+endif
+ifneq (,$(largs)$(run_prefix))
+ override run_cmd:=$(run_cmd) $(TEST_LAUNCHER)
+ TEST_LAUNCHER=
+ ifeq (,$(strip $(run_cmd)))
+ $(warning Test launcher is not defined for the platform, ignoring launcher arguments)
+ endif
+endif
+
+ifndef TEST_EXT
+ TEST_EXT = exe
+endif
+
+INCLUDES += $(INCLUDE_KEY)$(tbb_root)/src $(INCLUDE_KEY)$(tbb_root)/src/rml/include $(INCLUDE_KEY)$(tbb_root)/include
+
+CPLUS_FLAGS += $(WARNING_KEY) $(CXXFLAGS)
+ifeq ($(tbb_cpf),1)
+CPLUS_FLAGS += $(DEFINE_KEY)__TBB_CPF_BUILD=1
+endif
+LINK_FLAGS += $(LDFLAGS)
+LIB_LINK_FLAGS += $(LDFLAGS)
+
+LIB_LINK_CMD ?= $(CPLUS) $(PIC_KEY)
+ifeq ($(origin LIB_OUTPUT_KEY), undefined)
+ LIB_OUTPUT_KEY = $(OUTPUT_KEY)
+endif
+ifeq ($(origin LIB_LINK_LIBS), undefined)
+ LIB_LINK_LIBS = $(LIBDL) $(LIBS)
+endif
+
+CONLY ?= $(CPLUS)
+
+# The most generic rules
+#$(1) - is the target pattern
+define make-cxx-obj
+$1: %.cpp
+ $$(CPLUS) $$(OUTPUTOBJ_KEY)$$@ $$(COMPILE_ONLY) $$(CPLUS_FLAGS) $$(CXX_ONLY_FLAGS) $$(CXX_WARN_SUPPRESS) $$(INCLUDES) $$<
+endef
+
+TEST_AFFIXES_OBJS=$(addsuffix .$(OBJ),$(addprefix %_,$(TEST_SUFFIXES)) $(addsuffix _%,$(TEST_PREFIXES)))
+
+# Make will not process the same recipe for each test pattern (since the dependency on the same %.cpp)
+# thus the separated recipes should be provided
+$(foreach t,%.$(OBJ) $(TEST_AFFIXES_OBJS),$(eval $(call make-cxx-obj,$(t))))
+
+.PRECIOUS: %.$(OBJ) %.$(TEST_EXT) %.res $(TEST_AFFIXES_OBJS)
+
+# Rules for generating a test DLL
+%_dll.$(OBJ): %.cpp
+ $(CPLUS) $(COMPILE_ONLY) $(OUTPUTOBJ_KEY)$@ $(CPLUS_FLAGS) $(PIC_KEY) $(DEFINE_KEY)_USRDLL $(INCLUDES) $<
+
+#$(1) - is the binary name
+#$(2) - is the input obj files and libraries
+define make-test-binary
+ $(CPLUS) $(OUTPUT_KEY)$(strip $1) $(CPLUS_FLAGS) $(2) $(LIBS) $(LINK_FLAGS)
+endef
+
+# LINK_FILES the list of options to link test specific files (libraries and object files)
+LINK_FILES+=$(TEST_LIBS)
+# Rule for generating executable test
+%.$(TEST_EXT): %.$(OBJ) $(TEST_LIBS) $(TEST_PREREQUISITE) $(if $(use_proxy),$(PROXY.LIB))
+ $(call make-test-binary,$@,$< $(LINK_FILES) $(PIE_FLAG))
+
+# Rules for generating a test DLL
+%_dll.$(DLL): LINK_FLAGS += $(PIC_KEY) $(DYLIB_KEY)
+%_dll.$(DLL): TEST_LIBS := $(subst %_dll.$(DLL),,$(TEST_LIBS))
+%_dll.$(DLL): %_dll.$(OBJ)
+ $(call make-test-binary,$@,$< $(LINK_FILES))
+.PRECIOUS: %_dll.$(OBJ) %_dll.$(DLL)
+
+%.$(OBJ): %.c
+ $(CONLY) $(COMPILE_ONLY) $(OUTPUTOBJ_KEY)$@ $(C_FLAGS) $(INCLUDES) $<
+
+%.$(OBJ): %.asm
+ $(ASM) $(ASM_FLAGS) $<
+
+%.$(OBJ): %.s
+ cpp <$< | grep -v '^#' >$*.tmp
+ $(ASM) $(ASM_FLAGS) -o $@ $*.tmp
+
+# Rule for generating .E file if needed for visual inspection
+# Note that ICL treats an argument after PREPROC_ONLY as a file to open,
+# so all uses of PREPROC_ONLY should be immediately followed by a file name
+%.E: %.cpp
+ $(CPLUS) $(CPLUS_FLAGS) $(CXX_ONLY_FLAGS) $(INCLUDES) $(PREPROC_ONLY) $< >$@
+
+# TODO Rule for generating .asm file if needed for visual inspection
+%.asm: %.cpp
+ $(CPLUS) /c /FAs /Fa $(CPLUS_FLAGS) $(CXX_ONLY_FLAGS) $(INCLUDES) $<
+
+# TODO Rule for generating .s file if needed for visual inspection
+%.s: %.cpp
+ $(CPLUS) -S $(CPLUS_FLAGS) $(CXX_ONLY_FLAGS) $(INCLUDES) $<
+
+# Customizations
+$(KNOWN_WARNINGS): %.$(OBJ): %.cpp
+ $(CPLUS) $(COMPILE_ONLY) $(subst $(WARNING_KEY),,$(CPLUS_FLAGS)) $(CXX_ONLY_FLAGS) $(CXX_WARN_SUPPRESS) $(INCLUDES) $<
+
+tbb_misc.$(OBJ): version_string.ver
+tbb_misc.$(OBJ): INCLUDES+=$(INCLUDE_KEY).
+
+tbb_misc.E: tbb_misc.cpp version_string.ver
+ $(CPLUS) $(CPLUS_FLAGS) $(CXX_ONLY_FLAGS) $(INCLUDE_KEY). $(INCLUDES) $(PREPROC_ONLY) $< >$@
+
+%.res: %.rc version_string.ver $(TBB.MANIFEST)
+ rc /Fo$@ $(INCLUDES) $(filter /D%,$(CPLUS_FLAGS)) $<
+
+# TODO: add $(LIB_LINK_LIBS) $(LIB_LINK_FLAGS) (in a separate line?) and remove useless $(INCLUDES)
+VERSION_FLAGS=$(CPLUS) $(CPLUS_FLAGS) $(CXX_ONLY_FLAGS) $(INCLUDES)
+
+ifneq (,$(TBB.MANIFEST))
+$(TBB.MANIFEST):
+ cmd /C "echo #include ^ >tbbmanifest.c"
+ cmd /C "echo int main(){return 0;} >>tbbmanifest.c"
+ cl /nologo $(C_FLAGS) tbbmanifest.c
+
+version_string.ver: $(TBB.MANIFEST)
+ $(MAKE_VERSIONS)
+ cmd /C "echo #define TBB_MANIFEST 1 >> version_string.ver"
+# TODO: fix parallel build by writing to a temporary file and rename it when complete
+else
+# TODO: make version strings directly representative for all the libraries
+version_string.ver:
+ $(MAKE_VERSIONS)
+endif
+
+test_% debug_%: test_%.$(TEST_EXT) $(TEST_PREREQUISITE)
+ $(run_cmd) ./$< $(args)
+ifneq (,$(codecov))
+ profmerge
+ codecov $(if $(findstring -,$(codecov)),$(codecov),) -demang -comp $(tbb_root)/build/codecov.txt
+endif
+
diff --git a/dependencies/tbb/build/detect.js b/dependencies/tbb/build/detect.js
new file mode 100644
index 0000000000000000000000000000000000000000..a5b5d82f5c60aee78233a0cc299cbd9c7081ce88
--- /dev/null
+++ b/dependencies/tbb/build/detect.js
@@ -0,0 +1,188 @@
+// Copyright (c) 2005-2017 Intel Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+//
+//
+
+function readAllFromFile(fname) {
+ var fso = new ActiveXObject("Scripting.FileSystemObject");
+ var file = null;
+ try {
+ file = fso.OpenTextFile(fname, 1, 0);
+ return (file.readAll());
+ } finally {
+ // Close the file in the finally section to guarantee that it will be closed in any case
+ // (if the exception is thrown or not).
+ file.Close();
+ }
+}
+
+function doWork() {
+ var WshShell = WScript.CreateObject("WScript.Shell");
+
+ var tmpExec = WshShell.Run("cmd /c echo int main(){return 0;} >detect.c", 0, true);
+
+ // The next block deals with GCC (MinGW)
+ if (WScript.Arguments.Count() > 1) {
+ var compilerPath = WScript.Arguments(1);
+ // The RegExp matches everything up to and including the last slash (it uses a greedy approach.)
+ var compilerName = compilerPath.replace(/^.*[\/\\]/, "");
+ if (compilerName.match(/gcc/i) != null) {
+ if (WScript.Arguments(0) == "/arch") {
+ // Get predefined macros
+ tmpExec = WshShell.Run("cmd /C " + compilerPath + " -dM -E detect.c > detect.map", 0, true);
+ var defs = readAllFromFile("detect.map");
+ //detect target architecture
+ var intel64 = /x86_64|amd64/mgi;
+ var ia32 = /i386/mgi;
+ if (defs.match(intel64)) {
+ WScript.Echo("intel64");
+ } else if (defs.match(ia32)) {
+ WScript.Echo("ia32");
+ } else {
+ WScript.Echo("unknown");
+ }
+ } else {
+ tmpExec = WshShell.Exec(compilerPath + " -dumpversion");
+ var gccVersion = tmpExec.StdOut.ReadLine();
+ if (WScript.Arguments(0) == "/runtime") {
+ WScript.Echo("mingw" + gccVersion);
+ }
+ else if (WScript.Arguments(0) == "/minversion") {
+ // Comparing strings, not numbers; will not work for two-digit versions
+ if (gccVersion >= WScript.Arguments(2)) {
+ WScript.Echo("ok");
+ } else {
+ WScript.Echo("fail");
+ }
+ }
+ }
+ return;
+ }
+ }
+
+ //Compile binary
+ tmpExec = WshShell.Exec("cl /MD detect.c /link /MAP");
+ while (tmpExec.Status == 0) {
+ WScript.Sleep(100);
+ }
+ //compiler banner that includes version and target arch was printed to stderr
+ var clVersion = tmpExec.StdErr.ReadAll();
+
+ if (WScript.Arguments(0) == "/arch") {
+ //detect target architecture
+ var intel64 = /AMD64|EM64T|x64/mgi;
+ var ia32 = /[80|\s]x86/mgi;
+ var arm = /ARM/mgi;
+ if (clVersion.match(intel64)) {
+ WScript.Echo("intel64");
+ } else if (clVersion.match(ia32)) {
+ WScript.Echo("ia32");
+ } else if (clVersion.match(arm)) {
+ WScript.Echo("armv7");
+ } else {
+ WScript.Echo("unknown");
+ }
+ return;
+ }
+
+ if (WScript.Arguments(0) == "/runtime") {
+ //read map-file
+ var mapContext = readAllFromFile("detect.map");
+ //detect runtime
+ var vc71 = /MSVCR71\.DLL/mgi;
+ var vc80 = /MSVCR80\.DLL/mgi;
+ var vc90 = /MSVCR90\.DLL/mgi;
+ var vc100 = /MSVCR100\.DLL/mgi;
+ var vc110 = /MSVCR110\.DLL/mgi;
+ var vc120 = /MSVCR120\.DLL/mgi;
+ var vc140 = /VCRUNTIME140\.DLL/mgi;
+ var psdk = /MSVCRT\.DLL/mgi;
+ if (mapContext.match(vc71)) {
+ WScript.Echo("vc7.1");
+ } else if (mapContext.match(vc80)) {
+ WScript.Echo("vc8");
+ } else if (mapContext.match(vc90)) {
+ WScript.Echo("vc9");
+ } else if (mapContext.match(vc100)) {
+ WScript.Echo("vc10");
+ } else if (mapContext.match(vc110)) {
+ WScript.Echo("vc11");
+ } else if (mapContext.match(vc120)) {
+ WScript.Echo("vc12");
+ } else if (mapContext.match(vc140)) {
+ WScript.Echo("vc14");
+ } else {
+ WScript.Echo("unknown");
+ }
+ return;
+ }
+
+ if (WScript.Arguments(0) == "/minversion") {
+ var compilerVersion;
+ if (WScript.Arguments(1) == "cl") {
+ compilerVersion = clVersion.match(/Compiler Version ([0-9.]+)\s/mi)[1];
+ // compilerVersion is in xx.xx.xxxxx.xx format, i.e. a string.
+ // It will compare well with major.minor versions where major has two digits,
+ // which is sufficient as the versions of interest start from 13 (for VC7).
+ } else if (WScript.Arguments(1) == "icl") {
+ // Get predefined ICL macros
+ tmpExec = WshShell.Run("cmd /C icl /QdM /E detect.c > detect.map", 0, true);
+ var defs = readAllFromFile("detect.map");
+ // In #define __INTEL_COMPILER XXYY, XX is the major ICL version, YY is minor
+ compilerVersion = defs.match(/__INTEL_COMPILER[ \t]*([0-9]+).*$/mi)[1] / 100;
+ // compiler version is a number; it compares well with another major.minor
+ // version number, where major has one, two, and perhaps more digits (9.1, 11, etc).
+ }
+ if (compilerVersion >= WScript.Arguments(2)) {
+ WScript.Echo("ok");
+ } else {
+ WScript.Echo("fail");
+ }
+ return;
+ }
+}
+
+function doClean() {
+ var fso = new ActiveXObject("Scripting.FileSystemObject");
+ // delete intermediate files
+ if (fso.FileExists("detect.c"))
+ fso.DeleteFile("detect.c", false);
+ if (fso.FileExists("detect.obj"))
+ fso.DeleteFile("detect.obj", false);
+ if (fso.FileExists("detect.map"))
+ fso.DeleteFile("detect.map", false);
+ if (fso.FileExists("detect.exe"))
+ fso.DeleteFile("detect.exe", false);
+ if (fso.FileExists("detect.exe.manifest"))
+ fso.DeleteFile("detect.exe.manifest", false);
+}
+
+if (WScript.Arguments.Count() > 0) {
+
+ try {
+ doWork();
+ } catch (error) {
+ WScript.Echo("unknown");
+ }
+ doClean();
+
+} else {
+ WScript.Echo("Supported options:\n"
+ + "\t/arch [compiler]\n"
+ + "\t/runtime [compiler]\n"
+ + "\t/minversion compiler version");
+}
+
diff --git a/dependencies/tbb/build/generate_tbbvars.bat b/dependencies/tbb/build/generate_tbbvars.bat
new file mode 100644
index 0000000000000000000000000000000000000000..41d207d8309b5750d828fb6c21604f1ae78408d4
--- /dev/null
+++ b/dependencies/tbb/build/generate_tbbvars.bat
@@ -0,0 +1,65 @@
+@echo off
+REM
+REM Copyright (c) 2005-2017 Intel Corporation
+REM
+REM Licensed under the Apache License, Version 2.0 (the "License");
+REM you may not use this file except in compliance with the License.
+REM You may obtain a copy of the License at
+REM
+REM http://www.apache.org/licenses/LICENSE-2.0
+REM
+REM Unless required by applicable law or agreed to in writing, software
+REM distributed under the License is distributed on an "AS IS" BASIS,
+REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+REM See the License for the specific language governing permissions and
+REM limitations under the License.
+REM
+REM
+REM
+REM
+REM
+setlocal
+for %%D in ("%tbb_root%") do set actual_root=%%~fD
+set fslash_root=%actual_root:\=/%
+set bin_dir=%CD%
+set fslash_bin_dir=%bin_dir:\=/%
+set _INCLUDE=INCLUDE& set _LIB=LIB
+if not x%UNIXMODE%==x set _INCLUDE=CPATH& set _LIB=LIBRARY_PATH
+
+echo Generating local tbbvars.bat
+echo @echo off>tbbvars.bat
+echo SET TBBROOT=%actual_root%>>tbbvars.bat
+echo SET TBB_ARCH_PLATFORM=%arch%\%runtime%>>tbbvars.bat
+echo SET TBB_TARGET_ARCH=%arch%>>tbbvars.bat
+echo SET %_INCLUDE%=%%TBBROOT%%\include;%%%_INCLUDE%%%>>tbbvars.bat
+echo SET %_LIB%=%bin_dir%;%%%_LIB%%%>>tbbvars.bat
+echo SET PATH=%bin_dir%;%%PATH%%>>tbbvars.bat
+if not x%UNIXMODE%==x echo SET LD_LIBRARY_PATH=%bin_dir%;%%LD_LIBRARY_PATH%%>>tbbvars.bat
+
+echo Generating local tbbvars.sh
+echo #!/bin/sh>tbbvars.sh
+echo export TBBROOT="%fslash_root%">>tbbvars.sh
+echo export TBB_ARCH_PLATFORM="%arch%\%runtime%">>tbbvars.sh
+echo export TBB_TARGET_ARCH="%arch%">>tbbvars.sh
+echo export %_INCLUDE%="${TBBROOT}/include;$%_INCLUDE%">>tbbvars.sh
+echo export %_LIB%="%fslash_bin_dir%;$%_LIB%">>tbbvars.sh
+echo export PATH="%fslash_bin_dir%;$PATH">>tbbvars.sh
+if not x%UNIXMODE%==x echo export LD_LIBRARY_PATH="%fslash_bin_dir%;$LD_LIBRARY_PATH">>tbbvars.sh
+
+echo Generating local tbbvars.csh
+echo #!/bin/csh>tbbvars.csh
+echo setenv TBBROOT "%actual_root%">>tbbvars.csh
+echo setenv TBB_ARCH_PLATFORM "%arch%\%runtime%">>tbbvars.csh
+echo setenv TBB_TARGET_ARCH "%arch%">>tbbvars.csh
+echo setenv %_INCLUDE% "${TBBROOT}\include;$%_INCLUDE%">>tbbvars.csh
+echo setenv %_LIB% "%bin_dir%;$%_LIB%">>tbbvars.csh
+echo setenv PATH "%bin_dir%;$PATH">>tbbvars.csh
+if not x%UNIXMODE%==x echo setenv LD_LIBRARY_PATH "%bin_dir%;$LD_LIBRARY_PATH">>tbbvars.csh
+
+if not x%LIB_STL_ANDROID%==x (
+REM Workaround for copying Android* specific stl shared library to work folder
+copy /Y "%LIB_STL_ANDROID:/=\%" .
+)
+
+endlocal
+exit
diff --git a/dependencies/tbb/build/generate_tbbvars.sh b/dependencies/tbb/build/generate_tbbvars.sh
new file mode 100644
index 0000000000000000000000000000000000000000..0ca0965acf1319a6d81f514e8d6b3df1aff8ae08
--- /dev/null
+++ b/dependencies/tbb/build/generate_tbbvars.sh
@@ -0,0 +1,71 @@
+#!/bin/bash
+#
+# Copyright (c) 2005-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#
+#
+#
+
+# Script used to generate tbbvars.[c]sh scripts
+bin_dir="$PWD" #
+cd "$tbb_root" # keep this comments here
+tbb_root="$PWD" # to make it unsensible
+cd "$bin_dir" # to EOL encoding
+cat >./tbbvars.sh <./tbbvars.csh <
+
+
+Overview
+This directory contains the internal Makefile infrastructure for Intel® Threading Building Blocks (Intel® TBB).
+
+
+See below for how to build Intel TBB and how to port Intel TBB
+to a new platform, operating system or architecture.
+
+
+Files
+The files here are not intended to be used directly. See below for usage.
+
+- Makefile.tbb
+
- Main Makefile to build the Intel TBB library.
+ Invoked via 'make tbb' from top-level Makefile.
+
- Makefile.tbbmalloc
+
- Main Makefile to build the Intel TBB scalable memory allocator library as well as its tests.
+ Invoked via 'make tbbmalloc' from top-level Makefile.
+
- Makefile.test
+
- Main Makefile to build and run the tests for the Intel TBB library.
+ Invoked via 'make test' from top-level Makefile.
+
- common.inc
+
- Main common included Makefile that includes OS-specific and compiler-specific Makefiles.
+
- <os>.inc
+
- OS-specific Makefile for a particular <os>.
+
- <os>.<compiler>.inc
+
- Compiler-specific Makefile for a particular <os> / <compiler> combination.
+
- *.sh
+
- Infrastructure utilities for Linux* OS, macOS*, and UNIX*-related operating systems.
+
- *.js, *.bat
+
- Infrastructure utilities for Windows* OS.
+
+
+To Build
+
+To port Intel TBB to a new platform, operating system or architecture, see the porting directions below.
+
+
+Software prerequisites:
+
+- C++ compiler for the platform, operating system and architecture of interest.
+ Either the native compiler for your system, or, optionally, the appropriate Intel® C++ compiler, may be used.
+
- GNU make utility. On Windows OS, if a UNIX* emulator is used to run GNU make,
+ it should be able to run Windows OS utilities and commands. On Linux OS, macOS, etc.,
+ shell commands issued by GNU make should execute in a Bourne or BASH compatible shell.
+ In the following examples, replace make with the correct GNU make command for
+ your system (for example, gmake). GNU make version 3.80 and more recent are supported.
+
+
+
+Intel TBB libraries can be built by performing the following steps.
+On systems that support only one ABI (e.g., 32-bit), these steps build the libraries for that ABI.
+On systems that support both 64-bit and 32-bit libraries, these steps build the 64-bit libraries
+(Linux OS, macOS, and related systems) or whichever ABI is selected in the development environment (Windows OS).
+
+
+- Change to the top-level directory of the installed software.
+
- If using the Intel® C++ compiler, make sure the appropriate compiler is available in your PATH
+ (e.g., by sourcing the appropriate iccvars script for the compiler to be used).
+
- Invoke GNU make using no arguments, for example, make.
+
+
+
+To build Intel TBB libraries for other than the default ABI (e.g., to build 32-bit libraries on Linux OS, macOS,
+or related systems that support both 64-bit and 32-bit libraries), perform the following steps:
+
+
+- Change to the top-level directory of the installed software.
+
- If using the Intel® C++ compiler, make sure the appropriate compiler is available in your PATH
+ (e.g., by sourcing the appropriate iccvars script for the compiler to be used).
+
- Explicitly specify the architecture when invoking GNU make, e.g. make arch=ia32.
+
+
+The default make target will build the release and debug versions of the Intel TBB library.
+Other targets are available in the top-level Makefile. You might find the following targets useful:
+
+- make test will build and run Intel TBB unit-tests;
+
- make examples will build and run Intel TBB examples. Available in the open-source version only.
+For the commercial version, you can download Intel TBB Samples at the Intel® Software Product Samples and Tutorials website;
+
- make all will do all of the above. Available in the open-source version only.
+
+See also the list of other targets below.
+
+
+
+By default, the libraries will be built in sub-directories within the build/ directory.
+The sub-directories are named according to the operating system, architecture, compiler and software environment used
+(the sub-directory names also distinguish release vs. debug libraries). On Linux OS, the software environment comprises
+the GCC, libc and kernel version used. On macOS, the software environment comprises the GCC and OS version used.
+On Windows OS, the software environment comprises the Microsoft* Visual Studio* version used.
+See below for how to change the default build directory.
+
+
+
+To perform different build and/or test operations, use the following steps.
+
+
+- Change to the top-level directory of the installed software.
+
- If using the Intel® C++ compiler, make sure the appropriate compiler is available in your PATH
+ (e.g., by sourcing the appropriate iccvars script for the compiler to be used).
+
- Invoke GNU make by using one or more of the following commands.
+
+ - make
+
- Default build. Equivalent to make tbb tbbmalloc.
+
- make all
+
- Equivalent to make tbb tbbmalloc test examples. Available in the open-source version only.
+
- cd src;make release
+
- Build and test release libraries only.
+
- cd src;make debug
+
- Build and test debug libraries only.
+
- make tbb
+
- Make Intel TBB release and debug libraries.
+
- make tbbmalloc
+
- Make Intel TBB scalable memory allocator libraries.
+
- make test
+
- Compile and run unit-tests
+
- make examples
+
- Build libraries and run all examples, like doing make debug clean release from the general example Makefile.
+ Available in the open-source version only.
+
- make python
+
- Build, install, and test Python* API for Intel TBB. See details here.
+
- make compiler={icl, icc, gcc, clang} [(above options or targets)]
+
- Build and run as above, but use specified compilers instead of default, native compilers
+
+ - {icl, icc} - to use Intel® compilers (icl on Windows OS, icc on Linux OS or macOS).
+ - gcc - to use g++ (e.g. MinGW on Windows OS)
+ - clang - to use Clang compiler
+
+ - make compiler=clang stdlib=libc++ [(above options or targets)]
+
- Build and run as above, but use libc++ as a standard c++ library for clang.
+
- make stdver={c++11, c++14, ...} [(above options or targets)]
+
- Build and run as above, but additionally specify the version of the C++ standard or dialect to be used by
+ the compiler. The specified value of stdver will be used as a parameter to the appropriate
+ compiler option (such as -std); the behavior in case of unsupported value is compiler-specific.
+
- make target_ui=win8ui [target_ui_mode=production] [(above options or targets)]
+
- Build and run as above, but use API that is compliant with Windows Store* applications.
+ target_ui_mode=production is used to produce binaries that are compliant with Windows Store* application container. In later case they won't with Intel TBB unit tests but work only with Windows Store* applications.
+
- ndk-build target=android [(above options or targets)]
+
- Build and run as above, but build libraries for Android* OS by Android NDK that should be installed. Makefiles were tested with revision 8.
+
- make arch={ia32, intel64, ia64} [(above options or targets)]
+
- Build and run as above, but build libraries for the selected ABI.
+ Might be useful for cross-compilation; ensure proper environment is set before running this command.
+
- make tbb_root={(Intel TBB directory)} [(above options or targets)]
+
- Build and run as above; for use when invoking make from a directory other than the top-level directory.
+
- make tbb_build_dir={(build directory)} [(above options or targets)]
+
- Build and run as above, but place the built libraries in the specified directory, rather than in the default sub-directory within the build/ directory. This command might have troubles with the build in case the sources installed to the directory with spaces in the path.
+
- make tbb_build_prefix={(build sub-directory)} [(above options or targets)]
+
- Build and run as above, but place the built libraries in the specified sub-directory within the build/ directory, rather than using the default sub-directory name.
+
- make tbb_cpf=1 [(above options or targets)]
+
- Build and run as above, but build and use libraries with the Community Preview Features enabled, rather than the default libraries.
+
- make [(above options)] clean
+
- Remove any executables or intermediate files produced by the above commands.
+ Includes build directories, object files, libraries and test executables.
+
+
+
+To Port
+
+This section provides information on how to port Intel TBB to a new platform, operating system or architecture.
+A subset or a superset of these steps may be required for porting to a given platform.
+
+
+To port the Intel TBB source code:
+
+- If porting to a new architecture, create a file that describes the architecture-specific details for that architecture.
+
+ - Create a <os>_<architecture>.h file in the include/tbb/machine directory
+ that describes these details.
+
+ - The <os>_<architecture>.h is named after the operating system and architecture as recognized by
+ include/tbb/tbb_machine.h and the Makefile infrastructure.
+
- This file defines the implementations of synchronization operations, and also the
+ scheduler yield function, for the operating system and architecture.
+
- Several examples of <os>_<architecture>.h files can be found in the
+ include/tbb/machine directory.
+
+ - A minimal implementation defines the 4-byte and 8-byte compare-and-swap operations,
+ and the scheduler yield function. See include/tbb/machine/mac_ppc.h
+ for an example of a minimal implementation.
+
- More complex implementation examples can also be found in the
+ include/tbb/machine directory
+ that implement all the individual variants of synchronization operations that Intel TBB uses.
+ Such implementations are more verbose but may achieve better performance on a given architecture.
+
- In a given implementation, any synchronization operation that is not defined is implemented, by default,
+ in terms of 4-byte or 8-byte compare-and-swap. More operations can thus be added incrementally to increase
+ the performance of an implementation.
+
- In most cases, synchronization operations are implemented as inline assembly code; examples also exist,
+ (e.g., for Intel® Itanium® processors) that use out-of-line assembly code in *.s or *.asm files
+ (see the assembly code sub-directories in the src/tbb directory).
+
+
+ - Modify include/tbb/tbb_machine.h, if needed, to invoke the appropriate
+ <os>_<architecture>.h file in the include/tbb/machine directory.
+
+ - Add an implementation of DetectNumberOfWorkers() in src/tbb/tbb_misc.h,
+ that returns the number of cores found on the system in case it is not supported by the current implementation.
+ This is used to determine the default number of threads for the Intel TBB task scheduler.
+
- Either properly define FillDynamicLinks for use in
+ src/tbb/cache_aligned_allocator.cpp,
+ or hardcode the allocator to be used.
+
- Additional types might be required in the union defined in
+ include/tbb/aligned_space.h
+ to ensure proper alignment on your platform.
+
- Changes may be required in include/tbb/tick_count.h
+ for systems that do not provide gettimeofday.
+
+
+To port the Makefile infrastructure:
+Modify the appropriate files in the Makefile infrastructure to add a new platform, operating system or architecture as needed.
+See the Makefile infrastructure files for examples.
+
+- The top-level Makefile includes common.inc to determine the operating system.
+
+ - To add a new operating system, add the appropriate test to common.inc, and create the needed <os>.inc and <os>.<compiler>.inc files (see below).
+
+ - The <os>.inc file makes OS-specific settings for a particular operating systems.
+
+ - For example, linux.inc makes settings specific to Linux operating systems.
+
- This file performs OS-dependent tests to determine the specific platform and/or architecture, and sets other platform-dependent values.
+
- Add a new <os>.inc file for each new operating system added.
+
+ - The <os>.<compiler>.inc file makes compiler-specific settings for a particular
+ <os> / <compiler> combination.
+
+ - For example, linux.gcc.inc makes specific settings for using GCC on Linux OS, and linux.icc.inc makes specific settings for using the Intel® C++ compiler on Linux OS.
+
- This file sets particular compiler, assembler and linker options required when using a particular <os> / <compiler> combination.
+
- Add a new <os>.<compiler>.inc file for each new <os> / <compiler> combination added.
+
+
+
+
+Up to parent directory
+
+Copyright © 2005-2017 Intel Corporation. All Rights Reserved.
+
+Intel, the Intel logo and Itanium are trademarks of Intel Corporation or its subsidiaries in the U.S. and/or other countries.
+
+* Other names and brands may be claimed as the property of others.
+
+