[tbb] 23/64: Imported Upstream version 3.0+r035
Graham Inggs
ginggs at moszumanska.debian.org
Mon Jul 3 12:27:49 UTC 2017
This is an automated email from the git hooks/post-receive script.
ginggs pushed a commit to branch master
in repository tbb.
commit e2bf95b2335ffe9561133e198be82e36bed5f788
Author: Graham Inggs <ginggs at debian.org>
Date: Mon Jul 3 14:13:40 2017 +0200
Imported Upstream version 3.0+r035
---
CHANGES | Bin 32869 -> 34382 bytes
build/FreeBSD.inc | 1 +
build/Makefile.tbbmalloc | 17 +-
build/Makefile.test | 4 +-
build/SunOS.inc | 1 +
build/common_rules.inc | 4 +
build/linux.gcc.inc | 1 +
build/linux.icc.inc | 1 +
build/linux.inc | 18 +-
build/macos.gcc.inc | 2 +-
build/windows.gcc.inc | 4 +-
doc/html/a00001.html | 6 +-
doc/html/a00002.html | 6 +-
doc/html/a00003.html | 6 +-
doc/html/a00004.html | 28 +-
doc/html/a00005.html | 20 +-
doc/html/a00006.html | 24 +-
doc/html/a00007.html | 36 +-
doc/html/a00009.html | 8 +-
doc/html/a00011.html | 22 +-
doc/html/a00013.html | 128 +-
doc/html/a00015.html | 12 +-
doc/html/a00016.html | 20 +-
doc/html/a00017.html | 16 +-
doc/html/a00018.html | 48 +-
doc/html/a00019.html | 56 +-
doc/html/a00021.html | 74 +-
doc/html/a00026.html | 142 +-
doc/html/a00031.html | 70 +-
doc/html/a00042.html | 4 +-
doc/html/a00046.html | 10 +-
doc/html/a00048.html | 14 +-
doc/html/a00049.html | 22 +-
doc/html/a00050.html | 16 +-
doc/html/{a00002.html => a00052.html} | 6 +-
doc/html/a00053.html | 20 +-
doc/html/a00076.html | 2 +-
doc/html/a00094.html | 6 +-
doc/html/a00099.html | 24 +-
doc/html/a00102.html | 10 +-
doc/html/{a00141.html => a00140.html} | 6 +-
doc/html/a00141.html | 43 +-
doc/html/a00142.html | 36 +-
doc/html/a00143.html | 31 +-
doc/html/a00144.html | 33 +-
doc/html/a00145.html | 37 +-
doc/html/a00146.html | 34 +-
doc/html/a00147.html | 192 ++-
doc/html/a00148.html | 204 +--
doc/html/a00149.html | 65 +-
doc/html/a00150.html | 99 +-
doc/html/a00151.html | 83 +-
doc/html/a00152.html | 134 +-
doc/html/{a00153.png => a00152.png} | Bin
doc/html/a00153.html | 141 +-
doc/html/a00154.html | 288 +++-
doc/html/{a00155.png => a00154.png} | Bin
doc/html/a00155.html | 610 +++++++--
doc/html/a00156.html | 622 +--------
doc/html/{a00157.png => a00156.png} | Bin
doc/html/a00157.html | 48 +-
doc/html/a00158.html | 65 +-
doc/html/{a00159.png => a00158.png} | Bin
doc/html/a00159.html | 158 ++-
doc/html/a00160.html | 163 +--
doc/html/{a00161.png => a00160.png} | Bin
doc/html/a00161.html | 564 +++++++-
doc/html/a00162.html | 570 +-------
doc/html/{a00163.png => a00162.png} | Bin
doc/html/a00163.html | 171 ++-
doc/html/a00164.html | 243 ++--
doc/html/{a00165.png => a00164.png} | Bin
doc/html/a00165.html | 134 +-
doc/html/a00166.html | 50 +-
doc/html/a00167.html | 29 +-
doc/html/a00168.html | 4 +-
doc/html/a00169.html | 4 +-
doc/html/a00170.html | 4 +-
doc/html/a00171.html | 4 +-
doc/html/a00172.html | 6 +-
doc/html/a00173.html | 4 +-
doc/html/a00174.html | 6 +-
doc/html/a00175.html | 4 +-
doc/html/a00176.html | 6 +-
doc/html/a00177.html | 4 +-
doc/html/a00178.html | 4 +-
doc/html/a00179.html | 6 +-
doc/html/a00180.html | 12 +-
doc/html/a00181.html | 6 +-
doc/html/a00182.html | 6 +-
doc/html/a00183.html | 4 +-
doc/html/a00184.html | 6 +-
doc/html/a00185.html | 4 +-
doc/html/a00186.html | 6 +-
doc/html/a00187.html | 4 +-
doc/html/a00188.html | 4 +-
doc/html/a00189.html | 6 +-
doc/html/a00190.html | 4 +-
doc/html/a00191.html | 6 +-
doc/html/a00192.html | 6 +-
doc/html/a00193.html | 6 +-
doc/html/a00194.html | 6 +-
doc/html/a00195.html | 4 +-
doc/html/a00196.html | 6 +-
doc/html/a00197.html | 4 +-
doc/html/a00198.html | 6 +-
doc/html/a00199.html | 8 +-
doc/html/a00200.html | 4 +-
doc/html/a00201.html | 6 +-
doc/html/a00202.html | 6 +-
doc/html/a00203.html | 6 +-
doc/html/a00204.html | 6 +-
doc/html/a00205.html | 6 +-
doc/html/a00206.html | 14 +-
doc/html/a00207.html | 6 +-
doc/html/a00208.html | 4 +-
doc/html/a00209.html | 8 +-
doc/html/a00210.html | 6 +-
doc/html/a00211.html | 4 +-
doc/html/a00212.html | 4 +-
doc/html/a00213.html | 6 +-
doc/html/a00214.html | 6 +-
doc/html/a00248.html | 20 +-
doc/html/a00267.html | 194 +--
doc/html/a00273.html | 61 -
doc/html/a00274.html | 345 +----
doc/html/a00275.html | 326 ++++-
doc/html/a00276.html | 295 +---
doc/html/a00277.html | 298 +++-
doc/html/a00278.html | 35 +-
doc/html/a00279.html | 20 +-
doc/html/a00280.html | 939 +------------
doc/html/{a00280.html => a00281.html} | 8 +-
doc/html/{a00298.html => a00299.html} | 1420 ++++++++++----------
doc/html/{a00308.html => a00309.html} | 0
doc/html/a00310.html | 73 -
doc/html/a00311.html | 374 +-----
doc/html/{a00311.html => a00312.html} | 12 +-
doc/html/a00319.html | 127 --
doc/html/a00320.html | 134 +-
doc/html/a00321.html | 126 +-
doc/html/a00322.html | 161 ++-
doc/html/{a00322.html => a00323.html} | 26 +-
doc/html/a00324.html | 98 --
doc/html/a00325.html | 1253 +----------------
doc/html/{a00325.html => a00326.html} | 186 +--
doc/html/a00335.html | 365 -----
doc/html/a00336.html | 510 ++++---
doc/html/{a00336.html => a00337.html} | 0
doc/html/{a00341.html => a00342.html} | 124 +-
doc/html/{a00350.html => a00351.html} | 0
doc/html/a00353.html | 1019 --------------
doc/html/a00354.html | 970 +++++++++++++
doc/html/{a00362.html => a00367.html} | 12 +-
doc/html/{a00364.html => a00369.html} | 0
doc/html/{a00365.html => a00370.html} | 0
doc/html/{a00366.html => a00371.html} | 4 +-
doc/html/{a00375.html => a00380.html} | 38 +-
doc/html/{a00379.html => a00384.html} | 8 +-
doc/html/{a00381.html => a00386.html} | 36 +-
doc/html/a00391.html | 341 -----
doc/html/{a00387.html => a00392.html} | 44 +-
doc/html/a00396.html | 464 ++++---
doc/html/{a00396.html => a00401.html} | 14 +-
doc/html/a00404.html | 232 ----
doc/html/{a00400.html => a00405.html} | 4 +-
doc/html/a00409.html | 611 +++------
doc/html/a00414.html | 507 +++++++
doc/html/a00420.html | 136 --
doc/html/a00421.html | 168 ---
doc/html/a00426.html | 243 ++--
doc/html/a00427.html | 706 ++--------
doc/html/{a00422.html => a00428.html} | 4 +-
doc/html/{a00423.html => a00429.html} | 12 +-
doc/html/{a00424.html => a00430.html} | 22 +-
doc/html/{a00425.html => a00431.html} | 12 +-
doc/html/{a00426.html => a00432.html} | 0
doc/html/{a00427.html => a00433.html} | 2 +-
doc/html/{a00436.html => a00442.html} | 0
doc/html/a00446.html | 94 --
doc/html/a00447.html | 212 ---
doc/html/{a00443.html => a00449.html} | 0
doc/html/{a00444.html => a00450.html} | 0
doc/html/a00452.html | 64 +-
doc/html/a00453.html | 419 +++---
doc/html/{a00451.html => a00457.html} | 31 +-
doc/html/a00458.html | 95 +-
doc/html/a00459.html | 456 ++++---
doc/html/{a00454.html => a00460.html} | 1018 +++++++-------
doc/html/{a00458.html => a00464.html} | 0
doc/html/{a00459.html => a00465.html} | 79 +-
doc/html/{a00466.html => a00472.html} | 0
doc/html/{a00474.html => a00480.html} | 0
doc/html/{a00476.html => a00482.html} | 0
doc/html/annotated.html | 57 +-
doc/html/deprecated.html | 2 +-
doc/html/files.html | 102 +-
doc/html/functions.html | 197 +--
doc/html/functions_func.html | 178 +--
doc/html/functions_rela.html | 3 +-
doc/html/functions_type.html | 18 +-
doc/html/globals.html | 18 +-
doc/html/globals_func.html | 18 +-
doc/html/hierarchy.html | 57 +-
doc/html/modules.html | 12 +-
doc/html/namespacemembers.html | 14 +-
doc/html/namespacemembers_func.html | 14 +-
doc/html/namespaces.html | 2 +-
examples/common/copy_libraries.bat | 5 +-
examples/parallel_for/polygon_overlay/polymain.cpp | 31 +-
examples/parallel_for/polygon_overlay/polyover.cpp | 502 +++++--
examples/parallel_for/polygon_overlay/polyover.h | 2 +
.../parallel_for/polygon_overlay/pover_video.cpp | 34 +-
examples/parallel_for/polygon_overlay/rpolygon.h | 56 +-
examples/pipeline/square/square.cpp | 2 +-
examples/task_group/sudoku/index.html | 1 +
examples/task_group/sudoku/msvs/sudoku.vcproj | 712 +++++-----
examples/task_group/sudoku/msvs/sudoku_cl.sln | 50 +-
examples/task_group/sudoku/sudoku.cpp | 29 +-
include/tbb/_concurrent_unordered_internal.h | 54 +-
include/tbb/aligned_space.h | 2 +-
include/tbb/concurrent_hash_map.h | 8 +-
include/tbb/enumerable_thread_specific.h | 228 ++--
include/tbb/machine/linux_ia32.h | 3 +-
include/tbb/machine/linux_ia64.h | 4 +-
include/tbb/machine/linux_intel64.h | 5 +-
include/tbb/machine/mac_ppc.h | 12 +-
include/tbb/machine/sunos_sparc.h | 3 +-
include/tbb/machine/windows_ia32.h | 2 +-
include/tbb/machine/windows_intel64.h | 4 +-
include/tbb/machine/xbox360_ppc.h | 8 +-
include/tbb/pipeline.h | 42 +-
include/tbb/tbb_config.h | 6 +
include/tbb/tbb_exception.h | 2 +-
include/tbb/tbb_machine.h | 14 +
include/tbb/tbb_stddef.h | 9 +
src/old/test_task_v2.cpp | 123 --
src/perf/time_hash_map.cpp | 174 +--
src/perf/time_hash_map_fill.cpp | 41 +-
src/perf/time_sandbox.h | 29 +-
src/tbb/arena.h | 2 +-
src/tbb/concurrent_monitor.cpp | 2 +-
src/tbb/concurrent_monitor.h | 6 +-
src/tbb/custom_scheduler.h | 14 +-
src/tbb/market.cpp | 12 +-
src/tbb/private_server.cpp | 73 +-
src/tbb/scheduler.cpp | 28 +-
src/tbb/task.cpp | 48 +-
src/tbb/task_group_context.cpp | 26 +-
src/tbb/tbb_misc.cpp | 2 +-
src/tbbmalloc/Customize.h | 8 +
src/tbbmalloc/MemoryAllocator.cpp | 411 +++---
src/tbbmalloc/tbbmalloc.cpp | 10 +-
src/test/harness_m128.h | 4 +-
src/test/harness_report.h | 4 +
src/test/test_concurrent_hash_map.cpp | 12 +-
src/test/test_concurrent_unordered.cpp | 16 +-
src/test/test_enumerable_thread_specific.cpp | 60 +-
.../test/test_malloc_atexit.cpp | 78 +-
src/test/test_malloc_compliance.cpp | 4 +-
src/test/test_malloc_init_shutdown.cpp | 100 ++
src/test/test_malloc_overload.cpp | 20 +-
src/test/test_malloc_regression.cpp | 11 +-
src/test/test_malloc_whitebox.cpp | 35 +-
src/test/test_parallel_for.cpp | 25 +-
src/test/test_parallel_pipeline.cpp | 191 ++-
266 files changed, 10848 insertions(+), 14874 deletions(-)
diff --git a/CHANGES b/CHANGES
index ef101f1..807439f 100644
Binary files a/CHANGES and b/CHANGES differ
diff --git a/build/FreeBSD.inc b/build/FreeBSD.inc
index 38ada5c..8f2d8c8 100644
--- a/build/FreeBSD.inc
+++ b/build/FreeBSD.inc
@@ -67,6 +67,7 @@ endif
OBJ = o
DLL = so
+LIBEXT=so
TBB.DEF =
TBB.DLL = libtbb$(DEBUG_SUFFIX).$(DLL)
diff --git a/build/Makefile.tbbmalloc b/build/Makefile.tbbmalloc
index b73d980..3598543 100644
--- a/build/Makefile.tbbmalloc
+++ b/build/Makefile.tbbmalloc
@@ -135,8 +135,12 @@ malloc_proxy_dll: $(MALLOCPROXY.DLL)
add_debug=$(basename $(1))_debug$(suffix $(1))
cross_suffix=$(if $(crosstest),$(if $(DEBUG_SUFFIX),$(subst _debug,,$(1)),$(call add_debug,$(1))),$(1))
-MALLOC_MAIN_TESTS = test_ScalableAllocator.$(TEST_EXT) test_ScalableAllocator_STL.$(TEST_EXT) test_malloc_compliance.$(TEST_EXT) test_malloc_regression.$(TEST_EXT)
-MALLOC_OVERLOAD_TESTS = test_malloc_overload.$(TEST_EXT) test_malloc_overload_proxy.$(TEST_EXT)
+MALLOC_MAIN_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)
+MALLOC_OVERLOAD_TESTS = test_malloc_overload.$(TEST_EXT) test_malloc_overload_proxy.$(TEST_EXT) test_malloc_atexit.$(TEST_EXT)
MALLOC_LIB = $(call cross_suffix,$(MALLOC.LIB))
MALLOC_PROXY_LIB = $(call cross_suffix,$(MALLOCPROXY.LIB))
@@ -166,9 +170,17 @@ $(MALLOC_C_TESTS): %.$(TEST_EXT): %.$(OBJ) $(MALLOC_LIB)
$(CPLUS) $(OUTPUT_KEY)$@ $(CPLUS_FLAGS) $^ $(LIBS) $(LINK_FLAGS)
endif
+# Rules for generating a test DLL
+%_dll.$(DLL): %_dll.$(OBJ)
+ $(LIB_LINK_CMD) $(OUTPUT_KEY)$@ $(CPLUS_FLAGS) $(PIC_KEY) $< $(LIBS) $(DYLIB_KEY) $(LIB_LINK_FLAGS)
+
+test_malloc_atexit.$(TEST_EXT): test_malloc_atexit.$(OBJ) test_malloc_atexit_dll.$(DLL)
+ $(CPLUS) $(OUTPUT_KEY)$@ $(CPLUS_FLAGS) $< $(MALLOC_PROXY_LIB) $(MALLOC_LIB) test_malloc_atexit_dll.$(LIBEXT) $(LIBS) $(LINK_FLAGS)
+
MALLOC_TESTS = $(MALLOC_MAIN_TESTS) $(MALLOC_OVERLOAD_TESTS) $(MALLOC_C_TESTS) test_malloc_whitebox.$(TEST_EXT) test_malloc_lib_unload.$(TEST_EXT)
# run_cmd is usually empty
malloc_test: $(call cross_suffix,$(MALLOC.DLL)) $(TEST_PREREQUISITE) $(MALLOC_TESTS)
+ $(run_cmd) ./test_malloc_atexit.$(TEST_EXT) $(args)
$(run_cmd) ./test_malloc_lib_unload.$(TEST_EXT) $(args)
$(run_cmd) ./test_malloc_whitebox.$(TEST_EXT) $(args) 1:4
$(run_cmd) $(TEST_LAUNCHER) -l $(call cross_suffix,$(MALLOCPROXY.DLL)) test_malloc_overload.$(TEST_EXT) $(args)
@@ -177,6 +189,7 @@ malloc_test: $(call cross_suffix,$(MALLOC.DLL)) $(TEST_PREREQUISITE) $(MALLOC_TE
$(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)
ifeq (,$(NO_C_TESTS))
$(run_cmd) ./test_malloc_pure_c.$(TEST_EXT) $(args)
endif
diff --git a/build/Makefile.test b/build/Makefile.test
index 9170272..e64e72f 100644
--- a/build/Makefile.test
+++ b/build/Makefile.test
@@ -86,8 +86,6 @@ include $(tbb_root)/build/common_rules.inc
$(CPLUS) $(OUTPUT_KEY)$@ $(CPLUS_FLAGS) $< $(LINK_TBB.LIB) $(LIBS) $(LINK_FLAGS)
# Rules for generating a test DLL
-%_dll.$(OBJ): %.cpp
- $(CPLUS) $(COMPILE_ONLY) $(OUTPUTOBJ_KEY)$@ $(CPLUS_FLAGS_NOSTRICT) $(PIC_KEY) $(DEFINE_KEY)_USRDLL $(INCLUDES) $<
%_dll.$(DLL): %_dll.$(OBJ) $(TBB.LIB)
$(CPLUS) $(OUTPUT_KEY)$@ $(CPLUS_FLAGS) $(PIC_KEY) $< $(LINK_TBB.LIB) $(LIBS) $(LINK_FLAGS) $(DYLIB_KEY)
.PRECIOUS: %_dll.$(OBJ)
@@ -254,7 +252,7 @@ test_tbb_plain: $(TEST_PREREQUISITE) $(TASK_CPP_DIRECTLY_INCLUDED) $(TEST_TBB_PL
CPLUS_FLAGS_DEPRECATED = $(DEFINE_KEY)TBB_DEPRECATED=1 $(subst $(WARNING_KEY),,$(CPLUS_FLAGS_NOSTRICT)) $(WARNING_SUPPRESS)
-TEST_TBB_OLD.OBJ = test_concurrent_vector_v2.$(OBJ) test_concurrent_queue_v2.$(OBJ) test_mutex_v2.$(OBJ) test_task_v2.$(OBJ)
+TEST_TBB_OLD.OBJ = test_concurrent_vector_v2.$(OBJ) test_concurrent_queue_v2.$(OBJ) test_mutex_v2.$(OBJ)
TEST_TBB_DEPRECATED.OBJ = test_concurrent_queue_deprecated.$(OBJ) \
test_concurrent_vector_deprecated.$(OBJ) \
diff --git a/build/SunOS.inc b/build/SunOS.inc
index 9efb881..60cc44f 100644
--- a/build/SunOS.inc
+++ b/build/SunOS.inc
@@ -74,6 +74,7 @@ endif
OBJ = o
DLL = so
+LIBEXT=so
TBB.DEF =
TBB.DLL = libtbb$(DEBUG_SUFFIX).$(DLL)
diff --git a/build/common_rules.inc b/build/common_rules.inc
index db7dc31..3373c09 100644
--- a/build/common_rules.inc
+++ b/build/common_rules.inc
@@ -120,3 +120,7 @@ version_string.tmp:
$(MAKE_VERSIONS)
endif
+
+# Rules for generating a test DLL
+%_dll.$(OBJ): %.cpp
+ $(CPLUS) $(COMPILE_ONLY) $(OUTPUTOBJ_KEY)$@ $(CPLUS_FLAGS_NOSTRICT) $(PIC_KEY) $(DEFINE_KEY)_USRDLL $(INCLUDES) $<
diff --git a/build/linux.gcc.inc b/build/linux.gcc.inc
index 09862a5..e3accbb 100644
--- a/build/linux.gcc.inc
+++ b/build/linux.gcc.inc
@@ -37,6 +37,7 @@ TEST_WARNING_KEY = -Wshadow -Wcast-qual -Woverloaded-virtual -Wnon-virtual-dtor
WARNING_SUPPRESS = -Wno-parentheses -Wno-non-virtual-dtor
DYLIB_KEY = -shared
+EXPORT_KEY = -Wl,--version-script,
LIBDL = -ldl
TBB_NOSTRICT = 1
diff --git a/build/linux.icc.inc b/build/linux.icc.inc
index f85e031..85fab25 100644
--- a/build/linux.icc.inc
+++ b/build/linux.icc.inc
@@ -34,6 +34,7 @@ PIC_KEY = -fPIC
WARNING_AS_ERROR_KEY = -Werror
WARNING_KEY = -w1
DYLIB_KEY = -shared
+EXPORT_KEY = -Wl,--version-script,
LIBDL = -ldl
export COMPILER_VERSION := ICC: $(shell icc -V </dev/null 2>&1 | grep 'Version')
#TODO: autodetection of arch from COMPILER_VERSION!!
diff --git a/build/linux.inc b/build/linux.inc
index c60faee..99fbff7 100644
--- a/build/linux.inc
+++ b/build/linux.inc
@@ -38,6 +38,9 @@ ifndef arch
ifeq ($(uname_m),sparc64)
export arch:=sparc
endif
+ ifndef arch
+ export arch:=$(uname_m)
+ endif
endif
ifndef runtime
@@ -78,10 +81,21 @@ DLL = so
LIBEXT = so
SONAME_SUFFIX =$(shell grep TBB_COMPATIBLE_INTERFACE_VERSION $(tbb_root)/include/tbb/tbb_stddef.h | egrep -o [0-9.]+)
-def_prefix = $(if $(findstring 32,$(arch)),lin32,$(if $(findstring intel64,$(arch)),lin64,lin64ipf))
+ifeq ($(arch),ia64)
+ def_prefix = lin64ipf
+endif
+ifeq ($(arch),sparc)
+ def_prefix = lin64
+endif
+ifeq (,$(def_prefix))
+ ifeq (64,$(findstring 64,$(arch)))
+ def_prefix = lin64
+ else
+ def_prefix = lin32
+ endif
+endif
TBB.DEF = $(tbb_root)/src/tbb/$(def_prefix)-tbb-export.def
-EXPORT_KEY = -Wl,--version-script,
TBB.DLL = $(TBB_NO_VERSION.DLL).$(SONAME_SUFFIX)
TBB.LIB = $(TBB.DLL)
TBB_NO_VERSION.DLL=libtbb$(DEBUG_SUFFIX).$(DLL)
diff --git a/build/macos.gcc.inc b/build/macos.gcc.inc
index 5f34f4a..4ac4731 100644
--- a/build/macos.gcc.inc
+++ b/build/macos.gcc.inc
@@ -72,7 +72,7 @@ ifeq (ppc64,$(arch))
LIB_LINK_FLAGS += -arch ppc64
endif
-ifeq (ppc,$(arch))
+ifeq (ppc32,$(arch))
CPLUS_FLAGS += -arch ppc
LINK_FLAGS += -arch ppc
LIB_LINK_FLAGS += -arch ppc
diff --git a/build/windows.gcc.inc b/build/windows.gcc.inc
index ba88641..7464e48 100644
--- a/build/windows.gcc.inc
+++ b/build/windows.gcc.inc
@@ -74,8 +74,8 @@ LIBS = -lpsapi
# Command lines
#------------------------------------------------------------------------------
-LINK_FLAGS = -Wl,--enable-auto-import
-LIB_LINK_FLAGS = $(DYLIB_KEY)
+LINK_FLAGS = -Wl,--enable-auto-import -Wl,--enable-runtime-pseudo-reloc-v2
+LIB_LINK_FLAGS = $(DYLIB_KEY) -Wl,--enable-runtime-pseudo-reloc-v2
ifeq ($(cfg), release)
CPLUS_FLAGS = -O2
diff --git a/doc/html/a00001.html b/doc/html/a00001.html
index 2d89d4d..5a85470 100644
--- a/doc/html/a00001.html
+++ b/doc/html/a00001.html
@@ -20,9 +20,9 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::aligned_space< T, N > Member List</h1>This is the complete list of members for <a class="el" href="a00142.html">tbb::aligned_space< T, N ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00142.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()</td><td><a class="el" href="a00142.html">tbb::aligned_space< T, N ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00142.html#024be075c23c0394c9a2518d993bcd9e">end</a>()</td><td><a class="el" href="a00142.html">tbb::aligned_space< T, N ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::aligned_space< T, N > Member List</h1>This is the complete list of members for <a class="el" href="a00141.html">tbb::aligned_space< T, N ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00141.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()</td><td><a class="el" href="a00141.html">tbb::aligned_space< T, N ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00141.html#024be075c23c0394c9a2518d993bcd9e">end</a>()</td><td><a class="el" href="a00141.html">tbb::aligned_space< T, N ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00002.html b/doc/html/a00002.html
index 019f327..3cf66b7 100644
--- a/doc/html/a00002.html
+++ b/doc/html/a00002.html
@@ -20,9 +20,9 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::atomic< T > Member List</h1>This is the complete list of members for <a class="el" href="a00143.html">tbb::atomic< T ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>operator=</b>(T rhs) (defined in <a class="el" href="a00143.html">tbb::atomic< T ></a>)</td><td><a class="el" href="a00143.html">tbb::atomic< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const atomic< T > &rhs) (defined in <a class="el" href="a00143.html">tbb::atomic< T ></a>)</td><td><a class="el" href="a00143.html">tbb::atomic< T ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::atomic< T > Member List</h1>This is the complete list of members for <a class="el" href="a00142.html">tbb::atomic< T ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>operator=</b>(T rhs) (defined in <a class="el" href="a00142.html">tbb::atomic< T ></a>)</td><td><a class="el" href="a00142.html">tbb::atomic< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const atomic< T > &rhs) (defined in <a class="el" href="a00142.html">tbb::atomic< T ></a>)</td><td><a class="el" href="a00142.html">tbb::atomic< T ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00003.html b/doc/html/a00003.html
index 5fc6de9..81de51f 100644
--- a/doc/html/a00003.html
+++ b/doc/html/a00003.html
@@ -20,9 +20,9 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::atomic< void * > Member List</h1>This is the complete list of members for <a class="el" href="a00144.html">tbb::atomic< void * ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>operator=</b>(void *rhs) (defined in <a class="el" href="a00144.html">tbb::atomic< void * ></a>)</td><td><a class="el" href="a00144.html">tbb::atomic< void * ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const atomic< void * > &rhs) (defined in <a class="el" href="a00144.html">tbb::atomic< void * ></a>)</td><td><a class="el" href="a00144.html">tbb::atomic< void * ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::atomic< void * > Member List</h1>This is the complete list of members for <a class="el" href="a00143.html">tbb::atomic< void * ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>operator=</b>(void *rhs) (defined in <a class="el" href="a00143.html">tbb::atomic< void * ></a>)</td><td><a class="el" href="a00143.html">tbb::atomic< void * ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const atomic< void * > &rhs) (defined in <a class="el" href="a00143.html">tbb::atomic< void * ></a>)</td><td><a class="el" href="a00143.html">tbb::atomic< void * ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00004.html b/doc/html/a00004.html
index 24e961e..4d7e876 100644
--- a/doc/html/a00004.html
+++ b/doc/html/a00004.html
@@ -20,20 +20,20 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::blocked_range< Value > Member List</h1>This is the complete list of members for <a class="el" href="a00148.html">tbb::blocked_range< Value ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00148.html#18d2258400756ac1446dac7676b18df3">begin</a>() const </td><td><a class="el" href="a00148.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00148.html#94607755c5110d199202234d58d022ac">blocked_range</a>()</td><td><a class="el" href="a00148.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00148.html#14795a36ead1414b4371dbe1a4656359">blocked_range</a>(Value begin_, Value end_, size_type grainsize_=1)</td><td><a class="el" href="a00148.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00148.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">blocked_range</a>(blocked_range &r, split)</td><td><a class="el" href="a00148.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>blocked_range2d</b> (defined in <a class="el" href="a00148.html">tbb::blocked_range< Value ></a>)</td><td><a class="el" href="a00148.html">tbb::blocked_range< Value ></a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>blocked_range3d</b> (defined in <a class="el" href="a00148.html">tbb::blocked_range< Value ></a>)</td><td><a class="el" href="a00148.html">tbb::blocked_range< Value ></a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00148.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> typedef</td><td><a class="el" href="a00148.html">tbb::blocked_range< Value ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00148.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>() const </td><td><a class="el" href="a00148.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00148.html#8b929d93ddc13f148b11bceef3a3bdf8">end</a>() const </td><td><a class="el" href="a00148.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00148.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>() const </td><td><a class="el" href="a00148.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00148.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>() const </td><td><a class="el" href="a00148.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00148.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>() const </td><td><a class="el" href="a00148.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00148.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> typedef</td><td><a class="el" href="a00148.html">tbb::blocked_range< Value ></a></td><td></td></tr>
+<h1>tbb::blocked_range< Value > Member List</h1>This is the complete list of members for <a class="el" href="a00147.html">tbb::blocked_range< Value ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00147.html#18d2258400756ac1446dac7676b18df3">begin</a>() const </td><td><a class="el" href="a00147.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00147.html#94607755c5110d199202234d58d022ac">blocked_range</a>()</td><td><a class="el" href="a00147.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00147.html#14795a36ead1414b4371dbe1a4656359">blocked_range</a>(Value begin_, Value end_, size_type grainsize_=1)</td><td><a class="el" href="a00147.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00147.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">blocked_range</a>(blocked_range &r, split)</td><td><a class="el" href="a00147.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>blocked_range2d</b> (defined in <a class="el" href="a00147.html">tbb::blocked_range< Value ></a>)</td><td><a class="el" href="a00147.html">tbb::blocked_range< Value ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>blocked_range3d</b> (defined in <a class="el" href="a00147.html">tbb::blocked_range< Value ></a>)</td><td><a class="el" href="a00147.html">tbb::blocked_range< Value ></a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00147.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> typedef</td><td><a class="el" href="a00147.html">tbb::blocked_range< Value ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00147.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>() const </td><td><a class="el" href="a00147.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00147.html#8b929d93ddc13f148b11bceef3a3bdf8">end</a>() const </td><td><a class="el" href="a00147.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00147.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>() const </td><td><a class="el" href="a00147.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00147.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>() const </td><td><a class="el" href="a00147.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00147.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>() const </td><td><a class="el" href="a00147.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00147.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> typedef</td><td><a class="el" href="a00147.html">tbb::blocked_range< Value ></a></td><td></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00005.html b/doc/html/a00005.html
index fda8a82..445a967 100644
--- a/doc/html/a00005.html
+++ b/doc/html/a00005.html
@@ -20,16 +20,16 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::blocked_range2d< RowValue, ColValue > Member List</h1>This is the complete list of members for <a class="el" href="a00149.html">tbb::blocked_range2d< RowValue, ColValue ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>blocked_range2d</b>(RowValue row_begin, RowValue row_end, typename row_range_type::size_type row_grainsize, ColValue col_begin, ColValue col_end, typename col_range_type::size_type col_grainsize) (defined in <a class="el" href="a00149.html">tbb::blocked_range2d< RowValue, ColValue ></a>)</td><td><a class="el" href="a00149.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>blocked_range2d</b>(RowValue row_begin, RowValue row_end, ColValue col_begin, ColValue col_end) (defined in <a class="el" href="a00149.html">tbb::blocked_range2d< RowValue, ColValue ></a>)</td><td><a class="el" href="a00149.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>blocked_range2d</b>(blocked_range2d &r, split) (defined in <a class="el" href="a00149.html">tbb::blocked_range2d< RowValue, ColValue ></a>)</td><td><a class="el" href="a00149.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>col_range_type</b> typedef (defined in <a class="el" href="a00149.html">tbb::blocked_range2d< RowValue, ColValue ></a>)</td><td><a class="el" href="a00149.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00149.html#392a46759af2c884957115771affa7f4">cols</a>() const </td><td><a class="el" href="a00149.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00149.html#d144cb2d88cef553420311aca8667a44">empty</a>() const </td><td><a class="el" href="a00149.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00149.html#ad36a9b38e4fef26d376f99552ce2d92">is_divisible</a>() const </td><td><a class="el" href="a00149.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00149.html#a807a22fe658ec38b8edfd69521d0383">row_range_type</a> typedef</td><td><a class="el" href="a00149.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00149.html#f496e7348a82652fba581203477cc07c">rows</a>() const </td><td><a class="el" href="a00149.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::blocked_range2d< RowValue, ColValue > Member List</h1>This is the complete list of members for <a class="el" href="a00148.html">tbb::blocked_range2d< RowValue, ColValue ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>blocked_range2d</b>(RowValue row_begin, RowValue row_end, typename row_range_type::size_type row_grainsize, ColValue col_begin, ColValue col_end, typename col_range_type::size_type col_grainsize) (defined in <a class="el" href="a00148.html">tbb::blocked_range2d< RowValue, ColValue ></a>)</td><td><a class="el" href="a00148.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>blocked_range2d</b>(RowValue row_begin, RowValue row_end, ColValue col_begin, ColValue col_end) (defined in <a class="el" href="a00148.html">tbb::blocked_range2d< RowValue, ColValue ></a>)</td><td><a class="el" href="a00148.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>blocked_range2d</b>(blocked_range2d &r, split) (defined in <a class="el" href="a00148.html">tbb::blocked_range2d< RowValue, ColValue ></a>)</td><td><a class="el" href="a00148.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>col_range_type</b> typedef (defined in <a class="el" href="a00148.html">tbb::blocked_range2d< RowValue, ColValue ></a>)</td><td><a class="el" href="a00148.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00148.html#392a46759af2c884957115771affa7f4">cols</a>() const </td><td><a class="el" href="a00148.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00148.html#d144cb2d88cef553420311aca8667a44">empty</a>() const </td><td><a class="el" href="a00148.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00148.html#ad36a9b38e4fef26d376f99552ce2d92">is_divisible</a>() const </td><td><a class="el" href="a00148.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00148.html#a807a22fe658ec38b8edfd69521d0383">row_range_type</a> typedef</td><td><a class="el" href="a00148.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00148.html#f496e7348a82652fba581203477cc07c">rows</a>() const </td><td><a class="el" href="a00148.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00006.html b/doc/html/a00006.html
index c414b3b..6defd30 100644
--- a/doc/html/a00006.html
+++ b/doc/html/a00006.html
@@ -20,18 +20,18 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::blocked_range3d< PageValue, RowValue, ColValue > Member List</h1>This is the complete list of members for <a class="el" href="a00150.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>blocked_range3d</b>(PageValue page_begin, PageValue page_end, RowValue row_begin, RowValue row_end, ColValue col_begin, ColValue col_end) (defined in <a class="el" href="a00150.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00150.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>blocked_range3d</b>(PageValue page_begin, PageValue page_end, typename page_range_type::size_type page_grainsize, RowValue row_begin, RowValue row_end, typename row_range_type::size_type row_grainsize, ColValue col_begin, ColValue col_end, typename col_range_type::size_type col_grainsize) (defined in <a class="el" href="a00150.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00150.html">tbb::blocked_range3d [...]
- <tr bgcolor="#f0f0f0"><td><b>blocked_range3d</b>(blocked_range3d &r, split) (defined in <a class="el" href="a00150.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00150.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>col_range_type</b> typedef (defined in <a class="el" href="a00150.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00150.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00150.html#3336ba9480fd6c43e158f9beb024c050">cols</a>() const </td><td><a class="el" href="a00150.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00150.html#356860e1c977d91711e8216bd55c0b25">empty</a>() const </td><td><a class="el" href="a00150.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00150.html#39d69191721c488e737ae5d9c5336b9c">is_divisible</a>() const </td><td><a class="el" href="a00150.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00150.html#b8ebf17a552ba47825e9b3887855b719">page_range_type</a> typedef</td><td><a class="el" href="a00150.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00150.html#cf971430aa12361d3ed245344b7c6764">pages</a>() const </td><td><a class="el" href="a00150.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>row_range_type</b> typedef (defined in <a class="el" href="a00150.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00150.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00150.html#1584623e59ff32a8aa82006827508be4">rows</a>() const </td><td><a class="el" href="a00150.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::blocked_range3d< PageValue, RowValue, ColValue > Member List</h1>This is the complete list of members for <a class="el" href="a00149.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>blocked_range3d</b>(PageValue page_begin, PageValue page_end, RowValue row_begin, RowValue row_end, ColValue col_begin, ColValue col_end) (defined in <a class="el" href="a00149.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00149.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>blocked_range3d</b>(PageValue page_begin, PageValue page_end, typename page_range_type::size_type page_grainsize, RowValue row_begin, RowValue row_end, typename row_range_type::size_type row_grainsize, ColValue col_begin, ColValue col_end, typename col_range_type::size_type col_grainsize) (defined in <a class="el" href="a00149.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00149.html">tbb::blocked_range3d [...]
+ <tr bgcolor="#f0f0f0"><td><b>blocked_range3d</b>(blocked_range3d &r, split) (defined in <a class="el" href="a00149.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00149.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>col_range_type</b> typedef (defined in <a class="el" href="a00149.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00149.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00149.html#3336ba9480fd6c43e158f9beb024c050">cols</a>() const </td><td><a class="el" href="a00149.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00149.html#356860e1c977d91711e8216bd55c0b25">empty</a>() const </td><td><a class="el" href="a00149.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00149.html#39d69191721c488e737ae5d9c5336b9c">is_divisible</a>() const </td><td><a class="el" href="a00149.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00149.html#b8ebf17a552ba47825e9b3887855b719">page_range_type</a> typedef</td><td><a class="el" href="a00149.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00149.html#cf971430aa12361d3ed245344b7c6764">pages</a>() const </td><td><a class="el" href="a00149.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>row_range_type</b> typedef (defined in <a class="el" href="a00149.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00149.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00149.html#1584623e59ff32a8aa82006827508be4">rows</a>() const </td><td><a class="el" href="a00149.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00007.html b/doc/html/a00007.html
index fc61e7c..e72e69e 100644
--- a/doc/html/a00007.html
+++ b/doc/html/a00007.html
@@ -20,24 +20,24 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::cache_aligned_allocator< T > Member List</h1>This is the complete list of members for <a class="el" href="a00151.html">tbb::cache_aligned_allocator< T ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>address</b>(reference x) const (defined in <a class="el" href="a00151.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00151.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>address</b>(const_reference x) const (defined in <a class="el" href="a00151.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00151.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00151.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">allocate</a>(size_type n, const void *hint=0)</td><td><a class="el" href="a00151.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>cache_aligned_allocator</b>() (defined in <a class="el" href="a00151.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00151.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>cache_aligned_allocator</b>(const cache_aligned_allocator &) (defined in <a class="el" href="a00151.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00151.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>cache_aligned_allocator</b>(const cache_aligned_allocator< U > &) (defined in <a class="el" href="a00151.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00151.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00151.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00151.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_reference</b> typedef (defined in <a class="el" href="a00151.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00151.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00151.html#958ee8745c86c275bfc9533af565e017">construct</a>(pointer p, const value_type &value)</td><td><a class="el" href="a00151.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00151.html#3d4eadf188f7d85d3805ae534e0b8e1c">deallocate</a>(pointer p, size_type)</td><td><a class="el" href="a00151.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00151.html#cd298895a4f1654b5149ec84b591ecb5">destroy</a>(pointer p)</td><td><a class="el" href="a00151.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>difference_type</b> typedef (defined in <a class="el" href="a00151.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00151.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00151.html#fb23b687b4c0429dab4c7f8017266cf0">max_size</a>() const </td><td><a class="el" href="a00151.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00151.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00151.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00151.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00151.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00151.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00151.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00151.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00151.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
+<h1>tbb::cache_aligned_allocator< T > Member List</h1>This is the complete list of members for <a class="el" href="a00150.html">tbb::cache_aligned_allocator< T ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>address</b>(reference x) const (defined in <a class="el" href="a00150.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00150.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>address</b>(const_reference x) const (defined in <a class="el" href="a00150.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00150.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00150.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">allocate</a>(size_type n, const void *hint=0)</td><td><a class="el" href="a00150.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>cache_aligned_allocator</b>() (defined in <a class="el" href="a00150.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00150.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>cache_aligned_allocator</b>(const cache_aligned_allocator &) (defined in <a class="el" href="a00150.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00150.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>cache_aligned_allocator</b>(const cache_aligned_allocator< U > &) (defined in <a class="el" href="a00150.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00150.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00150.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00150.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_reference</b> typedef (defined in <a class="el" href="a00150.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00150.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00150.html#958ee8745c86c275bfc9533af565e017">construct</a>(pointer p, const value_type &value)</td><td><a class="el" href="a00150.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00150.html#3d4eadf188f7d85d3805ae534e0b8e1c">deallocate</a>(pointer p, size_type)</td><td><a class="el" href="a00150.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00150.html#cd298895a4f1654b5149ec84b591ecb5">destroy</a>(pointer p)</td><td><a class="el" href="a00150.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>difference_type</b> typedef (defined in <a class="el" href="a00150.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00150.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00150.html#fb23b687b4c0429dab4c7f8017266cf0">max_size</a>() const </td><td><a class="el" href="a00150.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00150.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00150.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00150.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00150.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00150.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00150.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00150.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00150.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00009.html b/doc/html/a00009.html
index 66833ec..356009c 100644
--- a/doc/html/a00009.html
+++ b/doc/html/a00009.html
@@ -20,10 +20,10 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::cache_aligned_allocator< void > Member List</h1>This is the complete list of members for <a class="el" href="a00152.html">tbb::cache_aligned_allocator< void ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00152.html">tbb::cache_aligned_allocator< void ></a>)</td><td><a class="el" href="a00152.html">tbb::cache_aligned_allocator< void ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00152.html">tbb::cache_aligned_allocator< void ></a>)</td><td><a class="el" href="a00152.html">tbb::cache_aligned_allocator< void ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00152.html">tbb::cache_aligned_allocator< void ></a>)</td><td><a class="el" href="a00152.html">tbb::cache_aligned_allocator< void ></a></td><td></td></tr>
+<h1>tbb::cache_aligned_allocator< void > Member List</h1>This is the complete list of members for <a class="el" href="a00151.html">tbb::cache_aligned_allocator< void ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00151.html">tbb::cache_aligned_allocator< void ></a>)</td><td><a class="el" href="a00151.html">tbb::cache_aligned_allocator< void ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00151.html">tbb::cache_aligned_allocator< void ></a>)</td><td><a class="el" href="a00151.html">tbb::cache_aligned_allocator< void ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00151.html">tbb::cache_aligned_allocator< void ></a>)</td><td><a class="el" href="a00151.html">tbb::cache_aligned_allocator< void ></a></td><td></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00011.html b/doc/html/a00011.html
index 16516f6..94b29c1 100644
--- a/doc/html/a00011.html
+++ b/doc/html/a00011.html
@@ -20,17 +20,17 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::combinable< T > Member List</h1>This is the complete list of members for <a class="el" href="a00154.html">tbb::combinable< T ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>clear</b>() (defined in <a class="el" href="a00154.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00154.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>combinable</b>() (defined in <a class="el" href="a00154.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00154.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>combinable</b>(finit _finit) (defined in <a class="el" href="a00154.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00154.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>combinable</b>(const combinable &other) (defined in <a class="el" href="a00154.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00154.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>combine</b>(combine_func_t f_combine) (defined in <a class="el" href="a00154.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00154.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>combine_each</b>(combine_func_t f_combine) (defined in <a class="el" href="a00154.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00154.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>local</b>() (defined in <a class="el" href="a00154.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00154.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>local</b>(bool &exists) (defined in <a class="el" href="a00154.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00154.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const combinable &other) (defined in <a class="el" href="a00154.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00154.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00154.html#2c87e79ae98588a5780f708773388843">~combinable</a>()</td><td><a class="el" href="a00154.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::combinable< T > Member List</h1>This is the complete list of members for <a class="el" href="a00153.html">tbb::combinable< T ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>clear</b>() (defined in <a class="el" href="a00153.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00153.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>combinable</b>() (defined in <a class="el" href="a00153.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00153.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>combinable</b>(finit _finit) (defined in <a class="el" href="a00153.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00153.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>combinable</b>(const combinable &other) (defined in <a class="el" href="a00153.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00153.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>combine</b>(combine_func_t f_combine) (defined in <a class="el" href="a00153.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00153.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>combine_each</b>(combine_func_t f_combine) (defined in <a class="el" href="a00153.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00153.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>local</b>() (defined in <a class="el" href="a00153.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00153.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>local</b>(bool &exists) (defined in <a class="el" href="a00153.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00153.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const combinable &other) (defined in <a class="el" href="a00153.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00153.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00153.html#2c87e79ae98588a5780f708773388843">~combinable</a>()</td><td><a class="el" href="a00153.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00013.html b/doc/html/a00013.html
index fdac41b..5bc8391 100644
--- a/doc/html/a00013.html
+++ b/doc/html/a00013.html
@@ -20,70 +20,70 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator > Member List</h1>This is the complete list of members for <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>allocator_type</b> typedef (defined in <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>begin</b>() (defined in <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>begin</b>() const (defined in <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00156.html#414d15033d36c63aa3a40666dc4d6f5e">bucket_count</a>() const </td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00156.html#a9f89be8fe28835749529d91081a2511">clear</a>()</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00156.html#d827bb5e4f61de1916ab67d51c7c6e60">concurrent_hash_map</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00156.html#a4612d5c7233712d455496641e9b31ff">concurrent_hash_map</a>(size_type n, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00156.html#df0cd14eaddb17f10929c91519e65be9">concurrent_hash_map</a>(const concurrent_hash_map &table, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00156.html#3bfe75fcb350ce39cf610c164f233edc">concurrent_hash_map</a>(I first, I last, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_accessor</b> (defined in <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_iterator</b> typedef (defined in <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_range_type</b> typedef (defined in <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_reference</b> typedef (defined in <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00156.html#74f5ef06a06c5e619f156a1c76c04969">count</a>(const Key &key) const </td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>delete_node</b>(node_base *n) (defined in <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline, protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>difference_type</b> typedef (defined in <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00156.html#6cab7d029a3e73a653ef0faeac4d1586">empty</a>() const </td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>end</b>() (defined in <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>end</b>() const (defined in <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>equal_range</b>(const Key &key) (defined in <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>equal_range</b>(const Key &key) const (defined in <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00156.html#034c3b3ee419edee78e0f2f2b1f0d7ca">erase</a>(const Key &key)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00156.html#da7e4a50f6bb06191817425ec85fe760">erase</a>(const_accessor &item_accessor)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00156.html#0f500842d0cf791f8fa61662edb1b311">erase</a>(accessor &item_accessor)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00156.html#faad2108bd2be75e52293486af59f11e">exclude</a>(const_accessor &item_accessor, bool readonly)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00156.html#64338d7f2e35df586af4cb0145cd910f">find</a>(const_accessor &result, const Key &key) const </td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00156.html#bce7bdf46435115a95cca2aa73c5da83">find</a>(accessor &result, const Key &key)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00156.html#199208eed6f09e200cda364f906be0fe">get_allocator</a>() const </td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00156.html#58c38b27273de6c670568633c0931854">insert</a>(const_accessor &result, const Key &key)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00156.html#ccfecaa3e71d92be61fb3d811dd264eb">insert</a>(accessor &result, const Key &key)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00156.html#d4a2816129e38c53128c6d0c7b6b7370">insert</a>(const_accessor &result, const value_type &value)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00156.html#a657e61cd2b13164764ca2708875784a">insert</a>(accessor &result, const value_type &value)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00156.html#52bffd1066b3d7b793945bc6fa1a71a1">insert</a>(const value_type &value)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00156.html#cfe172677e5987004ef4a03e22fa338a">insert</a>(I first, I last)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::hash_map_iterator</b> (defined in <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::hash_map_range</b> (defined in <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00156.html#3c27779fe66b79505390d084310d997e">internal_copy</a>(const concurrent_hash_map &source)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal_copy</b>(I first, I last) (defined in <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00156.html#976c57edfb7f22b9f91a2e11f141eb4a">internal_equal_range</a>(const Key &key, I end) const </td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00156.html#2f76ed101a0ccc8875b846c2f747897e">internal_fast_find</a>(const Key &key) const </td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline, protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>iterator</b> typedef (defined in <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>key_type</b> typedef (defined in <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00156.html#1f22480a290ddc6c145888d8f985531a">lookup</a>(bool op_insert, const Key &key, const T *t, const_accessor *result, bool write)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>mapped_type</b> typedef (defined in <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00156.html#1e45d3cbd1e2ae06f365f1b48e0df0b5">max_size</a>() const </td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_allocator</b> (defined in <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_hash_compare</b> (defined in <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>node_allocator_type</b> typedef (defined in <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00156.html#2c0c42a2e1b5282b6739157df9ce2304">operator=</a>(const concurrent_hash_map &table)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>range</b>(size_type grainsize=1) (defined in <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>range</b>(size_type grainsize=1) const (defined in <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>range_type</b> typedef (defined in <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00156.html#13f3f2e8de7564be03882c31559493c9">rehash</a>(size_type n=0)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>rehash_bucket</b>(bucket *b_new, const hashcode_t h) (defined in <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline, protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>search_bucket</b>(const key_type &key, bucket *b) const (defined in <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline, protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00156.html#17fd8c5fe8c6a86075f34aa4e8412ba3">size</a>() const </td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00156.html#eddb0d2efe0b4f25a85c059e1c3dac15">swap</a>(concurrent_hash_map &table)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00156.html#a1ac58997d8fbf242b266e3691573481">~concurrent_hash_map</a>()</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator > Member List</h1>This is the complete list of members for <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>allocator_type</b> typedef (defined in <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>begin</b>() (defined in <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>begin</b>() const (defined in <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#414d15033d36c63aa3a40666dc4d6f5e">bucket_count</a>() const </td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#a9f89be8fe28835749529d91081a2511">clear</a>()</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#d827bb5e4f61de1916ab67d51c7c6e60">concurrent_hash_map</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#a4612d5c7233712d455496641e9b31ff">concurrent_hash_map</a>(size_type n, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#df0cd14eaddb17f10929c91519e65be9">concurrent_hash_map</a>(const concurrent_hash_map &table, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#3bfe75fcb350ce39cf610c164f233edc">concurrent_hash_map</a>(I first, I last, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_accessor</b> (defined in <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_iterator</b> typedef (defined in <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_range_type</b> typedef (defined in <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_reference</b> typedef (defined in <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#74f5ef06a06c5e619f156a1c76c04969">count</a>(const Key &key) const </td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>delete_node</b>(node_base *n) (defined in <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline, protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>difference_type</b> typedef (defined in <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#6cab7d029a3e73a653ef0faeac4d1586">empty</a>() const </td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>end</b>() (defined in <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>end</b>() const (defined in <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>equal_range</b>(const Key &key) (defined in <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>equal_range</b>(const Key &key) const (defined in <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#034c3b3ee419edee78e0f2f2b1f0d7ca">erase</a>(const Key &key)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#da7e4a50f6bb06191817425ec85fe760">erase</a>(const_accessor &item_accessor)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#0f500842d0cf791f8fa61662edb1b311">erase</a>(accessor &item_accessor)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#faad2108bd2be75e52293486af59f11e">exclude</a>(const_accessor &item_accessor, bool readonly)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#64338d7f2e35df586af4cb0145cd910f">find</a>(const_accessor &result, const Key &key) const </td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#bce7bdf46435115a95cca2aa73c5da83">find</a>(accessor &result, const Key &key)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#199208eed6f09e200cda364f906be0fe">get_allocator</a>() const </td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#58c38b27273de6c670568633c0931854">insert</a>(const_accessor &result, const Key &key)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#ccfecaa3e71d92be61fb3d811dd264eb">insert</a>(accessor &result, const Key &key)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#d4a2816129e38c53128c6d0c7b6b7370">insert</a>(const_accessor &result, const value_type &value)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#a657e61cd2b13164764ca2708875784a">insert</a>(accessor &result, const value_type &value)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#52bffd1066b3d7b793945bc6fa1a71a1">insert</a>(const value_type &value)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#cfe172677e5987004ef4a03e22fa338a">insert</a>(I first, I last)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::hash_map_iterator</b> (defined in <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::hash_map_range</b> (defined in <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#3c27779fe66b79505390d084310d997e">internal_copy</a>(const concurrent_hash_map &source)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal_copy</b>(I first, I last) (defined in <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#976c57edfb7f22b9f91a2e11f141eb4a">internal_equal_range</a>(const Key &key, I end) const </td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#2f76ed101a0ccc8875b846c2f747897e">internal_fast_find</a>(const Key &key) const </td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline, protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>iterator</b> typedef (defined in <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>key_type</b> typedef (defined in <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#1f22480a290ddc6c145888d8f985531a">lookup</a>(bool op_insert, const Key &key, const T *t, const_accessor *result, bool write)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>mapped_type</b> typedef (defined in <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#1e45d3cbd1e2ae06f365f1b48e0df0b5">max_size</a>() const </td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_allocator</b> (defined in <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_hash_compare</b> (defined in <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>node_allocator_type</b> typedef (defined in <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#2c0c42a2e1b5282b6739157df9ce2304">operator=</a>(const concurrent_hash_map &table)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>range</b>(size_type grainsize=1) (defined in <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>range</b>(size_type grainsize=1) const (defined in <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>range_type</b> typedef (defined in <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#13f3f2e8de7564be03882c31559493c9">rehash</a>(size_type n=0)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>rehash_bucket</b>(bucket *b_new, const hashcode_t h) (defined in <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline, protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>search_bucket</b>(const key_type &key, bucket *b) const (defined in <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline, protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#17fd8c5fe8c6a86075f34aa4e8412ba3">size</a>() const </td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#eddb0d2efe0b4f25a85c059e1c3dac15">swap</a>(concurrent_hash_map &table)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00155.html#a1ac58997d8fbf242b266e3691573481">~concurrent_hash_map</a>()</td><td><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00015.html b/doc/html/a00015.html
index e636df4..bcd4a74 100644
--- a/doc/html/a00015.html
+++ b/doc/html/a00015.html
@@ -20,12 +20,12 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor Member List</h1>This is the complete list of members for <a class="el" href="a00158.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00158.html#26b4fe0ca87a7ad4852cb787db880119">acquire</a>(concurrent_hash_map *base, const hashcode_t h, bool writer=false)</td><td><a class="el" href="a00158.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>bucket_accessor</b>(concurrent_hash_map *base, const hashcode_t h, bool writer=false) (defined in <a class="el" href="a00158.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>)</td><td><a class="el" href="a00158.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00158.html#fc194e3a186dc935a5fb513cc9f8e898">is_writer</a>()</td><td><a class="el" href="a00158.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00158.html#57c6110bd20e95c06de5a199de988941">operator()</a>()</td><td><a class="el" href="a00158.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>upgrade_to_writer</b>() (defined in <a class="el" href="a00158.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>)</td><td><a class="el" href="a00158.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor Member List</h1>This is the complete list of members for <a class="el" href="a00157.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00157.html#26b4fe0ca87a7ad4852cb787db880119">acquire</a>(concurrent_hash_map *base, const hashcode_t h, bool writer=false)</td><td><a class="el" href="a00157.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>bucket_accessor</b>(concurrent_hash_map *base, const hashcode_t h, bool writer=false) (defined in <a class="el" href="a00157.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>)</td><td><a class="el" href="a00157.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00157.html#fc194e3a186dc935a5fb513cc9f8e898">is_writer</a>()</td><td><a class="el" href="a00157.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00157.html#57c6110bd20e95c06de5a199de988941">operator()</a>()</td><td><a class="el" href="a00157.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>upgrade_to_writer</b>() (defined in <a class="el" href="a00157.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>)</td><td><a class="el" href="a00157.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00016.html b/doc/html/a00016.html
index 7eaf1a0..c381134 100644
--- a/doc/html/a00016.html
+++ b/doc/html/a00016.html
@@ -20,16 +20,16 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor Member List</h1>This is the complete list of members for <a class="el" href="a00159.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>accessor</b> (defined in <a class="el" href="a00159.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00159.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>concurrent_hash_map< Key, T, HashCompare, Allocator ></b> (defined in <a class="el" href="a00159.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00159.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00159.html#a9ead65cca68d4c49c7ef64d7899a4c8">const_accessor</a>()</td><td><a class="el" href="a00159.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00159.html#5cce3104cb0a52e08d2131370871c614">empty</a>() const </td><td><a class="el" href="a00159.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00159.html#30f31106840700a4c3664b9cb1c31ca7">operator *</a>() const </td><td><a class="el" href="a00159.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00159.html#3d03a48ecb8cd9549bd8be64b09c9b0d">operator-></a>() const </td><td><a class="el" href="a00159.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00159.html#d5ce4f88d8870290238a8ad621e6f270">release</a>()</td><td><a class="el" href="a00159.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00159.html#48647ca0d79c1233b997f5768403c926">value_type</a> typedef</td><td><a class="el" href="a00159.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00159.html#752b0c1ec74b94786403a75e42917d01">~const_accessor</a>()</td><td><a class="el" href="a00159.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor Member List</h1>This is the complete list of members for <a class="el" href="a00158.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>accessor</b> (defined in <a class="el" href="a00158.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00158.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>concurrent_hash_map< Key, T, HashCompare, Allocator ></b> (defined in <a class="el" href="a00158.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00158.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00158.html#a9ead65cca68d4c49c7ef64d7899a4c8">const_accessor</a>()</td><td><a class="el" href="a00158.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00158.html#5cce3104cb0a52e08d2131370871c614">empty</a>() const </td><td><a class="el" href="a00158.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00158.html#30f31106840700a4c3664b9cb1c31ca7">operator *</a>() const </td><td><a class="el" href="a00158.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00158.html#3d03a48ecb8cd9549bd8be64b09c9b0d">operator-></a>() const </td><td><a class="el" href="a00158.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00158.html#d5ce4f88d8870290238a8ad621e6f270">release</a>()</td><td><a class="el" href="a00158.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00158.html#48647ca0d79c1233b997f5768403c926">value_type</a> typedef</td><td><a class="el" href="a00158.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00158.html#752b0c1ec74b94786403a75e42917d01">~const_accessor</a>()</td><td><a class="el" href="a00158.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00017.html b/doc/html/a00017.html
index bcec9ff..025e56c 100644
--- a/doc/html/a00017.html
+++ b/doc/html/a00017.html
@@ -20,14 +20,14 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor Member List</h1>This is the complete list of members for <a class="el" href="a00157.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00159.html#a9ead65cca68d4c49c7ef64d7899a4c8">const_accessor</a>()</td><td><a class="el" href="a00159.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00159.html#5cce3104cb0a52e08d2131370871c614">empty</a>() const </td><td><a class="el" href="a00159.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00157.html#e8938f0cd1211e88a1d73527ed3636c4">operator *</a>() const </td><td><a class="el" href="a00157.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00157.html#fcebc32c020202cc37e60eadef157569">operator-></a>() const </td><td><a class="el" href="a00157.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00159.html#d5ce4f88d8870290238a8ad621e6f270">release</a>()</td><td><a class="el" href="a00159.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00157.html#49eec74f272bab187d176c0d9d16a7fe">value_type</a> typedef</td><td><a class="el" href="a00157.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00159.html#752b0c1ec74b94786403a75e42917d01">~const_accessor</a>()</td><td><a class="el" href="a00159.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor Member List</h1>This is the complete list of members for <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00158.html#a9ead65cca68d4c49c7ef64d7899a4c8">const_accessor</a>()</td><td><a class="el" href="a00158.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00158.html#5cce3104cb0a52e08d2131370871c614">empty</a>() const </td><td><a class="el" href="a00158.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00156.html#e8938f0cd1211e88a1d73527ed3636c4">operator *</a>() const </td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00156.html#fcebc32c020202cc37e60eadef157569">operator-></a>() const </td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00158.html#d5ce4f88d8870290238a8ad621e6f270">release</a>()</td><td><a class="el" href="a00158.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00156.html#49eec74f272bab187d176c0d9d16a7fe">value_type</a> typedef</td><td><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00158.html#752b0c1ec74b94786403a75e42917d01">~const_accessor</a>()</td><td><a class="el" href="a00158.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00018.html b/doc/html/a00018.html
index 9fa9d87..65bd878 100644
--- a/doc/html/a00018.html
+++ b/doc/html/a00018.html
@@ -20,30 +20,30 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::strict_ppl::concurrent_queue< T, A > Member List</h1>This is the complete list of members for <a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00160.html#5a3956341728eaa558d8827063718cac">allocator_type</a> typedef</td><td><a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00160.html#c32e8e84c0524155133b4aae32d2a827">clear</a>()</td><td><a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00160.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00160.html#25209656c84f2f9b030e2f9162713341">concurrent_queue</a>(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00160.html#8a6b98ea11a867db8ac868f0113ca429">concurrent_queue</a>(const concurrent_queue &src, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_iterator</b> typedef (defined in <a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00160.html#4d48e7ff93f81636bca2c74f7da34750">const_reference</a> typedef</td><td><a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00160.html#068576d16c7e4e05d52f9db7a45b5b65">difference_type</a> typedef</td><td><a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00160.html#f3f6fce0cfa2d581d6f3b47e0613ad64">empty</a>() const </td><td><a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00160.html#f034f70caef445fe8abc9113ec926a8d">get_allocator</a>() const </td><td><a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::concurrent_queue_iterator</b> (defined in <a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>iterator</b> typedef (defined in <a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00160.html#73c47563ffcc4c2f6452f25a04ebe2e2">push</a>(const T &source)</td><td><a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00160.html#a8d725c50a9834bb7af5b67c0aff92b8">reference</a> typedef</td><td><a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00160.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a> typedef</td><td><a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00160.html#ae31ca0db34ef96ef1e74aa0d28c95f8">try_pop</a>(T &result)</td><td><a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>unsafe_begin</b>() (defined in <a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>unsafe_begin</b>() const (defined in <a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>unsafe_end</b>() (defined in <a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>unsafe_end</b>() const (defined in <a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00160.html#eaa35a5274606779802e9a669a706260">unsafe_size</a>() const </td><td><a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00160.html#682c3978d5cb0620000994f11c44a476">value_type</a> typedef</td><td><a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00160.html#830b33753d6b149c366344e29b2edd8c">~concurrent_queue</a>()</td><td><a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+<h1>tbb::strict_ppl::concurrent_queue< T, A > Member List</h1>This is the complete list of members for <a class="el" href="a00159.html">tbb::strict_ppl::concurrent_queue< T, A ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00159.html#5a3956341728eaa558d8827063718cac">allocator_type</a> typedef</td><td><a class="el" href="a00159.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00159.html#c32e8e84c0524155133b4aae32d2a827">clear</a>()</td><td><a class="el" href="a00159.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00159.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00159.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00159.html#25209656c84f2f9b030e2f9162713341">concurrent_queue</a>(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00159.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00159.html#8a6b98ea11a867db8ac868f0113ca429">concurrent_queue</a>(const concurrent_queue &src, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00159.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_iterator</b> typedef (defined in <a class="el" href="a00159.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00159.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00159.html#4d48e7ff93f81636bca2c74f7da34750">const_reference</a> typedef</td><td><a class="el" href="a00159.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00159.html#068576d16c7e4e05d52f9db7a45b5b65">difference_type</a> typedef</td><td><a class="el" href="a00159.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00159.html#f3f6fce0cfa2d581d6f3b47e0613ad64">empty</a>() const </td><td><a class="el" href="a00159.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00159.html#f034f70caef445fe8abc9113ec926a8d">get_allocator</a>() const </td><td><a class="el" href="a00159.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::concurrent_queue_iterator</b> (defined in <a class="el" href="a00159.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00159.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>iterator</b> typedef (defined in <a class="el" href="a00159.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00159.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00159.html#73c47563ffcc4c2f6452f25a04ebe2e2">push</a>(const T &source)</td><td><a class="el" href="a00159.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00159.html#a8d725c50a9834bb7af5b67c0aff92b8">reference</a> typedef</td><td><a class="el" href="a00159.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00159.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a> typedef</td><td><a class="el" href="a00159.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00159.html#ae31ca0db34ef96ef1e74aa0d28c95f8">try_pop</a>(T &result)</td><td><a class="el" href="a00159.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>unsafe_begin</b>() (defined in <a class="el" href="a00159.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00159.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>unsafe_begin</b>() const (defined in <a class="el" href="a00159.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00159.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>unsafe_end</b>() (defined in <a class="el" href="a00159.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00159.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>unsafe_end</b>() const (defined in <a class="el" href="a00159.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00159.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00159.html#eaa35a5274606779802e9a669a706260">unsafe_size</a>() const </td><td><a class="el" href="a00159.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00159.html#682c3978d5cb0620000994f11c44a476">value_type</a> typedef</td><td><a class="el" href="a00159.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00159.html#830b33753d6b149c366344e29b2edd8c">~concurrent_queue</a>()</td><td><a class="el" href="a00159.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00019.html b/doc/html/a00019.html
index d53f314..a419489 100644
--- a/doc/html/a00019.html
+++ b/doc/html/a00019.html
@@ -20,34 +20,34 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::concurrent_bounded_queue< T, A > Member List</h1>This is the complete list of members for <a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> typedef</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00155.html#b2888b3e4e837d7e03f2c731963a402b">capacity</a>() const </td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00155.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a>()</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00155.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00155.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">concurrent_bounded_queue</a>(const concurrent_bounded_queue &src, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00155.html#a5e04dcd7db9fd9b583b4e7df832246a">concurrent_bounded_queue</a>(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_iterator</b> typedef (defined in <a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00155.html#796713d0b9ba93a4721cbe13e4474068">const_reference</a> typedef</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00155.html#4b45c91297e69515d83d5eef85ae1f49">difference_type</a> typedef</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00155.html#f64924f2ee9225c368a270fc3c394db9">empty</a>() const </td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00155.html#415eb87e53b1c6a266de06ecbc490d16">get_allocator</a>() const </td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::concurrent_queue_iterator</b> (defined in <a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>iterator</b> typedef (defined in <a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00155.html#41f4c6bd7a82ab070e840bbf81b0b123">pop</a>(T &destination)</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00155.html#ceb08c743b11ba88c878e73fff8af20b">push</a>(const T &source)</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00155.html#dcd44ca6a88c0dc7a847a47a10811f0c">reference</a> typedef</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00155.html#f3c6c934f85fd02aedbc83a16943193b">set_capacity</a>(size_type new_capacity)</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00155.html#7dc14d1a579a4cccda9f857585e1768d">size</a>() const </td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00155.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> typedef</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00155.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a>(T &destination)</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00155.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>(const T &source)</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>unsafe_begin</b>() (defined in <a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>unsafe_begin</b>() const (defined in <a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>unsafe_end</b>() (defined in <a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>unsafe_end</b>() const (defined in <a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00155.html#98245517a931e5893f6601e66c51fc75">value_type</a> typedef</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00155.html#acaf5b510dc0dfc7780b8c956cf773cf">~concurrent_bounded_queue</a>()</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+<h1>tbb::concurrent_bounded_queue< T, A > Member List</h1>This is the complete list of members for <a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00154.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> typedef</td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00154.html#b2888b3e4e837d7e03f2c731963a402b">capacity</a>() const </td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00154.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a>()</td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00154.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00154.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">concurrent_bounded_queue</a>(const concurrent_bounded_queue &src, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00154.html#a5e04dcd7db9fd9b583b4e7df832246a">concurrent_bounded_queue</a>(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_iterator</b> typedef (defined in <a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00154.html#796713d0b9ba93a4721cbe13e4474068">const_reference</a> typedef</td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00154.html#4b45c91297e69515d83d5eef85ae1f49">difference_type</a> typedef</td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00154.html#f64924f2ee9225c368a270fc3c394db9">empty</a>() const </td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00154.html#415eb87e53b1c6a266de06ecbc490d16">get_allocator</a>() const </td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::concurrent_queue_iterator</b> (defined in <a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>iterator</b> typedef (defined in <a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00154.html#41f4c6bd7a82ab070e840bbf81b0b123">pop</a>(T &destination)</td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00154.html#ceb08c743b11ba88c878e73fff8af20b">push</a>(const T &source)</td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00154.html#dcd44ca6a88c0dc7a847a47a10811f0c">reference</a> typedef</td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00154.html#f3c6c934f85fd02aedbc83a16943193b">set_capacity</a>(size_type new_capacity)</td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00154.html#7dc14d1a579a4cccda9f857585e1768d">size</a>() const </td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00154.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> typedef</td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00154.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a>(T &destination)</td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00154.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>(const T &source)</td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>unsafe_begin</b>() (defined in <a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>unsafe_begin</b>() const (defined in <a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>unsafe_end</b>() (defined in <a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>unsafe_end</b>() const (defined in <a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00154.html#98245517a931e5893f6601e66c51fc75">value_type</a> typedef</td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00154.html#acaf5b510dc0dfc7780b8c956cf773cf">~concurrent_bounded_queue</a>()</td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00021.html b/doc/html/a00021.html
index 951361b..79a95ba 100644
--- a/doc/html/a00021.html
+++ b/doc/html/a00021.html
@@ -20,43 +20,43 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::deprecated::concurrent_queue< T, A > Member List</h1>This is the complete list of members for <a class="el" href="a00161.html">tbb::deprecated::concurrent_queue< T, A ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> typedef</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>begin</b>() (defined in <a class="el" href="a00161.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00161.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>begin</b>() const (defined in <a class="el" href="a00161.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00161.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00155.html#b2888b3e4e837d7e03f2c731963a402b">capacity</a>() const </td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00155.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a>()</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00155.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00155.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">concurrent_bounded_queue</a>(const concurrent_bounded_queue &src, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00155.html#a5e04dcd7db9fd9b583b4e7df832246a">concurrent_bounded_queue</a>(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00161.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a>(const A &a=A())</td><td><a class="el" href="a00161.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00161.html#fc092b9082f233482f3513fc3bb670f7">concurrent_queue</a>(const concurrent_queue &src, const A &a=A())</td><td><a class="el" href="a00161.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00161.html#9102b897776bd2d9e908e6604ff16b5f">concurrent_queue</a>(InputIterator b, InputIterator e, const A &a=A())</td><td><a class="el" href="a00161.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_iterator</b> typedef (defined in <a class="el" href="a00161.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00161.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00155.html#796713d0b9ba93a4721cbe13e4474068">const_reference</a> typedef</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00155.html#4b45c91297e69515d83d5eef85ae1f49">difference_type</a> typedef</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00155.html#f64924f2ee9225c368a270fc3c394db9">empty</a>() const </td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>end</b>() (defined in <a class="el" href="a00161.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00161.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>end</b>() const (defined in <a class="el" href="a00161.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00161.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00155.html#415eb87e53b1c6a266de06ecbc490d16">get_allocator</a>() const </td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::concurrent_queue_iterator</b> (defined in <a class="el" href="a00161.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00161.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>iterator</b> typedef (defined in <a class="el" href="a00161.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00161.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00155.html#41f4c6bd7a82ab070e840bbf81b0b123">pop</a>(T &destination)</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00161.html#48da3536245318af6cb5fd58bac78039">pop_if_present</a>(T &destination)</td><td><a class="el" href="a00161.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00155.html#ceb08c743b11ba88c878e73fff8af20b">push</a>(const T &source)</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00161.html#7c45561bafe71107d09b2bc1b8f4e681">push_if_not_full</a>(const T &source)</td><td><a class="el" href="a00161.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00155.html#dcd44ca6a88c0dc7a847a47a10811f0c">reference</a> typedef</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00155.html#f3c6c934f85fd02aedbc83a16943193b">set_capacity</a>(size_type new_capacity)</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00155.html#7dc14d1a579a4cccda9f857585e1768d">size</a>() const </td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00155.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> typedef</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00155.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a>(T &destination)</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00155.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>(const T &source)</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>unsafe_begin</b>() (defined in <a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>unsafe_begin</b>() const (defined in <a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>unsafe_end</b>() (defined in <a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>unsafe_end</b>() const (defined in <a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00155.html#98245517a931e5893f6601e66c51fc75">value_type</a> typedef</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00155.html#acaf5b510dc0dfc7780b8c956cf773cf">~concurrent_bounded_queue</a>()</td><td><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+<h1>tbb::deprecated::concurrent_queue< T, A > Member List</h1>This is the complete list of members for <a class="el" href="a00160.html">tbb::deprecated::concurrent_queue< T, A ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00154.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> typedef</td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>begin</b>() (defined in <a class="el" href="a00160.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00160.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>begin</b>() const (defined in <a class="el" href="a00160.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00160.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00154.html#b2888b3e4e837d7e03f2c731963a402b">capacity</a>() const </td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00154.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a>()</td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00154.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00154.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">concurrent_bounded_queue</a>(const concurrent_bounded_queue &src, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00154.html#a5e04dcd7db9fd9b583b4e7df832246a">concurrent_bounded_queue</a>(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00160.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a>(const A &a=A())</td><td><a class="el" href="a00160.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00160.html#fc092b9082f233482f3513fc3bb670f7">concurrent_queue</a>(const concurrent_queue &src, const A &a=A())</td><td><a class="el" href="a00160.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00160.html#9102b897776bd2d9e908e6604ff16b5f">concurrent_queue</a>(InputIterator b, InputIterator e, const A &a=A())</td><td><a class="el" href="a00160.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_iterator</b> typedef (defined in <a class="el" href="a00160.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00160.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00154.html#796713d0b9ba93a4721cbe13e4474068">const_reference</a> typedef</td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00154.html#4b45c91297e69515d83d5eef85ae1f49">difference_type</a> typedef</td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00154.html#f64924f2ee9225c368a270fc3c394db9">empty</a>() const </td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>end</b>() (defined in <a class="el" href="a00160.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00160.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>end</b>() const (defined in <a class="el" href="a00160.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00160.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00154.html#415eb87e53b1c6a266de06ecbc490d16">get_allocator</a>() const </td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::concurrent_queue_iterator</b> (defined in <a class="el" href="a00160.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00160.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>iterator</b> typedef (defined in <a class="el" href="a00160.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00160.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00154.html#41f4c6bd7a82ab070e840bbf81b0b123">pop</a>(T &destination)</td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00160.html#48da3536245318af6cb5fd58bac78039">pop_if_present</a>(T &destination)</td><td><a class="el" href="a00160.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00154.html#ceb08c743b11ba88c878e73fff8af20b">push</a>(const T &source)</td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00160.html#7c45561bafe71107d09b2bc1b8f4e681">push_if_not_full</a>(const T &source)</td><td><a class="el" href="a00160.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00154.html#dcd44ca6a88c0dc7a847a47a10811f0c">reference</a> typedef</td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00154.html#f3c6c934f85fd02aedbc83a16943193b">set_capacity</a>(size_type new_capacity)</td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00154.html#7dc14d1a579a4cccda9f857585e1768d">size</a>() const </td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00154.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> typedef</td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00154.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a>(T &destination)</td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00154.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>(const T &source)</td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>unsafe_begin</b>() (defined in <a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>unsafe_begin</b>() const (defined in <a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>unsafe_end</b>() (defined in <a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>unsafe_end</b>() const (defined in <a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00154.html#98245517a931e5893f6601e66c51fc75">value_type</a> typedef</td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00154.html#acaf5b510dc0dfc7780b8c956cf773cf">~concurrent_bounded_queue</a>()</td><td><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00026.html b/doc/html/a00026.html
index d8494d8..daddd0b 100644
--- a/doc/html/a00026.html
+++ b/doc/html/a00026.html
@@ -20,77 +20,77 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::concurrent_vector< T, A > Member List</h1>This is the complete list of members for <a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>allocator_type</b> typedef (defined in <a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#423e5aa15e0e3309ad86d026fd85f6f6">assign</a>(size_type n, const_reference t)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#93a06b3112cb804f42f40efb5e7387b4">assign</a>(I first, I last)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#0c073ca43e787c7cbf7b0e26d2221748">at</a>(size_type index)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#23e14a38af748edff96a7adc3a0f1c58">at</a>(size_type index) const </td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#41ce48d6015a1a2812d41cf620ec3476">back</a>()</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#bd518e204107d07fd08d0ec5bdfd383d">back</a>() const </td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#730b23a251ecb6d37f692fb22f38e029">begin</a>()</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#78a06182276ff758788d4c0623ae0d71">begin</a>() const </td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#3ed6b9ae7217af5103d974045b6f5cd5">capacity</a>() const </td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#f88fcf1c920693c39bd9709db33c199f">cbegin</a>() const </td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#0c15a5d0f1cf75d687dabba07da1d46b">cend</a>() const </td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#26f937a359a66b6aae904c3cd9a3c444">clear</a>()</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#1693d1da41b1a8235871be9c6633be35">compact</a>()</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#2c8ca9cabfcd30ad5943324c853664b5">concurrent_vector</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#dd8a200b99a8088435a37934b58fe335">concurrent_vector</a>(const concurrent_vector &vector, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#64432f13f7b29bfe4acfb5568f34f3a8">concurrent_vector</a>(const concurrent_vector< T, M > &vector, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#2a2e261dfe1cab3f73f7b1a94137cfca">concurrent_vector</a>(size_type n)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#3883a8a908b44e249a57f454de3f55d8">concurrent_vector</a>(size_type n, const_reference t, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#4450de83c5862ea4bcd9443fd7e67419">concurrent_vector</a>(I first, I last, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_iterator</b> typedef (defined in <a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_range_type</b> typedef (defined in <a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_reference</b> typedef (defined in <a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_reverse_iterator</b> typedef (defined in <a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_reverse_iterator</b> typedef (defined in <a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#db78a1d28c9c966050e8a2926d834a33">crbegin</a>() const </td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#fff9cece89438587997ebedf93c5e962">crend</a>() const </td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>difference_type</b> typedef (defined in <a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#c6426cb93cf20d3af40f3c90f1f0481a">empty</a>() const </td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#c0b51160e5a764982ec97a455f94f2c6">end</a>()</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">end</a>() const </td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#15181759c0bfa2ddce5d10c7550e0002">front</a>()</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#502615a858eb9fa0390ee59169065e90">front</a>() const </td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#2fdba8e90de6a4d2300222236d46758e">get_allocator</a>() const </td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#30484e3959892fd5392fa93c873c31f0">grow_by</a>(size_type delta)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#c8177b1865270ea68aa1ab9148e5e35e">grow_by</a>(size_type delta)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#38274ab3f772ecba600c7daca7690102">grow_by</a>(size_type delta, const_reference t)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#473a59a4c9308b93411b898b3110d26c">grow_by</a>(size_type delta, const_reference t)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#47fe588214dd5fa06ab6e8ab78d83874">grow_to_at_least</a>(size_type n)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#a7e3b67c8ccab16d0aecc80899ae799d">grow_to_at_least</a>(size_type n)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::vector_iterator</b> (defined in <a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal_vector_base</b>() const (defined in <a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>iterator</b> typedef (defined in <a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#2c248a017f0576df3e7cd99627836fd6">max_size</a>() const </td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#691f0f3cda3e489c37a657016e375eaf">operator=</a>(const concurrent_vector &vector)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#19f4ab88a01b0fd056af3bba463e7bd6">operator=</a>(const concurrent_vector< T, M > &vector)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#4c52f2950bb1832886bd4458eb09d7eb">operator[]</a>(size_type index)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#c6fade5c732cc95274d1d8277ea619d1">operator[]</a>(size_type index) const </td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(const_reference item) iterator push_back(const _reference item)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#a4c6ffff3bf08b92939aa2fc516edfba">range</a>(size_t grainsize=1)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#3d09ccfb581b879ae64203741035e193">range</a>(size_t grainsize=1) const </td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>range_type</b> typedef (defined in <a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#5e220926d09236d98f04fe0721e5f9a1">rbegin</a>()</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#9f9c103e18d5f212703805354074ad44">rbegin</a>() const </td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#290119a4eb43cd6a9e98fa17016ba3c2">rend</a>()</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#d438b9b32ea3a8ffb703015b6dce055b">rend</a>() const </td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#5a0ce05026994b010018f72cfdeb72c1">reserve</a>(size_type n)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#8dfb0cb0eef96d440b4dcf801807a718">resize</a>(size_type n)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#98ce6b2c6d2622f0c030b46dfac3880c">resize</a>(size_type n, const_reference t)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>reverse_iterator</b> typedef (defined in <a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>reverse_iterator</b> typedef (defined in <a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#03c6f4cf66532bf4cc907ee738a9a186">shrink_to_fit</a>()</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>() const </td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#96c9c4bd968ed3edb8dd276854d2dae0">swap</a>(concurrent_vector &vector)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00162.html#da2444b28bb840d38f60d0030333a5fc">~concurrent_vector</a>()</td><td><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::concurrent_vector< T, A > Member List</h1>This is the complete list of members for <a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>allocator_type</b> typedef (defined in <a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#423e5aa15e0e3309ad86d026fd85f6f6">assign</a>(size_type n, const_reference t)</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#93a06b3112cb804f42f40efb5e7387b4">assign</a>(I first, I last)</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#0c073ca43e787c7cbf7b0e26d2221748">at</a>(size_type index)</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#23e14a38af748edff96a7adc3a0f1c58">at</a>(size_type index) const </td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#41ce48d6015a1a2812d41cf620ec3476">back</a>()</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#bd518e204107d07fd08d0ec5bdfd383d">back</a>() const </td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#730b23a251ecb6d37f692fb22f38e029">begin</a>()</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#78a06182276ff758788d4c0623ae0d71">begin</a>() const </td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#3ed6b9ae7217af5103d974045b6f5cd5">capacity</a>() const </td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#f88fcf1c920693c39bd9709db33c199f">cbegin</a>() const </td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#0c15a5d0f1cf75d687dabba07da1d46b">cend</a>() const </td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#26f937a359a66b6aae904c3cd9a3c444">clear</a>()</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#1693d1da41b1a8235871be9c6633be35">compact</a>()</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#2c8ca9cabfcd30ad5943324c853664b5">concurrent_vector</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#dd8a200b99a8088435a37934b58fe335">concurrent_vector</a>(const concurrent_vector &vector, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#64432f13f7b29bfe4acfb5568f34f3a8">concurrent_vector</a>(const concurrent_vector< T, M > &vector, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#2a2e261dfe1cab3f73f7b1a94137cfca">concurrent_vector</a>(size_type n)</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#3883a8a908b44e249a57f454de3f55d8">concurrent_vector</a>(size_type n, const_reference t, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#4450de83c5862ea4bcd9443fd7e67419">concurrent_vector</a>(I first, I last, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_iterator</b> typedef (defined in <a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_range_type</b> typedef (defined in <a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_reference</b> typedef (defined in <a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_reverse_iterator</b> typedef (defined in <a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_reverse_iterator</b> typedef (defined in <a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#db78a1d28c9c966050e8a2926d834a33">crbegin</a>() const </td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#fff9cece89438587997ebedf93c5e962">crend</a>() const </td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>difference_type</b> typedef (defined in <a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#c6426cb93cf20d3af40f3c90f1f0481a">empty</a>() const </td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#c0b51160e5a764982ec97a455f94f2c6">end</a>()</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">end</a>() const </td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#15181759c0bfa2ddce5d10c7550e0002">front</a>()</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#502615a858eb9fa0390ee59169065e90">front</a>() const </td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#2fdba8e90de6a4d2300222236d46758e">get_allocator</a>() const </td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#30484e3959892fd5392fa93c873c31f0">grow_by</a>(size_type delta)</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#c8177b1865270ea68aa1ab9148e5e35e">grow_by</a>(size_type delta)</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#38274ab3f772ecba600c7daca7690102">grow_by</a>(size_type delta, const_reference t)</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#473a59a4c9308b93411b898b3110d26c">grow_by</a>(size_type delta, const_reference t)</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#47fe588214dd5fa06ab6e8ab78d83874">grow_to_at_least</a>(size_type n)</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#a7e3b67c8ccab16d0aecc80899ae799d">grow_to_at_least</a>(size_type n)</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::vector_iterator</b> (defined in <a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal_vector_base</b>() const (defined in <a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>iterator</b> typedef (defined in <a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#2c248a017f0576df3e7cd99627836fd6">max_size</a>() const </td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#691f0f3cda3e489c37a657016e375eaf">operator=</a>(const concurrent_vector &vector)</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#19f4ab88a01b0fd056af3bba463e7bd6">operator=</a>(const concurrent_vector< T, M > &vector)</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#4c52f2950bb1832886bd4458eb09d7eb">operator[]</a>(size_type index)</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#c6fade5c732cc95274d1d8277ea619d1">operator[]</a>(size_type index) const </td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(const_reference item) iterator push_back(const _reference item)</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#a4c6ffff3bf08b92939aa2fc516edfba">range</a>(size_t grainsize=1)</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#3d09ccfb581b879ae64203741035e193">range</a>(size_t grainsize=1) const </td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>range_type</b> typedef (defined in <a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#5e220926d09236d98f04fe0721e5f9a1">rbegin</a>()</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#9f9c103e18d5f212703805354074ad44">rbegin</a>() const </td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#290119a4eb43cd6a9e98fa17016ba3c2">rend</a>()</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#d438b9b32ea3a8ffb703015b6dce055b">rend</a>() const </td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#5a0ce05026994b010018f72cfdeb72c1">reserve</a>(size_type n)</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#8dfb0cb0eef96d440b4dcf801807a718">resize</a>(size_type n)</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#98ce6b2c6d2622f0c030b46dfac3880c">resize</a>(size_type n, const_reference t)</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reverse_iterator</b> typedef (defined in <a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reverse_iterator</b> typedef (defined in <a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#03c6f4cf66532bf4cc907ee738a9a186">shrink_to_fit</a>()</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>() const </td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#96c9c4bd968ed3edb8dd276854d2dae0">swap</a>(concurrent_vector &vector)</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00161.html#da2444b28bb840d38f60d0030333a5fc">~concurrent_vector</a>()</td><td><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00031.html b/doc/html/a00031.html
index f43057d..642e3d7 100644
--- a/doc/html/a00031.html
+++ b/doc/html/a00031.html
@@ -20,41 +20,41 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type > Member List</h1>This is the complete list of members for <a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00164.html#da7721b6c35d333ec89a37b63d0d82d3">allocator_type</a> typedef</td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00164.html#efd1e3d008ec5cd69c6b10c6dcac1e2c">begin</a>()</td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00164.html#5f94cdb3a743e8b57c70dcb1041cfdf9">begin</a>() const </td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00164.html#e7be0d504ba71ae6c7479eb373a361ab">clear</a>()</td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>combine</b>(combine_func_t f_combine) (defined in <a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>combine_each</b>(combine_func_t f_combine) (defined in <a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_iterator</b> typedef (defined in <a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_range_type</b> typedef (defined in <a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_reference</b> typedef (defined in <a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>difference_type</b> typedef (defined in <a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00164.html#af91306d8e10e093226788a733ee59b4">empty</a>() const </td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00164.html#3156594e622924c094c45faa261dba5a">end</a>()</td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00164.html#9909c01ec91ef10908c5155d6350db2d">end</a>() const </td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>enumerable_thread_specific</b> (defined in <a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00164.html#ca9994099ebd88e92be061452687422e">enumerable_thread_specific</a>()</td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00164.html#724ed4c846493da62b4efe032e16eb4a">enumerable_thread_specific</a>(Finit _finit)</td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00164.html#105a6487c8c4113ba89891b75243780c">enumerable_thread_specific</a>(const T &_exemplar)</td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>enumerable_thread_specific</b>(const enumerable_thread_specific< U, Alloc, Cachetype > &other) (defined in <a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>enumerable_thread_specific</b>(const enumerable_thread_specific &other) (defined in <a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>iterator</b> typedef (defined in <a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00164.html#8bcc55bfecc81937872b13f6db962b16">local</a>()</td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00164.html#34423652c3add42563b1d5d44ca78158">local</a>(bool &exists)</td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const enumerable_thread_specific &other) (defined in <a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const enumerable_thread_specific< U, Alloc, Cachetype > &other) (defined in <a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00164.html#ab3f04b8d355b5d311e955d3bb63562c">range</a>(size_t grainsize=1)</td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00164.html#48f5ab20db3c77faa7219deb28076e6c">range</a>(size_t grainsize=1) const </td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>range_type</b> typedef (defined in <a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00164.html#101ecd32efae3ce1331c3d8a791c645b">size</a>() const </td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00164.html#7f6e5b3654712ea003cbb7ebaffa8dd9">~enumerable_thread_specific</a>()</td><td><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type > Member List</h1>This is the complete list of members for <a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00163.html#3c03eb40955b933b01987222722ac4bd">allocator_type</a> typedef</td><td><a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00163.html#01d7baf8e913ab2819e97917a2ac795f">begin</a>()</td><td><a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00163.html#84afb3906a39e399cde1c950d6351300">begin</a>() const </td><td><a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00163.html#a8764176d4b6014c5d65f1051851abc8">clear</a>()</td><td><a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>combine</b>(combine_func_t f_combine) (defined in <a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>combine_each</b>(combine_func_t f_combine) (defined in <a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_iterator</b> typedef (defined in <a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_range_type</b> typedef (defined in <a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_reference</b> typedef (defined in <a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>difference_type</b> typedef (defined in <a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00163.html#72595886d0ac8fd0543f90038570510d">empty</a>() const </td><td><a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00163.html#2456ff88252fc921b01cd8907628a4ee">end</a>()</td><td><a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00163.html#cb448bb4977ce366ceb7344085cc7050">end</a>() const </td><td><a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>enumerable_thread_specific</b> (defined in <a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00163.html#0cfa3a5c8f2be3bbf313d93b1fa8cdb3">enumerable_thread_specific</a>()</td><td><a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00163.html#8d4b456ff9d7b289c73254eccc11db45">enumerable_thread_specific</a>(Finit finit)</td><td><a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00163.html#7bce6829981c9efe3f59cae2355e383e">enumerable_thread_specific</a>(const T &exemplar)</td><td><a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>enumerable_thread_specific</b>(const enumerable_thread_specific< U, Alloc, Cachetype > &other) (defined in <a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>enumerable_thread_specific</b>(const enumerable_thread_specific &other) (defined in <a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>iterator</b> typedef (defined in <a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00163.html#c8d5265ccbd5e4485996b3f3baaa5ba1">local</a>()</td><td><a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00163.html#7dc79058d2832f7447de8e691c3455ea">local</a>(bool &exists)</td><td><a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const enumerable_thread_specific &other) (defined in <a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const enumerable_thread_specific< U, Alloc, Cachetype > &other) (defined in <a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00163.html#b22c54990b2362cd93c1a8f73de140bc">range</a>(size_t grainsize=1)</td><td><a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00163.html#3b068000cf4dbf9b40f8bb7e3fc53e0b">range</a>(size_t grainsize=1) const </td><td><a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>range_type</b> typedef (defined in <a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00163.html#33fd6593da1ed14340f10f67d5a69130">size</a>() const </td><td><a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00163.html#5a7907d9e3e5b18e7a7b55211ef3213f">~enumerable_thread_specific</a>()</td><td><a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00042.html b/doc/html/a00042.html
index 34b0448..a8e9567 100644
--- a/doc/html/a00042.html
+++ b/doc/html/a00042.html
@@ -20,8 +20,8 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::final_scan_tag Member List</h1>This is the complete list of members for <a class="el" href="a00167.html">tbb::final_scan_tag</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>is_final_scan</b>() (defined in <a class="el" href="a00167.html">tbb::final_scan_tag</a>)</td><td><a class="el" href="a00167.html">tbb::final_scan_tag</a></td><td><code> [inline, static]</code></td></tr>
+<h1>tbb::final_scan_tag Member List</h1>This is the complete list of members for <a class="el" href="a00166.html">tbb::final_scan_tag</a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>is_final_scan</b>() (defined in <a class="el" href="a00166.html">tbb::final_scan_tag</a>)</td><td><a class="el" href="a00166.html">tbb::final_scan_tag</a></td><td><code> [inline, static]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00046.html b/doc/html/a00046.html
index ca8a641..afda5d4 100644
--- a/doc/html/a00046.html
+++ b/doc/html/a00046.html
@@ -20,11 +20,11 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::auto_partitioner Member List</h1>This is the complete list of members for <a class="el" href="a00146.html">tbb::auto_partitioner</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>auto_partitioner</b>() (defined in <a class="el" href="a00146.html">tbb::auto_partitioner</a>)</td><td><a class="el" href="a00146.html">tbb::auto_partitioner</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::start_for</b> (defined in <a class="el" href="a00146.html">tbb::auto_partitioner</a>)</td><td><a class="el" href="a00146.html">tbb::auto_partitioner</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::start_reduce</b> (defined in <a class="el" href="a00146.html">tbb::auto_partitioner</a>)</td><td><a class="el" href="a00146.html">tbb::auto_partitioner</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::start_scan</b> (defined in <a class="el" href="a00146.html">tbb::auto_partitioner</a>)</td><td><a class="el" href="a00146.html">tbb::auto_partitioner</a></td><td><code> [friend]</code></td></tr>
+<h1>tbb::auto_partitioner Member List</h1>This is the complete list of members for <a class="el" href="a00145.html">tbb::auto_partitioner</a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>auto_partitioner</b>() (defined in <a class="el" href="a00145.html">tbb::auto_partitioner</a>)</td><td><a class="el" href="a00145.html">tbb::auto_partitioner</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::start_for</b> (defined in <a class="el" href="a00145.html">tbb::auto_partitioner</a>)</td><td><a class="el" href="a00145.html">tbb::auto_partitioner</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::start_reduce</b> (defined in <a class="el" href="a00145.html">tbb::auto_partitioner</a>)</td><td><a class="el" href="a00145.html">tbb::auto_partitioner</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::start_scan</b> (defined in <a class="el" href="a00145.html">tbb::auto_partitioner</a>)</td><td><a class="el" href="a00145.html">tbb::auto_partitioner</a></td><td><code> [friend]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00048.html b/doc/html/a00048.html
index 7fa0f2a..4142902 100644
--- a/doc/html/a00048.html
+++ b/doc/html/a00048.html
@@ -20,13 +20,13 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::affinity_partitioner Member List</h1>This is the complete list of members for <a class="el" href="a00141.html">tbb::affinity_partitioner</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>affinity_partitioner</b>() (defined in <a class="el" href="a00141.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00141.html">tbb::affinity_partitioner</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::affinity_partition_type</b> (defined in <a class="el" href="a00141.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00141.html">tbb::affinity_partitioner</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::start_for</b> (defined in <a class="el" href="a00141.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00141.html">tbb::affinity_partitioner</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::start_reduce</b> (defined in <a class="el" href="a00141.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00141.html">tbb::affinity_partitioner</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::start_reduce_with_affinity</b> (defined in <a class="el" href="a00141.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00141.html">tbb::affinity_partitioner</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::start_scan</b> (defined in <a class="el" href="a00141.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00141.html">tbb::affinity_partitioner</a></td><td><code> [friend]</code></td></tr>
+<h1>tbb::affinity_partitioner Member List</h1>This is the complete list of members for <a class="el" href="a00140.html">tbb::affinity_partitioner</a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>affinity_partitioner</b>() (defined in <a class="el" href="a00140.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00140.html">tbb::affinity_partitioner</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::affinity_partition_type</b> (defined in <a class="el" href="a00140.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00140.html">tbb::affinity_partitioner</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::start_for</b> (defined in <a class="el" href="a00140.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00140.html">tbb::affinity_partitioner</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::start_reduce</b> (defined in <a class="el" href="a00140.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00140.html">tbb::affinity_partitioner</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::start_reduce_with_affinity</b> (defined in <a class="el" href="a00140.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00140.html">tbb::affinity_partitioner</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::start_scan</b> (defined in <a class="el" href="a00140.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00140.html">tbb::affinity_partitioner</a></td><td><code> [friend]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00049.html b/doc/html/a00049.html
index 1467f4a..0c3e068 100644
--- a/doc/html/a00049.html
+++ b/doc/html/a00049.html
@@ -20,17 +20,17 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::filter Member List</h1>This is the complete list of members for <a class="el" href="a00165.html">tbb::filter</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00165.html#56275eb889c77c4807967133e21401bd">finalize</a>(void *)</td><td><a class="el" href="a00165.html">tbb::filter</a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::pipeline_root_task</b> (defined in <a class="el" href="a00165.html">tbb::filter</a>)</td><td><a class="el" href="a00165.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::stage_task</b> (defined in <a class="el" href="a00165.html">tbb::filter</a>)</td><td><a class="el" href="a00165.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00165.html#15c29cae5d237e6d63dbfe5c94af89d5">is_bound</a>() const </td><td><a class="el" href="a00165.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00165.html#cd53206c4795ef2df5df26b795caf692">is_ordered</a>() const </td><td><a class="el" href="a00165.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00165.html#fcfec27656a69ff2072802ac001e936f">is_serial</a>() const </td><td><a class="el" href="a00165.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00165.html#fa1b3dc1f4f47563ccab7f4d92f5b543">operator()</a>(void *item)=0</td><td><a class="el" href="a00165.html">tbb::filter</a></td><td><code> [pure virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>pipeline</b> (defined in <a class="el" href="a00165.html">tbb::filter</a>)</td><td><a class="el" href="a00165.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>thread_bound_filter</b> (defined in <a class="el" href="a00165.html">tbb::filter</a>)</td><td><a class="el" href="a00165.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00165.html#66d159f362293e3964ba3da8bc1d2604">~filter</a>()</td><td><a class="el" href="a00165.html">tbb::filter</a></td><td><code> [virtual]</code></td></tr>
+<h1>tbb::filter Member List</h1>This is the complete list of members for <a class="el" href="a00164.html">tbb::filter</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00164.html#56275eb889c77c4807967133e21401bd">finalize</a>(void *)</td><td><a class="el" href="a00164.html">tbb::filter</a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::pipeline_root_task</b> (defined in <a class="el" href="a00164.html">tbb::filter</a>)</td><td><a class="el" href="a00164.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::stage_task</b> (defined in <a class="el" href="a00164.html">tbb::filter</a>)</td><td><a class="el" href="a00164.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00164.html#15c29cae5d237e6d63dbfe5c94af89d5">is_bound</a>() const </td><td><a class="el" href="a00164.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00164.html#cd53206c4795ef2df5df26b795caf692">is_ordered</a>() const </td><td><a class="el" href="a00164.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00164.html#fcfec27656a69ff2072802ac001e936f">is_serial</a>() const </td><td><a class="el" href="a00164.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00164.html#fa1b3dc1f4f47563ccab7f4d92f5b543">operator()</a>(void *item)=0</td><td><a class="el" href="a00164.html">tbb::filter</a></td><td><code> [pure virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>pipeline</b> (defined in <a class="el" href="a00164.html">tbb::filter</a>)</td><td><a class="el" href="a00164.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>thread_bound_filter</b> (defined in <a class="el" href="a00164.html">tbb::filter</a>)</td><td><a class="el" href="a00164.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00164.html#66d159f362293e3964ba3da8bc1d2604">~filter</a>()</td><td><a class="el" href="a00164.html">tbb::filter</a></td><td><code> [virtual]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00050.html b/doc/html/a00050.html
index 5c0d41e..b509337 100644
--- a/doc/html/a00050.html
+++ b/doc/html/a00050.html
@@ -22,20 +22,20 @@
</ul></div>
<h1>tbb::thread_bound_filter Member List</h1>This is the complete list of members for <a class="el" href="a00209.html">tbb::thread_bound_filter</a>, including all inherited members.<p><table>
<tr bgcolor="#f0f0f0"><td><b>end_of_stream</b> enum value (defined in <a class="el" href="a00209.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00209.html">tbb::thread_bound_filter</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00165.html#56275eb889c77c4807967133e21401bd">finalize</a>(void *)</td><td><a class="el" href="a00165.html">tbb::filter</a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::pipeline_root_task</b> (defined in <a class="el" href="a00165.html">tbb::filter</a>)</td><td><a class="el" href="a00165.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::stage_task</b> (defined in <a class="el" href="a00165.html">tbb::filter</a>)</td><td><a class="el" href="a00165.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00165.html#15c29cae5d237e6d63dbfe5c94af89d5">is_bound</a>() const </td><td><a class="el" href="a00165.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00165.html#cd53206c4795ef2df5df26b795caf692">is_ordered</a>() const </td><td><a class="el" href="a00165.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00165.html#fcfec27656a69ff2072802ac001e936f">is_serial</a>() const </td><td><a class="el" href="a00165.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00164.html#56275eb889c77c4807967133e21401bd">finalize</a>(void *)</td><td><a class="el" href="a00164.html">tbb::filter</a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::pipeline_root_task</b> (defined in <a class="el" href="a00164.html">tbb::filter</a>)</td><td><a class="el" href="a00164.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::stage_task</b> (defined in <a class="el" href="a00164.html">tbb::filter</a>)</td><td><a class="el" href="a00164.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00164.html#15c29cae5d237e6d63dbfe5c94af89d5">is_bound</a>() const </td><td><a class="el" href="a00164.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00164.html#cd53206c4795ef2df5df26b795caf692">is_ordered</a>() const </td><td><a class="el" href="a00164.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00164.html#fcfec27656a69ff2072802ac001e936f">is_serial</a>() const </td><td><a class="el" href="a00164.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
<tr bgcolor="#f0f0f0"><td><b>item_not_available</b> enum value (defined in <a class="el" href="a00209.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00209.html">tbb::thread_bound_filter</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00165.html#fa1b3dc1f4f47563ccab7f4d92f5b543">operator()</a>(void *item)=0</td><td><a class="el" href="a00165.html">tbb::filter</a></td><td><code> [pure virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00164.html#fa1b3dc1f4f47563ccab7f4d92f5b543">operator()</a>(void *item)=0</td><td><a class="el" href="a00164.html">tbb::filter</a></td><td><code> [pure virtual]</code></td></tr>
<tr class="memlist"><td><a class="el" href="a00209.html#5e726bdc7fbd924c0b07bd558b1d4d5d">process_item</a>()</td><td><a class="el" href="a00209.html">tbb::thread_bound_filter</a></td><td></td></tr>
<tr bgcolor="#f0f0f0"><td><b>result_type</b> enum name (defined in <a class="el" href="a00209.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00209.html">tbb::thread_bound_filter</a></td><td></td></tr>
<tr bgcolor="#f0f0f0"><td><b>success</b> enum value (defined in <a class="el" href="a00209.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00209.html">tbb::thread_bound_filter</a></td><td></td></tr>
<tr bgcolor="#f0f0f0"><td><b>thread_bound_filter</b>(mode filter_mode) (defined in <a class="el" href="a00209.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00209.html">tbb::thread_bound_filter</a></td><td><code> [inline, protected]</code></td></tr>
<tr class="memlist"><td><a class="el" href="a00209.html#c4f90f2c771bce748beb9be734fa286c">try_process_item</a>()</td><td><a class="el" href="a00209.html">tbb::thread_bound_filter</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00165.html#66d159f362293e3964ba3da8bc1d2604">~filter</a>()</td><td><a class="el" href="a00165.html">tbb::filter</a></td><td><code> [virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00164.html#66d159f362293e3964ba3da8bc1d2604">~filter</a>()</td><td><a class="el" href="a00164.html">tbb::filter</a></td><td><code> [virtual]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00002.html b/doc/html/a00052.html
similarity index 66%
copy from doc/html/a00002.html
copy to doc/html/a00052.html
index 019f327..6e872b8 100644
--- a/doc/html/a00002.html
+++ b/doc/html/a00052.html
@@ -20,9 +20,9 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::atomic< T > Member List</h1>This is the complete list of members for <a class="el" href="a00143.html">tbb::atomic< T ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>operator=</b>(T rhs) (defined in <a class="el" href="a00143.html">tbb::atomic< T ></a>)</td><td><a class="el" href="a00143.html">tbb::atomic< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const atomic< T > &rhs) (defined in <a class="el" href="a00143.html">tbb::atomic< T ></a>)</td><td><a class="el" href="a00143.html">tbb::atomic< T ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::interface5::flow_control Member List</h1>This is the complete list of members for <a class="el" href="a00167.html">tbb::interface5::flow_control</a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>internal::concrete_filter</b> (defined in <a class="el" href="a00167.html">tbb::interface5::flow_control</a>)</td><td><a class="el" href="a00167.html">tbb::interface5::flow_control</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>stop</b>() (defined in <a class="el" href="a00167.html">tbb::interface5::flow_control</a>)</td><td><a class="el" href="a00167.html">tbb::interface5::flow_control</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00053.html b/doc/html/a00053.html
index 174dc97..9003cd6 100644
--- a/doc/html/a00053.html
+++ b/doc/html/a00053.html
@@ -20,16 +20,16 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::interface5::filter_t< T, U > Member List</h1>This is the complete list of members for <a class="el" href="a00166.html">tbb::interface5::filter_t< T, U ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>clear</b>() (defined in <a class="el" href="a00166.html">tbb::interface5::filter_t< T, U ></a>)</td><td><a class="el" href="a00166.html">tbb::interface5::filter_t< T, U ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>filter_t</b>() (defined in <a class="el" href="a00166.html">tbb::interface5::filter_t< T, U ></a>)</td><td><a class="el" href="a00166.html">tbb::interface5::filter_t< T, U ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>filter_t</b>(const filter_t< T, U > &rhs) (defined in <a class="el" href="a00166.html">tbb::interface5::filter_t< T, U ></a>)</td><td><a class="el" href="a00166.html">tbb::interface5::filter_t< T, U ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>filter_t</b>(tbb::filter::mode mode, const Body &body) (defined in <a class="el" href="a00166.html">tbb::interface5::filter_t< T, U ></a>)</td><td><a class="el" href="a00166.html">tbb::interface5::filter_t< T, U ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::pipeline_proxy</b> (defined in <a class="el" href="a00166.html">tbb::interface5::filter_t< T, U ></a>)</td><td><a class="el" href="a00166.html">tbb::interface5::filter_t< T, U ></a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>make_filter</b> (defined in <a class="el" href="a00166.html">tbb::interface5::filter_t< T, U ></a>)</td><td><a class="el" href="a00166.html">tbb::interface5::filter_t< T, U ></a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>operator &</b> (defined in <a class="el" href="a00166.html">tbb::interface5::filter_t< T, U ></a>)</td><td><a class="el" href="a00166.html">tbb::interface5::filter_t< T, U ></a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const filter_t< T, U > &rhs) (defined in <a class="el" href="a00166.html">tbb::interface5::filter_t< T, U ></a>)</td><td><a class="el" href="a00166.html">tbb::interface5::filter_t< T, U ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~filter_t</b>() (defined in <a class="el" href="a00166.html">tbb::interface5::filter_t< T, U ></a>)</td><td><a class="el" href="a00166.html">tbb::interface5::filter_t< T, U ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::interface5::filter_t< T, U > Member List</h1>This is the complete list of members for <a class="el" href="a00165.html">tbb::interface5::filter_t< T, U ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>clear</b>() (defined in <a class="el" href="a00165.html">tbb::interface5::filter_t< T, U ></a>)</td><td><a class="el" href="a00165.html">tbb::interface5::filter_t< T, U ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>filter_t</b>() (defined in <a class="el" href="a00165.html">tbb::interface5::filter_t< T, U ></a>)</td><td><a class="el" href="a00165.html">tbb::interface5::filter_t< T, U ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>filter_t</b>(const filter_t< T, U > &rhs) (defined in <a class="el" href="a00165.html">tbb::interface5::filter_t< T, U ></a>)</td><td><a class="el" href="a00165.html">tbb::interface5::filter_t< T, U ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>filter_t</b>(tbb::filter::mode mode, const Body &body) (defined in <a class="el" href="a00165.html">tbb::interface5::filter_t< T, U ></a>)</td><td><a class="el" href="a00165.html">tbb::interface5::filter_t< T, U ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>internal::pipeline_proxy</b> (defined in <a class="el" href="a00165.html">tbb::interface5::filter_t< T, U ></a>)</td><td><a class="el" href="a00165.html">tbb::interface5::filter_t< T, U ></a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00165.html#85c2892eff1fddcd06e28911e75838bd">make_filter</a>(tbb::filter::mode, const Body &)</td><td><a class="el" href="a00165.html">tbb::interface5::filter_t< T, U ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>operator &</b> (defined in <a class="el" href="a00165.html">tbb::interface5::filter_t< T, U ></a>)</td><td><a class="el" href="a00165.html">tbb::interface5::filter_t< T, U ></a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const filter_t< T, U > &rhs) (defined in <a class="el" href="a00165.html">tbb::interface5::filter_t< T, U ></a>)</td><td><a class="el" href="a00165.html">tbb::interface5::filter_t< T, U ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>~filter_t</b>() (defined in <a class="el" href="a00165.html">tbb::interface5::filter_t< T, U ></a>)</td><td><a class="el" href="a00165.html">tbb::interface5::filter_t< T, U ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00076.html b/doc/html/a00076.html
index bc06f8f..2db1358 100644
--- a/doc/html/a00076.html
+++ b/doc/html/a00076.html
@@ -20,7 +20,7 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::empty_task Member List</h1>This is the complete list of members for <a class="el" href="a00163.html">tbb::empty_task</a>, including all inherited members.<p><table>
+<h1>tbb::empty_task Member List</h1>This is the complete list of members for <a class="el" href="a00162.html">tbb::empty_task</a>, including all inherited members.<p><table>
<tr bgcolor="#f0f0f0"><td><b>add_to_depth</b>(int) (defined in <a class="el" href="a00199.html">tbb::task</a>)</td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
<tr class="memlist"><td><a class="el" href="a00199.html#3a920a56b0bcf2801518fb45b2c9d2be">affinity</a>() const </td><td><a class="el" href="a00199.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
<tr class="memlist"><td><a class="el" href="a00199.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> typedef</td><td><a class="el" href="a00199.html">tbb::task</a></td><td></td></tr>
diff --git a/doc/html/a00094.html b/doc/html/a00094.html
index 9467fd5..ebfe34f 100644
--- a/doc/html/a00094.html
+++ b/doc/html/a00094.html
@@ -20,9 +20,9 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::bad_last_alloc Member List</h1>This is the complete list of members for <a class="el" href="a00147.html">tbb::bad_last_alloc</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>what</b>() const (defined in <a class="el" href="a00147.html">tbb::bad_last_alloc</a>)</td><td><a class="el" href="a00147.html">tbb::bad_last_alloc</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~bad_last_alloc</b>() (defined in <a class="el" href="a00147.html">tbb::bad_last_alloc</a>)</td><td><a class="el" href="a00147.html">tbb::bad_last_alloc</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::bad_last_alloc Member List</h1>This is the complete list of members for <a class="el" href="a00146.html">tbb::bad_last_alloc</a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>what</b>() const (defined in <a class="el" href="a00146.html">tbb::bad_last_alloc</a>)</td><td><a class="el" href="a00146.html">tbb::bad_last_alloc</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>~bad_last_alloc</b>() (defined in <a class="el" href="a00146.html">tbb::bad_last_alloc</a>)</td><td><a class="el" href="a00146.html">tbb::bad_last_alloc</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00099.html b/doc/html/a00099.html
index b28297d..5837e4c 100644
--- a/doc/html/a00099.html
+++ b/doc/html/a00099.html
@@ -20,19 +20,19 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::captured_exception Member List</h1>This is the complete list of members for <a class="el" href="a00153.html">tbb::captured_exception</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>captured_exception</b>(const captured_exception &src) (defined in <a class="el" href="a00153.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00153.html">tbb::captured_exception</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>captured_exception</b>(const char *name_, const char *info) (defined in <a class="el" href="a00153.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00153.html">tbb::captured_exception</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>clear</b>() (defined in <a class="el" href="a00153.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00153.html">tbb::captured_exception</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00153.html#93d875d3555502ff6f18513525de204c">destroy</a>()</td><td><a class="el" href="a00153.html">tbb::captured_exception</a></td><td><code> [virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00153.html#837a50b8f6a800bda225c39d1699643f">move</a>()</td><td><a class="el" href="a00153.html">tbb::captured_exception</a></td><td><code> [virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00153.html#5af82fd677449c5ca727fa1d7e16f9f5">name</a>() const </td><td><a class="el" href="a00153.html">tbb::captured_exception</a></td><td><code> [virtual]</code></td></tr>
+<h1>tbb::captured_exception Member List</h1>This is the complete list of members for <a class="el" href="a00152.html">tbb::captured_exception</a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>captured_exception</b>(const captured_exception &src) (defined in <a class="el" href="a00152.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00152.html">tbb::captured_exception</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>captured_exception</b>(const char *name_, const char *info) (defined in <a class="el" href="a00152.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00152.html">tbb::captured_exception</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>clear</b>() (defined in <a class="el" href="a00152.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00152.html">tbb::captured_exception</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00152.html#93d875d3555502ff6f18513525de204c">destroy</a>()</td><td><a class="el" href="a00152.html">tbb::captured_exception</a></td><td><code> [virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00152.html#837a50b8f6a800bda225c39d1699643f">move</a>()</td><td><a class="el" href="a00152.html">tbb::captured_exception</a></td><td><code> [virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00152.html#5af82fd677449c5ca727fa1d7e16f9f5">name</a>() const </td><td><a class="el" href="a00152.html">tbb::captured_exception</a></td><td><code> [virtual]</code></td></tr>
<tr class="memlist"><td><a class="el" href="a00206.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete</a>(void *p)</td><td><a class="el" href="a00206.html">tbb::tbb_exception</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const captured_exception &src) (defined in <a class="el" href="a00153.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00153.html">tbb::captured_exception</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>set</b>(const char *name, const char *info) (defined in <a class="el" href="a00153.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00153.html">tbb::captured_exception</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00153.html#2dd1be66ab32fa27e0ddef5707fa67ef">throw_self</a>()</td><td><a class="el" href="a00153.html">tbb::captured_exception</a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00153.html#6b5988ef74a1fe2a58998d110b3633e0">what</a>() const </td><td><a class="el" href="a00153.html">tbb::captured_exception</a></td><td><code> [virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~captured_exception</b>() (defined in <a class="el" href="a00153.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00153.html">tbb::captured_exception</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const captured_exception &src) (defined in <a class="el" href="a00152.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00152.html">tbb::captured_exception</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>set</b>(const char *name, const char *info) (defined in <a class="el" href="a00152.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00152.html">tbb::captured_exception</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00152.html#2dd1be66ab32fa27e0ddef5707fa67ef">throw_self</a>()</td><td><a class="el" href="a00152.html">tbb::captured_exception</a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00152.html#6b5988ef74a1fe2a58998d110b3633e0">what</a>() const </td><td><a class="el" href="a00152.html">tbb::captured_exception</a></td><td><code> [virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>~captured_exception</b>() (defined in <a class="el" href="a00152.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00152.html">tbb::captured_exception</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00102.html b/doc/html/a00102.html
index 5e570ae..160f4b4 100644
--- a/doc/html/a00102.html
+++ b/doc/html/a00102.html
@@ -20,11 +20,11 @@
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
-<h1>tbb::internal::atomic_backoff Member List</h1>This is the complete list of members for <a class="el" href="a00145.html">tbb::internal::atomic_backoff</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>atomic_backoff</b>() (defined in <a class="el" href="a00145.html">tbb::internal::atomic_backoff</a>)</td><td><a class="el" href="a00145.html">tbb::internal::atomic_backoff</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>bounded_pause</b>() (defined in <a class="el" href="a00145.html">tbb::internal::atomic_backoff</a>)</td><td><a class="el" href="a00145.html">tbb::internal::atomic_backoff</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00145.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>()</td><td><a class="el" href="a00145.html">tbb::internal::atomic_backoff</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>reset</b>() (defined in <a class="el" href="a00145.html">tbb::internal::atomic_backoff</a>)</td><td><a class="el" href="a00145.html">tbb::internal::atomic_backoff</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::internal::atomic_backoff Member List</h1>This is the complete list of members for <a class="el" href="a00144.html">tbb::internal::atomic_backoff</a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>atomic_backoff</b>() (defined in <a class="el" href="a00144.html">tbb::internal::atomic_backoff</a>)</td><td><a class="el" href="a00144.html">tbb::internal::atomic_backoff</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>bounded_pause</b>() (defined in <a class="el" href="a00144.html">tbb::internal::atomic_backoff</a>)</td><td><a class="el" href="a00144.html">tbb::internal::atomic_backoff</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00144.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>()</td><td><a class="el" href="a00144.html">tbb::internal::atomic_backoff</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reset</b>() (defined in <a class="el" href="a00144.html">tbb::internal::atomic_backoff</a>)</td><td><a class="el" href="a00144.html">tbb::internal::atomic_backoff</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00141.html b/doc/html/a00140.html
similarity index 95%
copy from doc/html/a00141.html
copy to doc/html/a00140.html
index 169a65e..75465f4 100644
--- a/doc/html/a00141.html
+++ b/doc/html/a00140.html
@@ -21,11 +21,11 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00141.html">affinity_partitioner</a></div>
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00140.html">affinity_partitioner</a></div>
<h1>tbb::affinity_partitioner Class Reference</h1><!-- doxytag: class="tbb::affinity_partitioner" -->An affinity partitioner.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00404.html">partitioner.h</a>></code>
+<code>#include <<a class="el" href="a00409.html">partitioner.h</a>></code>
<p>
<a href="a00048.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -50,7 +50,7 @@ class </td><td class="memItemRight" valign="bottom"><b>internal::affinity_p
An affinity partitioner.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00404.html">partitioner.h</a></ul>
+<li><a class="el" href="a00409.html">partitioner.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00141.html b/doc/html/a00141.html
index 169a65e..62575be 100644
--- a/doc/html/a00141.html
+++ b/doc/html/a00141.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::affinity_partitioner Class Reference</title>
+<title>tbb::aligned_space< T, N > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,36 +21,37 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00141.html">affinity_partitioner</a></div>
-<h1>tbb::affinity_partitioner Class Reference</h1><!-- doxytag: class="tbb::affinity_partitioner" -->An affinity partitioner.
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00141.html">aligned_space</a></div>
+<h1>tbb::aligned_space< T, N > Class Template Reference<br>
+<small>
+[<a class="el" href="a00277.html">Memory Allocation</a>]</small>
+</h1><!-- doxytag: class="tbb::aligned_space" -->Block of space aligned sufficiently to construct an array T with N elements.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00404.html">partitioner.h</a>></code>
+<code>#include <<a class="el" href="a00311.html">aligned_space.h</a>></code>
<p>
-<a href="a00048.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00001.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a47f7e0208a2bf68f35b51b27d2ddf2a"></a><!-- doxytag: member="tbb::affinity_partitioner::internal::start_for" ref="a47f7e0208a2bf68f35b51b27d2ddf2a" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::start_for</b></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0d702fc6b9e9d061ace3501b3c861cdf"></a><!-- doxytag: member="tbb::aligned_space::begin" ref="0d702fc6b9e9d061ace3501b3c861cdf" args="()" -->
+T * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00141.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e8f710e431b62c2a48914bd99d0fe034"></a><!-- doxytag: member="tbb::affinity_partitioner::internal::start_reduce" ref="e8f710e431b62c2a48914bd99d0fe034" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::start_reduce</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="181db51277e9b15dd0ec4a0617ab1f92"></a><!-- doxytag: member="tbb::affinity_partitioner::internal::start_reduce_with_affinity" ref="181db51277e9b15dd0ec4a0617ab1f92" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::start_reduce_with_affinity</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="76d97ae6ad98db0acfc8ed8cb7c76705"></a><!-- doxytag: member="tbb::affinity_partitioner::internal::start_scan" ref="76d97ae6ad98db0acfc8ed8cb7c76705" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::start_scan</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e9575467e391b90e0703fadf573dbad7"></a><!-- doxytag: member="tbb::affinity_partitioner::internal::affinity_partition_type" ref="e9575467e391b90e0703fadf573dbad7" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::affinity_partition_type</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Pointer to beginning of array. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="024be075c23c0394c9a2518d993bcd9e"></a><!-- doxytag: member="tbb::aligned_space::end" ref="024be075c23c0394c9a2518d993bcd9e" args="()" -->
+T * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00141.html#024be075c23c0394c9a2518d993bcd9e">end</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Pointer to one past last element in array. <br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-An affinity partitioner.
+<h3>template<typename T, size_t N><br>
+ class tbb::aligned_space< T, N ></h3>
+
+Block of space aligned sufficiently to construct an array T with N elements.
+<p>
+The elements are not constructed or destroyed by this class.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00404.html">partitioner.h</a></ul>
+<li><a class="el" href="a00311.html">aligned_space.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00142.html b/doc/html/a00142.html
index b7c81a3..679900d 100644
--- a/doc/html/a00142.html
+++ b/doc/html/a00142.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::aligned_space< T, N > Class Template Reference</title>
+<title>tbb::atomic< T > Struct Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,37 +21,35 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00142.html">aligned_space</a></div>
-<h1>tbb::aligned_space< T, N > Class Template Reference<br>
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00142.html">atomic</a></div>
+<h1>tbb::atomic< T > Struct Template Reference<br>
<small>
-[<a class="el" href="a00276.html">Memory Allocation</a>]</small>
-</h1><!-- doxytag: class="tbb::aligned_space" -->Block of space aligned sufficiently to construct an array T with N elements.
+[<a class="el" href="a00278.html">Synchronization</a>]</small>
+</h1><!-- doxytag: class="tbb::atomic" -->Primary template for atomic.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00310.html">aligned_space.h</a>></code>
+<code>#include <<a class="el" href="a00312.html">atomic.h</a>></code>
<p>
-<a href="a00001.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00002.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0d702fc6b9e9d061ace3501b3c861cdf"></a><!-- doxytag: member="tbb::aligned_space::begin" ref="0d702fc6b9e9d061ace3501b3c861cdf" args="()" -->
-T * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00142.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1e29e03a31436bad5eb1aa5a9d46a2da"></a><!-- doxytag: member="tbb::atomic::operator=" ref="1e29e03a31436bad5eb1aa5a9d46a2da" args="(T rhs)" -->
+T </td><td class="memItemRight" valign="bottom"><b>operator=</b> (T rhs)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Pointer to beginning of array. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="024be075c23c0394c9a2518d993bcd9e"></a><!-- doxytag: member="tbb::aligned_space::end" ref="024be075c23c0394c9a2518d993bcd9e" args="()" -->
-T * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00142.html#024be075c23c0394c9a2518d993bcd9e">end</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="90791297d59b1659cfaf0d93c7cc59ae"></a><!-- doxytag: member="tbb::atomic::operator=" ref="90791297d59b1659cfaf0d93c7cc59ae" args="(const atomic< T > &rhs)" -->
+<a class="el" href="a00142.html">atomic</a>< T > & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00142.html">atomic</a>< T > &rhs)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Pointer to one past last element in array. <br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T, size_t N><br>
- class tbb::aligned_space< T, N ></h3>
+<h3>template<typename T><br>
+ struct tbb::atomic< T ></h3>
-Block of space aligned sufficiently to construct an array T with N elements.
+Primary template for atomic.
<p>
-The elements are not constructed or destroyed by this class.
+See the Reference for details.
<p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00310.html">aligned_space.h</a></ul>
+<hr>The documentation for this struct was generated from the following file:<ul>
+<li><a class="el" href="a00312.html">atomic.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00143.html b/doc/html/a00143.html
index b40de9e..fddbba3 100644
--- a/doc/html/a00143.html
+++ b/doc/html/a00143.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::atomic< T > Struct Template Reference</title>
+<title>tbb::atomic< void * > Struct Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,35 +21,30 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00143.html">atomic</a></div>
-<h1>tbb::atomic< T > Struct Template Reference<br>
-<small>
-[<a class="el" href="a00277.html">Synchronization</a>]</small>
-</h1><!-- doxytag: class="tbb::atomic" -->Primary template for atomic.
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00143.html">atomic< void * ></a></div>
+<h1>tbb::atomic< void * > Struct Template Reference</h1><!-- doxytag: class="tbb::atomic< void * >" -->Specialization for <a class="el" href="a00143.html">atomic<void*></a>, for sake of not allowing arithmetic or operator->.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00311.html">atomic.h</a>></code>
+<code>#include <<a class="el" href="a00312.html">atomic.h</a>></code>
<p>
-<a href="a00002.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00003.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1e29e03a31436bad5eb1aa5a9d46a2da"></a><!-- doxytag: member="tbb::atomic::operator=" ref="1e29e03a31436bad5eb1aa5a9d46a2da" args="(T rhs)" -->
-T </td><td class="memItemRight" valign="bottom"><b>operator=</b> (T rhs)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ba6e74163e255b88c497c40db64c5dad"></a><!-- doxytag: member="tbb::atomic< void * >::operator=" ref="ba6e74163e255b88c497c40db64c5dad" args="(void *rhs)" -->
+void * </td><td class="memItemRight" valign="bottom"><b>operator=</b> (void *rhs)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="90791297d59b1659cfaf0d93c7cc59ae"></a><!-- doxytag: member="tbb::atomic::operator=" ref="90791297d59b1659cfaf0d93c7cc59ae" args="(const atomic< T > &rhs)" -->
-<a class="el" href="a00143.html">atomic</a>< T > & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00143.html">atomic</a>< T > &rhs)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="37979e62d1f88eb45bd3ad7df5a140f8"></a><!-- doxytag: member="tbb::atomic< void * >::operator=" ref="37979e62d1f88eb45bd3ad7df5a140f8" args="(const atomic< void * > &rhs)" -->
+<a class="el" href="a00142.html">atomic</a>< void * > & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00142.html">atomic</a>< void * > &rhs)</td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T><br>
- struct tbb::atomic< T ></h3>
+<h3>template<><br>
+ struct tbb::atomic< void * ></h3>
-Primary template for atomic.
-<p>
-See the Reference for details.
+Specialization for <a class="el" href="a00143.html">atomic<void*></a>, for sake of not allowing arithmetic or operator->.
<p>
<hr>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="a00311.html">atomic.h</a></ul>
+<li><a class="el" href="a00312.html">atomic.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00144.html b/doc/html/a00144.html
index de22ed9..a238209 100644
--- a/doc/html/a00144.html
+++ b/doc/html/a00144.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::atomic< void * > Struct Template Reference</title>
+<title>tbb::internal::atomic_backoff Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,30 +21,33 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00144.html">atomic< void * ></a></div>
-<h1>tbb::atomic< void * > Struct Template Reference</h1><!-- doxytag: class="tbb::atomic< void * >" -->Specialization for <a class="el" href="a00144.html">atomic<void*></a>, for sake of not allowing arithmetic or operator->.
+<a class="el" href="a00267.html">tbb</a>::<b>internal</b>::<a class="el" href="a00144.html">atomic_backoff</a></div>
+<h1>tbb::internal::atomic_backoff Class Reference</h1><!-- doxytag: class="tbb::internal::atomic_backoff" -->Class that implements exponential backoff.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00311.html">atomic.h</a>></code>
+<code>#include <<a class="el" href="a00460.html">tbb_machine.h</a>></code>
<p>
-<a href="a00003.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00102.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ba6e74163e255b88c497c40db64c5dad"></a><!-- doxytag: member="tbb::atomic< void * >::operator=" ref="ba6e74163e255b88c497c40db64c5dad" args="(void *rhs)" -->
-void * </td><td class="memItemRight" valign="bottom"><b>operator=</b> (void *rhs)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a174ea93e3bd3d5cce82389c2f28d037"></a><!-- doxytag: member="tbb::internal::atomic_backoff::pause" ref="a174ea93e3bd3d5cce82389c2f28d037" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00144.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="37979e62d1f88eb45bd3ad7df5a140f8"></a><!-- doxytag: member="tbb::atomic< void * >::operator=" ref="37979e62d1f88eb45bd3ad7df5a140f8" args="(const atomic< void * > &rhs)" -->
-<a class="el" href="a00143.html">atomic</a>< void * > & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00143.html">atomic</a>< void * > &rhs)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Pause for a while. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c6179b19e2e8dedd73a36d523af2fe12"></a><!-- doxytag: member="tbb::internal::atomic_backoff::bounded_pause" ref="c6179b19e2e8dedd73a36d523af2fe12" args="()" -->
+bool </td><td class="memItemRight" valign="bottom"><b>bounded_pause</b> ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="45edb535489eb0e76ecc59a19fd952de"></a><!-- doxytag: member="tbb::internal::atomic_backoff::reset" ref="45edb535489eb0e76ecc59a19fd952de" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><b>reset</b> ()</td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<><br>
- struct tbb::atomic< void * ></h3>
-
-Specialization for <a class="el" href="a00144.html">atomic<void*></a>, for sake of not allowing arithmetic or operator->.
+Class that implements exponential backoff.
+<p>
+See implementation of spin_wait_while_eq for an example.
<p>
-<hr>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="a00311.html">atomic.h</a></ul>
+<hr>The documentation for this class was generated from the following file:<ul>
+<li><a class="el" href="a00460.html">tbb_machine.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00145.html b/doc/html/a00145.html
index a20082b..c6a13b3 100644
--- a/doc/html/a00145.html
+++ b/doc/html/a00145.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::internal::atomic_backoff Class Reference</title>
+<title>tbb::auto_partitioner Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,33 +21,38 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00267.html">tbb</a>::<b>internal</b>::<a class="el" href="a00145.html">atomic_backoff</a></div>
-<h1>tbb::internal::atomic_backoff Class Reference</h1><!-- doxytag: class="tbb::internal::atomic_backoff" -->Class that implements exponential backoff.
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00145.html">auto_partitioner</a></div>
+<h1>tbb::auto_partitioner Class Reference<br>
+<small>
+[<a class="el" href="a00275.html">Algorithms</a>]</small>
+</h1><!-- doxytag: class="tbb::auto_partitioner" -->An auto partitioner.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00454.html">tbb_machine.h</a>></code>
+<code>#include <<a class="el" href="a00409.html">partitioner.h</a>></code>
<p>
-<a href="a00102.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00046.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a174ea93e3bd3d5cce82389c2f28d037"></a><!-- doxytag: member="tbb::internal::atomic_backoff::pause" ref="a174ea93e3bd3d5cce82389c2f28d037" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00145.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a> ()</td></tr>
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a47f7e0208a2bf68f35b51b27d2ddf2a"></a><!-- doxytag: member="tbb::auto_partitioner::internal::start_for" ref="a47f7e0208a2bf68f35b51b27d2ddf2a" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::start_for</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Pause for a while. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c6179b19e2e8dedd73a36d523af2fe12"></a><!-- doxytag: member="tbb::internal::atomic_backoff::bounded_pause" ref="c6179b19e2e8dedd73a36d523af2fe12" args="()" -->
-bool </td><td class="memItemRight" valign="bottom"><b>bounded_pause</b> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e8f710e431b62c2a48914bd99d0fe034"></a><!-- doxytag: member="tbb::auto_partitioner::internal::start_reduce" ref="e8f710e431b62c2a48914bd99d0fe034" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::start_reduce</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="45edb535489eb0e76ecc59a19fd952de"></a><!-- doxytag: member="tbb::internal::atomic_backoff::reset" ref="45edb535489eb0e76ecc59a19fd952de" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><b>reset</b> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="76d97ae6ad98db0acfc8ed8cb7c76705"></a><!-- doxytag: member="tbb::auto_partitioner::internal::start_scan" ref="76d97ae6ad98db0acfc8ed8cb7c76705" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::start_scan</b></td></tr>
+
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>partition_type</b></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Class that implements exponential backoff.
+An auto partitioner.
<p>
-See implementation of spin_wait_while_eq for an example.
+The range is initial divided into several large chunks. Chunks are further subdivided into VICTIM_CHUNKS pieces if they are stolen and divisible.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00454.html">tbb_machine.h</a></ul>
+<li><a class="el" href="a00409.html">partitioner.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00146.html b/doc/html/a00146.html
index 0904347..7eabe80 100644
--- a/doc/html/a00146.html
+++ b/doc/html/a00146.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::auto_partitioner Class Reference</title>
+<title>tbb::bad_last_alloc Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,38 +21,24 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00146.html">auto_partitioner</a></div>
-<h1>tbb::auto_partitioner Class Reference<br>
-<small>
-[<a class="el" href="a00274.html">Algorithms</a>]</small>
-</h1><!-- doxytag: class="tbb::auto_partitioner" -->An auto partitioner.
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00146.html">bad_last_alloc</a></div>
+<h1>tbb::bad_last_alloc Class Reference</h1><!-- doxytag: class="tbb::bad_last_alloc" -->Exception for concurrent containers.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00404.html">partitioner.h</a>></code>
+<code>#include <<a class="el" href="a00459.html">tbb_exception.h</a>></code>
<p>
-<a href="a00046.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00094.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a47f7e0208a2bf68f35b51b27d2ddf2a"></a><!-- doxytag: member="tbb::auto_partitioner::internal::start_for" ref="a47f7e0208a2bf68f35b51b27d2ddf2a" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::start_for</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e8f710e431b62c2a48914bd99d0fe034"></a><!-- doxytag: member="tbb::auto_partitioner::internal::start_reduce" ref="e8f710e431b62c2a48914bd99d0fe034" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::start_reduce</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="76d97ae6ad98db0acfc8ed8cb7c76705"></a><!-- doxytag: member="tbb::auto_partitioner::internal::start_scan" ref="76d97ae6ad98db0acfc8ed8cb7c76705" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::start_scan</b></td></tr>
-
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>partition_type</b></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ec7a57742ff4dc214266179d88984015"></a><!-- doxytag: member="tbb::bad_last_alloc::what" ref="ec7a57742ff4dc214266179d88984015" args="() const " -->
+const char * </td><td class="memItemRight" valign="bottom"><b>what</b> () const throw ()</td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-An auto partitioner.
-<p>
-The range is initial divided into several large chunks. Chunks are further subdivided into VICTIM_CHUNKS pieces if they are stolen and divisible.
+Exception for concurrent containers.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00404.html">partitioner.h</a></ul>
+<li><a class="el" href="a00459.html">tbb_exception.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00147.html b/doc/html/a00147.html
index 82143f1..ae2a156 100644
--- a/doc/html/a00147.html
+++ b/doc/html/a00147.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::bad_last_alloc Class Reference</title>
+<title>tbb::blocked_range< Value > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,24 +21,198 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00147.html">bad_last_alloc</a></div>
-<h1>tbb::bad_last_alloc Class Reference</h1><!-- doxytag: class="tbb::bad_last_alloc" -->Exception for concurrent containers.
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00147.html">blocked_range</a></div>
+<h1>tbb::blocked_range< Value > Class Template Reference<br>
+<small>
+[<a class="el" href="a00275.html">Algorithms</a>]</small>
+</h1><!-- doxytag: class="tbb::blocked_range" -->A range over which to iterate.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00453.html">tbb_exception.h</a>></code>
+<code>#include <<a class="el" href="a00320.html">blocked_range.h</a>></code>
<p>
-<a href="a00094.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00004.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">typedef Value </td><td class="memItemRight" valign="bottom"><a class="el" href="a00147.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Type of a value. <a href="#1a8d05842c2b3dfc177bc4d347e4cef7"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f5707bffea38eee5c9680f37358afb8e"></a><!-- doxytag: member="tbb::blocked_range::size_type" ref="f5707bffea38eee5c9680f37358afb8e" args="" -->
+typedef std::size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00147.html#f5707bffea38eee5c9680f37358afb8e">size_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Type for size of a range. <br></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ec7a57742ff4dc214266179d88984015"></a><!-- doxytag: member="tbb::bad_last_alloc::what" ref="ec7a57742ff4dc214266179d88984015" args="() const " -->
-const char * </td><td class="memItemRight" valign="bottom"><b>what</b> () const throw ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00147.html#94607755c5110d199202234d58d022ac">blocked_range</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct range with default-constructed values for begin and end. <a href="#94607755c5110d199202234d58d022ac"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="14795a36ead1414b4371dbe1a4656359"></a><!-- doxytag: member="tbb::blocked_range::blocked_range" ref="14795a36ead1414b4371dbe1a4656359" args="(Value begin_, Value end_, size_type grainsize_=1)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00147.html#14795a36ead1414b4371dbe1a4656359">blocked_range</a> (Value begin_, Value end_, <a class="el" href="a00147.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> grainsize_=1)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct range over half-open interval [begin,end), with the given grainsize. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="18d2258400756ac1446dac7676b18df3"></a><!-- doxytag: member="tbb::blocked_range::begin" ref="18d2258400756ac1446dac7676b18df3" args="() const " -->
+<a class="el" href="a00147.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00147.html#18d2258400756ac1446dac7676b18df3">begin</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Beginning of range. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8b929d93ddc13f148b11bceef3a3bdf8"></a><!-- doxytag: member="tbb::blocked_range::end" ref="8b929d93ddc13f148b11bceef3a3bdf8" args="() const " -->
+<a class="el" href="a00147.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00147.html#8b929d93ddc13f148b11bceef3a3bdf8">end</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">One past last value in range. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00147.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00147.html#9eaa0b6beff1420f688570bbf6b8c462">size</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Size of the range. <a href="#9eaa0b6beff1420f688570bbf6b8c462"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fcd2e5b8b6c11fd3f20fc0aa9f11bbc2"></a><!-- doxytag: member="tbb::blocked_range::grainsize" ref="fcd2e5b8b6c11fd3f20fc0aa9f11bbc2" args="() const " -->
+<a class="el" href="a00147.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00147.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The grain size for this range. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8f4f02f530eb3f2e7ea26e06f76aef9d"></a><!-- doxytag: member="tbb::blocked_range::empty" ref="8f4f02f530eb3f2e7ea26e06f76aef9d" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00147.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">True if range is empty. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00147.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">True if range is divisible. <a href="#41a58b703d574b6e1ca155df3576f578"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00147.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">blocked_range</a> (<a class="el" href="a00147.html">blocked_range</a> &r, <a class="el" href="a00198.html">split</a>)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Split range. <a href="#4c0efd2be3f96a0ab3ba5085e8b3fcc7"></a><br></td></tr>
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="395a514a55017e36d571809f1223389b"></a><!-- doxytag: member="tbb::blocked_range::blocked_range2d" ref="395a514a55017e36d571809f1223389b" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>blocked_range2d</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="13d172a4da9be197033e64516fff1f4b"></a><!-- doxytag: member="tbb::blocked_range::blocked_range3d" ref="13d172a4da9be197033e64516fff1f4b" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>blocked_range3d</b></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Exception for concurrent containers.
+<h3>template<typename Value><br>
+ class tbb::blocked_range< Value ></h3>
+
+A range over which to iterate.
+<p>
+<hr><h2>Member Typedef Documentation</h2>
+<a class="anchor" name="1a8d05842c2b3dfc177bc4d347e4cef7"></a><!-- doxytag: member="tbb::blocked_range::const_iterator" ref="1a8d05842c2b3dfc177bc4d347e4cef7" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Value> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">typedef Value <a class="el" href="a00147.html">tbb::blocked_range</a>< Value >::<a class="el" href="a00147.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Type of a value.
+<p>
+Called a const_iterator for sake of algorithms that need to treat a <a class="el" href="a00147.html">blocked_range</a> as an STL container.
+</div>
+</div><p>
+<hr><h2>Constructor & Destructor Documentation</h2>
+<a class="anchor" name="94607755c5110d199202234d58d022ac"></a><!-- doxytag: member="tbb::blocked_range::blocked_range" ref="94607755c5110d199202234d58d022ac" args="()" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Value> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="a00147.html">tbb::blocked_range</a>< Value >::<a class="el" href="a00147.html">blocked_range</a> </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Construct range with default-constructed values for begin and end.
+<p>
+Requires that Value have a default constructor.
+</div>
+</div><p>
+<a class="anchor" name="4c0efd2be3f96a0ab3ba5085e8b3fcc7"></a><!-- doxytag: member="tbb::blocked_range::blocked_range" ref="4c0efd2be3f96a0ab3ba5085e8b3fcc7" args="(blocked_range &r, split)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Value> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="a00147.html">tbb::blocked_range</a>< Value >::<a class="el" href="a00147.html">blocked_range</a> </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00147.html">blocked_range</a>< Value > & </td>
+ <td class="paramname"> <em>r</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="a00198.html">split</a> </td>
+ <td class="paramname"></td><td> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Split range.
+<p>
+The new Range *this has the second half, the old range r has the first half. Unspecified if <a class="el" href="a00147.html#8b929d93ddc13f148b11bceef3a3bdf8">end()</a><<a class="el" href="a00147.html#18d2258400756ac1446dac7676b18df3">begin()</a> or !is_divisible().
+</div>
+</div><p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="41a58b703d574b6e1ca155df3576f578"></a><!-- doxytag: member="tbb::blocked_range::is_divisible" ref="41a58b703d574b6e1ca155df3576f578" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Value> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="a00147.html">tbb::blocked_range</a>< Value >::is_divisible </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"> const<code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+True if range is divisible.
+<p>
+Unspecified if <a class="el" href="a00147.html#8b929d93ddc13f148b11bceef3a3bdf8">end()</a><<a class="el" href="a00147.html#18d2258400756ac1446dac7676b18df3">begin()</a>.
+</div>
+</div><p>
+<a class="anchor" name="9eaa0b6beff1420f688570bbf6b8c462"></a><!-- doxytag: member="tbb::blocked_range::size" ref="9eaa0b6beff1420f688570bbf6b8c462" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Value> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="a00147.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> <a class="el" href="a00147.html">tbb::blocked_range</a>< Value >::size </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"> const<code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Size of the range.
<p>
+Unspecified if <a class="el" href="a00147.html#8b929d93ddc13f148b11bceef3a3bdf8">end()</a><<a class="el" href="a00147.html#18d2258400756ac1446dac7676b18df3">begin()</a>.
+</div>
+</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00453.html">tbb_exception.h</a></ul>
+<li><a class="el" href="a00320.html">blocked_range.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00148.html b/doc/html/a00148.html
index c2baa07..2baf543 100644
--- a/doc/html/a00148.html
+++ b/doc/html/a00148.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::blocked_range< Value > Class Template Reference</title>
+<title>tbb::blocked_range2d< RowValue, ColValue > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,198 +21,60 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00148.html">blocked_range</a></div>
-<h1>tbb::blocked_range< Value > Class Template Reference<br>
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00148.html">blocked_range2d</a></div>
+<h1>tbb::blocked_range2d< RowValue, ColValue > Class Template Reference<br>
<small>
-[<a class="el" href="a00274.html">Algorithms</a>]</small>
-</h1><!-- doxytag: class="tbb::blocked_range" -->A range over which to iterate.
+[<a class="el" href="a00275.html">Algorithms</a>]</small>
+</h1><!-- doxytag: class="tbb::blocked_range2d" -->A 2-dimensional range that models the Range concept.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00319.html">blocked_range.h</a>></code>
+<code>#include <<a class="el" href="a00321.html">blocked_range2d.h</a>></code>
<p>
-<a href="a00004.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00005.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">typedef Value </td><td class="memItemRight" valign="bottom"><a class="el" href="a00148.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a807a22fe658ec38b8edfd69521d0383"></a><!-- doxytag: member="tbb::blocked_range2d::row_range_type" ref="a807a22fe658ec38b8edfd69521d0383" args="" -->
+typedef <a class="el" href="a00147.html">blocked_range</a>< RowValue > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00148.html#a807a22fe658ec38b8edfd69521d0383">row_range_type</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Type of a value. <a href="#1a8d05842c2b3dfc177bc4d347e4cef7"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f5707bffea38eee5c9680f37358afb8e"></a><!-- doxytag: member="tbb::blocked_range::size_type" ref="f5707bffea38eee5c9680f37358afb8e" args="" -->
-typedef std::size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00148.html#f5707bffea38eee5c9680f37358afb8e">size_type</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Type for size of an iteation range. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="750d5c6ac9915443df477a30031c07fd"></a><!-- doxytag: member="tbb::blocked_range2d::col_range_type" ref="750d5c6ac9915443df477a30031c07fd" args="" -->
+typedef <a class="el" href="a00147.html">blocked_range</a>< ColValue > </td><td class="memItemRight" valign="bottom"><b>col_range_type</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Type for size of a range. <br></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00148.html#94607755c5110d199202234d58d022ac">blocked_range</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4180bc35d4f8ed9f20045dba4f2a1bdc"></a><!-- doxytag: member="tbb::blocked_range2d::blocked_range2d" ref="4180bc35d4f8ed9f20045dba4f2a1bdc" args="(RowValue row_begin, RowValue row_end, typename row_range_type::size_type row_grainsize, ColValue col_begin, ColValue col_end, typename col_range_type::size_type col_grainsize)" -->
+ </td><td class="memItemRight" valign="bottom"><b>blocked_range2d</b> (RowValue row_begin, RowValue row_end, typename <a class="el" href="a00147.html#f5707bffea38eee5c9680f37358afb8e">row_range_type::size_type</a> row_grainsize, ColValue col_begin, ColValue col_end, typename <a class="el" href="a00147.html#f5707bffea38eee5c9680f37358afb8e">col_range_type::size_type</a> col_grainsize)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct range with default-constructed values for begin and end. <a href="#94607755c5110d199202234d58d022ac"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="14795a36ead1414b4371dbe1a4656359"></a><!-- doxytag: member="tbb::blocked_range::blocked_range" ref="14795a36ead1414b4371dbe1a4656359" args="(Value begin_, Value end_, size_type grainsize_=1)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00148.html#14795a36ead1414b4371dbe1a4656359">blocked_range</a> (Value begin_, Value end_, <a class="el" href="a00148.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> grainsize_=1)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="485434db1609b2074d86cb604f3c674e"></a><!-- doxytag: member="tbb::blocked_range2d::blocked_range2d" ref="485434db1609b2074d86cb604f3c674e" args="(RowValue row_begin, RowValue row_end, ColValue col_begin, ColValue col_end)" -->
+ </td><td class="memItemRight" valign="bottom"><b>blocked_range2d</b> (RowValue row_begin, RowValue row_end, ColValue col_begin, ColValue col_end)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct range over half-open interval [begin,end), with the given grainsize. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="18d2258400756ac1446dac7676b18df3"></a><!-- doxytag: member="tbb::blocked_range::begin" ref="18d2258400756ac1446dac7676b18df3" args="() const " -->
-<a class="el" href="a00148.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00148.html#18d2258400756ac1446dac7676b18df3">begin</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Beginning of range. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8b929d93ddc13f148b11bceef3a3bdf8"></a><!-- doxytag: member="tbb::blocked_range::end" ref="8b929d93ddc13f148b11bceef3a3bdf8" args="() const " -->
-<a class="el" href="a00148.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00148.html#8b929d93ddc13f148b11bceef3a3bdf8">end</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">One past last value in range. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00148.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00148.html#9eaa0b6beff1420f688570bbf6b8c462">size</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Size of the range. <a href="#9eaa0b6beff1420f688570bbf6b8c462"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fcd2e5b8b6c11fd3f20fc0aa9f11bbc2"></a><!-- doxytag: member="tbb::blocked_range::grainsize" ref="fcd2e5b8b6c11fd3f20fc0aa9f11bbc2" args="() const " -->
-<a class="el" href="a00148.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00148.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The grain size for this range. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8f4f02f530eb3f2e7ea26e06f76aef9d"></a><!-- doxytag: member="tbb::blocked_range::empty" ref="8f4f02f530eb3f2e7ea26e06f76aef9d" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00148.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d144cb2d88cef553420311aca8667a44"></a><!-- doxytag: member="tbb::blocked_range2d::empty" ref="d144cb2d88cef553420311aca8667a44" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00148.html#d144cb2d88cef553420311aca8667a44">empty</a> () const </td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">True if range is empty. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00148.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ad36a9b38e4fef26d376f99552ce2d92"></a><!-- doxytag: member="tbb::blocked_range2d::is_divisible" ref="ad36a9b38e4fef26d376f99552ce2d92" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00148.html#ad36a9b38e4fef26d376f99552ce2d92">is_divisible</a> () const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">True if range is divisible. <a href="#41a58b703d574b6e1ca155df3576f578"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00148.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">blocked_range</a> (<a class="el" href="a00148.html">blocked_range</a> &r, <a class="el" href="a00198.html">split</a>)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">True if range is divisible into two pieces. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4f80e6db02bfa4e90e2a219de9f17461"></a><!-- doxytag: member="tbb::blocked_range2d::blocked_range2d" ref="4f80e6db02bfa4e90e2a219de9f17461" args="(blocked_range2d &r, split)" -->
+ </td><td class="memItemRight" valign="bottom"><b>blocked_range2d</b> (<a class="el" href="a00148.html">blocked_range2d</a> &r, <a class="el" href="a00198.html">split</a>)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Split range. <a href="#4c0efd2be3f96a0ab3ba5085e8b3fcc7"></a><br></td></tr>
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="395a514a55017e36d571809f1223389b"></a><!-- doxytag: member="tbb::blocked_range::blocked_range2d" ref="395a514a55017e36d571809f1223389b" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>blocked_range2d</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f496e7348a82652fba581203477cc07c"></a><!-- doxytag: member="tbb::blocked_range2d::rows" ref="f496e7348a82652fba581203477cc07c" args="() const " -->
+const <a class="el" href="a00147.html">row_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00148.html#f496e7348a82652fba581203477cc07c">rows</a> () const </td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="13d172a4da9be197033e64516fff1f4b"></a><!-- doxytag: member="tbb::blocked_range::blocked_range3d" ref="13d172a4da9be197033e64516fff1f4b" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>blocked_range3d</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The rows of the iteration space. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="392a46759af2c884957115771affa7f4"></a><!-- doxytag: member="tbb::blocked_range2d::cols" ref="392a46759af2c884957115771affa7f4" args="() const " -->
+const <a class="el" href="a00147.html">col_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00148.html#392a46759af2c884957115771affa7f4">cols</a> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The columns of the iteration space. <br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename Value><br>
- class tbb::blocked_range< Value ></h3>
-
-A range over which to iterate.
-<p>
-<hr><h2>Member Typedef Documentation</h2>
-<a class="anchor" name="1a8d05842c2b3dfc177bc4d347e4cef7"></a><!-- doxytag: member="tbb::blocked_range::const_iterator" ref="1a8d05842c2b3dfc177bc4d347e4cef7" args="" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Value> </div>
- <table class="memname">
- <tr>
- <td class="memname">typedef Value <a class="el" href="a00148.html">tbb::blocked_range</a>< Value >::<a class="el" href="a00148.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
+<h3>template<typename RowValue, typename ColValue = RowValue><br>
+ class tbb::blocked_range2d< RowValue, ColValue ></h3>
+A 2-dimensional range that models the Range concept.
<p>
-Type of a value.
-<p>
-Called a const_iterator for sake of algorithms that need to treat a <a class="el" href="a00148.html">blocked_range</a> as an STL container.
-</div>
-</div><p>
-<hr><h2>Constructor & Destructor Documentation</h2>
-<a class="anchor" name="94607755c5110d199202234d58d022ac"></a><!-- doxytag: member="tbb::blocked_range::blocked_range" ref="94607755c5110d199202234d58d022ac" args="()" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Value> </div>
- <table class="memname">
- <tr>
- <td class="memname"><a class="el" href="a00148.html">tbb::blocked_range</a>< Value >::<a class="el" href="a00148.html">blocked_range</a> </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Construct range with default-constructed values for begin and end.
-<p>
-Requires that Value have a default constructor.
-</div>
-</div><p>
-<a class="anchor" name="4c0efd2be3f96a0ab3ba5085e8b3fcc7"></a><!-- doxytag: member="tbb::blocked_range::blocked_range" ref="4c0efd2be3f96a0ab3ba5085e8b3fcc7" args="(blocked_range &r, split)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Value> </div>
- <table class="memname">
- <tr>
- <td class="memname"><a class="el" href="a00148.html">tbb::blocked_range</a>< Value >::<a class="el" href="a00148.html">blocked_range</a> </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00148.html">blocked_range</a>< Value > & </td>
- <td class="paramname"> <em>r</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="a00198.html">split</a> </td>
- <td class="paramname"></td><td> </td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Split range.
-<p>
-The new Range *this has the second half, the old range r has the first half. Unspecified if <a class="el" href="a00148.html#8b929d93ddc13f148b11bceef3a3bdf8">end()</a><<a class="el" href="a00148.html#18d2258400756ac1446dac7676b18df3">begin()</a> or !is_divisible().
-</div>
-</div><p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="41a58b703d574b6e1ca155df3576f578"></a><!-- doxytag: member="tbb::blocked_range::is_divisible" ref="41a58b703d574b6e1ca155df3576f578" args="() const " -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Value> </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="a00148.html">tbb::blocked_range</a>< Value >::is_divisible </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"> const<code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-True if range is divisible.
-<p>
-Unspecified if <a class="el" href="a00148.html#8b929d93ddc13f148b11bceef3a3bdf8">end()</a><<a class="el" href="a00148.html#18d2258400756ac1446dac7676b18df3">begin()</a>.
-</div>
-</div><p>
-<a class="anchor" name="9eaa0b6beff1420f688570bbf6b8c462"></a><!-- doxytag: member="tbb::blocked_range::size" ref="9eaa0b6beff1420f688570bbf6b8c462" args="() const " -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Value> </div>
- <table class="memname">
- <tr>
- <td class="memname"><a class="el" href="a00148.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> <a class="el" href="a00148.html">tbb::blocked_range</a>< Value >::size </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"> const<code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Size of the range.
-<p>
-Unspecified if <a class="el" href="a00148.html#8b929d93ddc13f148b11bceef3a3bdf8">end()</a><<a class="el" href="a00148.html#18d2258400756ac1446dac7676b18df3">begin()</a>.
-</div>
-</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00319.html">blocked_range.h</a></ul>
+<li><a class="el" href="a00321.html">blocked_range2d.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00149.html b/doc/html/a00149.html
index e1bfa81..e0cdf24 100644
--- a/doc/html/a00149.html
+++ b/doc/html/a00149.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::blocked_range2d< RowValue, ColValue > Class Template Reference</title>
+<title>tbb::blocked_range3d< PageValue, RowValue, ColValue > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,60 +21,67 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00149.html">blocked_range2d</a></div>
-<h1>tbb::blocked_range2d< RowValue, ColValue > Class Template Reference<br>
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00149.html">blocked_range3d</a></div>
+<h1>tbb::blocked_range3d< PageValue, RowValue, ColValue > Class Template Reference<br>
<small>
-[<a class="el" href="a00274.html">Algorithms</a>]</small>
-</h1><!-- doxytag: class="tbb::blocked_range2d" -->A 2-dimensional range that models the Range concept.
+[<a class="el" href="a00275.html">Algorithms</a>]</small>
+</h1><!-- doxytag: class="tbb::blocked_range3d" -->A 3-dimensional range that models the Range concept.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00320.html">blocked_range2d.h</a>></code>
+<code>#include <<a class="el" href="a00322.html">blocked_range3d.h</a>></code>
<p>
-<a href="a00005.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00006.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a807a22fe658ec38b8edfd69521d0383"></a><!-- doxytag: member="tbb::blocked_range2d::row_range_type" ref="a807a22fe658ec38b8edfd69521d0383" args="" -->
-typedef <a class="el" href="a00148.html">blocked_range</a>< RowValue > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00149.html#a807a22fe658ec38b8edfd69521d0383">row_range_type</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b8ebf17a552ba47825e9b3887855b719"></a><!-- doxytag: member="tbb::blocked_range3d::page_range_type" ref="b8ebf17a552ba47825e9b3887855b719" args="" -->
+typedef <a class="el" href="a00147.html">blocked_range</a>< PageValue > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00149.html#b8ebf17a552ba47825e9b3887855b719">page_range_type</a></td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Type for size of an iteation range. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="750d5c6ac9915443df477a30031c07fd"></a><!-- doxytag: member="tbb::blocked_range2d::col_range_type" ref="750d5c6ac9915443df477a30031c07fd" args="" -->
-typedef <a class="el" href="a00148.html">blocked_range</a>< ColValue > </td><td class="memItemRight" valign="bottom"><b>col_range_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4edc39b1a76c84c8f43ea8bff3e88007"></a><!-- doxytag: member="tbb::blocked_range3d::row_range_type" ref="4edc39b1a76c84c8f43ea8bff3e88007" args="" -->
+typedef <a class="el" href="a00147.html">blocked_range</a>< RowValue > </td><td class="memItemRight" valign="bottom"><b>row_range_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="02229b59d4dc5437bf5fbe72acca7f66"></a><!-- doxytag: member="tbb::blocked_range3d::col_range_type" ref="02229b59d4dc5437bf5fbe72acca7f66" args="" -->
+typedef <a class="el" href="a00147.html">blocked_range</a>< ColValue > </td><td class="memItemRight" valign="bottom"><b>col_range_type</b></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4180bc35d4f8ed9f20045dba4f2a1bdc"></a><!-- doxytag: member="tbb::blocked_range2d::blocked_range2d" ref="4180bc35d4f8ed9f20045dba4f2a1bdc" args="(RowValue row_begin, RowValue row_end, typename row_range_type::size_type row_grainsize, ColValue col_begin, ColValue col_end, typename col_range_type::size_type col_grainsize)" -->
- </td><td class="memItemRight" valign="bottom"><b>blocked_range2d</b> (RowValue row_begin, RowValue row_end, typename <a class="el" href="a00148.html#f5707bffea38eee5c9680f37358afb8e">row_range_type::size_type</a> row_grainsize, ColValue col_begin, ColValue col_end, typename <a class="el" href="a00148.html#f5707bffea38eee5c9680f37358afb8e">col_range_type::size_type</a> col_grainsize)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a762f420ed83a887967cb7dfe337582c"></a><!-- doxytag: member="tbb::blocked_range3d::blocked_range3d" ref="a762f420ed83a887967cb7dfe337582c" args="(PageValue page_begin, PageValue page_end, RowValue row_begin, RowValue row_end, ColValue col_begin, ColValue col_end)" -->
+ </td><td class="memItemRight" valign="bottom"><b>blocked_range3d</b> (PageValue page_begin, PageValue page_end, RowValue row_begin, RowValue row_end, ColValue col_begin, ColValue col_end)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="485434db1609b2074d86cb604f3c674e"></a><!-- doxytag: member="tbb::blocked_range2d::blocked_range2d" ref="485434db1609b2074d86cb604f3c674e" args="(RowValue row_begin, RowValue row_end, ColValue col_begin, ColValue col_end)" -->
- </td><td class="memItemRight" valign="bottom"><b>blocked_range2d</b> (RowValue row_begin, RowValue row_end, ColValue col_begin, ColValue col_end)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0b4dcf5b059634b95c1671086bf6d4ff"></a><!-- doxytag: member="tbb::blocked_range3d::blocked_range3d" ref="0b4dcf5b059634b95c1671086bf6d4ff" args="(PageValue page_begin, PageValue page_end, typename page_range_type::size_type page_grainsize, RowValue row_begin, RowValue row_end, typename row_range_type::size_type row_grainsize, ColValue col_begin, ColValue col_end, typename col_range_type::size_type col_gr [...]
+ </td><td class="memItemRight" valign="bottom"><b>blocked_range3d</b> (PageValue page_begin, PageValue page_end, typename <a class="el" href="a00147.html#f5707bffea38eee5c9680f37358afb8e">page_range_type::size_type</a> page_grainsize, RowValue row_begin, RowValue row_end, typename <a class="el" href="a00147.html#f5707bffea38eee5c9680f37358afb8e">row_range_type::size_type</a> row_grainsize, ColValue col_begin, ColValue col_end, typename <a class="el" href="a00147.html#f5707bffea38eee [...]
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d144cb2d88cef553420311aca8667a44"></a><!-- doxytag: member="tbb::blocked_range2d::empty" ref="d144cb2d88cef553420311aca8667a44" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00149.html#d144cb2d88cef553420311aca8667a44">empty</a> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="356860e1c977d91711e8216bd55c0b25"></a><!-- doxytag: member="tbb::blocked_range3d::empty" ref="356860e1c977d91711e8216bd55c0b25" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00149.html#356860e1c977d91711e8216bd55c0b25">empty</a> () const </td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">True if range is empty. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ad36a9b38e4fef26d376f99552ce2d92"></a><!-- doxytag: member="tbb::blocked_range2d::is_divisible" ref="ad36a9b38e4fef26d376f99552ce2d92" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00149.html#ad36a9b38e4fef26d376f99552ce2d92">is_divisible</a> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="39d69191721c488e737ae5d9c5336b9c"></a><!-- doxytag: member="tbb::blocked_range3d::is_divisible" ref="39d69191721c488e737ae5d9c5336b9c" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00149.html#39d69191721c488e737ae5d9c5336b9c">is_divisible</a> () const </td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">True if range is divisible into two pieces. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4f80e6db02bfa4e90e2a219de9f17461"></a><!-- doxytag: member="tbb::blocked_range2d::blocked_range2d" ref="4f80e6db02bfa4e90e2a219de9f17461" args="(blocked_range2d &r, split)" -->
- </td><td class="memItemRight" valign="bottom"><b>blocked_range2d</b> (<a class="el" href="a00149.html">blocked_range2d</a> &r, <a class="el" href="a00198.html">split</a>)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a0d6f0085c9fb364ddcbc2197da6c251"></a><!-- doxytag: member="tbb::blocked_range3d::blocked_range3d" ref="a0d6f0085c9fb364ddcbc2197da6c251" args="(blocked_range3d &r, split)" -->
+ </td><td class="memItemRight" valign="bottom"><b>blocked_range3d</b> (<a class="el" href="a00149.html">blocked_range3d</a> &r, <a class="el" href="a00198.html">split</a>)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cf971430aa12361d3ed245344b7c6764"></a><!-- doxytag: member="tbb::blocked_range3d::pages" ref="cf971430aa12361d3ed245344b7c6764" args="() const " -->
+const <a class="el" href="a00147.html">page_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00149.html#cf971430aa12361d3ed245344b7c6764">pages</a> () const </td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f496e7348a82652fba581203477cc07c"></a><!-- doxytag: member="tbb::blocked_range2d::rows" ref="f496e7348a82652fba581203477cc07c" args="() const " -->
-const <a class="el" href="a00148.html">row_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00149.html#f496e7348a82652fba581203477cc07c">rows</a> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The pages of the iteration space. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1584623e59ff32a8aa82006827508be4"></a><!-- doxytag: member="tbb::blocked_range3d::rows" ref="1584623e59ff32a8aa82006827508be4" args="() const " -->
+const <a class="el" href="a00147.html">row_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00149.html#1584623e59ff32a8aa82006827508be4">rows</a> () const </td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">The rows of the iteration space. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="392a46759af2c884957115771affa7f4"></a><!-- doxytag: member="tbb::blocked_range2d::cols" ref="392a46759af2c884957115771affa7f4" args="() const " -->
-const <a class="el" href="a00148.html">col_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00149.html#392a46759af2c884957115771affa7f4">cols</a> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3336ba9480fd6c43e158f9beb024c050"></a><!-- doxytag: member="tbb::blocked_range3d::cols" ref="3336ba9480fd6c43e158f9beb024c050" args="() const " -->
+const <a class="el" href="a00147.html">col_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00149.html#3336ba9480fd6c43e158f9beb024c050">cols</a> () const </td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">The columns of the iteration space. <br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename RowValue, typename ColValue = RowValue><br>
- class tbb::blocked_range2d< RowValue, ColValue ></h3>
+<h3>template<typename PageValue, typename RowValue = PageValue, typename ColValue = RowValue><br>
+ class tbb::blocked_range3d< PageValue, RowValue, ColValue ></h3>
-A 2-dimensional range that models the Range concept.
+A 3-dimensional range that models the Range concept.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00320.html">blocked_range2d.h</a></ul>
+<li><a class="el" href="a00322.html">blocked_range3d.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00150.html b/doc/html/a00150.html
index e2f0df2..15f547d 100644
--- a/doc/html/a00150.html
+++ b/doc/html/a00150.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::blocked_range3d< PageValue, RowValue, ColValue > Class Template Reference</title>
+<title>tbb::cache_aligned_allocator< T > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,67 +21,88 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00150.html">blocked_range3d</a></div>
-<h1>tbb::blocked_range3d< PageValue, RowValue, ColValue > Class Template Reference<br>
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00150.html">cache_aligned_allocator</a></div>
+<h1>tbb::cache_aligned_allocator< T > Class Template Reference<br>
<small>
-[<a class="el" href="a00274.html">Algorithms</a>]</small>
-</h1><!-- doxytag: class="tbb::blocked_range3d" -->A 3-dimensional range that models the Range concept.
+[<a class="el" href="a00277.html">Memory Allocation</a>]</small>
+</h1><!-- doxytag: class="tbb::cache_aligned_allocator" -->Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00321.html">blocked_range3d.h</a>></code>
+<code>#include <<a class="el" href="a00323.html">cache_aligned_allocator.h</a>></code>
<p>
-<a href="a00006.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00007.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b8ebf17a552ba47825e9b3887855b719"></a><!-- doxytag: member="tbb::blocked_range3d::page_range_type" ref="b8ebf17a552ba47825e9b3887855b719" args="" -->
-typedef <a class="el" href="a00148.html">blocked_range</a>< PageValue > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00150.html#b8ebf17a552ba47825e9b3887855b719">page_range_type</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8f7128452e3c43b5bf1801b61d971d17"></a><!-- doxytag: member="tbb::cache_aligned_allocator::value_type" ref="8f7128452e3c43b5bf1801b61d971d17" args="" -->
+typedef internal::allocator_type<<br>
+ T >::value_type </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Type for size of an iteation range. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4edc39b1a76c84c8f43ea8bff3e88007"></a><!-- doxytag: member="tbb::blocked_range3d::row_range_type" ref="4edc39b1a76c84c8f43ea8bff3e88007" args="" -->
-typedef <a class="el" href="a00148.html">blocked_range</a>< RowValue > </td><td class="memItemRight" valign="bottom"><b>row_range_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b23ef1d76c34fe1c2ebbb2f3df5b5676"></a><!-- doxytag: member="tbb::cache_aligned_allocator::pointer" ref="b23ef1d76c34fe1c2ebbb2f3df5b5676" args="" -->
+typedef value_type * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="02229b59d4dc5437bf5fbe72acca7f66"></a><!-- doxytag: member="tbb::blocked_range3d::col_range_type" ref="02229b59d4dc5437bf5fbe72acca7f66" args="" -->
-typedef <a class="el" href="a00148.html">blocked_range</a>< ColValue > </td><td class="memItemRight" valign="bottom"><b>col_range_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d15affd67eafcabbd12bd1cd07372994"></a><!-- doxytag: member="tbb::cache_aligned_allocator::const_pointer" ref="d15affd67eafcabbd12bd1cd07372994" args="" -->
+typedef const value_type * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e8c4e0d5867a07b1cea21d4fca2998c8"></a><!-- doxytag: member="tbb::cache_aligned_allocator::reference" ref="e8c4e0d5867a07b1cea21d4fca2998c8" args="" -->
+typedef value_type & </td><td class="memItemRight" valign="bottom"><b>reference</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d3d77a39f0852c42f80c6505843f450c"></a><!-- doxytag: member="tbb::cache_aligned_allocator::const_reference" ref="d3d77a39f0852c42f80c6505843f450c" args="" -->
+typedef const value_type & </td><td class="memItemRight" valign="bottom"><b>const_reference</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="90ca6a2979ebee466be771f4c2f9337e"></a><!-- doxytag: member="tbb::cache_aligned_allocator::size_type" ref="90ca6a2979ebee466be771f4c2f9337e" args="" -->
+typedef size_t </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b73eba293d042333f343d025c26751a4"></a><!-- doxytag: member="tbb::cache_aligned_allocator::difference_type" ref="b73eba293d042333f343d025c26751a4" args="" -->
+typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><b>difference_type</b></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a762f420ed83a887967cb7dfe337582c"></a><!-- doxytag: member="tbb::blocked_range3d::blocked_range3d" ref="a762f420ed83a887967cb7dfe337582c" args="(PageValue page_begin, PageValue page_end, RowValue row_begin, RowValue row_end, ColValue col_begin, ColValue col_end)" -->
- </td><td class="memItemRight" valign="bottom"><b>blocked_range3d</b> (PageValue page_begin, PageValue page_end, RowValue row_begin, RowValue row_end, ColValue col_begin, ColValue col_end)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="74ccd00a29171ddd61a4ea88cfa49c32"></a><!-- doxytag: member="tbb::cache_aligned_allocator::cache_aligned_allocator" ref="74ccd00a29171ddd61a4ea88cfa49c32" args="(const cache_aligned_allocator &)" -->
+ </td><td class="memItemRight" valign="bottom"><b>cache_aligned_allocator</b> (const <a class="el" href="a00150.html">cache_aligned_allocator</a> &) throw ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0b4dcf5b059634b95c1671086bf6d4ff"></a><!-- doxytag: member="tbb::blocked_range3d::blocked_range3d" ref="0b4dcf5b059634b95c1671086bf6d4ff" args="(PageValue page_begin, PageValue page_end, typename page_range_type::size_type page_grainsize, RowValue row_begin, RowValue row_end, typename row_range_type::size_type row_grainsize, ColValue col_begin, ColValue col_end, typename col_range_type::size_type col_gr [...]
- </td><td class="memItemRight" valign="bottom"><b>blocked_range3d</b> (PageValue page_begin, PageValue page_end, typename <a class="el" href="a00148.html#f5707bffea38eee5c9680f37358afb8e">page_range_type::size_type</a> page_grainsize, RowValue row_begin, RowValue row_end, typename <a class="el" href="a00148.html#f5707bffea38eee5c9680f37358afb8e">row_range_type::size_type</a> row_grainsize, ColValue col_begin, ColValue col_end, typename <a class="el" href="a00148.html#f5707bffea38eee [...]
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="de57e731c36a51bf39b458c9b8adee58"></a><!-- doxytag: member="tbb::cache_aligned_allocator::cache_aligned_allocator" ref="de57e731c36a51bf39b458c9b8adee58" args="(const cache_aligned_allocator< U > &)" -->
+template<typename U> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>cache_aligned_allocator</b> (const <a class="el" href="a00150.html">cache_aligned_allocator</a>< U > &) throw ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="356860e1c977d91711e8216bd55c0b25"></a><!-- doxytag: member="tbb::blocked_range3d::empty" ref="356860e1c977d91711e8216bd55c0b25" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00150.html#356860e1c977d91711e8216bd55c0b25">empty</a> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="023e0cc7cf6ebde69e1f2c12182eb12b"></a><!-- doxytag: member="tbb::cache_aligned_allocator::address" ref="023e0cc7cf6ebde69e1f2c12182eb12b" args="(reference x) const " -->
+pointer </td><td class="memItemRight" valign="bottom"><b>address</b> (reference x) const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">True if range is empty. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="39d69191721c488e737ae5d9c5336b9c"></a><!-- doxytag: member="tbb::blocked_range3d::is_divisible" ref="39d69191721c488e737ae5d9c5336b9c" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00150.html#39d69191721c488e737ae5d9c5336b9c">is_divisible</a> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="db4f7613b1de12d1e79285c15636cf3b"></a><!-- doxytag: member="tbb::cache_aligned_allocator::address" ref="db4f7613b1de12d1e79285c15636cf3b" args="(const_reference x) const " -->
+const_pointer </td><td class="memItemRight" valign="bottom"><b>address</b> (const_reference x) const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">True if range is divisible into two pieces. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a0d6f0085c9fb364ddcbc2197da6c251"></a><!-- doxytag: member="tbb::blocked_range3d::blocked_range3d" ref="a0d6f0085c9fb364ddcbc2197da6c251" args="(blocked_range3d &r, split)" -->
- </td><td class="memItemRight" valign="bottom"><b>blocked_range3d</b> (<a class="el" href="a00150.html">blocked_range3d</a> &r, <a class="el" href="a00198.html">split</a>)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4cdeea67af6c1fcd8f1d5e9c4cab61e8"></a><!-- doxytag: member="tbb::cache_aligned_allocator::allocate" ref="4cdeea67af6c1fcd8f1d5e9c4cab61e8" args="(size_type n, const void *hint=0)" -->
+pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="a00150.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">allocate</a> (size_type n, const void *hint=0)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cf971430aa12361d3ed245344b7c6764"></a><!-- doxytag: member="tbb::blocked_range3d::pages" ref="cf971430aa12361d3ed245344b7c6764" args="() const " -->
-const <a class="el" href="a00148.html">page_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00150.html#cf971430aa12361d3ed245344b7c6764">pages</a> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Allocate space for n objects, starting on a cache/sector line. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3d4eadf188f7d85d3805ae534e0b8e1c"></a><!-- doxytag: member="tbb::cache_aligned_allocator::deallocate" ref="3d4eadf188f7d85d3805ae534e0b8e1c" args="(pointer p, size_type)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00150.html#3d4eadf188f7d85d3805ae534e0b8e1c">deallocate</a> (pointer p, size_type)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The pages of the iteration space. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1584623e59ff32a8aa82006827508be4"></a><!-- doxytag: member="tbb::blocked_range3d::rows" ref="1584623e59ff32a8aa82006827508be4" args="() const " -->
-const <a class="el" href="a00148.html">row_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00150.html#1584623e59ff32a8aa82006827508be4">rows</a> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Free block of memory that starts on a cache line. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fb23b687b4c0429dab4c7f8017266cf0"></a><!-- doxytag: member="tbb::cache_aligned_allocator::max_size" ref="fb23b687b4c0429dab4c7f8017266cf0" args="() const " -->
+size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00150.html#fb23b687b4c0429dab4c7f8017266cf0">max_size</a> () const throw ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The rows of the iteration space. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3336ba9480fd6c43e158f9beb024c050"></a><!-- doxytag: member="tbb::blocked_range3d::cols" ref="3336ba9480fd6c43e158f9beb024c050" args="() const " -->
-const <a class="el" href="a00148.html">col_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00150.html#3336ba9480fd6c43e158f9beb024c050">cols</a> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Largest value for which method allocate might succeed. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="958ee8745c86c275bfc9533af565e017"></a><!-- doxytag: member="tbb::cache_aligned_allocator::construct" ref="958ee8745c86c275bfc9533af565e017" args="(pointer p, const value_type &value)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00150.html#958ee8745c86c275bfc9533af565e017">construct</a> (pointer p, const value_type &value)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy-construct value at location pointed to by p. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cd298895a4f1654b5149ec84b591ecb5"></a><!-- doxytag: member="tbb::cache_aligned_allocator::destroy" ref="cd298895a4f1654b5149ec84b591ecb5" args="(pointer p)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00150.html#cd298895a4f1654b5149ec84b591ecb5">destroy</a> (pointer p)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy value at location pointed to by p. <br></td></tr>
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><b>rebind</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The columns of the iteration space. <br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename PageValue, typename RowValue = PageValue, typename ColValue = RowValue><br>
- class tbb::blocked_range3d< PageValue, RowValue, ColValue ></h3>
+<h3>template<typename T><br>
+ class tbb::cache_aligned_allocator< T ></h3>
-A 3-dimensional range that models the Range concept.
+Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.
+<p>
+The members are ordered the same way they are in section 20.4.1 of the ISO C++ standard.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00321.html">blocked_range3d.h</a></ul>
+<li><a class="el" href="a00323.html">cache_aligned_allocator.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00151.html b/doc/html/a00151.html
index f72039d..c670332 100644
--- a/doc/html/a00151.html
+++ b/doc/html/a00151.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::cache_aligned_allocator< T > Class Template Reference</title>
+<title>tbb::cache_aligned_allocator< void > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,88 +21,39 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00151.html">cache_aligned_allocator</a></div>
-<h1>tbb::cache_aligned_allocator< T > Class Template Reference<br>
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00151.html">cache_aligned_allocator< void ></a></div>
+<h1>tbb::cache_aligned_allocator< void > Class Template Reference<br>
<small>
-[<a class="el" href="a00276.html">Memory Allocation</a>]</small>
-</h1><!-- doxytag: class="tbb::cache_aligned_allocator" -->Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.
+[<a class="el" href="a00277.html">Memory Allocation</a>]</small>
+</h1><!-- doxytag: class="tbb::cache_aligned_allocator< void >" -->Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00322.html">cache_aligned_allocator.h</a>></code>
+<code>#include <<a class="el" href="a00323.html">cache_aligned_allocator.h</a>></code>
<p>
-<a href="a00007.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00009.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8f7128452e3c43b5bf1801b61d971d17"></a><!-- doxytag: member="tbb::cache_aligned_allocator::value_type" ref="8f7128452e3c43b5bf1801b61d971d17" args="" -->
-typedef internal::allocator_type<<br>
- T >::value_type </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ce89776145998f0685a767b4f195272d"></a><!-- doxytag: member="tbb::cache_aligned_allocator< void >::pointer" ref="ce89776145998f0685a767b4f195272d" args="" -->
+typedef void * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b23ef1d76c34fe1c2ebbb2f3df5b5676"></a><!-- doxytag: member="tbb::cache_aligned_allocator::pointer" ref="b23ef1d76c34fe1c2ebbb2f3df5b5676" args="" -->
-typedef value_type * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4431fbbe1a8cfeb19c48ad0072078f45"></a><!-- doxytag: member="tbb::cache_aligned_allocator< void >::const_pointer" ref="4431fbbe1a8cfeb19c48ad0072078f45" args="" -->
+typedef const void * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d15affd67eafcabbd12bd1cd07372994"></a><!-- doxytag: member="tbb::cache_aligned_allocator::const_pointer" ref="d15affd67eafcabbd12bd1cd07372994" args="" -->
-typedef const value_type * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2ab296f4ecdd75f8e193ff92004a697d"></a><!-- doxytag: member="tbb::cache_aligned_allocator< void >::value_type" ref="2ab296f4ecdd75f8e193ff92004a697d" args="" -->
+typedef void </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e8c4e0d5867a07b1cea21d4fca2998c8"></a><!-- doxytag: member="tbb::cache_aligned_allocator::reference" ref="e8c4e0d5867a07b1cea21d4fca2998c8" args="" -->
-typedef value_type & </td><td class="memItemRight" valign="bottom"><b>reference</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d3d77a39f0852c42f80c6505843f450c"></a><!-- doxytag: member="tbb::cache_aligned_allocator::const_reference" ref="d3d77a39f0852c42f80c6505843f450c" args="" -->
-typedef const value_type & </td><td class="memItemRight" valign="bottom"><b>const_reference</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="90ca6a2979ebee466be771f4c2f9337e"></a><!-- doxytag: member="tbb::cache_aligned_allocator::size_type" ref="90ca6a2979ebee466be771f4c2f9337e" args="" -->
-typedef size_t </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b73eba293d042333f343d025c26751a4"></a><!-- doxytag: member="tbb::cache_aligned_allocator::difference_type" ref="b73eba293d042333f343d025c26751a4" args="" -->
-typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><b>difference_type</b></td></tr>
-
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="74ccd00a29171ddd61a4ea88cfa49c32"></a><!-- doxytag: member="tbb::cache_aligned_allocator::cache_aligned_allocator" ref="74ccd00a29171ddd61a4ea88cfa49c32" args="(const cache_aligned_allocator &)" -->
- </td><td class="memItemRight" valign="bottom"><b>cache_aligned_allocator</b> (const <a class="el" href="a00151.html">cache_aligned_allocator</a> &) throw ()</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="de57e731c36a51bf39b458c9b8adee58"></a><!-- doxytag: member="tbb::cache_aligned_allocator::cache_aligned_allocator" ref="de57e731c36a51bf39b458c9b8adee58" args="(const cache_aligned_allocator< U > &)" -->
-template<typename U> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>cache_aligned_allocator</b> (const <a class="el" href="a00151.html">cache_aligned_allocator</a>< U > &) throw ()</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="023e0cc7cf6ebde69e1f2c12182eb12b"></a><!-- doxytag: member="tbb::cache_aligned_allocator::address" ref="023e0cc7cf6ebde69e1f2c12182eb12b" args="(reference x) const " -->
-pointer </td><td class="memItemRight" valign="bottom"><b>address</b> (reference x) const </td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="db4f7613b1de12d1e79285c15636cf3b"></a><!-- doxytag: member="tbb::cache_aligned_allocator::address" ref="db4f7613b1de12d1e79285c15636cf3b" args="(const_reference x) const " -->
-const_pointer </td><td class="memItemRight" valign="bottom"><b>address</b> (const_reference x) const </td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4cdeea67af6c1fcd8f1d5e9c4cab61e8"></a><!-- doxytag: member="tbb::cache_aligned_allocator::allocate" ref="4cdeea67af6c1fcd8f1d5e9c4cab61e8" args="(size_type n, const void *hint=0)" -->
-pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="a00151.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">allocate</a> (size_type n, const void *hint=0)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Allocate space for n objects, starting on a cache/sector line. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3d4eadf188f7d85d3805ae534e0b8e1c"></a><!-- doxytag: member="tbb::cache_aligned_allocator::deallocate" ref="3d4eadf188f7d85d3805ae534e0b8e1c" args="(pointer p, size_type)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00151.html#3d4eadf188f7d85d3805ae534e0b8e1c">deallocate</a> (pointer p, size_type)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Free block of memory that starts on a cache line. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fb23b687b4c0429dab4c7f8017266cf0"></a><!-- doxytag: member="tbb::cache_aligned_allocator::max_size" ref="fb23b687b4c0429dab4c7f8017266cf0" args="() const " -->
-size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00151.html#fb23b687b4c0429dab4c7f8017266cf0">max_size</a> () const throw ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Largest value for which method allocate might succeed. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="958ee8745c86c275bfc9533af565e017"></a><!-- doxytag: member="tbb::cache_aligned_allocator::construct" ref="958ee8745c86c275bfc9533af565e017" args="(pointer p, const value_type &value)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00151.html#958ee8745c86c275bfc9533af565e017">construct</a> (pointer p, const value_type &value)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy-construct value at location pointed to by p. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cd298895a4f1654b5149ec84b591ecb5"></a><!-- doxytag: member="tbb::cache_aligned_allocator::destroy" ref="cd298895a4f1654b5149ec84b591ecb5" args="(pointer p)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00151.html#cd298895a4f1654b5149ec84b591ecb5">destroy</a> (pointer p)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy value at location pointed to by p. <br></td></tr>
<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><b>rebind</b></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T><br>
- class tbb::cache_aligned_allocator< T ></h3>
+<h3>template<><br>
+ class tbb::cache_aligned_allocator< void ></h3>
-Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.
-<p>
-The members are ordered the same way they are in section 20.4.1 of the ISO C++ standard.
+Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00322.html">cache_aligned_allocator.h</a></ul>
+<li><a class="el" href="a00323.html">cache_aligned_allocator.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00152.html b/doc/html/a00152.html
index 366b8f3..b8bdd7d 100644
--- a/doc/html/a00152.html
+++ b/doc/html/a00152.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::cache_aligned_allocator< void > Class Template Reference</title>
+<title>tbb::captured_exception Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,39 +21,131 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00152.html">cache_aligned_allocator< void ></a></div>
-<h1>tbb::cache_aligned_allocator< void > Class Template Reference<br>
-<small>
-[<a class="el" href="a00276.html">Memory Allocation</a>]</small>
-</h1><!-- doxytag: class="tbb::cache_aligned_allocator< void >" -->Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00152.html">captured_exception</a></div>
+<h1>tbb::captured_exception Class Reference</h1><!-- doxytag: class="tbb::captured_exception" --><!-- doxytag: inherits="tbb::tbb_exception" -->This class is used by TBB to propagate information about unhandled exceptions into the root thread.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00322.html">cache_aligned_allocator.h</a>></code>
+<code>#include <<a class="el" href="a00459.html">tbb_exception.h</a>></code>
<p>
-<a href="a00009.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::captured_exception:
+<p><center><img src="a00152.png" usemap="#tbb::captured_exception_map" border="0" alt=""></center>
+<map name="tbb::captured_exception_map">
+<area href="a00206.html" alt="tbb::tbb_exception" shape="rect" coords="0,0,146,24">
+</map>
+<a href="a00099.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ce89776145998f0685a767b4f195272d"></a><!-- doxytag: member="tbb::cache_aligned_allocator< void >::pointer" ref="ce89776145998f0685a767b4f195272d" args="" -->
-typedef void * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b50d9716bcdd281df574ec758a3952f9"></a><!-- doxytag: member="tbb::captured_exception::captured_exception" ref="b50d9716bcdd281df574ec758a3952f9" args="(const captured_exception &src)" -->
+ </td><td class="memItemRight" valign="bottom"><b>captured_exception</b> (const <a class="el" href="a00152.html">captured_exception</a> &src)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4431fbbe1a8cfeb19c48ad0072078f45"></a><!-- doxytag: member="tbb::cache_aligned_allocator< void >::const_pointer" ref="4431fbbe1a8cfeb19c48ad0072078f45" args="" -->
-typedef const void * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="179076f146699724f652a9b1e81bd791"></a><!-- doxytag: member="tbb::captured_exception::captured_exception" ref="179076f146699724f652a9b1e81bd791" args="(const char *name_, const char *info)" -->
+ </td><td class="memItemRight" valign="bottom"><b>captured_exception</b> (const char *name_, const char *info)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2ab296f4ecdd75f8e193ff92004a697d"></a><!-- doxytag: member="tbb::cache_aligned_allocator< void >::value_type" ref="2ab296f4ecdd75f8e193ff92004a697d" args="" -->
-typedef void </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e95b8eb99ec9dea22934ac528a08654c"></a><!-- doxytag: member="tbb::captured_exception::operator=" ref="e95b8eb99ec9dea22934ac528a08654c" args="(const captured_exception &src)" -->
+<a class="el" href="a00152.html">captured_exception</a> & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00152.html">captured_exception</a> &src)</td></tr>
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><b>rebind</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00152.html">captured_exception</a> *__TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00152.html#837a50b8f6a800bda225c39d1699643f">move</a> () throw ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Creates and returns pointer to the deep copy of this exception object. <a href="#837a50b8f6a800bda225c39d1699643f"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00152.html#93d875d3555502ff6f18513525de204c">destroy</a> () throw ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys objects created by the <a class="el" href="a00152.html#837a50b8f6a800bda225c39d1699643f">move()</a> method. <a href="#93d875d3555502ff6f18513525de204c"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00152.html#2dd1be66ab32fa27e0ddef5707fa67ef">throw_self</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Throws this exception object. <a href="#2dd1be66ab32fa27e0ddef5707fa67ef"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5af82fd677449c5ca727fa1d7e16f9f5"></a><!-- doxytag: member="tbb::captured_exception::name" ref="5af82fd677449c5ca727fa1d7e16f9f5" args="() const " -->
+const char *__TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00152.html#5af82fd677449c5ca727fa1d7e16f9f5">name</a> () const throw ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns RTTI name of the originally intercepted exception. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6b5988ef74a1fe2a58998d110b3633e0"></a><!-- doxytag: member="tbb::captured_exception::what" ref="6b5988ef74a1fe2a58998d110b3633e0" args="() const " -->
+const char *__TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00152.html#6b5988ef74a1fe2a58998d110b3633e0">what</a> () const throw ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the result of originally intercepted exception's <a class="el" href="a00152.html#6b5988ef74a1fe2a58998d110b3633e0">what()</a> method. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="92ed4100413eef26969f8299f6845e18"></a><!-- doxytag: member="tbb::captured_exception::set" ref="92ed4100413eef26969f8299f6845e18" args="(const char *name, const char *info)" -->
+void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><b>set</b> (const char *name, const char *info) throw ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d5f56d05102acdba6c2f09ba6db3baeb"></a><!-- doxytag: member="tbb::captured_exception::clear" ref="d5f56d05102acdba6c2f09ba6db3baeb" args="()" -->
+void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><b>clear</b> () throw ()</td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<><br>
- class tbb::cache_aligned_allocator< void ></h3>
+This class is used by TBB to propagate information about unhandled exceptions into the root thread.
+<p>
+Exception of this type is thrown by TBB in the root thread (thread that started a parallel algorithm ) if an unhandled exception was intercepted during the algorithm execution in one of the workers. <dl compact><dt><b>See also:</b></dt><dd><a class="el" href="a00206.html">tbb::tbb_exception</a> </dd></dl>
-Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.
<p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="93d875d3555502ff6f18513525de204c"></a><!-- doxytag: member="tbb::captured_exception::destroy" ref="93d875d3555502ff6f18513525de204c" args="()" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void __TBB_EXPORTED_METHOD tbb::captured_exception::destroy </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"> throw ()<code> [virtual]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Destroys objects created by the <a class="el" href="a00152.html#837a50b8f6a800bda225c39d1699643f">move()</a> method.
+<p>
+Frees memory and calls destructor for this exception object. Can and must be used only on objects created by the move method.
+<p>
+Implements <a class="el" href="a00206.html#66c94938eca8bf88b76f3eccaaf215d8">tbb::tbb_exception</a>.
+</div>
+</div><p>
+<a class="anchor" name="837a50b8f6a800bda225c39d1699643f"></a><!-- doxytag: member="tbb::captured_exception::move" ref="837a50b8f6a800bda225c39d1699643f" args="()" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="a00152.html">captured_exception</a>* __TBB_EXPORTED_METHOD tbb::captured_exception::move </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"> throw ()<code> [virtual]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Creates and returns pointer to the deep copy of this exception object.
+<p>
+Move semantics is allowed.
+<p>
+Implements <a class="el" href="a00206.html#3e3482bf264d4ca4dde046cd9c02c766">tbb::tbb_exception</a>.
+</div>
+</div><p>
+<a class="anchor" name="2dd1be66ab32fa27e0ddef5707fa67ef"></a><!-- doxytag: member="tbb::captured_exception::throw_self" ref="2dd1be66ab32fa27e0ddef5707fa67ef" args="()" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void tbb::captured_exception::throw_self </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline, virtual]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Throws this exception object.
+<p>
+Make sure that if you have several levels of derivation from this interface you implement or override this method on the most derived level. The implementation is as simple as "throw *this;". Failure to do this will result in exception of a base class type being thrown.
+<p>
+Implements <a class="el" href="a00206.html#8588e07fa49692f4d734e4f2e4f048f4">tbb::tbb_exception</a>.
+</div>
+</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00322.html">cache_aligned_allocator.h</a></ul>
+<li><a class="el" href="a00459.html">tbb_exception.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00153.png b/doc/html/a00152.png
similarity index 100%
rename from doc/html/a00153.png
rename to doc/html/a00152.png
diff --git a/doc/html/a00153.html b/doc/html/a00153.html
index eecc2d0..bae449c 100644
--- a/doc/html/a00153.html
+++ b/doc/html/a00153.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::captured_exception Class Reference</title>
+<title>tbb::combinable< T > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,131 +21,58 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00153.html">captured_exception</a></div>
-<h1>tbb::captured_exception Class Reference</h1><!-- doxytag: class="tbb::captured_exception" --><!-- doxytag: inherits="tbb::tbb_exception" -->This class is used by TBB to propagate information about unhandled exceptions into the root thread.
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00153.html">combinable</a></div>
+<h1>tbb::combinable< T > Class Template Reference<br>
+<small>
+[<a class="el" href="a00276.html">Containers</a>]</small>
+</h1><!-- doxytag: class="tbb::combinable" -->Thread-local storage with optional reduction.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00453.html">tbb_exception.h</a>></code>
+<code>#include <<a class="el" href="a00325.html">combinable.h</a>></code>
<p>
-<p>Inheritance diagram for tbb::captured_exception:
-<p><center><img src="a00153.png" usemap="#tbb::captured_exception_map" border="0" alt=""></center>
-<map name="tbb::captured_exception_map">
-<area href="a00206.html" alt="tbb::tbb_exception" shape="rect" coords="0,0,146,24">
-</map>
-<a href="a00099.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00011.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b50d9716bcdd281df574ec758a3952f9"></a><!-- doxytag: member="tbb::captured_exception::captured_exception" ref="b50d9716bcdd281df574ec758a3952f9" args="(const captured_exception &src)" -->
- </td><td class="memItemRight" valign="bottom"><b>captured_exception</b> (const <a class="el" href="a00153.html">captured_exception</a> &src)</td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="d03619e90e62555aa5634fcc8adadcc9"></a><!-- doxytag: member="tbb::combinable::combinable" ref="d03619e90e62555aa5634fcc8adadcc9" args="(finit _finit)" -->
+template<typename finit> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>combinable</b> (finit _finit)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="179076f146699724f652a9b1e81bd791"></a><!-- doxytag: member="tbb::captured_exception::captured_exception" ref="179076f146699724f652a9b1e81bd791" args="(const char *name_, const char *info)" -->
- </td><td class="memItemRight" valign="bottom"><b>captured_exception</b> (const char *name_, const char *info)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c87e79ae98588a5780f708773388843"></a><!-- doxytag: member="tbb::combinable::~combinable" ref="2c87e79ae98588a5780f708773388843" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00153.html#2c87e79ae98588a5780f708773388843">~combinable</a> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e95b8eb99ec9dea22934ac528a08654c"></a><!-- doxytag: member="tbb::captured_exception::operator=" ref="e95b8eb99ec9dea22934ac528a08654c" args="(const captured_exception &src)" -->
-<a class="el" href="a00153.html">captured_exception</a> & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00153.html">captured_exception</a> &src)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">destructor <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="57012803b7bc7416452cb930121ff210"></a><!-- doxytag: member="tbb::combinable::combinable" ref="57012803b7bc7416452cb930121ff210" args="(const combinable &other)" -->
+ </td><td class="memItemRight" valign="bottom"><b>combinable</b> (const <a class="el" href="a00153.html">combinable</a> &other)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00153.html">captured_exception</a> *__TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00153.html#837a50b8f6a800bda225c39d1699643f">move</a> () throw ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c9650d59f65b1042afa232ede57dfca9"></a><!-- doxytag: member="tbb::combinable::operator=" ref="c9650d59f65b1042afa232ede57dfca9" args="(const combinable &other)" -->
+<a class="el" href="a00153.html">combinable</a> & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00153.html">combinable</a> &other)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Creates and returns pointer to the deep copy of this exception object. <a href="#837a50b8f6a800bda225c39d1699643f"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00153.html#93d875d3555502ff6f18513525de204c">destroy</a> () throw ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f09233cccb9b5e8a58874e43a703cac2"></a><!-- doxytag: member="tbb::combinable::clear" ref="f09233cccb9b5e8a58874e43a703cac2" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><b>clear</b> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys objects created by the <a class="el" href="a00153.html#837a50b8f6a800bda225c39d1699643f">move()</a> method. <a href="#93d875d3555502ff6f18513525de204c"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00153.html#2dd1be66ab32fa27e0ddef5707fa67ef">throw_self</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2d7550204bcb88fa8810b5a39e9cad24"></a><!-- doxytag: member="tbb::combinable::local" ref="2d7550204bcb88fa8810b5a39e9cad24" args="()" -->
+T & </td><td class="memItemRight" valign="bottom"><b>local</b> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Throws this exception object. <a href="#2dd1be66ab32fa27e0ddef5707fa67ef"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5af82fd677449c5ca727fa1d7e16f9f5"></a><!-- doxytag: member="tbb::captured_exception::name" ref="5af82fd677449c5ca727fa1d7e16f9f5" args="() const " -->
-const char *__TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00153.html#5af82fd677449c5ca727fa1d7e16f9f5">name</a> () const throw ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="93a42052881ecccdd8ddff16a1b1cca1"></a><!-- doxytag: member="tbb::combinable::local" ref="93a42052881ecccdd8ddff16a1b1cca1" args="(bool &exists)" -->
+T & </td><td class="memItemRight" valign="bottom"><b>local</b> (bool &exists)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns RTTI name of the originally intercepted exception. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6b5988ef74a1fe2a58998d110b3633e0"></a><!-- doxytag: member="tbb::captured_exception::what" ref="6b5988ef74a1fe2a58998d110b3633e0" args="() const " -->
-const char *__TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00153.html#6b5988ef74a1fe2a58998d110b3633e0">what</a> () const throw ()</td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="9be306b4a073066dcac4043dc189c514"></a><!-- doxytag: member="tbb::combinable::combine" ref="9be306b4a073066dcac4043dc189c514" args="(combine_func_t f_combine)" -->
+template<typename combine_func_t> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">T </td><td class="memTemplItemRight" valign="bottom"><b>combine</b> (combine_func_t f_combine)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the result of originally intercepted exception's <a class="el" href="a00153.html#6b5988ef74a1fe2a58998d110b3633e0">what()</a> method. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="92ed4100413eef26969f8299f6845e18"></a><!-- doxytag: member="tbb::captured_exception::set" ref="92ed4100413eef26969f8299f6845e18" args="(const char *name, const char *info)" -->
-void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><b>set</b> (const char *name, const char *info) throw ()</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d5f56d05102acdba6c2f09ba6db3baeb"></a><!-- doxytag: member="tbb::captured_exception::clear" ref="d5f56d05102acdba6c2f09ba6db3baeb" args="()" -->
-void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><b>clear</b> () throw ()</td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="dcd23283834149c87c345c0e476dfee8"></a><!-- doxytag: member="tbb::combinable::combine_each" ref="dcd23283834149c87c345c0e476dfee8" args="(combine_func_t f_combine)" -->
+template<typename combine_func_t> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>combine_each</b> (combine_func_t f_combine)</td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-This class is used by TBB to propagate information about unhandled exceptions into the root thread.
-<p>
-Exception of this type is thrown by TBB in the root thread (thread that started a parallel algorithm ) if an unhandled exception was intercepted during the algorithm execution in one of the workers. <dl compact><dt><b>See also:</b></dt><dd><a class="el" href="a00206.html">tbb::tbb_exception</a> </dd></dl>
-
-<p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="93d875d3555502ff6f18513525de204c"></a><!-- doxytag: member="tbb::captured_exception::destroy" ref="93d875d3555502ff6f18513525de204c" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void __TBB_EXPORTED_METHOD tbb::captured_exception::destroy </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"> throw ()<code> [virtual]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Destroys objects created by the <a class="el" href="a00153.html#837a50b8f6a800bda225c39d1699643f">move()</a> method.
-<p>
-Frees memory and calls destructor for this exception object. Can and must be used only on objects created by the move method.
-<p>
-Implements <a class="el" href="a00206.html#66c94938eca8bf88b76f3eccaaf215d8">tbb::tbb_exception</a>.
-</div>
-</div><p>
-<a class="anchor" name="837a50b8f6a800bda225c39d1699643f"></a><!-- doxytag: member="tbb::captured_exception::move" ref="837a50b8f6a800bda225c39d1699643f" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname"><a class="el" href="a00153.html">captured_exception</a>* __TBB_EXPORTED_METHOD tbb::captured_exception::move </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"> throw ()<code> [virtual]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
+<h3>template<typename T><br>
+ class tbb::combinable< T ></h3>
+Thread-local storage with optional reduction.
<p>
-Creates and returns pointer to the deep copy of this exception object.
-<p>
-Move semantics is allowed.
-<p>
-Implements <a class="el" href="a00206.html#3e3482bf264d4ca4dde046cd9c02c766">tbb::tbb_exception</a>.
-</div>
-</div><p>
-<a class="anchor" name="2dd1be66ab32fa27e0ddef5707fa67ef"></a><!-- doxytag: member="tbb::captured_exception::throw_self" ref="2dd1be66ab32fa27e0ddef5707fa67ef" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void tbb::captured_exception::throw_self </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [inline, virtual]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Throws this exception object.
-<p>
-Make sure that if you have several levels of derivation from this interface you implement or override this method on the most derived level. The implementation is as simple as "throw *this;". Failure to do this will result in exception of a base class type being thrown.
-<p>
-Implements <a class="el" href="a00206.html#8588e07fa49692f4d734e4f2e4f048f4">tbb::tbb_exception</a>.
-</div>
-</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00453.html">tbb_exception.h</a></ul>
+<li><a class="el" href="a00325.html">combinable.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00154.html b/doc/html/a00154.html
index 40015d5..861ec22 100644
--- a/doc/html/a00154.html
+++ b/doc/html/a00154.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::combinable< T > Class Template Reference</title>
+<title>tbb::concurrent_bounded_queue< T, A > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,58 +21,280 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00154.html">combinable</a></div>
-<h1>tbb::combinable< T > Class Template Reference<br>
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00154.html">concurrent_bounded_queue</a></div>
+<h1>tbb::concurrent_bounded_queue< T, A > Class Template Reference<br>
<small>
-[<a class="el" href="a00275.html">Containers</a>]</small>
-</h1><!-- doxytag: class="tbb::combinable" -->Thread-local storage with optional reduction.
+[<a class="el" href="a00276.html">Containers</a>]</small>
+</h1><!-- doxytag: class="tbb::concurrent_bounded_queue" -->A high-performance thread-safe blocking concurrent bounded queue.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00324.html">combinable.h</a>></code>
+<code>#include <<a class="el" href="a00336.html">concurrent_queue.h</a>></code>
<p>
-<a href="a00011.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::concurrent_bounded_queue< T, A >:
+<p><center><img src="a00154.png" usemap="#tbb::concurrent_bounded_queue< T, A >_map" border="0" alt=""></center>
+<map name="tbb::concurrent_bounded_queue< T, A >_map">
+<area href="a00160.html" alt="tbb::deprecated::concurrent_queue< T, A >" shape="rect" coords="0,56,257,80">
+</map>
+<a href="a00019.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="98245517a931e5893f6601e66c51fc75"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::value_type" ref="98245517a931e5893f6601e66c51fc75" args="" -->
+typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00154.html#98245517a931e5893f6601e66c51fc75">value_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Element type in the queue. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2e2726fccf6d975dc1071608cc0bbf90"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::allocator_type" ref="2e2726fccf6d975dc1071608cc0bbf90" args="" -->
+typedef A </td><td class="memItemRight" valign="bottom"><a class="el" href="a00154.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Allocator type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dcd44ca6a88c0dc7a847a47a10811f0c"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::reference" ref="dcd44ca6a88c0dc7a847a47a10811f0c" args="" -->
+typedef T & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00154.html#dcd44ca6a88c0dc7a847a47a10811f0c">reference</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Reference type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="796713d0b9ba93a4721cbe13e4474068"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::const_reference" ref="796713d0b9ba93a4721cbe13e4474068" args="" -->
+typedef const T & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00154.html#796713d0b9ba93a4721cbe13e4474068">const_reference</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Const reference type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">typedef std::ptrdiff_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00154.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Integral type for representing size of the queue. <a href="#a80e4c11dbb324e4b92a24a77bbcde68"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4b45c91297e69515d83d5eef85ae1f49"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::difference_type" ref="4b45c91297e69515d83d5eef85ae1f49" args="" -->
+typedef std::ptrdiff_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00154.html#4b45c91297e69515d83d5eef85ae1f49">difference_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Difference type for iterator. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="aeea2ad38b7e7fc2866f063dfed24c52"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::iterator" ref="aeea2ad38b7e7fc2866f063dfed24c52" args="" -->
+typedef internal::concurrent_queue_iterator<<br>
+ <a class="el" href="a00154.html">concurrent_bounded_queue</a>,<br>
+ T > </td><td class="memItemRight" valign="bottom"><b>iterator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0edd1a90e6ffa503bac1c4027116dbff"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::const_iterator" ref="0edd1a90e6ffa503bac1c4027116dbff" args="" -->
+typedef internal::concurrent_queue_iterator<<br>
+ <a class="el" href="a00154.html">concurrent_bounded_queue</a>,<br>
+ const T > </td><td class="memItemRight" valign="bottom"><b>const_iterator</b></td></tr>
+
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="d03619e90e62555aa5634fcc8adadcc9"></a><!-- doxytag: member="tbb::combinable::combinable" ref="d03619e90e62555aa5634fcc8adadcc9" args="(finit _finit)" -->
-template<typename finit> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>combinable</b> (finit _finit)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e3525226732963ff0f13e89d8e6dab5b"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::concurrent_bounded_queue" ref="e3525226732963ff0f13e89d8e6dab5b" args="(const allocator_type &a=allocator_type())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00154.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a> (const <a class="el" href="a00154.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> &a=<a class="el" href="a00154.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty queue. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7b7fb414d2eaa8a7f5d68fc4cd63ac50"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::concurrent_bounded_queue" ref="7b7fb414d2eaa8a7f5d68fc4cd63ac50" args="(const concurrent_bounded_queue &src, const allocator_type &a=allocator_type())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00154.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">concurrent_bounded_queue</a> (const <a class="el" href="a00154.html">concurrent_bounded_queue</a> &src, const <a class="el" href="a00154.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> &a=<a class="el" href="a00154.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="a5e04dcd7db9fd9b583b4e7df832246a"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::concurrent_bounded_queue" ref="a5e04dcd7db9fd9b583b4e7df832246a" args="(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())" -->
+template<typename InputIterator> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00154.html#a5e04dcd7db9fd9b583b4e7df832246a">concurrent_bounded_queue</a> (InputIterator begin, InputIterator end, const <a class="el" href="a00154.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> &a=<a class="el" href="a00154.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">[begin,end) constructor <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="acaf5b510dc0dfc7780b8c956cf773cf"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::~concurrent_bounded_queue" ref="acaf5b510dc0dfc7780b8c956cf773cf" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00154.html#acaf5b510dc0dfc7780b8c956cf773cf">~concurrent_bounded_queue</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy queue. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ceb08c743b11ba88c878e73fff8af20b"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::push" ref="ceb08c743b11ba88c878e73fff8af20b" args="(const T &source)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00154.html#ceb08c743b11ba88c878e73fff8af20b">push</a> (const T &source)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Enqueue an item at tail of queue. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00154.html#41f4c6bd7a82ab070e840bbf81b0b123">pop</a> (T &destination)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Dequeue item from head of queue. <a href="#41f4c6bd7a82ab070e840bbf81b0b123"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00154.html#2bd6232531279fb3ccbd296bea23066b">try_push</a> (const T &source)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Enqueue an item at tail of queue if queue is not already full. <a href="#2bd6232531279fb3ccbd296bea23066b"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00154.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a> (T &destination)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Attempt to dequeue an item from head of queue. <a href="#0ca487019bbb00a196442aff78a1e4f7"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00154.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00154.html#7dc14d1a579a4cccda9f857585e1768d">size</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Return number of pushes minus number of pops. <a href="#7dc14d1a579a4cccda9f857585e1768d"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f64924f2ee9225c368a270fc3c394db9"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::empty" ref="f64924f2ee9225c368a270fc3c394db9" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00154.html#f64924f2ee9225c368a270fc3c394db9">empty</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Equivalent to <a class="el" href="a00154.html#7dc14d1a579a4cccda9f857585e1768d">size()</a><=0. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b2888b3e4e837d7e03f2c731963a402b"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::capacity" ref="b2888b3e4e837d7e03f2c731963a402b" args="() const " -->
+<a class="el" href="a00154.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00154.html#b2888b3e4e837d7e03f2c731963a402b">capacity</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Maximum number of allowed elements. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00154.html#f3c6c934f85fd02aedbc83a16943193b">set_capacity</a> (<a class="el" href="a00154.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> new_capacity)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c87e79ae98588a5780f708773388843"></a><!-- doxytag: member="tbb::combinable::~combinable" ref="2c87e79ae98588a5780f708773388843" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00154.html#2c87e79ae98588a5780f708773388843">~combinable</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Set the capacity. <a href="#f3c6c934f85fd02aedbc83a16943193b"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="415eb87e53b1c6a266de06ecbc490d16"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::get_allocator" ref="415eb87e53b1c6a266de06ecbc490d16" args="() const " -->
+<a class="el" href="a00154.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00154.html#415eb87e53b1c6a266de06ecbc490d16">get_allocator</a> () const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">destructor <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="57012803b7bc7416452cb930121ff210"></a><!-- doxytag: member="tbb::combinable::combinable" ref="57012803b7bc7416452cb930121ff210" args="(const combinable &other)" -->
- </td><td class="memItemRight" valign="bottom"><b>combinable</b> (const <a class="el" href="a00154.html">combinable</a> &other)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">return allocator object <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="90b31e2954c6e4596c7900435a5f4bc1"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::clear" ref="90b31e2954c6e4596c7900435a5f4bc1" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00154.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c9650d59f65b1042afa232ede57dfca9"></a><!-- doxytag: member="tbb::combinable::operator=" ref="c9650d59f65b1042afa232ede57dfca9" args="(const combinable &other)" -->
-<a class="el" href="a00154.html">combinable</a> & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00154.html">combinable</a> &other)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">clear the queue. not thread-safe. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5a2637188e104503ac2c0dff633014e8"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::unsafe_begin" ref="5a2637188e104503ac2c0dff633014e8" args="()" -->
+iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_begin</b> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f09233cccb9b5e8a58874e43a703cac2"></a><!-- doxytag: member="tbb::combinable::clear" ref="f09233cccb9b5e8a58874e43a703cac2" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><b>clear</b> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c7267334ef11087c76c810abb9d5cbc2"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::unsafe_end" ref="c7267334ef11087c76c810abb9d5cbc2" args="()" -->
+iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_end</b> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2d7550204bcb88fa8810b5a39e9cad24"></a><!-- doxytag: member="tbb::combinable::local" ref="2d7550204bcb88fa8810b5a39e9cad24" args="()" -->
-T & </td><td class="memItemRight" valign="bottom"><b>local</b> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8be757841d0bbf7744508aaf6a141d08"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::unsafe_begin" ref="8be757841d0bbf7744508aaf6a141d08" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_begin</b> () const </td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="93a42052881ecccdd8ddff16a1b1cca1"></a><!-- doxytag: member="tbb::combinable::local" ref="93a42052881ecccdd8ddff16a1b1cca1" args="(bool &exists)" -->
-T & </td><td class="memItemRight" valign="bottom"><b>local</b> (bool &exists)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3aac91d288bf227d9d06717b44ef28f7"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::unsafe_end" ref="3aac91d288bf227d9d06717b44ef28f7" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_end</b> () const </td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="9be306b4a073066dcac4043dc189c514"></a><!-- doxytag: member="tbb::combinable::combine" ref="9be306b4a073066dcac4043dc189c514" args="(combine_func_t f_combine)" -->
-template<typename combine_func_t> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">T </td><td class="memTemplItemRight" valign="bottom"><b>combine</b> (combine_func_t f_combine)</td></tr>
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05bffad9626d51abbd4bb82ae2a1cceb"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::internal::concurrent_queue_iterator" ref="05bffad9626d51abbd4bb82ae2a1cceb" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::concurrent_queue_iterator</b></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="dcd23283834149c87c345c0e476dfee8"></a><!-- doxytag: member="tbb::combinable::combine_each" ref="dcd23283834149c87c345c0e476dfee8" args="(combine_func_t f_combine)" -->
-template<typename combine_func_t> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>combine_each</b> (combine_func_t f_combine)</td></tr>
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>destroyer</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Class used to ensure exception-safety of method "pop". <br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T><br>
- class tbb::combinable< T ></h3>
+<h3>template<typename T, class A = cache_aligned_allocator<T>><br>
+ class tbb::concurrent_bounded_queue< T, A ></h3>
-Thread-local storage with optional reduction.
+A high-performance thread-safe blocking concurrent bounded queue.
+<p>
+This is the pre-PPL TBB concurrent queue which supports boundedness and blocking semantics. Note that method names agree with the PPL-style concurrent queue. Multiple threads may each push and pop concurrently. Assignment construction is not allowed.
+<p>
+<hr><h2>Member Typedef Documentation</h2>
+<a class="anchor" name="a80e4c11dbb324e4b92a24a77bbcde68"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::size_type" ref="a80e4c11dbb324e4b92a24a77bbcde68" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, class A = cache_aligned_allocator<T>> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">typedef std::ptrdiff_t <a class="el" href="a00154.html">tbb::concurrent_bounded_queue</a>< T, A >::<a class="el" href="a00154.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Integral type for representing size of the queue.
+<p>
+Notice that the size_type is a signed integral type. This is because the size can be negative if there are pending pops without corresponding pushes.
+</div>
+</div><p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="41f4c6bd7a82ab070e840bbf81b0b123"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::pop" ref="41f4c6bd7a82ab070e840bbf81b0b123" args="(T &destination)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, class A = cache_aligned_allocator<T>> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="a00154.html">tbb::concurrent_bounded_queue</a>< T, A >::pop </td>
+ <td>(</td>
+ <td class="paramtype">T & </td>
+ <td class="paramname"> <em>destination</em> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Dequeue item from head of queue.
+<p>
+Block until an item becomes available, and then dequeue it.
+</div>
+</div><p>
+<a class="anchor" name="f3c6c934f85fd02aedbc83a16943193b"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::set_capacity" ref="f3c6c934f85fd02aedbc83a16943193b" args="(size_type new_capacity)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, class A = cache_aligned_allocator<T>> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="a00154.html">tbb::concurrent_bounded_queue</a>< T, A >::set_capacity </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00154.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> </td>
+ <td class="paramname"> <em>new_capacity</em> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Set the capacity.
+<p>
+Setting the capacity to 0 causes subsequent try_push operations to always fail, and subsequent push operations to block forever.
+</div>
+</div><p>
+<a class="anchor" name="7dc14d1a579a4cccda9f857585e1768d"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::size" ref="7dc14d1a579a4cccda9f857585e1768d" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, class A = cache_aligned_allocator<T>> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="a00154.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> <a class="el" href="a00154.html">tbb::concurrent_bounded_queue</a>< T, A >::size </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"> const<code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Return number of pushes minus number of pops.
+<p>
+Note that the result can be negative if there are pops waiting for the corresponding pushes. The result can also exceed <a class="el" href="a00154.html#b2888b3e4e837d7e03f2c731963a402b">capacity()</a> if there are push operations in flight.
+</div>
+</div><p>
+<a class="anchor" name="0ca487019bbb00a196442aff78a1e4f7"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::try_pop" ref="0ca487019bbb00a196442aff78a1e4f7" args="(T &destination)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, class A = cache_aligned_allocator<T>> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="a00154.html">tbb::concurrent_bounded_queue</a>< T, A >::try_pop </td>
+ <td>(</td>
+ <td class="paramtype">T & </td>
+ <td class="paramname"> <em>destination</em> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Attempt to dequeue an item from head of queue.
+<p>
+Does not wait for item to become available. Returns true if successful; false otherwise.
+</div>
+</div><p>
+<a class="anchor" name="2bd6232531279fb3ccbd296bea23066b"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::try_push" ref="2bd6232531279fb3ccbd296bea23066b" args="(const T &source)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, class A = cache_aligned_allocator<T>> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="a00154.html">tbb::concurrent_bounded_queue</a>< T, A >::try_push </td>
+ <td>(</td>
+ <td class="paramtype">const T & </td>
+ <td class="paramname"> <em>source</em> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Enqueue an item at tail of queue if queue is not already full.
<p>
+Does not wait for queue to become not full. Returns true if item is pushed; false if queue was already full.
+</div>
+</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00324.html">combinable.h</a></ul>
+<li><a class="el" href="a00336.html">concurrent_queue.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00155.png b/doc/html/a00154.png
similarity index 100%
rename from doc/html/a00155.png
rename to doc/html/a00154.png
diff --git a/doc/html/a00155.html b/doc/html/a00155.html
index d3eae09..e4f5e66 100644
--- a/doc/html/a00155.html
+++ b/doc/html/a00155.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::concurrent_bounded_queue< T, A > Class Template Reference</title>
+<title>tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,170 +21,311 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00155.html">concurrent_bounded_queue</a></div>
-<h1>tbb::concurrent_bounded_queue< T, A > Class Template Reference<br>
+<a class="el" href="a00267.html">tbb</a>::<b>interface4</b>::<a class="el" href="a00155.html">concurrent_hash_map</a></div>
+<h1>tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator > Class Template Reference<br>
<small>
-[<a class="el" href="a00275.html">Containers</a>]</small>
-</h1><!-- doxytag: class="tbb::concurrent_bounded_queue" -->A high-performance thread-safe blocking concurrent bounded queue.
+[<a class="el" href="a00276.html">Containers</a>]</small>
+</h1><!-- doxytag: class="tbb::interface4::concurrent_hash_map" -->Unordered map from Key to T.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00335.html">concurrent_queue.h</a>></code>
+<code>#include <<a class="el" href="a00326.html">concurrent_hash_map.h</a>></code>
<p>
-<p>Inheritance diagram for tbb::concurrent_bounded_queue< T, A >:
-<p><center><img src="a00155.png" usemap="#tbb::concurrent_bounded_queue< T, A >_map" border="0" alt=""></center>
-<map name="tbb::concurrent_bounded_queue< T, A >_map">
-<area href="a00161.html" alt="tbb::deprecated::concurrent_queue< T, A >" shape="rect" coords="0,56,257,80">
-</map>
-<a href="a00019.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00013.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="98245517a931e5893f6601e66c51fc75"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::value_type" ref="98245517a931e5893f6601e66c51fc75" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#98245517a931e5893f6601e66c51fc75">value_type</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="33b3b94e17dab45c97b246bca3625655"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::key_type" ref="33b3b94e17dab45c97b246bca3625655" args="" -->
+typedef Key </td><td class="memItemRight" valign="bottom"><b>key_type</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Element type in the queue. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2e2726fccf6d975dc1071608cc0bbf90"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::allocator_type" ref="2e2726fccf6d975dc1071608cc0bbf90" args="" -->
-typedef A </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a5d75ef053d5e69de88ae7e941a743ec"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::mapped_type" ref="a5d75ef053d5e69de88ae7e941a743ec" args="" -->
+typedef T </td><td class="memItemRight" valign="bottom"><b>mapped_type</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Allocator type. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dcd44ca6a88c0dc7a847a47a10811f0c"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::reference" ref="dcd44ca6a88c0dc7a847a47a10811f0c" args="" -->
-typedef T & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#dcd44ca6a88c0dc7a847a47a10811f0c">reference</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="01ebd1df398d3823ca6ea8fcb6b068ae"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::value_type" ref="01ebd1df398d3823ca6ea8fcb6b068ae" args="" -->
+typedef std::pair< const Key,<br>
+ T > </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Reference type. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="796713d0b9ba93a4721cbe13e4474068"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::const_reference" ref="796713d0b9ba93a4721cbe13e4474068" args="" -->
-typedef const T & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#796713d0b9ba93a4721cbe13e4474068">const_reference</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ae6bb63bc9cf97d63e78d208ae0e479d"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::size_type" ref="ae6bb63bc9cf97d63e78d208ae0e479d" args="" -->
+typedef hash_map_base::size_type </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Const reference type. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">typedef std::ptrdiff_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2f5093a93592b0a30fda935711f9f788"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::difference_type" ref="2f5093a93592b0a30fda935711f9f788" args="" -->
+typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><b>difference_type</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Integral type for representing size of the queue. <a href="#a80e4c11dbb324e4b92a24a77bbcde68"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4b45c91297e69515d83d5eef85ae1f49"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::difference_type" ref="4b45c91297e69515d83d5eef85ae1f49" args="" -->
-typedef std::ptrdiff_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#4b45c91297e69515d83d5eef85ae1f49">difference_type</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1d1ffb83cae339007dc8d5b2e4e3cea8"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::pointer" ref="1d1ffb83cae339007dc8d5b2e4e3cea8" args="" -->
+typedef value_type * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Difference type for iterator. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="aeea2ad38b7e7fc2866f063dfed24c52"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::iterator" ref="aeea2ad38b7e7fc2866f063dfed24c52" args="" -->
-typedef internal::concurrent_queue_iterator<<br>
- <a class="el" href="a00155.html">concurrent_bounded_queue</a>,<br>
- T > </td><td class="memItemRight" valign="bottom"><b>iterator</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ecf3dc1d6d8290a71639967ffa933343"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::const_pointer" ref="ecf3dc1d6d8290a71639967ffa933343" args="" -->
+typedef const value_type * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0edd1a90e6ffa503bac1c4027116dbff"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::const_iterator" ref="0edd1a90e6ffa503bac1c4027116dbff" args="" -->
-typedef internal::concurrent_queue_iterator<<br>
- <a class="el" href="a00155.html">concurrent_bounded_queue</a>,<br>
- const T > </td><td class="memItemRight" valign="bottom"><b>const_iterator</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="14a3d74308b04a355b0689eb019ee683"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::reference" ref="14a3d74308b04a355b0689eb019ee683" args="" -->
+typedef value_type & </td><td class="memItemRight" valign="bottom"><b>reference</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1f6fcb68889829bca708d57f7b9e2da4"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::const_reference" ref="1f6fcb68889829bca708d57f7b9e2da4" args="" -->
+typedef const value_type & </td><td class="memItemRight" valign="bottom"><b>const_reference</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="118b95ebef79ac195fb99babbf335e8c"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::iterator" ref="118b95ebef79ac195fb99babbf335e8c" args="" -->
+typedef internal::hash_map_iterator<<br>
+ <a class="el" href="a00155.html">concurrent_hash_map</a>, value_type > </td><td class="memItemRight" valign="bottom"><b>iterator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5fec1af5576448740eb5c6119a30c6a9"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::const_iterator" ref="5fec1af5576448740eb5c6119a30c6a9" args="" -->
+typedef internal::hash_map_iterator<<br>
+ <a class="el" href="a00155.html">concurrent_hash_map</a>, const <br>
+value_type > </td><td class="memItemRight" valign="bottom"><b>const_iterator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="aa3d1bdabd5e9a15174624946048a2c8"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::range_type" ref="aa3d1bdabd5e9a15174624946048a2c8" args="" -->
+typedef internal::hash_map_range<<br>
+ iterator > </td><td class="memItemRight" valign="bottom"><b>range_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="20981e8295ff79f4e3d8b76a16c42851"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::const_range_type" ref="20981e8295ff79f4e3d8b76a16c42851" args="" -->
+typedef internal::hash_map_range<<br>
+ const_iterator > </td><td class="memItemRight" valign="bottom"><b>const_range_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f8d6e7e809e96f48fd039a54fc4df630"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::allocator_type" ref="f8d6e7e809e96f48fd039a54fc4df630" args="" -->
+typedef Allocator </td><td class="memItemRight" valign="bottom"><b>allocator_type</b></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e3525226732963ff0f13e89d8e6dab5b"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::concurrent_bounded_queue" ref="e3525226732963ff0f13e89d8e6dab5b" args="(const allocator_type &a=allocator_type())" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a> (const <a class="el" href="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> &a=<a class="el" href="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>())</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d827bb5e4f61de1916ab67d51c7c6e60"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::concurrent_hash_map" ref="d827bb5e4f61de1916ab67d51c7c6e60" args="(const allocator_type &a=allocator_type())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#d827bb5e4f61de1916ab67d51c7c6e60">concurrent_hash_map</a> (const allocator_type &a=allocator_type())</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty queue. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7b7fb414d2eaa8a7f5d68fc4cd63ac50"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::concurrent_bounded_queue" ref="7b7fb414d2eaa8a7f5d68fc4cd63ac50" args="(const concurrent_bounded_queue &src, const allocator_type &a=allocator_type())" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">concurrent_bounded_queue</a> (const <a class="el" href="a00155.html">concurrent_bounded_queue</a> &src, const <a class="el" href="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> &a=<a class="el" href="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>())</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty table. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a4612d5c7233712d455496641e9b31ff"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::concurrent_hash_map" ref="a4612d5c7233712d455496641e9b31ff" args="(size_type n, const allocator_type &a=allocator_type())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#a4612d5c7233712d455496641e9b31ff">concurrent_hash_map</a> (size_type n, const allocator_type &a=allocator_type())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty table with n preallocated buckets. This number serves also as initial concurrency level. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="df0cd14eaddb17f10929c91519e65be9"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::concurrent_hash_map" ref="df0cd14eaddb17f10929c91519e65be9" args="(const concurrent_hash_map &table, const allocator_type &a=allocator_type())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#df0cd14eaddb17f10929c91519e65be9">concurrent_hash_map</a> (const <a class="el" href="a00155.html">concurrent_hash_map</a> &table, const allocator_type &a=allocator_type())</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="a5e04dcd7db9fd9b583b4e7df832246a"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::concurrent_bounded_queue" ref="a5e04dcd7db9fd9b583b4e7df832246a" args="(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())" -->
-template<typename InputIterator> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00155.html#a5e04dcd7db9fd9b583b4e7df832246a">concurrent_bounded_queue</a> (InputIterator begin, InputIterator end, const <a class="el" href="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> &a=<a class="el" href="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>())</td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="3bfe75fcb350ce39cf610c164f233edc"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::concurrent_hash_map" ref="3bfe75fcb350ce39cf610c164f233edc" args="(I first, I last, const allocator_type &a=allocator_type())" -->
+template<typename I> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00155.html#3bfe75fcb350ce39cf610c164f233edc">concurrent_hash_map</a> (I first, I last, const allocator_type &a=allocator_type())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construction with copying iteration range and given allocator instance. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c0c42a2e1b5282b6739157df9ce2304"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::operator=" ref="2c0c42a2e1b5282b6739157df9ce2304" args="(const concurrent_hash_map &table)" -->
+<a class="el" href="a00155.html">concurrent_hash_map</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#2c0c42a2e1b5282b6739157df9ce2304">operator=</a> (const <a class="el" href="a00155.html">concurrent_hash_map</a> &table)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Assignment. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#13f3f2e8de7564be03882c31559493c9">rehash</a> (size_type n=0)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Rehashes and optionally resizes the whole table. <a href="#13f3f2e8de7564be03882c31559493c9"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a9f89be8fe28835749529d91081a2511"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::clear" ref="a9f89be8fe28835749529d91081a2511" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#a9f89be8fe28835749529d91081a2511">clear</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Clear table. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a1ac58997d8fbf242b266e3691573481"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::~concurrent_hash_map" ref="a1ac58997d8fbf242b266e3691573481" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#a1ac58997d8fbf242b266e3691573481">~concurrent_hash_map</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">[begin,end) constructor <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="acaf5b510dc0dfc7780b8c956cf773cf"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::~concurrent_bounded_queue" ref="acaf5b510dc0dfc7780b8c956cf773cf" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#acaf5b510dc0dfc7780b8c956cf773cf">~concurrent_bounded_queue</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Clear table and destroy it. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1d279026ce93bbef47a5b8a028cd387b"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::range" ref="1d279026ce93bbef47a5b8a028cd387b" args="(size_type grainsize=1)" -->
+range_type </td><td class="memItemRight" valign="bottom"><b>range</b> (size_type grainsize=1)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy queue. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ceb08c743b11ba88c878e73fff8af20b"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::push" ref="ceb08c743b11ba88c878e73fff8af20b" args="(const T &source)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#ceb08c743b11ba88c878e73fff8af20b">push</a> (const T &source)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="728c7aef8f1326f3f9ca6b4a6d1155cf"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::range" ref="728c7aef8f1326f3f9ca6b4a6d1155cf" args="(size_type grainsize=1) const " -->
+const_range_type </td><td class="memItemRight" valign="bottom"><b>range</b> (size_type grainsize=1) const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Enqueue an item at tail of queue. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#41f4c6bd7a82ab070e840bbf81b0b123">pop</a> (T &destination)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4a3c58cf1234b74ca796dcf555d32f53"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::begin" ref="4a3c58cf1234b74ca796dcf555d32f53" args="()" -->
+iterator </td><td class="memItemRight" valign="bottom"><b>begin</b> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Dequeue item from head of queue. <a href="#41f4c6bd7a82ab070e840bbf81b0b123"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#2bd6232531279fb3ccbd296bea23066b">try_push</a> (const T &source)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="28c690486d8db5783475f5b1a59d21bc"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::end" ref="28c690486d8db5783475f5b1a59d21bc" args="()" -->
+iterator </td><td class="memItemRight" valign="bottom"><b>end</b> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Enqueue an item at tail of queue if queue is not already full. <a href="#2bd6232531279fb3ccbd296bea23066b"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a> (T &destination)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="aa51c059c92aaf259916be74b928adb2"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::begin" ref="aa51c059c92aaf259916be74b928adb2" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><b>begin</b> () const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Attempt to dequeue an item from head of queue. <a href="#0ca487019bbb00a196442aff78a1e4f7"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00155.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#7dc14d1a579a4cccda9f857585e1768d">size</a> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d2610bf00a3f631719308bdb59876f08"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::end" ref="d2610bf00a3f631719308bdb59876f08" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><b>end</b> () const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Return number of pushes minus number of pops. <a href="#7dc14d1a579a4cccda9f857585e1768d"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f64924f2ee9225c368a270fc3c394db9"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::empty" ref="f64924f2ee9225c368a270fc3c394db9" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#f64924f2ee9225c368a270fc3c394db9">empty</a> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5faacd9a290b122947a21f72c676a0b9"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::equal_range" ref="5faacd9a290b122947a21f72c676a0b9" args="(const Key &key)" -->
+std::pair< iterator, iterator > </td><td class="memItemRight" valign="bottom"><b>equal_range</b> (const Key &key)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Equivalent to <a class="el" href="a00155.html#7dc14d1a579a4cccda9f857585e1768d">size()</a><=0. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b2888b3e4e837d7e03f2c731963a402b"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::capacity" ref="b2888b3e4e837d7e03f2c731963a402b" args="() const " -->
-<a class="el" href="a00155.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#b2888b3e4e837d7e03f2c731963a402b">capacity</a> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4abad08a1788b57a78698f16fab92838"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::equal_range" ref="4abad08a1788b57a78698f16fab92838" args="(const Key &key) const " -->
+std::pair< const_iterator,<br>
+ const_iterator > </td><td class="memItemRight" valign="bottom"><b>equal_range</b> (const Key &key) const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Maximum number of allowed elements. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#f3c6c934f85fd02aedbc83a16943193b">set_capacity</a> (<a class="el" href="a00155.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> new_capacity)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="17fd8c5fe8c6a86075f34aa4e8412ba3"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::size" ref="17fd8c5fe8c6a86075f34aa4e8412ba3" args="() const " -->
+size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#17fd8c5fe8c6a86075f34aa4e8412ba3">size</a> () const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Set the capacity. <a href="#f3c6c934f85fd02aedbc83a16943193b"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="415eb87e53b1c6a266de06ecbc490d16"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::get_allocator" ref="415eb87e53b1c6a266de06ecbc490d16" args="() const " -->
-<a class="el" href="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#415eb87e53b1c6a266de06ecbc490d16">get_allocator</a> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Number of items in table. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6cab7d029a3e73a653ef0faeac4d1586"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::empty" ref="6cab7d029a3e73a653ef0faeac4d1586" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#6cab7d029a3e73a653ef0faeac4d1586">empty</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">True if <a class="el" href="a00155.html#17fd8c5fe8c6a86075f34aa4e8412ba3">size()</a>==0. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1e45d3cbd1e2ae06f365f1b48e0df0b5"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::max_size" ref="1e45d3cbd1e2ae06f365f1b48e0df0b5" args="() const " -->
+size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#1e45d3cbd1e2ae06f365f1b48e0df0b5">max_size</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Upper bound on size. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="414d15033d36c63aa3a40666dc4d6f5e"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::bucket_count" ref="414d15033d36c63aa3a40666dc4d6f5e" args="() const " -->
+size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#414d15033d36c63aa3a40666dc4d6f5e">bucket_count</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the current number of buckets. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="199208eed6f09e200cda364f906be0fe"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::get_allocator" ref="199208eed6f09e200cda364f906be0fe" args="() const " -->
+allocator_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#199208eed6f09e200cda364f906be0fe">get_allocator</a> () const </td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">return allocator object <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="90b31e2954c6e4596c7900435a5f4bc1"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::clear" ref="90b31e2954c6e4596c7900435a5f4bc1" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eddb0d2efe0b4f25a85c059e1c3dac15"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::swap" ref="eddb0d2efe0b4f25a85c059e1c3dac15" args="(concurrent_hash_map &table)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#eddb0d2efe0b4f25a85c059e1c3dac15">swap</a> (<a class="el" href="a00155.html">concurrent_hash_map</a> &table)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">swap two instances. Iterators are invalidated <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="74f5ef06a06c5e619f156a1c76c04969"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::count" ref="74f5ef06a06c5e619f156a1c76c04969" args="(const Key &key) const " -->
+size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#74f5ef06a06c5e619f156a1c76c04969">count</a> (const Key &key) const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Return count of items (0 or 1). <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#64338d7f2e35df586af4cb0145cd910f">find</a> (<a class="el" href="a00158.html">const_accessor</a> &result, const Key &key) const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Find item and acquire a read lock on the item. <a href="#64338d7f2e35df586af4cb0145cd910f"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#bce7bdf46435115a95cca2aa73c5da83">find</a> (<a class="el" href="a00156.html">accessor</a> &result, const Key &key)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Find item and acquire a write lock on the item. <a href="#bce7bdf46435115a95cca2aa73c5da83"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#58c38b27273de6c670568633c0931854">insert</a> (<a class="el" href="a00158.html">const_accessor</a> &result, const Key &key)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Insert item (if not already present) and acquire a read lock on the item. <a href="#58c38b27273de6c670568633c0931854"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#ccfecaa3e71d92be61fb3d811dd264eb">insert</a> (<a class="el" href="a00156.html">accessor</a> &result, const Key &key)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Insert item (if not already present) and acquire a write lock on the item. <a href="#ccfecaa3e71d92be61fb3d811dd264eb"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#d4a2816129e38c53128c6d0c7b6b7370">insert</a> (<a class="el" href="a00158.html">const_accessor</a> &result, const value_type &value)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Insert item by copying if there is no such key present already and acquire a read lock on the item. <a href="#d4a2816129e38c53128c6d0c7b6b7370"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#a657e61cd2b13164764ca2708875784a">insert</a> (<a class="el" href="a00156.html">accessor</a> &result, const value_type &value)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">clear the queue. not thread-safe. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5a2637188e104503ac2c0dff633014e8"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::unsafe_begin" ref="5a2637188e104503ac2c0dff633014e8" args="()" -->
-iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_begin</b> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Insert item by copying if there is no such key present already and acquire a write lock on the item. <a href="#a657e61cd2b13164764ca2708875784a"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#52bffd1066b3d7b793945bc6fa1a71a1">insert</a> (const value_type &value)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c7267334ef11087c76c810abb9d5cbc2"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::unsafe_end" ref="c7267334ef11087c76c810abb9d5cbc2" args="()" -->
-iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_end</b> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Insert item by copying if there is no such key present already. <a href="#52bffd1066b3d7b793945bc6fa1a71a1"></a><br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="cfe172677e5987004ef4a03e22fa338a"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::insert" ref="cfe172677e5987004ef4a03e22fa338a" args="(I first, I last)" -->
+template<typename I> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00155.html#cfe172677e5987004ef4a03e22fa338a">insert</a> (I first, I last)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8be757841d0bbf7744508aaf6a141d08"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::unsafe_begin" ref="8be757841d0bbf7744508aaf6a141d08" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_begin</b> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Insert range [first, last). <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#034c3b3ee419edee78e0f2f2b1f0d7ca">erase</a> (const Key &key)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3aac91d288bf227d9d06717b44ef28f7"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::unsafe_end" ref="3aac91d288bf227d9d06717b44ef28f7" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_end</b> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Erase item. <a href="#034c3b3ee419edee78e0f2f2b1f0d7ca"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#da7e4a50f6bb06191817425ec85fe760">erase</a> (<a class="el" href="a00158.html">const_accessor</a> &item_accessor)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Erase item by <a class="el" href="a00158.html">const_accessor</a>. <a href="#da7e4a50f6bb06191817425ec85fe760"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#0f500842d0cf791f8fa61662edb1b311">erase</a> (<a class="el" href="a00156.html">accessor</a> &item_accessor)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Erase item by accessor. <a href="#0f500842d0cf791f8fa61662edb1b311"></a><br></td></tr>
+<tr><td colspan="2"><br><h2>Protected Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6bea55a4e94be2ab299de06dc266f3a3"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::node_allocator_type" ref="6bea55a4e94be2ab299de06dc266f3a3" args="" -->
+typedef Allocator::template <br>
+rebind< node >::other </td><td class="memItemRight" valign="bottom"><b>node_allocator_type</b></td></tr>
+
+<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="53a98a10a2adb33d91a286a487d0cd78"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::delete_node" ref="53a98a10a2adb33d91a286a487d0cd78" args="(node_base *n)" -->
+void </td><td class="memItemRight" valign="bottom"><b>delete_node</b> (node_base *n)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6d30c4c2698ea07ed6dd0e9eaf774b11"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::search_bucket" ref="6d30c4c2698ea07ed6dd0e9eaf774b11" args="(const key_type &key, bucket *b) const " -->
+node * </td><td class="memItemRight" valign="bottom"><b>search_bucket</b> (const key_type &key, bucket *b) const </td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="571d635fd206d9985cf20a1a659ea476"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::rehash_bucket" ref="571d635fd206d9985cf20a1a659ea476" args="(bucket *b_new, const hashcode_t h)" -->
+void </td><td class="memItemRight" valign="bottom"><b>rehash_bucket</b> (bucket *b_new, const hashcode_t h)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1f22480a290ddc6c145888d8f985531a"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::lookup" ref="1f22480a290ddc6c145888d8f985531a" args="(bool op_insert, const Key &key, const T *t, const_accessor *result, bool write)" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#1f22480a290ddc6c145888d8f985531a">lookup</a> (bool op_insert, const Key &key, const T *t, <a class="el" href="a00158.html">const_accessor</a> *result, bool write)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Insert or find item and optionally acquire a lock on the item. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="faad2108bd2be75e52293486af59f11e"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::exclude" ref="faad2108bd2be75e52293486af59f11e" args="(const_accessor &item_accessor, bool readonly)" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#faad2108bd2be75e52293486af59f11e">exclude</a> (<a class="el" href="a00158.html">const_accessor</a> &item_accessor, bool readonly)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">delete item by accessor <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="976c57edfb7f22b9f91a2e11f141eb4a"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::internal_equal_range" ref="976c57edfb7f22b9f91a2e11f141eb4a" args="(const Key &key, I end) const " -->
+template<typename I> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">std::pair< I, I > </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00155.html#976c57edfb7f22b9f91a2e11f141eb4a">internal_equal_range</a> (const Key &key, I end) const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns an iterator for an item defined by the key, or for the next item after it (if upper==true). <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3c27779fe66b79505390d084310d997e"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::internal_copy" ref="3c27779fe66b79505390d084310d997e" args="(const concurrent_hash_map &source)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#3c27779fe66b79505390d084310d997e">internal_copy</a> (const <a class="el" href="a00155.html">concurrent_hash_map</a> &source)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy "source" to *this, where *this must start out empty. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="cf43170691e36146a1bff61e3cf895ce"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::internal_copy" ref="cf43170691e36146a1bff61e3cf895ce" args="(I first, I last)" -->
+template<typename I> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>internal_copy</b> (I first, I last)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">const_pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html#2f76ed101a0ccc8875b846c2f747897e">internal_fast_find</a> (const Key &key) const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Fast find when no concurrent erasure is used. For internal use inside TBB only! <a href="#2f76ed101a0ccc8875b846c2f747897e"></a><br></td></tr>
+<tr><td colspan="2"><br><h2>Protected Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="252e91d8029f6308db7179557e3b1436"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::my_allocator" ref="252e91d8029f6308db7179557e3b1436" args="" -->
+node_allocator_type </td><td class="memItemRight" valign="bottom"><b>my_allocator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f738f241c8500ce3dbf0f9028ca8b602"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::my_hash_compare" ref="f738f241c8500ce3dbf0f9028ca8b602" args="" -->
+HashCompare </td><td class="memItemRight" valign="bottom"><b>my_hash_compare</b></td></tr>
<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05bffad9626d51abbd4bb82ae2a1cceb"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::internal::concurrent_queue_iterator" ref="05bffad9626d51abbd4bb82ae2a1cceb" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::concurrent_queue_iterator</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e24acd2f6849db3377a3942807639758"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::internal::hash_map_iterator" ref="e24acd2f6849db3377a3942807639758" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::hash_map_iterator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c94f21746c8902f7e0b5115a8d4da1d2"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::internal::hash_map_range" ref="c94f21746c8902f7e0b5115a8d4da1d2" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::hash_map_range</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c0028dfa75a6baa14007355ab1ef7fc"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::const_accessor" ref="2c0028dfa75a6baa14007355ab1ef7fc" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>const_accessor</b></td></tr>
<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>destroyer</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html">accessor</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Allows write access to elements and combines data access, locking, and garbage collection. <a href="a00156.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00157.html">bucket_accessor</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">bucket accessor is to find, rehash, acquire a lock, and access a bucket <a href="a00157.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00158.html">const_accessor</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Combines data access, locking, and garbage collection. <a href="a00158.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><b>node</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Class used to ensure exception-safety of method "pop". <br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T, class A = cache_aligned_allocator<T>><br>
- class tbb::concurrent_bounded_queue< T, A ></h3>
+<h3>template<typename Key, typename T, typename HashCompare, typename Allocator><br>
+ class tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></h3>
-A high-performance thread-safe blocking concurrent bounded queue.
+Unordered map from Key to T.
<p>
-This is the pre-PPL TBB concurrent queue which supports boundedness and blocking semantics. Note that method names agree with the PPL-style concurrent queue. Multiple threads may each push and pop concurrently. Assignment construction is not allowed.
+<a class="el" href="a00155.html">concurrent_hash_map</a> is associative container with concurrent access.<p>
+<dl compact><dt><b>Compatibility</b></dt><dd>The class meets all Container Requirements from C++ Standard (See ISO/IEC 14882:2003(E), clause 23.1).</dd></dl>
+<dl compact><dt><b>Exception Safety</b></dt><dd><ul>
+<li>Hash function is not permitted to throw an exception. User-defined types Key and T are forbidden from throwing an exception in destructors.</li><li>If exception happens during <a class="el" href="a00155.html#58c38b27273de6c670568633c0931854">insert()</a> operations, it has no effect (unless exception raised by HashCompare::hash() function during grow_segment).</li><li>If exception happens during <a class="el" href="a00155.html#2c0c42a2e1b5282b6739157df9ce2304">operator=()</a> operati [...]
+</dd></dl>
+<dl compact><dt><b>Changes since TBB 2.1</b></dt><dd><ul>
+<li>Replaced internal algorithm and data structure. Patent is pending.</li><li>Added buckets number argument for constructor</li></ul>
+</dd></dl>
+<dl compact><dt><b>Changes since TBB 2.0</b></dt><dd><ul>
+<li>Fixed exception-safety</li><li>Added template argument for allocator</li><li>Added allocator argument in constructors</li><li>Added constructor from a range of iterators</li><li>Added several new overloaded <a class="el" href="a00155.html#58c38b27273de6c670568633c0931854">insert()</a> methods</li><li>Added <a class="el" href="a00155.html#199208eed6f09e200cda364f906be0fe">get_allocator()</a></li><li>Added <a class="el" href="a00155.html#eddb0d2efe0b4f25a85c059e1c3dac15">swap()</a></li [...]
+</dd></dl>
+
<p>
-<hr><h2>Member Typedef Documentation</h2>
-<a class="anchor" name="a80e4c11dbb324e4b92a24a77bbcde68"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::size_type" ref="a80e4c11dbb324e4b92a24a77bbcde68" args="" -->
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="0f500842d0cf791f8fa61662edb1b311"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::erase" ref="0f500842d0cf791f8fa61662edb1b311" args="(accessor &item_accessor)" -->
<div class="memitem">
<div class="memproto">
<div class="memtemplate">
-template<typename T, class A = cache_aligned_allocator<T>> </div>
+template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
<table class="memname">
<tr>
- <td class="memname">typedef std::ptrdiff_t <a class="el" href="a00155.html">tbb::concurrent_bounded_queue</a>< T, A >::<a class="el" href="a00155.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> </td>
+ <td class="memname">bool <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::erase </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00156.html">accessor</a> & </td>
+ <td class="paramname"> <em>item_accessor</em> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>
-Integral type for representing size of the queue.
+Erase item by accessor.
<p>
-Notice that the size_type is a signed integral type. This is because the size can be negative if there are pending pops without corresponding pushes.
+Return true if item was erased by particularly this call.
</div>
</div><p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="41f4c6bd7a82ab070e840bbf81b0b123"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::pop" ref="41f4c6bd7a82ab070e840bbf81b0b123" args="(T &destination)" -->
+<a class="anchor" name="da7e4a50f6bb06191817425ec85fe760"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::erase" ref="da7e4a50f6bb06191817425ec85fe760" args="(const_accessor &item_accessor)" -->
<div class="memitem">
<div class="memproto">
<div class="memtemplate">
-template<typename T, class A = cache_aligned_allocator<T>> </div>
+template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
<table class="memname">
<tr>
- <td class="memname">void <a class="el" href="a00155.html">tbb::concurrent_bounded_queue</a>< T, A >::pop </td>
+ <td class="memname">bool <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::erase </td>
<td>(</td>
- <td class="paramtype">T & </td>
- <td class="paramname"> <em>destination</em> </td>
+ <td class="paramtype"><a class="el" href="a00158.html">const_accessor</a> & </td>
+ <td class="paramname"> <em>item_accessor</em> </td>
<td> ) </td>
<td width="100%"><code> [inline]</code></td>
</tr>
@@ -193,69 +334,112 @@ template<typename T, class A = cache_aligned_allocator<T>> </div>
<div class="memdoc">
<p>
-Dequeue item from head of queue.
+Erase item by <a class="el" href="a00158.html">const_accessor</a>.
<p>
-Block until an item becomes available, and then dequeue it.
+Return true if item was erased by particularly this call.
</div>
</div><p>
-<a class="anchor" name="f3c6c934f85fd02aedbc83a16943193b"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::set_capacity" ref="f3c6c934f85fd02aedbc83a16943193b" args="(size_type new_capacity)" -->
+<a class="anchor" name="034c3b3ee419edee78e0f2f2b1f0d7ca"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::erase" ref="034c3b3ee419edee78e0f2f2b1f0d7ca" args="(const Key &key)" -->
<div class="memitem">
<div class="memproto">
<div class="memtemplate">
-template<typename T, class A = cache_aligned_allocator<T>> </div>
+template<typename Key, typename T, typename HashCompare, typename A> </div>
<table class="memname">
<tr>
- <td class="memname">void <a class="el" href="a00155.html">tbb::concurrent_bounded_queue</a>< T, A >::set_capacity </td>
+ <td class="memname">bool <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map</a>< Key, T, HashCompare, A >::erase </td>
<td>(</td>
- <td class="paramtype"><a class="el" href="a00155.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> </td>
- <td class="paramname"> <em>new_capacity</em> </td>
+ <td class="paramtype">const Key & </td>
+ <td class="paramname"> <em>key</em> </td>
<td> ) </td>
- <td width="100%"><code> [inline]</code></td>
+ <td width="100%"></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>
-Set the capacity.
+Erase item.
<p>
-Setting the capacity to 0 causes subsequent try_push operations to always fail, and subsequent push operations to block forever.
+Return true if item was erased by particularly this call.
</div>
</div><p>
-<a class="anchor" name="7dc14d1a579a4cccda9f857585e1768d"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::size" ref="7dc14d1a579a4cccda9f857585e1768d" args="() const " -->
+<a class="anchor" name="bce7bdf46435115a95cca2aa73c5da83"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::find" ref="bce7bdf46435115a95cca2aa73c5da83" args="(accessor &result, const Key &key)" -->
<div class="memitem">
<div class="memproto">
<div class="memtemplate">
-template<typename T, class A = cache_aligned_allocator<T>> </div>
+template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
<table class="memname">
<tr>
- <td class="memname"><a class="el" href="a00155.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> <a class="el" href="a00155.html">tbb::concurrent_bounded_queue</a>< T, A >::size </td>
+ <td class="memname">bool <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::find </td>
<td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"> const<code> [inline]</code></td>
+ <td class="paramtype"><a class="el" href="a00156.html">accessor</a> & </td>
+ <td class="paramname"> <em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const Key & </td>
+ <td class="paramname"> <em>key</em></td><td> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td width="100%"><code> [inline]</code></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>
-Return number of pushes minus number of pops.
+Find item and acquire a write lock on the item.
<p>
-Note that the result can be negative if there are pops waiting for the corresponding pushes. The result can also exceed <a class="el" href="a00155.html#b2888b3e4e837d7e03f2c731963a402b">capacity()</a> if there are push operations in flight.
+Return true if item is found, false otherwise.
</div>
</div><p>
-<a class="anchor" name="0ca487019bbb00a196442aff78a1e4f7"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::try_pop" ref="0ca487019bbb00a196442aff78a1e4f7" args="(T &destination)" -->
+<a class="anchor" name="64338d7f2e35df586af4cb0145cd910f"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::find" ref="64338d7f2e35df586af4cb0145cd910f" args="(const_accessor &result, const Key &key) const " -->
<div class="memitem">
<div class="memproto">
<div class="memtemplate">
-template<typename T, class A = cache_aligned_allocator<T>> </div>
+template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
<table class="memname">
<tr>
- <td class="memname">bool <a class="el" href="a00155.html">tbb::concurrent_bounded_queue</a>< T, A >::try_pop </td>
+ <td class="memname">bool <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::find </td>
<td>(</td>
- <td class="paramtype">T & </td>
- <td class="paramname"> <em>destination</em> </td>
+ <td class="paramtype"><a class="el" href="a00158.html">const_accessor</a> & </td>
+ <td class="paramname"> <em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const Key & </td>
+ <td class="paramname"> <em>key</em></td><td> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td width="100%"> const<code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Find item and acquire a read lock on the item.
+<p>
+Return true if item is found, false otherwise.
+</div>
+</div><p>
+<a class="anchor" name="52bffd1066b3d7b793945bc6fa1a71a1"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::insert" ref="52bffd1066b3d7b793945bc6fa1a71a1" args="(const value_type &value)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert </td>
+ <td>(</td>
+ <td class="paramtype">const value_type & </td>
+ <td class="paramname"> <em>value</em> </td>
<td> ) </td>
<td width="100%"><code> [inline]</code></td>
</tr>
@@ -264,37 +448,193 @@ template<typename T, class A = cache_aligned_allocator<T>> </div>
<div class="memdoc">
<p>
-Attempt to dequeue an item from head of queue.
+Insert item by copying if there is no such key present already.
<p>
-Does not wait for item to become available. Returns true if successful; false otherwise.
+Returns true if item is inserted.
</div>
</div><p>
-<a class="anchor" name="2bd6232531279fb3ccbd296bea23066b"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::try_push" ref="2bd6232531279fb3ccbd296bea23066b" args="(const T &source)" -->
+<a class="anchor" name="a657e61cd2b13164764ca2708875784a"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::insert" ref="a657e61cd2b13164764ca2708875784a" args="(accessor &result, const value_type &value)" -->
<div class="memitem">
<div class="memproto">
<div class="memtemplate">
-template<typename T, class A = cache_aligned_allocator<T>> </div>
+template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
<table class="memname">
<tr>
- <td class="memname">bool <a class="el" href="a00155.html">tbb::concurrent_bounded_queue</a>< T, A >::try_push </td>
+ <td class="memname">bool <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert </td>
<td>(</td>
- <td class="paramtype">const T & </td>
- <td class="paramname"> <em>source</em> </td>
+ <td class="paramtype"><a class="el" href="a00156.html">accessor</a> & </td>
+ <td class="paramname"> <em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const value_type & </td>
+ <td class="paramname"> <em>value</em></td><td> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Insert item by copying if there is no such key present already and acquire a write lock on the item.
+<p>
+Returns true if item is new.
+</div>
+</div><p>
+<a class="anchor" name="d4a2816129e38c53128c6d0c7b6b7370"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::insert" ref="d4a2816129e38c53128c6d0c7b6b7370" args="(const_accessor &result, const value_type &value)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00158.html">const_accessor</a> & </td>
+ <td class="paramname"> <em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const value_type & </td>
+ <td class="paramname"> <em>value</em></td><td> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Insert item by copying if there is no such key present already and acquire a read lock on the item.
+<p>
+Returns true if item is new.
+</div>
+</div><p>
+<a class="anchor" name="ccfecaa3e71d92be61fb3d811dd264eb"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::insert" ref="ccfecaa3e71d92be61fb3d811dd264eb" args="(accessor &result, const Key &key)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00156.html">accessor</a> & </td>
+ <td class="paramname"> <em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const Key & </td>
+ <td class="paramname"> <em>key</em></td><td> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Insert item (if not already present) and acquire a write lock on the item.
+<p>
+Returns true if item is new.
+</div>
+</div><p>
+<a class="anchor" name="58c38b27273de6c670568633c0931854"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::insert" ref="58c38b27273de6c670568633c0931854" args="(const_accessor &result, const Key &key)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00158.html">const_accessor</a> & </td>
+ <td class="paramname"> <em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const Key & </td>
+ <td class="paramname"> <em>key</em></td><td> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Insert item (if not already present) and acquire a read lock on the item.
+<p>
+Returns true if item is new.
+</div>
+</div><p>
+<a class="anchor" name="2f76ed101a0ccc8875b846c2f747897e"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::internal_fast_find" ref="2f76ed101a0ccc8875b846c2f747897e" args="(const Key &key) const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">const_pointer <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::internal_fast_find </td>
+ <td>(</td>
+ <td class="paramtype">const Key & </td>
+ <td class="paramname"> <em>key</em> </td>
<td> ) </td>
- <td width="100%"><code> [inline]</code></td>
+ <td width="100%"> const<code> [inline, protected]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Fast find when no concurrent erasure is used. For internal use inside TBB only!
+<p>
+Return pointer to item with given key, or NULL if no such item exists. Must not be called concurrently with erasure operations.
+</div>
+</div><p>
+<a class="anchor" name="13f3f2e8de7564be03882c31559493c9"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::rehash" ref="13f3f2e8de7564be03882c31559493c9" args="(size_type n=0)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Key, typename T, typename HashCompare, typename A> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map</a>< Key, T, HashCompare, A >::rehash </td>
+ <td>(</td>
+ <td class="paramtype">size_type </td>
+ <td class="paramname"> <em>n</em> = <code>0</code> </td>
+ <td> ) </td>
+ <td width="100%"></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>
-Enqueue an item at tail of queue if queue is not already full.
+Rehashes and optionally resizes the whole table.
<p>
-Does not wait for queue to become not full. Returns true if item is pushed; false if queue was already full.
+Useful to optimize performance before or after concurrent operations. Also enables using of <a class="el" href="a00155.html#64338d7f2e35df586af4cb0145cd910f">find()</a> and <a class="el" href="a00155.html#74f5ef06a06c5e619f156a1c76c04969">count()</a> concurrent methods in serial context.
</div>
</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00335.html">concurrent_queue.h</a></ul>
+<li><a class="el" href="a00326.html">concurrent_hash_map.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00156.html b/doc/html/a00156.html
index 93a71f2..564906d 100644
--- a/doc/html/a00156.html
+++ b/doc/html/a00156.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator > Class Template Reference</title>
+<title>tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,620 +21,42 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00267.html">tbb</a>::<b>interface4</b>::<a class="el" href="a00156.html">concurrent_hash_map</a></div>
-<h1>tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator > Class Template Reference<br>
-<small>
-[<a class="el" href="a00275.html">Containers</a>]</small>
-</h1><!-- doxytag: class="tbb::interface4::concurrent_hash_map" -->Unordered map from Key to T.
+<a class="el" href="a00267.html">tbb</a>::<b>interface4</b>::<a class="el" href="a00155.html">concurrent_hash_map</a>::<a class="el" href="a00156.html">accessor</a></div>
+<h1>tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor Class Reference</h1><!-- doxytag: class="tbb::interface4::concurrent_hash_map::accessor" --><!-- doxytag: inherits="tbb::interface4::concurrent_hash_map::const_accessor" -->Allows write access to elements and combines data access, locking, and garbage collection.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00325.html">concurrent_hash_map.h</a>></code>
+<code>#include <<a class="el" href="a00326.html">concurrent_hash_map.h</a>></code>
<p>
-<a href="a00013.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor:
+<p><center><img src="a00156.png" usemap="#tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor_map" border="0" alt=""></center>
+<map name="tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor_map">
+<area href="a00158.html" alt="tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor" shape="rect" coords="0,0,530,24">
+</map>
+<a href="a00017.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="33b3b94e17dab45c97b246bca3625655"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::key_type" ref="33b3b94e17dab45c97b246bca3625655" args="" -->
-typedef Key </td><td class="memItemRight" valign="bottom"><b>key_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a5d75ef053d5e69de88ae7e941a743ec"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::mapped_type" ref="a5d75ef053d5e69de88ae7e941a743ec" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><b>mapped_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="01ebd1df398d3823ca6ea8fcb6b068ae"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::value_type" ref="01ebd1df398d3823ca6ea8fcb6b068ae" args="" -->
-typedef std::pair< const Key,<br>
- T > </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ae6bb63bc9cf97d63e78d208ae0e479d"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::size_type" ref="ae6bb63bc9cf97d63e78d208ae0e479d" args="" -->
-typedef hash_map_base::size_type </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2f5093a93592b0a30fda935711f9f788"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::difference_type" ref="2f5093a93592b0a30fda935711f9f788" args="" -->
-typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><b>difference_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1d1ffb83cae339007dc8d5b2e4e3cea8"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::pointer" ref="1d1ffb83cae339007dc8d5b2e4e3cea8" args="" -->
-typedef value_type * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ecf3dc1d6d8290a71639967ffa933343"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::const_pointer" ref="ecf3dc1d6d8290a71639967ffa933343" args="" -->
-typedef const value_type * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="14a3d74308b04a355b0689eb019ee683"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::reference" ref="14a3d74308b04a355b0689eb019ee683" args="" -->
-typedef value_type & </td><td class="memItemRight" valign="bottom"><b>reference</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1f6fcb68889829bca708d57f7b9e2da4"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::const_reference" ref="1f6fcb68889829bca708d57f7b9e2da4" args="" -->
-typedef const value_type & </td><td class="memItemRight" valign="bottom"><b>const_reference</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="118b95ebef79ac195fb99babbf335e8c"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::iterator" ref="118b95ebef79ac195fb99babbf335e8c" args="" -->
-typedef internal::hash_map_iterator<<br>
- <a class="el" href="a00156.html">concurrent_hash_map</a>, value_type > </td><td class="memItemRight" valign="bottom"><b>iterator</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5fec1af5576448740eb5c6119a30c6a9"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::const_iterator" ref="5fec1af5576448740eb5c6119a30c6a9" args="" -->
-typedef internal::hash_map_iterator<<br>
- <a class="el" href="a00156.html">concurrent_hash_map</a>, const <br>
-value_type > </td><td class="memItemRight" valign="bottom"><b>const_iterator</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="aa3d1bdabd5e9a15174624946048a2c8"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::range_type" ref="aa3d1bdabd5e9a15174624946048a2c8" args="" -->
-typedef internal::hash_map_range<<br>
- iterator > </td><td class="memItemRight" valign="bottom"><b>range_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="20981e8295ff79f4e3d8b76a16c42851"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::const_range_type" ref="20981e8295ff79f4e3d8b76a16c42851" args="" -->
-typedef internal::hash_map_range<<br>
- const_iterator > </td><td class="memItemRight" valign="bottom"><b>const_range_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f8d6e7e809e96f48fd039a54fc4df630"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::allocator_type" ref="f8d6e7e809e96f48fd039a54fc4df630" args="" -->
-typedef Allocator </td><td class="memItemRight" valign="bottom"><b>allocator_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="49eec74f272bab187d176c0d9d16a7fe"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::accessor::value_type" ref="49eec74f272bab187d176c0d9d16a7fe" args="" -->
+typedef concurrent_hash_map::value_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#49eec74f272bab187d176c0d9d16a7fe">value_type</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Type of value. <br></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d827bb5e4f61de1916ab67d51c7c6e60"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::concurrent_hash_map" ref="d827bb5e4f61de1916ab67d51c7c6e60" args="(const allocator_type &a=allocator_type())" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#d827bb5e4f61de1916ab67d51c7c6e60">concurrent_hash_map</a> (const allocator_type &a=allocator_type())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty table. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a4612d5c7233712d455496641e9b31ff"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::concurrent_hash_map" ref="a4612d5c7233712d455496641e9b31ff" args="(size_type n, const allocator_type &a=allocator_type())" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#a4612d5c7233712d455496641e9b31ff">concurrent_hash_map</a> (size_type n, const allocator_type &a=allocator_type())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty table with n preallocated buckets. This number serves also as initial concurrency level. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="df0cd14eaddb17f10929c91519e65be9"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::concurrent_hash_map" ref="df0cd14eaddb17f10929c91519e65be9" args="(const concurrent_hash_map &table, const allocator_type &a=allocator_type())" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#df0cd14eaddb17f10929c91519e65be9">concurrent_hash_map</a> (const <a class="el" href="a00156.html">concurrent_hash_map</a> &table, const allocator_type &a=allocator_type())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="3bfe75fcb350ce39cf610c164f233edc"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::concurrent_hash_map" ref="3bfe75fcb350ce39cf610c164f233edc" args="(I first, I last, const allocator_type &a=allocator_type())" -->
-template<typename I> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00156.html#3bfe75fcb350ce39cf610c164f233edc">concurrent_hash_map</a> (I first, I last, const allocator_type &a=allocator_type())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construction with copying iteration range and given allocator instance. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c0c42a2e1b5282b6739157df9ce2304"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::operator=" ref="2c0c42a2e1b5282b6739157df9ce2304" args="(const concurrent_hash_map &table)" -->
-<a class="el" href="a00156.html">concurrent_hash_map</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#2c0c42a2e1b5282b6739157df9ce2304">operator=</a> (const <a class="el" href="a00156.html">concurrent_hash_map</a> &table)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Assignment. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#13f3f2e8de7564be03882c31559493c9">rehash</a> (size_type n=0)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Rehashes and optionally resizes the whole table. <a href="#13f3f2e8de7564be03882c31559493c9"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a9f89be8fe28835749529d91081a2511"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::clear" ref="a9f89be8fe28835749529d91081a2511" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#a9f89be8fe28835749529d91081a2511">clear</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Clear table. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a1ac58997d8fbf242b266e3691573481"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::~concurrent_hash_map" ref="a1ac58997d8fbf242b266e3691573481" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#a1ac58997d8fbf242b266e3691573481">~concurrent_hash_map</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Clear table and destroy it. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1d279026ce93bbef47a5b8a028cd387b"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::range" ref="1d279026ce93bbef47a5b8a028cd387b" args="(size_type grainsize=1)" -->
-range_type </td><td class="memItemRight" valign="bottom"><b>range</b> (size_type grainsize=1)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="728c7aef8f1326f3f9ca6b4a6d1155cf"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::range" ref="728c7aef8f1326f3f9ca6b4a6d1155cf" args="(size_type grainsize=1) const " -->
-const_range_type </td><td class="memItemRight" valign="bottom"><b>range</b> (size_type grainsize=1) const </td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4a3c58cf1234b74ca796dcf555d32f53"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::begin" ref="4a3c58cf1234b74ca796dcf555d32f53" args="()" -->
-iterator </td><td class="memItemRight" valign="bottom"><b>begin</b> ()</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="28c690486d8db5783475f5b1a59d21bc"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::end" ref="28c690486d8db5783475f5b1a59d21bc" args="()" -->
-iterator </td><td class="memItemRight" valign="bottom"><b>end</b> ()</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="aa51c059c92aaf259916be74b928adb2"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::begin" ref="aa51c059c92aaf259916be74b928adb2" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><b>begin</b> () const </td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d2610bf00a3f631719308bdb59876f08"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::end" ref="d2610bf00a3f631719308bdb59876f08" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><b>end</b> () const </td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5faacd9a290b122947a21f72c676a0b9"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::equal_range" ref="5faacd9a290b122947a21f72c676a0b9" args="(const Key &key)" -->
-std::pair< iterator, iterator > </td><td class="memItemRight" valign="bottom"><b>equal_range</b> (const Key &key)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4abad08a1788b57a78698f16fab92838"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::equal_range" ref="4abad08a1788b57a78698f16fab92838" args="(const Key &key) const " -->
-std::pair< const_iterator,<br>
- const_iterator > </td><td class="memItemRight" valign="bottom"><b>equal_range</b> (const Key &key) const </td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="17fd8c5fe8c6a86075f34aa4e8412ba3"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::size" ref="17fd8c5fe8c6a86075f34aa4e8412ba3" args="() const " -->
-size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#17fd8c5fe8c6a86075f34aa4e8412ba3">size</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Number of items in table. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6cab7d029a3e73a653ef0faeac4d1586"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::empty" ref="6cab7d029a3e73a653ef0faeac4d1586" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#6cab7d029a3e73a653ef0faeac4d1586">empty</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">True if <a class="el" href="a00156.html#17fd8c5fe8c6a86075f34aa4e8412ba3">size()</a>==0. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1e45d3cbd1e2ae06f365f1b48e0df0b5"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::max_size" ref="1e45d3cbd1e2ae06f365f1b48e0df0b5" args="() const " -->
-size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#1e45d3cbd1e2ae06f365f1b48e0df0b5">max_size</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Upper bound on size. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="414d15033d36c63aa3a40666dc4d6f5e"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::bucket_count" ref="414d15033d36c63aa3a40666dc4d6f5e" args="() const " -->
-size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#414d15033d36c63aa3a40666dc4d6f5e">bucket_count</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the current number of buckets. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="199208eed6f09e200cda364f906be0fe"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::get_allocator" ref="199208eed6f09e200cda364f906be0fe" args="() const " -->
-allocator_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#199208eed6f09e200cda364f906be0fe">get_allocator</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">return allocator object <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eddb0d2efe0b4f25a85c059e1c3dac15"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::swap" ref="eddb0d2efe0b4f25a85c059e1c3dac15" args="(concurrent_hash_map &table)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#eddb0d2efe0b4f25a85c059e1c3dac15">swap</a> (<a class="el" href="a00156.html">concurrent_hash_map</a> &table)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">swap two instances. Iterators are invalidated <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="74f5ef06a06c5e619f156a1c76c04969"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::count" ref="74f5ef06a06c5e619f156a1c76c04969" args="(const Key &key) const " -->
-size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#74f5ef06a06c5e619f156a1c76c04969">count</a> (const Key &key) const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Return count of items (0 or 1). <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#64338d7f2e35df586af4cb0145cd910f">find</a> (<a class="el" href="a00159.html">const_accessor</a> &result, const Key &key) const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Find item and acquire a read lock on the item. <a href="#64338d7f2e35df586af4cb0145cd910f"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#bce7bdf46435115a95cca2aa73c5da83">find</a> (<a class="el" href="a00157.html">accessor</a> &result, const Key &key)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Find item and acquire a write lock on the item. <a href="#bce7bdf46435115a95cca2aa73c5da83"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#58c38b27273de6c670568633c0931854">insert</a> (<a class="el" href="a00159.html">const_accessor</a> &result, const Key &key)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Insert item (if not already present) and acquire a read lock on the item. <a href="#58c38b27273de6c670568633c0931854"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#ccfecaa3e71d92be61fb3d811dd264eb">insert</a> (<a class="el" href="a00157.html">accessor</a> &result, const Key &key)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Insert item (if not already present) and acquire a write lock on the item. <a href="#ccfecaa3e71d92be61fb3d811dd264eb"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#d4a2816129e38c53128c6d0c7b6b7370">insert</a> (<a class="el" href="a00159.html">const_accessor</a> &result, const value_type &value)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Insert item by copying if there is no such key present already and acquire a read lock on the item. <a href="#d4a2816129e38c53128c6d0c7b6b7370"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#a657e61cd2b13164764ca2708875784a">insert</a> (<a class="el" href="a00157.html">accessor</a> &result, const value_type &value)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Insert item by copying if there is no such key present already and acquire a write lock on the item. <a href="#a657e61cd2b13164764ca2708875784a"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#52bffd1066b3d7b793945bc6fa1a71a1">insert</a> (const value_type &value)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Insert item by copying if there is no such key present already. <a href="#52bffd1066b3d7b793945bc6fa1a71a1"></a><br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="cfe172677e5987004ef4a03e22fa338a"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::insert" ref="cfe172677e5987004ef4a03e22fa338a" args="(I first, I last)" -->
-template<typename I> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00156.html#cfe172677e5987004ef4a03e22fa338a">insert</a> (I first, I last)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Insert range [first, last). <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#034c3b3ee419edee78e0f2f2b1f0d7ca">erase</a> (const Key &key)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Erase item. <a href="#034c3b3ee419edee78e0f2f2b1f0d7ca"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#da7e4a50f6bb06191817425ec85fe760">erase</a> (<a class="el" href="a00159.html">const_accessor</a> &item_accessor)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Erase item by <a class="el" href="a00159.html">const_accessor</a>. <a href="#da7e4a50f6bb06191817425ec85fe760"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#0f500842d0cf791f8fa61662edb1b311">erase</a> (<a class="el" href="a00157.html">accessor</a> &item_accessor)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Erase item by accessor. <a href="#0f500842d0cf791f8fa61662edb1b311"></a><br></td></tr>
-<tr><td colspan="2"><br><h2>Protected Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6bea55a4e94be2ab299de06dc266f3a3"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::node_allocator_type" ref="6bea55a4e94be2ab299de06dc266f3a3" args="" -->
-typedef Allocator::template <br>
-rebind< node >::other </td><td class="memItemRight" valign="bottom"><b>node_allocator_type</b></td></tr>
-
-<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="53a98a10a2adb33d91a286a487d0cd78"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::delete_node" ref="53a98a10a2adb33d91a286a487d0cd78" args="(node_base *n)" -->
-void </td><td class="memItemRight" valign="bottom"><b>delete_node</b> (node_base *n)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6d30c4c2698ea07ed6dd0e9eaf774b11"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::search_bucket" ref="6d30c4c2698ea07ed6dd0e9eaf774b11" args="(const key_type &key, bucket *b) const " -->
-node * </td><td class="memItemRight" valign="bottom"><b>search_bucket</b> (const key_type &key, bucket *b) const </td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="571d635fd206d9985cf20a1a659ea476"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::rehash_bucket" ref="571d635fd206d9985cf20a1a659ea476" args="(bucket *b_new, const hashcode_t h)" -->
-void </td><td class="memItemRight" valign="bottom"><b>rehash_bucket</b> (bucket *b_new, const hashcode_t h)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1f22480a290ddc6c145888d8f985531a"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::lookup" ref="1f22480a290ddc6c145888d8f985531a" args="(bool op_insert, const Key &key, const T *t, const_accessor *result, bool write)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#1f22480a290ddc6c145888d8f985531a">lookup</a> (bool op_insert, const Key &key, const T *t, <a class="el" href="a00159.html">const_accessor</a> *result, bool write)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e8938f0cd1211e88a1d73527ed3636c4"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::accessor::operator *" ref="e8938f0cd1211e88a1d73527ed3636c4" args="() const " -->
+reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#e8938f0cd1211e88a1d73527ed3636c4">operator *</a> () const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Insert or find item and optionally acquire a lock on the item. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="faad2108bd2be75e52293486af59f11e"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::exclude" ref="faad2108bd2be75e52293486af59f11e" args="(const_accessor &item_accessor, bool readonly)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#faad2108bd2be75e52293486af59f11e">exclude</a> (<a class="el" href="a00159.html">const_accessor</a> &item_accessor, bool readonly)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">delete item by accessor <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="976c57edfb7f22b9f91a2e11f141eb4a"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::internal_equal_range" ref="976c57edfb7f22b9f91a2e11f141eb4a" args="(const Key &key, I end) const " -->
-template<typename I> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">std::pair< I, I > </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00156.html#976c57edfb7f22b9f91a2e11f141eb4a">internal_equal_range</a> (const Key &key, I end) const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns an iterator for an item defined by the key, or for the next item after it (if upper==true). <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3c27779fe66b79505390d084310d997e"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::internal_copy" ref="3c27779fe66b79505390d084310d997e" args="(const concurrent_hash_map &source)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#3c27779fe66b79505390d084310d997e">internal_copy</a> (const <a class="el" href="a00156.html">concurrent_hash_map</a> &source)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy "source" to *this, where *this must start out empty. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="cf43170691e36146a1bff61e3cf895ce"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::internal_copy" ref="cf43170691e36146a1bff61e3cf895ce" args="(I first, I last)" -->
-template<typename I> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>internal_copy</b> (I first, I last)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">const_pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#2f76ed101a0ccc8875b846c2f747897e">internal_fast_find</a> (const Key &key) const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Fast find when no concurrent erasure is used. For internal use inside TBB only! <a href="#2f76ed101a0ccc8875b846c2f747897e"></a><br></td></tr>
-<tr><td colspan="2"><br><h2>Protected Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="252e91d8029f6308db7179557e3b1436"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::my_allocator" ref="252e91d8029f6308db7179557e3b1436" args="" -->
-node_allocator_type </td><td class="memItemRight" valign="bottom"><b>my_allocator</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f738f241c8500ce3dbf0f9028ca8b602"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::my_hash_compare" ref="f738f241c8500ce3dbf0f9028ca8b602" args="" -->
-HashCompare </td><td class="memItemRight" valign="bottom"><b>my_hash_compare</b></td></tr>
-
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e24acd2f6849db3377a3942807639758"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::internal::hash_map_iterator" ref="e24acd2f6849db3377a3942807639758" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::hash_map_iterator</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c94f21746c8902f7e0b5115a8d4da1d2"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::internal::hash_map_range" ref="c94f21746c8902f7e0b5115a8d4da1d2" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::hash_map_range</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c0028dfa75a6baa14007355ab1ef7fc"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::const_accessor" ref="2c0028dfa75a6baa14007355ab1ef7fc" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>const_accessor</b></td></tr>
-
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00157.html">accessor</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Allows write access to elements and combines data access, locking, and garbage collection. <a href="a00157.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00158.html">bucket_accessor</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">bucket accessor is to find, rehash, acquire a lock, and access a bucket <a href="a00158.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00159.html">const_accessor</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Combines data access, locking, and garbage collection. <a href="a00159.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><b>node</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Return reference to associated value in hash table. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fcebc32c020202cc37e60eadef157569"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::accessor::operator->" ref="fcebc32c020202cc37e60eadef157569" args="() const " -->
+pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html#fcebc32c020202cc37e60eadef157569">operator-></a> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Return pointer to associated value in hash table. <br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
<h3>template<typename Key, typename T, typename HashCompare, typename Allocator><br>
- class tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></h3>
-
-Unordered map from Key to T.
-<p>
-<a class="el" href="a00156.html">concurrent_hash_map</a> is associative container with concurrent access.<p>
-<dl compact><dt><b>Compatibility</b></dt><dd>The class meets all Container Requirements from C++ Standard (See ISO/IEC 14882:2003(E), clause 23.1).</dd></dl>
-<dl compact><dt><b>Exception Safety</b></dt><dd><ul>
-<li>Hash function is not permitted to throw an exception. User-defined types Key and T are forbidden from throwing an exception in destructors.</li><li>If exception happens during <a class="el" href="a00156.html#58c38b27273de6c670568633c0931854">insert()</a> operations, it has no effect (unless exception raised by HashCompare::hash() function during grow_segment).</li><li>If exception happens during <a class="el" href="a00156.html#2c0c42a2e1b5282b6739157df9ce2304">operator=()</a> operati [...]
-</dd></dl>
-<dl compact><dt><b>Changes since TBB 2.1</b></dt><dd><ul>
-<li>Replaced internal algorithm and data structure. Patent is pending.</li><li>Added buckets number argument for constructor</li></ul>
-</dd></dl>
-<dl compact><dt><b>Changes since TBB 2.0</b></dt><dd><ul>
-<li>Fixed exception-safety</li><li>Added template argument for allocator</li><li>Added allocator argument in constructors</li><li>Added constructor from a range of iterators</li><li>Added several new overloaded <a class="el" href="a00156.html#58c38b27273de6c670568633c0931854">insert()</a> methods</li><li>Added <a class="el" href="a00156.html#199208eed6f09e200cda364f906be0fe">get_allocator()</a></li><li>Added <a class="el" href="a00156.html#eddb0d2efe0b4f25a85c059e1c3dac15">swap()</a></li [...]
-</dd></dl>
-
-<p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="0f500842d0cf791f8fa61662edb1b311"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::erase" ref="0f500842d0cf791f8fa61662edb1b311" args="(accessor &item_accessor)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::erase </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00157.html">accessor</a> & </td>
- <td class="paramname"> <em>item_accessor</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Erase item by accessor.
-<p>
-Return true if item was erased by particularly this call.
-</div>
-</div><p>
-<a class="anchor" name="da7e4a50f6bb06191817425ec85fe760"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::erase" ref="da7e4a50f6bb06191817425ec85fe760" args="(const_accessor &item_accessor)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::erase </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00159.html">const_accessor</a> & </td>
- <td class="paramname"> <em>item_accessor</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Erase item by <a class="el" href="a00159.html">const_accessor</a>.
-<p>
-Return true if item was erased by particularly this call.
-</div>
-</div><p>
-<a class="anchor" name="034c3b3ee419edee78e0f2f2b1f0d7ca"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::erase" ref="034c3b3ee419edee78e0f2f2b1f0d7ca" args="(const Key &key)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Key, typename T, typename HashCompare, typename A> </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map</a>< Key, T, HashCompare, A >::erase </td>
- <td>(</td>
- <td class="paramtype">const Key & </td>
- <td class="paramname"> <em>key</em> </td>
- <td> ) </td>
- <td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Erase item.
-<p>
-Return true if item was erased by particularly this call.
-</div>
-</div><p>
-<a class="anchor" name="bce7bdf46435115a95cca2aa73c5da83"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::find" ref="bce7bdf46435115a95cca2aa73c5da83" args="(accessor &result, const Key &key)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::find </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00157.html">accessor</a> & </td>
- <td class="paramname"> <em>result</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">const Key & </td>
- <td class="paramname"> <em>key</em></td><td> </td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
+ class tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</h3>
+Allows write access to elements and combines data access, locking, and garbage collection.
<p>
-Find item and acquire a write lock on the item.
-<p>
-Return true if item is found, false otherwise.
-</div>
-</div><p>
-<a class="anchor" name="64338d7f2e35df586af4cb0145cd910f"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::find" ref="64338d7f2e35df586af4cb0145cd910f" args="(const_accessor &result, const Key &key) const " -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::find </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00159.html">const_accessor</a> & </td>
- <td class="paramname"> <em>result</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">const Key & </td>
- <td class="paramname"> <em>key</em></td><td> </td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"> const<code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Find item and acquire a read lock on the item.
-<p>
-Return true if item is found, false otherwise.
-</div>
-</div><p>
-<a class="anchor" name="52bffd1066b3d7b793945bc6fa1a71a1"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::insert" ref="52bffd1066b3d7b793945bc6fa1a71a1" args="(const value_type &value)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert </td>
- <td>(</td>
- <td class="paramtype">const value_type & </td>
- <td class="paramname"> <em>value</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Insert item by copying if there is no such key present already.
-<p>
-Returns true if item is inserted.
-</div>
-</div><p>
-<a class="anchor" name="a657e61cd2b13164764ca2708875784a"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::insert" ref="a657e61cd2b13164764ca2708875784a" args="(accessor &result, const value_type &value)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00157.html">accessor</a> & </td>
- <td class="paramname"> <em>result</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">const value_type & </td>
- <td class="paramname"> <em>value</em></td><td> </td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Insert item by copying if there is no such key present already and acquire a write lock on the item.
-<p>
-Returns true if item is new.
-</div>
-</div><p>
-<a class="anchor" name="d4a2816129e38c53128c6d0c7b6b7370"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::insert" ref="d4a2816129e38c53128c6d0c7b6b7370" args="(const_accessor &result, const value_type &value)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00159.html">const_accessor</a> & </td>
- <td class="paramname"> <em>result</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">const value_type & </td>
- <td class="paramname"> <em>value</em></td><td> </td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Insert item by copying if there is no such key present already and acquire a read lock on the item.
-<p>
-Returns true if item is new.
-</div>
-</div><p>
-<a class="anchor" name="ccfecaa3e71d92be61fb3d811dd264eb"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::insert" ref="ccfecaa3e71d92be61fb3d811dd264eb" args="(accessor &result, const Key &key)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00157.html">accessor</a> & </td>
- <td class="paramname"> <em>result</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">const Key & </td>
- <td class="paramname"> <em>key</em></td><td> </td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Insert item (if not already present) and acquire a write lock on the item.
-<p>
-Returns true if item is new.
-</div>
-</div><p>
-<a class="anchor" name="58c38b27273de6c670568633c0931854"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::insert" ref="58c38b27273de6c670568633c0931854" args="(const_accessor &result, const Key &key)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00159.html">const_accessor</a> & </td>
- <td class="paramname"> <em>result</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">const Key & </td>
- <td class="paramname"> <em>key</em></td><td> </td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Insert item (if not already present) and acquire a read lock on the item.
-<p>
-Returns true if item is new.
-</div>
-</div><p>
-<a class="anchor" name="2f76ed101a0ccc8875b846c2f747897e"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::internal_fast_find" ref="2f76ed101a0ccc8875b846c2f747897e" args="(const Key &key) const " -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
- <table class="memname">
- <tr>
- <td class="memname">const_pointer <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::internal_fast_find </td>
- <td>(</td>
- <td class="paramtype">const Key & </td>
- <td class="paramname"> <em>key</em> </td>
- <td> ) </td>
- <td width="100%"> const<code> [inline, protected]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Fast find when no concurrent erasure is used. For internal use inside TBB only!
-<p>
-Return pointer to item with given key, or NULL if no such item exists. Must not be called concurrently with erasure operations.
-</div>
-</div><p>
-<a class="anchor" name="13f3f2e8de7564be03882c31559493c9"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::rehash" ref="13f3f2e8de7564be03882c31559493c9" args="(size_type n=0)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Key, typename T, typename HashCompare, typename A> </div>
- <table class="memname">
- <tr>
- <td class="memname">void <a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map</a>< Key, T, HashCompare, A >::rehash </td>
- <td>(</td>
- <td class="paramtype">size_type </td>
- <td class="paramname"> <em>n</em> = <code>0</code> </td>
- <td> ) </td>
- <td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Rehashes and optionally resizes the whole table.
-<p>
-Useful to optimize performance before or after concurrent operations. Also enables using of <a class="el" href="a00156.html#64338d7f2e35df586af4cb0145cd910f">find()</a> and <a class="el" href="a00156.html#74f5ef06a06c5e619f156a1c76c04969">count()</a> concurrent methods in serial context.
-</div>
-</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00325.html">concurrent_hash_map.h</a></ul>
+<li><a class="el" href="a00326.html">concurrent_hash_map.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00157.png b/doc/html/a00156.png
similarity index 100%
rename from doc/html/a00157.png
rename to doc/html/a00156.png
diff --git a/doc/html/a00157.html b/doc/html/a00157.html
index ca7109f..c4054ce 100644
--- a/doc/html/a00157.html
+++ b/doc/html/a00157.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor Class Reference</title>
+<title>tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,42 +21,42 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00267.html">tbb</a>::<b>interface4</b>::<a class="el" href="a00156.html">concurrent_hash_map</a>::<a class="el" href="a00157.html">accessor</a></div>
-<h1>tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor Class Reference</h1><!-- doxytag: class="tbb::interface4::concurrent_hash_map::accessor" --><!-- doxytag: inherits="tbb::interface4::concurrent_hash_map::const_accessor" -->Allows write access to elements and combines data access, locking, and garbage collection.
+<a class="el" href="a00267.html">tbb</a>::<b>interface4</b>::<a class="el" href="a00155.html">concurrent_hash_map</a>::<a class="el" href="a00157.html">bucket_accessor</a></div>
+<h1>tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor Class Reference</h1><!-- doxytag: class="tbb::interface4::concurrent_hash_map::bucket_accessor" -->bucket accessor is to find, rehash, acquire a lock, and access a bucket
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00325.html">concurrent_hash_map.h</a>></code>
+<code>#include <<a class="el" href="a00326.html">concurrent_hash_map.h</a>></code>
<p>
-<p>Inheritance diagram for tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor:
-<p><center><img src="a00157.png" usemap="#tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor_map" border="0" alt=""></center>
-<map name="tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor_map">
-<area href="a00159.html" alt="tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor" shape="rect" coords="0,0,530,24">
-</map>
-<a href="a00017.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00015.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="49eec74f272bab187d176c0d9d16a7fe"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::accessor::value_type" ref="49eec74f272bab187d176c0d9d16a7fe" args="" -->
-typedef concurrent_hash_map::value_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00157.html#49eec74f272bab187d176c0d9d16a7fe">value_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Type of value. <br></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e8938f0cd1211e88a1d73527ed3636c4"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::accessor::operator *" ref="e8938f0cd1211e88a1d73527ed3636c4" args="() const " -->
-reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00157.html#e8938f0cd1211e88a1d73527ed3636c4">operator *</a> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5aa0b492fb4260a940ea7bda2ef486e2"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::bucket_accessor::bucket_accessor" ref="5aa0b492fb4260a940ea7bda2ef486e2" args="(concurrent_hash_map *base, const hashcode_t h, bool writer=false)" -->
+ </td><td class="memItemRight" valign="bottom"><b>bucket_accessor</b> (<a class="el" href="a00155.html">concurrent_hash_map</a> *base, const hashcode_t h, bool writer=false)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="26b4fe0ca87a7ad4852cb787db880119"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::bucket_accessor::acquire" ref="26b4fe0ca87a7ad4852cb787db880119" args="(concurrent_hash_map *base, const hashcode_t h, bool writer=false)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00157.html#26b4fe0ca87a7ad4852cb787db880119">acquire</a> (<a class="el" href="a00155.html">concurrent_hash_map</a> *base, const hashcode_t h, bool writer=false)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">find a bucket by masked hashcode, optionally rehash, and acquire the lock <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fc194e3a186dc935a5fb513cc9f8e898"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::bucket_accessor::is_writer" ref="fc194e3a186dc935a5fb513cc9f8e898" args="()" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00157.html#fc194e3a186dc935a5fb513cc9f8e898">is_writer</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">check whether bucket is locked for write <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="57c6110bd20e95c06de5a199de988941"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::bucket_accessor::operator()" ref="57c6110bd20e95c06de5a199de988941" args="()" -->
+bucket * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00157.html#57c6110bd20e95c06de5a199de988941">operator()</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Return reference to associated value in hash table. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fcebc32c020202cc37e60eadef157569"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::accessor::operator->" ref="fcebc32c020202cc37e60eadef157569" args="() const " -->
-pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="a00157.html#fcebc32c020202cc37e60eadef157569">operator-></a> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">get bucket pointer <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8f7f0dc61f528de29d06e6054b4a9835"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::bucket_accessor::upgrade_to_writer" ref="8f7f0dc61f528de29d06e6054b4a9835" args="()" -->
+bool </td><td class="memItemRight" valign="bottom"><b>upgrade_to_writer</b> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Return pointer to associated value in hash table. <br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
<h3>template<typename Key, typename T, typename HashCompare, typename Allocator><br>
- class tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</h3>
+ class tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</h3>
-Allows write access to elements and combines data access, locking, and garbage collection.
+bucket accessor is to find, rehash, acquire a lock, and access a bucket
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00325.html">concurrent_hash_map.h</a></ul>
+<li><a class="el" href="a00326.html">concurrent_hash_map.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00158.html b/doc/html/a00158.html
index 30be5c2..1cd874b 100644
--- a/doc/html/a00158.html
+++ b/doc/html/a00158.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor Class Reference</title>
+<title>tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,42 +21,65 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00267.html">tbb</a>::<b>interface4</b>::<a class="el" href="a00156.html">concurrent_hash_map</a>::<a class="el" href="a00158.html">bucket_accessor</a></div>
-<h1>tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor Class Reference</h1><!-- doxytag: class="tbb::interface4::concurrent_hash_map::bucket_accessor" -->bucket accessor is to find, rehash, acquire a lock, and access a bucket
+<a class="el" href="a00267.html">tbb</a>::<b>interface4</b>::<a class="el" href="a00155.html">concurrent_hash_map</a>::<a class="el" href="a00158.html">const_accessor</a></div>
+<h1>tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor Class Reference</h1><!-- doxytag: class="tbb::interface4::concurrent_hash_map::const_accessor" -->Combines data access, locking, and garbage collection.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00325.html">concurrent_hash_map.h</a>></code>
+<code>#include <<a class="el" href="a00326.html">concurrent_hash_map.h</a>></code>
<p>
-<a href="a00015.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor:
+<p><center><img src="a00158.png" usemap="#tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor_map" border="0" alt=""></center>
+<map name="tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor_map">
+<area href="a00156.html" alt="tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor" shape="rect" coords="0,56,530,80">
+</map>
+<a href="a00016.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="48647ca0d79c1233b997f5768403c926"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::const_accessor::value_type" ref="48647ca0d79c1233b997f5768403c926" args="" -->
+typedef const concurrent_hash_map::value_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00158.html#48647ca0d79c1233b997f5768403c926">value_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Type of value. <br></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5aa0b492fb4260a940ea7bda2ef486e2"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::bucket_accessor::bucket_accessor" ref="5aa0b492fb4260a940ea7bda2ef486e2" args="(concurrent_hash_map *base, const hashcode_t h, bool writer=false)" -->
- </td><td class="memItemRight" valign="bottom"><b>bucket_accessor</b> (<a class="el" href="a00156.html">concurrent_hash_map</a> *base, const hashcode_t h, bool writer=false)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5cce3104cb0a52e08d2131370871c614"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::const_accessor::empty" ref="5cce3104cb0a52e08d2131370871c614" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00158.html#5cce3104cb0a52e08d2131370871c614">empty</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">True if result is empty. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d5ce4f88d8870290238a8ad621e6f270"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::const_accessor::release" ref="d5ce4f88d8870290238a8ad621e6f270" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00158.html#d5ce4f88d8870290238a8ad621e6f270">release</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Set to null. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="30f31106840700a4c3664b9cb1c31ca7"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::const_accessor::operator *" ref="30f31106840700a4c3664b9cb1c31ca7" args="() const " -->
+const_reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00158.html#30f31106840700a4c3664b9cb1c31ca7">operator *</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Return reference to associated value in hash table. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3d03a48ecb8cd9549bd8be64b09c9b0d"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::const_accessor::operator->" ref="3d03a48ecb8cd9549bd8be64b09c9b0d" args="() const " -->
+const_pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="a00158.html#3d03a48ecb8cd9549bd8be64b09c9b0d">operator-></a> () const </td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="26b4fe0ca87a7ad4852cb787db880119"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::bucket_accessor::acquire" ref="26b4fe0ca87a7ad4852cb787db880119" args="(concurrent_hash_map *base, const hashcode_t h, bool writer=false)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00158.html#26b4fe0ca87a7ad4852cb787db880119">acquire</a> (<a class="el" href="a00156.html">concurrent_hash_map</a> *base, const hashcode_t h, bool writer=false)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Return pointer to associated value in hash table. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a9ead65cca68d4c49c7ef64d7899a4c8"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::const_accessor::const_accessor" ref="a9ead65cca68d4c49c7ef64d7899a4c8" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00158.html#a9ead65cca68d4c49c7ef64d7899a4c8">const_accessor</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">find a bucket by masked hashcode, optionally rehash, and acquire the lock <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fc194e3a186dc935a5fb513cc9f8e898"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::bucket_accessor::is_writer" ref="fc194e3a186dc935a5fb513cc9f8e898" args="()" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00158.html#fc194e3a186dc935a5fb513cc9f8e898">is_writer</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Create empty result. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="752b0c1ec74b94786403a75e42917d01"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::const_accessor::~const_accessor" ref="752b0c1ec74b94786403a75e42917d01" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00158.html#752b0c1ec74b94786403a75e42917d01">~const_accessor</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">check whether bucket is locked for write <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="57c6110bd20e95c06de5a199de988941"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::bucket_accessor::operator()" ref="57c6110bd20e95c06de5a199de988941" args="()" -->
-bucket * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00158.html#57c6110bd20e95c06de5a199de988941">operator()</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy result after releasing the underlying reference. <br></td></tr>
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d062d8ecb243a6ec62fa30bca52a1bcf"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::const_accessor::concurrent_hash_map< Key, T, HashCompare, Allocator >" ref="d062d8ecb243a6ec62fa30bca52a1bcf" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>concurrent_hash_map< Key, T, HashCompare, Allocator ></b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">get bucket pointer <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8f7f0dc61f528de29d06e6054b4a9835"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::bucket_accessor::upgrade_to_writer" ref="8f7f0dc61f528de29d06e6054b4a9835" args="()" -->
-bool </td><td class="memItemRight" valign="bottom"><b>upgrade_to_writer</b> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ddd77aff56c12366acc02d0f1588a706"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::const_accessor::accessor" ref="ddd77aff56c12366acc02d0f1588a706" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>accessor</b></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
<h3>template<typename Key, typename T, typename HashCompare, typename Allocator><br>
- class tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</h3>
+ class tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</h3>
-bucket accessor is to find, rehash, acquire a lock, and access a bucket
+Combines data access, locking, and garbage collection.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00325.html">concurrent_hash_map.h</a></ul>
+<li><a class="el" href="a00326.html">concurrent_hash_map.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00159.png b/doc/html/a00158.png
similarity index 100%
rename from doc/html/a00159.png
rename to doc/html/a00158.png
diff --git a/doc/html/a00159.html b/doc/html/a00159.html
index 1a98f62..ba24fd5 100644
--- a/doc/html/a00159.html
+++ b/doc/html/a00159.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor Class Reference</title>
+<title>tbb::strict_ppl::concurrent_queue< T, A > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,65 +21,143 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00267.html">tbb</a>::<b>interface4</b>::<a class="el" href="a00156.html">concurrent_hash_map</a>::<a class="el" href="a00159.html">const_accessor</a></div>
-<h1>tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor Class Reference</h1><!-- doxytag: class="tbb::interface4::concurrent_hash_map::const_accessor" -->Combines data access, locking, and garbage collection.
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00274.html">strict_ppl</a>::<a class="el" href="a00159.html">concurrent_queue</a></div>
+<h1>tbb::strict_ppl::concurrent_queue< T, A > Class Template Reference<br>
+<small>
+[<a class="el" href="a00276.html">Containers</a>]</small>
+</h1><!-- doxytag: class="tbb::strict_ppl::concurrent_queue" -->A high-performance thread-safe non-blocking concurrent queue.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00325.html">concurrent_hash_map.h</a>></code>
+<code>#include <<a class="el" href="a00336.html">concurrent_queue.h</a>></code>
<p>
-<p>Inheritance diagram for tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor:
-<p><center><img src="a00159.png" usemap="#tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor_map" border="0" alt=""></center>
-<map name="tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor_map">
-<area href="a00157.html" alt="tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor" shape="rect" coords="0,56,530,80">
-</map>
-<a href="a00016.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00018.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="48647ca0d79c1233b997f5768403c926"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::const_accessor::value_type" ref="48647ca0d79c1233b997f5768403c926" args="" -->
-typedef const concurrent_hash_map::value_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00159.html#48647ca0d79c1233b997f5768403c926">value_type</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="682c3978d5cb0620000994f11c44a476"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::value_type" ref="682c3978d5cb0620000994f11c44a476" args="" -->
+typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00159.html#682c3978d5cb0620000994f11c44a476">value_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Element type in the queue. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a8d725c50a9834bb7af5b67c0aff92b8"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::reference" ref="a8d725c50a9834bb7af5b67c0aff92b8" args="" -->
+typedef T & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00159.html#a8d725c50a9834bb7af5b67c0aff92b8">reference</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Reference type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4d48e7ff93f81636bca2c74f7da34750"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::const_reference" ref="4d48e7ff93f81636bca2c74f7da34750" args="" -->
+typedef const T & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00159.html#4d48e7ff93f81636bca2c74f7da34750">const_reference</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Const reference type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8fc30e93f8342a1960357f71e4fe8a2b"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::size_type" ref="8fc30e93f8342a1960357f71e4fe8a2b" args="" -->
+typedef size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00159.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Integral type for representing size of the queue. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="068576d16c7e4e05d52f9db7a45b5b65"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::difference_type" ref="068576d16c7e4e05d52f9db7a45b5b65" args="" -->
+typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00159.html#068576d16c7e4e05d52f9db7a45b5b65">difference_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Difference type for iterator. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5a3956341728eaa558d8827063718cac"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::allocator_type" ref="5a3956341728eaa558d8827063718cac" args="" -->
+typedef A </td><td class="memItemRight" valign="bottom"><a class="el" href="a00159.html#5a3956341728eaa558d8827063718cac">allocator_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Allocator type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9736ac047d6da3363895c7e5b121d0c4"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::iterator" ref="9736ac047d6da3363895c7e5b121d0c4" args="" -->
+typedef internal::concurrent_queue_iterator<<br>
+ <a class="el" href="a00159.html">concurrent_queue</a>, T > </td><td class="memItemRight" valign="bottom"><b>iterator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9cd76d19af8c78be1bafc6ca0123ac0d"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::const_iterator" ref="9cd76d19af8c78be1bafc6ca0123ac0d" args="" -->
+typedef internal::concurrent_queue_iterator<<br>
+ <a class="el" href="a00159.html">concurrent_queue</a>, const T > </td><td class="memItemRight" valign="bottom"><b>const_iterator</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Type of value. <br></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5cce3104cb0a52e08d2131370871c614"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::const_accessor::empty" ref="5cce3104cb0a52e08d2131370871c614" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00159.html#5cce3104cb0a52e08d2131370871c614">empty</a> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7c48a05a94a1f4f98fdfadfbef98ecf6"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::concurrent_queue" ref="7c48a05a94a1f4f98fdfadfbef98ecf6" args="(const allocator_type &a=allocator_type())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00159.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a> (const <a class="el" href="a00159.html#5a3956341728eaa558d8827063718cac">allocator_type</a> &a=<a class="el" href="a00159.html#5a3956341728eaa558d8827063718cac">allocator_type</a>())</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">True if result is empty. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d5ce4f88d8870290238a8ad621e6f270"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::const_accessor::release" ref="d5ce4f88d8870290238a8ad621e6f270" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00159.html#d5ce4f88d8870290238a8ad621e6f270">release</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty queue. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="25209656c84f2f9b030e2f9162713341"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::concurrent_queue" ref="25209656c84f2f9b030e2f9162713341" args="(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())" -->
+template<typename InputIterator> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00159.html#25209656c84f2f9b030e2f9162713341">concurrent_queue</a> (InputIterator begin, InputIterator end, const <a class="el" href="a00159.html#5a3956341728eaa558d8827063718cac">allocator_type</a> &a=<a class="el" href="a00159.html#5a3956341728eaa558d8827063718cac">allocator_type</a>())</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Set to null. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="30f31106840700a4c3664b9cb1c31ca7"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::const_accessor::operator *" ref="30f31106840700a4c3664b9cb1c31ca7" args="() const " -->
-const_reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00159.html#30f31106840700a4c3664b9cb1c31ca7">operator *</a> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">[begin,end) constructor <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8a6b98ea11a867db8ac868f0113ca429"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::concurrent_queue" ref="8a6b98ea11a867db8ac868f0113ca429" args="(const concurrent_queue &src, const allocator_type &a=allocator_type())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00159.html#8a6b98ea11a867db8ac868f0113ca429">concurrent_queue</a> (const <a class="el" href="a00159.html">concurrent_queue</a> &src, const <a class="el" href="a00159.html#5a3956341728eaa558d8827063718cac">allocator_type</a> &a=<a class="el" href="a00159.html#5a3956341728eaa558d8827063718cac">allocator_type</a>())</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Return reference to associated value in hash table. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3d03a48ecb8cd9549bd8be64b09c9b0d"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::const_accessor::operator->" ref="3d03a48ecb8cd9549bd8be64b09c9b0d" args="() const " -->
-const_pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="a00159.html#3d03a48ecb8cd9549bd8be64b09c9b0d">operator-></a> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="830b33753d6b149c366344e29b2edd8c"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::~concurrent_queue" ref="830b33753d6b149c366344e29b2edd8c" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00159.html#830b33753d6b149c366344e29b2edd8c">~concurrent_queue</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Return pointer to associated value in hash table. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a9ead65cca68d4c49c7ef64d7899a4c8"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::const_accessor::const_accessor" ref="a9ead65cca68d4c49c7ef64d7899a4c8" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00159.html#a9ead65cca68d4c49c7ef64d7899a4c8">const_accessor</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy queue. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="73c47563ffcc4c2f6452f25a04ebe2e2"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::push" ref="73c47563ffcc4c2f6452f25a04ebe2e2" args="(const T &source)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00159.html#73c47563ffcc4c2f6452f25a04ebe2e2">push</a> (const T &source)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Create empty result. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="752b0c1ec74b94786403a75e42917d01"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::const_accessor::~const_accessor" ref="752b0c1ec74b94786403a75e42917d01" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00159.html#752b0c1ec74b94786403a75e42917d01">~const_accessor</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Enqueue an item at tail of queue. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00159.html#ae31ca0db34ef96ef1e74aa0d28c95f8">try_pop</a> (T &result)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy result after releasing the underlying reference. <br></td></tr>
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d062d8ecb243a6ec62fa30bca52a1bcf"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::const_accessor::concurrent_hash_map< Key, T, HashCompare, Allocator >" ref="d062d8ecb243a6ec62fa30bca52a1bcf" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>concurrent_hash_map< Key, T, HashCompare, Allocator ></b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Attempt to dequeue an item from head of queue. <a href="#ae31ca0db34ef96ef1e74aa0d28c95f8"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eaa35a5274606779802e9a669a706260"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::unsafe_size" ref="eaa35a5274606779802e9a669a706260" args="() const " -->
+<a class="el" href="a00159.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00159.html#eaa35a5274606779802e9a669a706260">unsafe_size</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Return the number of items in the queue; thread unsafe. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f3f6fce0cfa2d581d6f3b47e0613ad64"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::empty" ref="f3f6fce0cfa2d581d6f3b47e0613ad64" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00159.html#f3f6fce0cfa2d581d6f3b47e0613ad64">empty</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Equivalent to size()==0. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c32e8e84c0524155133b4aae32d2a827"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::clear" ref="c32e8e84c0524155133b4aae32d2a827" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00159.html#c32e8e84c0524155133b4aae32d2a827">clear</a> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ddd77aff56c12366acc02d0f1588a706"></a><!-- doxytag: member="tbb::interface4::concurrent_hash_map::const_accessor::accessor" ref="ddd77aff56c12366acc02d0f1588a706" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>accessor</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Clear the queue. not thread-safe. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f034f70caef445fe8abc9113ec926a8d"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::get_allocator" ref="f034f70caef445fe8abc9113ec926a8d" args="() const " -->
+<a class="el" href="a00159.html#5a3956341728eaa558d8827063718cac">allocator_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00159.html#f034f70caef445fe8abc9113ec926a8d">get_allocator</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Return allocator object. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6297f48808dd7c14e6c2fe81559ca190"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::unsafe_begin" ref="6297f48808dd7c14e6c2fe81559ca190" args="()" -->
+iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_begin</b> ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1569f70e70521fe71944a5b0138c6ef5"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::unsafe_end" ref="1569f70e70521fe71944a5b0138c6ef5" args="()" -->
+iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_end</b> ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e3e6746f7b6ecfbc16f781665ac51112"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::unsafe_begin" ref="e3e6746f7b6ecfbc16f781665ac51112" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_begin</b> () const </td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="83bf90849c08f44d25dd7a3b207a8956"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::unsafe_end" ref="83bf90849c08f44d25dd7a3b207a8956" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_end</b> () const </td></tr>
+
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05bffad9626d51abbd4bb82ae2a1cceb"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::internal::concurrent_queue_iterator" ref="05bffad9626d51abbd4bb82ae2a1cceb" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::concurrent_queue_iterator</b></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename Key, typename T, typename HashCompare, typename Allocator><br>
- class tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</h3>
+<h3>template<typename T, typename A = cache_aligned_allocator<T>><br>
+ class tbb::strict_ppl::concurrent_queue< T, A ></h3>
-Combines data access, locking, and garbage collection.
+A high-performance thread-safe non-blocking concurrent queue.
+<p>
+Multiple threads may each push and pop concurrently. Assignment construction is not allowed.
+<p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="ae31ca0db34ef96ef1e74aa0d28c95f8"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::try_pop" ref="ae31ca0db34ef96ef1e74aa0d28c95f8" args="(T &result)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, typename A = cache_aligned_allocator<T>> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="a00159.html">tbb::strict_ppl::concurrent_queue</a>< T, A >::try_pop </td>
+ <td>(</td>
+ <td class="paramtype">T & </td>
+ <td class="paramname"> <em>result</em> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Attempt to dequeue an item from head of queue.
<p>
+Does not wait for item to become available. Returns true if successful; false otherwise.
+</div>
+</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00325.html">concurrent_hash_map.h</a></ul>
+<li><a class="el" href="a00336.html">concurrent_queue.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00160.html b/doc/html/a00160.html
index 52f1f8a..e61f478 100644
--- a/doc/html/a00160.html
+++ b/doc/html/a00160.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::strict_ppl::concurrent_queue< T, A > Class Template Reference</title>
+<title>tbb::deprecated::concurrent_queue< T, A > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,128 +21,88 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00273.html">strict_ppl</a>::<a class="el" href="a00160.html">concurrent_queue</a></div>
-<h1>tbb::strict_ppl::concurrent_queue< T, A > Class Template Reference<br>
+<a class="el" href="a00267.html">tbb</a>::<b>deprecated</b>::<a class="el" href="a00160.html">concurrent_queue</a></div>
+<h1>tbb::deprecated::concurrent_queue< T, A > Class Template Reference<br>
<small>
-[<a class="el" href="a00275.html">Containers</a>]</small>
-</h1><!-- doxytag: class="tbb::strict_ppl::concurrent_queue" -->A high-performance thread-safe non-blocking concurrent queue.
+[<a class="el" href="a00276.html">Containers</a>]</small>
+</h1><!-- doxytag: class="tbb::deprecated::concurrent_queue" --><!-- doxytag: inherits="tbb::concurrent_bounded_queue" -->A high-performance thread-safe blocking concurrent bounded queue.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00335.html">concurrent_queue.h</a>></code>
+<code>#include <<a class="el" href="a00336.html">concurrent_queue.h</a>></code>
<p>
-<a href="a00018.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::deprecated::concurrent_queue< T, A >:
+<p><center><img src="a00160.png" usemap="#tbb::deprecated::concurrent_queue< T, A >_map" border="0" alt=""></center>
+<map name="tbb::deprecated::concurrent_queue< T, A >_map">
+<area href="a00154.html" alt="tbb::concurrent_bounded_queue< T, A >" shape="rect" coords="0,0,257,24">
+</map>
+<a href="a00021.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="682c3978d5cb0620000994f11c44a476"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::value_type" ref="682c3978d5cb0620000994f11c44a476" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00160.html#682c3978d5cb0620000994f11c44a476">value_type</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8861a9cdf232a20b5f2569754a281871"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::iterator" ref="8861a9cdf232a20b5f2569754a281871" args="" -->
+typedef <a class="el" href="a00154.html">concurrent_bounded_queue</a><<br>
+ T, A >::iterator </td><td class="memItemRight" valign="bottom"><b>iterator</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Element type in the queue. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a8d725c50a9834bb7af5b67c0aff92b8"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::reference" ref="a8d725c50a9834bb7af5b67c0aff92b8" args="" -->
-typedef T & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00160.html#a8d725c50a9834bb7af5b67c0aff92b8">reference</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Reference type. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4d48e7ff93f81636bca2c74f7da34750"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::const_reference" ref="4d48e7ff93f81636bca2c74f7da34750" args="" -->
-typedef const T & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00160.html#4d48e7ff93f81636bca2c74f7da34750">const_reference</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Const reference type. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8fc30e93f8342a1960357f71e4fe8a2b"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::size_type" ref="8fc30e93f8342a1960357f71e4fe8a2b" args="" -->
-typedef size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00160.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Integral type for representing size of the queue. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="068576d16c7e4e05d52f9db7a45b5b65"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::difference_type" ref="068576d16c7e4e05d52f9db7a45b5b65" args="" -->
-typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00160.html#068576d16c7e4e05d52f9db7a45b5b65">difference_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Difference type for iterator. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5a3956341728eaa558d8827063718cac"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::allocator_type" ref="5a3956341728eaa558d8827063718cac" args="" -->
-typedef A </td><td class="memItemRight" valign="bottom"><a class="el" href="a00160.html#5a3956341728eaa558d8827063718cac">allocator_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Allocator type. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9736ac047d6da3363895c7e5b121d0c4"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::iterator" ref="9736ac047d6da3363895c7e5b121d0c4" args="" -->
-typedef internal::concurrent_queue_iterator<<br>
- <a class="el" href="a00160.html">concurrent_queue</a>, T > </td><td class="memItemRight" valign="bottom"><b>iterator</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9cd76d19af8c78be1bafc6ca0123ac0d"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::const_iterator" ref="9cd76d19af8c78be1bafc6ca0123ac0d" args="" -->
-typedef internal::concurrent_queue_iterator<<br>
- <a class="el" href="a00160.html">concurrent_queue</a>, const T > </td><td class="memItemRight" valign="bottom"><b>const_iterator</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7117842ce3ed7c5147d3c886922e64d0"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::const_iterator" ref="7117842ce3ed7c5147d3c886922e64d0" args="" -->
+typedef <a class="el" href="a00154.html">concurrent_bounded_queue</a><<br>
+ T, A >::const_iterator </td><td class="memItemRight" valign="bottom"><b>const_iterator</b></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7c48a05a94a1f4f98fdfadfbef98ecf6"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::concurrent_queue" ref="7c48a05a94a1f4f98fdfadfbef98ecf6" args="(const allocator_type &a=allocator_type())" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00160.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a> (const <a class="el" href="a00160.html#5a3956341728eaa558d8827063718cac">allocator_type</a> &a=<a class="el" href="a00160.html#5a3956341728eaa558d8827063718cac">allocator_type</a>())</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="aaf19bd7337b72f3131ece60f7315ef7"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::concurrent_queue" ref="aaf19bd7337b72f3131ece60f7315ef7" args="(const A &a=A())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00160.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a> (const A &a=A())</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty queue. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="25209656c84f2f9b030e2f9162713341"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::concurrent_queue" ref="25209656c84f2f9b030e2f9162713341" args="(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())" -->
-template<typename InputIterator> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00160.html#25209656c84f2f9b030e2f9162713341">concurrent_queue</a> (InputIterator begin, InputIterator end, const <a class="el" href="a00160.html#5a3956341728eaa558d8827063718cac">allocator_type</a> &a=<a class="el" href="a00160.html#5a3956341728eaa558d8827063718cac">allocator_type</a>())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">[begin,end) constructor <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8a6b98ea11a867db8ac868f0113ca429"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::concurrent_queue" ref="8a6b98ea11a867db8ac868f0113ca429" args="(const concurrent_queue &src, const allocator_type &a=allocator_type())" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00160.html#8a6b98ea11a867db8ac868f0113ca429">concurrent_queue</a> (const <a class="el" href="a00160.html">concurrent_queue</a> &src, const <a class="el" href="a00160.html#5a3956341728eaa558d8827063718cac">allocator_type</a> &a=<a class="el" href="a00160.html#5a3956341728eaa558d8827063718cac">allocator_type</a>())</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fc092b9082f233482f3513fc3bb670f7"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::concurrent_queue" ref="fc092b9082f233482f3513fc3bb670f7" args="(const concurrent_queue &src, const A &a=A())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00160.html#fc092b9082f233482f3513fc3bb670f7">concurrent_queue</a> (const <a class="el" href="a00160.html">concurrent_queue</a> &src, const A &a=A())</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="830b33753d6b149c366344e29b2edd8c"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::~concurrent_queue" ref="830b33753d6b149c366344e29b2edd8c" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00160.html#830b33753d6b149c366344e29b2edd8c">~concurrent_queue</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy queue. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="73c47563ffcc4c2f6452f25a04ebe2e2"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::push" ref="73c47563ffcc4c2f6452f25a04ebe2e2" args="(const T &source)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00160.html#73c47563ffcc4c2f6452f25a04ebe2e2">push</a> (const T &source)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Enqueue an item at tail of queue. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00160.html#ae31ca0db34ef96ef1e74aa0d28c95f8">try_pop</a> (T &result)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Attempt to dequeue an item from head of queue. <a href="#ae31ca0db34ef96ef1e74aa0d28c95f8"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eaa35a5274606779802e9a669a706260"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::unsafe_size" ref="eaa35a5274606779802e9a669a706260" args="() const " -->
-<a class="el" href="a00160.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00160.html#eaa35a5274606779802e9a669a706260">unsafe_size</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Return the number of items in the queue; thread unsafe. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f3f6fce0cfa2d581d6f3b47e0613ad64"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::empty" ref="f3f6fce0cfa2d581d6f3b47e0613ad64" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00160.html#f3f6fce0cfa2d581d6f3b47e0613ad64">empty</a> () const </td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="9102b897776bd2d9e908e6604ff16b5f"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::concurrent_queue" ref="9102b897776bd2d9e908e6604ff16b5f" args="(InputIterator b, InputIterator e, const A &a=A())" -->
+template<typename InputIterator> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00160.html#9102b897776bd2d9e908e6604ff16b5f">concurrent_queue</a> (InputIterator b, InputIterator e, const A &a=A())</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Equivalent to size()==0. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c32e8e84c0524155133b4aae32d2a827"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::clear" ref="c32e8e84c0524155133b4aae32d2a827" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00160.html#c32e8e84c0524155133b4aae32d2a827">clear</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">[begin,end) constructor <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00160.html#7c45561bafe71107d09b2bc1b8f4e681">push_if_not_full</a> (const T &source)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Clear the queue. not thread-safe. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f034f70caef445fe8abc9113ec926a8d"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::get_allocator" ref="f034f70caef445fe8abc9113ec926a8d" args="() const " -->
-<a class="el" href="a00160.html#5a3956341728eaa558d8827063718cac">allocator_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00160.html#f034f70caef445fe8abc9113ec926a8d">get_allocator</a> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Enqueue an item at tail of queue if queue is not already full. <a href="#7c45561bafe71107d09b2bc1b8f4e681"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00160.html#48da3536245318af6cb5fd58bac78039">pop_if_present</a> (T &destination)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Return allocator object. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6297f48808dd7c14e6c2fe81559ca190"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::unsafe_begin" ref="6297f48808dd7c14e6c2fe81559ca190" args="()" -->
-iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_begin</b> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Attempt to dequeue an item from head of queue. <a href="#48da3536245318af6cb5fd58bac78039"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ed7202cd273ae36463e6ac57e9472670"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::begin" ref="ed7202cd273ae36463e6ac57e9472670" args="()" -->
+iterator </td><td class="memItemRight" valign="bottom"><b>begin</b> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1569f70e70521fe71944a5b0138c6ef5"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::unsafe_end" ref="1569f70e70521fe71944a5b0138c6ef5" args="()" -->
-iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_end</b> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="35fbb0d7e135545eb1daec2b4ae894cd"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::end" ref="35fbb0d7e135545eb1daec2b4ae894cd" args="()" -->
+iterator </td><td class="memItemRight" valign="bottom"><b>end</b> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e3e6746f7b6ecfbc16f781665ac51112"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::unsafe_begin" ref="e3e6746f7b6ecfbc16f781665ac51112" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_begin</b> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="62f31fe653e1158e64ddb0e163d0335c"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::begin" ref="62f31fe653e1158e64ddb0e163d0335c" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><b>begin</b> () const </td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="83bf90849c08f44d25dd7a3b207a8956"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::unsafe_end" ref="83bf90849c08f44d25dd7a3b207a8956" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_end</b> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3d42ddc4a6fe42350750a930302863d1"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::end" ref="3d42ddc4a6fe42350750a930302863d1" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><b>end</b> () const </td></tr>
<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05bffad9626d51abbd4bb82ae2a1cceb"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::internal::concurrent_queue_iterator" ref="05bffad9626d51abbd4bb82ae2a1cceb" args="" -->
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05bffad9626d51abbd4bb82ae2a1cceb"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::internal::concurrent_queue_iterator" ref="05bffad9626d51abbd4bb82ae2a1cceb" args="" -->
class </td><td class="memItemRight" valign="bottom"><b>internal::concurrent_queue_iterator</b></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T, typename A = cache_aligned_allocator<T>><br>
- class tbb::strict_ppl::concurrent_queue< T, A ></h3>
+<h3>template<typename T, class A = cache_aligned_allocator<T>><br>
+ class tbb::deprecated::concurrent_queue< T, A ></h3>
-A high-performance thread-safe non-blocking concurrent queue.
+A high-performance thread-safe blocking concurrent bounded queue.
<p>
-Multiple threads may each push and pop concurrently. Assignment construction is not allowed.
+This is the pre-PPL TBB concurrent queue which support boundedness and blocking semantics. Note that method names agree with the PPL-style concurrent queue. Multiple threads may each push and pop concurrently. Assignment construction is not allowed.
<p>
<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="ae31ca0db34ef96ef1e74aa0d28c95f8"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::try_pop" ref="ae31ca0db34ef96ef1e74aa0d28c95f8" args="(T &result)" -->
+<a class="anchor" name="48da3536245318af6cb5fd58bac78039"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::pop_if_present" ref="48da3536245318af6cb5fd58bac78039" args="(T &destination)" -->
<div class="memitem">
<div class="memproto">
<div class="memtemplate">
-template<typename T, typename A = cache_aligned_allocator<T>> </div>
+template<typename T, class A = cache_aligned_allocator<T>> </div>
<table class="memname">
<tr>
- <td class="memname">bool <a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue</a>< T, A >::try_pop </td>
+ <td class="memname">bool <a class="el" href="a00160.html">tbb::deprecated::concurrent_queue</a>< T, A >::pop_if_present </td>
<td>(</td>
<td class="paramtype">T & </td>
- <td class="paramname"> <em>result</em> </td>
+ <td class="paramname"> <em>destination</em> </td>
<td> ) </td>
<td width="100%"><code> [inline]</code></td>
</tr>
@@ -153,11 +113,36 @@ template<typename T, typename A = cache_aligned_allocator<T>> </div>
<p>
Attempt to dequeue an item from head of queue.
<p>
-Does not wait for item to become available. Returns true if successful; false otherwise.
+Does not wait for item to become available. Returns true if successful; false otherwise. <dl compact><dt><b><a class="el" href="deprecated.html#_deprecated000001">Deprecated:</a></b></dt><dd>Use <a class="el" href="a00154.html#0ca487019bbb00a196442aff78a1e4f7">try_pop()</a> </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="7c45561bafe71107d09b2bc1b8f4e681"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::push_if_not_full" ref="7c45561bafe71107d09b2bc1b8f4e681" args="(const T &source)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, class A = cache_aligned_allocator<T>> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="a00160.html">tbb::deprecated::concurrent_queue</a>< T, A >::push_if_not_full </td>
+ <td>(</td>
+ <td class="paramtype">const T & </td>
+ <td class="paramname"> <em>source</em> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Enqueue an item at tail of queue if queue is not already full.
+<p>
+Does not wait for queue to become not full. Returns true if item is pushed; false if queue was already full.
</div>
</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00335.html">concurrent_queue.h</a></ul>
+<li><a class="el" href="a00336.html">concurrent_queue.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00161.png b/doc/html/a00160.png
similarity index 100%
rename from doc/html/a00161.png
rename to doc/html/a00160.png
diff --git a/doc/html/a00161.html b/doc/html/a00161.html
index 1d9434f..07b22f5 100644
--- a/doc/html/a00161.html
+++ b/doc/html/a00161.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::deprecated::concurrent_queue< T, A > Class Template Reference</title>
+<title>tbb::concurrent_vector< T, A > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,88 +21,327 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00267.html">tbb</a>::<b>deprecated</b>::<a class="el" href="a00161.html">concurrent_queue</a></div>
-<h1>tbb::deprecated::concurrent_queue< T, A > Class Template Reference<br>
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00161.html">concurrent_vector</a></div>
+<h1>tbb::concurrent_vector< T, A > Class Template Reference<br>
<small>
-[<a class="el" href="a00275.html">Containers</a>]</small>
-</h1><!-- doxytag: class="tbb::deprecated::concurrent_queue" --><!-- doxytag: inherits="tbb::concurrent_bounded_queue" -->A high-performance thread-safe blocking concurrent bounded queue.
+[<a class="el" href="a00276.html">Containers</a>]</small>
+</h1><!-- doxytag: class="tbb::concurrent_vector" -->Concurrent vector container.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00335.html">concurrent_queue.h</a>></code>
+<code>#include <<a class="el" href="a00342.html">concurrent_vector.h</a>></code>
<p>
-<p>Inheritance diagram for tbb::deprecated::concurrent_queue< T, A >:
-<p><center><img src="a00161.png" usemap="#tbb::deprecated::concurrent_queue< T, A >_map" border="0" alt=""></center>
-<map name="tbb::deprecated::concurrent_queue< T, A >_map">
-<area href="a00155.html" alt="tbb::concurrent_bounded_queue< T, A >" shape="rect" coords="0,0,257,24">
-</map>
-<a href="a00021.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00026.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8861a9cdf232a20b5f2569754a281871"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::iterator" ref="8861a9cdf232a20b5f2569754a281871" args="" -->
-typedef <a class="el" href="a00155.html">concurrent_bounded_queue</a><<br>
- T, A >::iterator </td><td class="memItemRight" valign="bottom"><b>iterator</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bc85684238d4bb5e422cb8ea0bdc438f"></a><!-- doxytag: member="tbb::concurrent_vector::size_type" ref="bc85684238d4bb5e422cb8ea0bdc438f" args="" -->
+typedef internal::concurrent_vector_base_v3::size_type </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7117842ce3ed7c5147d3c886922e64d0"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::const_iterator" ref="7117842ce3ed7c5147d3c886922e64d0" args="" -->
-typedef <a class="el" href="a00155.html">concurrent_bounded_queue</a><<br>
- T, A >::const_iterator </td><td class="memItemRight" valign="bottom"><b>const_iterator</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ac7083635ab59834e9afc15e6c168df5"></a><!-- doxytag: member="tbb::concurrent_vector::allocator_type" ref="ac7083635ab59834e9afc15e6c168df5" args="" -->
+typedef internal::allocator_base<<br>
+ T, A >::allocator_type </td><td class="memItemRight" valign="bottom"><b>allocator_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4543d7d45b2e461d3f8ef416974ec1f1"></a><!-- doxytag: member="tbb::concurrent_vector::value_type" ref="4543d7d45b2e461d3f8ef416974ec1f1" args="" -->
+typedef T </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e655e67dd14ed6d0cbfe7981d5fa350e"></a><!-- doxytag: member="tbb::concurrent_vector::difference_type" ref="e655e67dd14ed6d0cbfe7981d5fa350e" args="" -->
+typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><b>difference_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8c29033785d76e240ea96ae40610275d"></a><!-- doxytag: member="tbb::concurrent_vector::reference" ref="8c29033785d76e240ea96ae40610275d" args="" -->
+typedef T & </td><td class="memItemRight" valign="bottom"><b>reference</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b0b2a6241ab3fa9ab4f4074893fecd47"></a><!-- doxytag: member="tbb::concurrent_vector::const_reference" ref="b0b2a6241ab3fa9ab4f4074893fecd47" args="" -->
+typedef const T & </td><td class="memItemRight" valign="bottom"><b>const_reference</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="74319c908a32d5dcdc6a080f9c2b8803"></a><!-- doxytag: member="tbb::concurrent_vector::pointer" ref="74319c908a32d5dcdc6a080f9c2b8803" args="" -->
+typedef T * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dd80729019220cdb80872ea6b905ffb1"></a><!-- doxytag: member="tbb::concurrent_vector::const_pointer" ref="dd80729019220cdb80872ea6b905ffb1" args="" -->
+typedef const T * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a049674e7f386de3ea09ff2ed6d6bbbe"></a><!-- doxytag: member="tbb::concurrent_vector::iterator" ref="a049674e7f386de3ea09ff2ed6d6bbbe" args="" -->
+typedef internal::vector_iterator<<br>
+ <a class="el" href="a00161.html">concurrent_vector</a>, T > </td><td class="memItemRight" valign="bottom"><b>iterator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b51a1baa7da67e283806c0d4f2fe9c69"></a><!-- doxytag: member="tbb::concurrent_vector::const_iterator" ref="b51a1baa7da67e283806c0d4f2fe9c69" args="" -->
+typedef internal::vector_iterator<<br>
+ <a class="el" href="a00161.html">concurrent_vector</a>, const <br>
+T > </td><td class="memItemRight" valign="bottom"><b>const_iterator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c7e4d252bef7af22286041c39c62abe"></a><!-- doxytag: member="tbb::concurrent_vector::reverse_iterator" ref="2c7e4d252bef7af22286041c39c62abe" args="" -->
+typedef std::reverse_iterator<<br>
+ iterator > </td><td class="memItemRight" valign="bottom"><b>reverse_iterator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c59c3f9412b666a31a9052b789fb58bc"></a><!-- doxytag: member="tbb::concurrent_vector::const_reverse_iterator" ref="c59c3f9412b666a31a9052b789fb58bc" args="" -->
+typedef std::reverse_iterator<<br>
+ const_iterator > </td><td class="memItemRight" valign="bottom"><b>const_reverse_iterator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0c3901b092e9e8185bdc3cae5913e625"></a><!-- doxytag: member="tbb::concurrent_vector::reverse_iterator" ref="0c3901b092e9e8185bdc3cae5913e625" args="" -->
+typedef std::reverse_iterator<<br>
+ iterator, T, T &, T * > </td><td class="memItemRight" valign="bottom"><b>reverse_iterator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="426145d7bd5913bc08e701c14b221046"></a><!-- doxytag: member="tbb::concurrent_vector::const_reverse_iterator" ref="426145d7bd5913bc08e701c14b221046" args="" -->
+typedef std::reverse_iterator<<br>
+ const_iterator, T, const <br>
+T &, const T * > </td><td class="memItemRight" valign="bottom"><b>const_reverse_iterator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="61fd90288dba6f8808d6dafe9a249ec5"></a><!-- doxytag: member="tbb::concurrent_vector::range_type" ref="61fd90288dba6f8808d6dafe9a249ec5" args="" -->
+typedef generic_range_type<<br>
+ iterator > </td><td class="memItemRight" valign="bottom"><b>range_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d6ddf0312a820a98efd9a5f394cb9dbd"></a><!-- doxytag: member="tbb::concurrent_vector::const_range_type" ref="d6ddf0312a820a98efd9a5f394cb9dbd" args="" -->
+typedef generic_range_type<<br>
+ const_iterator > </td><td class="memItemRight" valign="bottom"><b>const_range_type</b></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="aaf19bd7337b72f3131ece60f7315ef7"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::concurrent_queue" ref="aaf19bd7337b72f3131ece60f7315ef7" args="(const A &a=A())" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a> (const A &a=A())</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c8ca9cabfcd30ad5943324c853664b5"></a><!-- doxytag: member="tbb::concurrent_vector::concurrent_vector" ref="2c8ca9cabfcd30ad5943324c853664b5" args="(const allocator_type &a=allocator_type())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#2c8ca9cabfcd30ad5943324c853664b5">concurrent_vector</a> (const allocator_type &a=allocator_type())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty vector. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dd8a200b99a8088435a37934b58fe335"></a><!-- doxytag: member="tbb::concurrent_vector::concurrent_vector" ref="dd8a200b99a8088435a37934b58fe335" args="(const concurrent_vector &vector, const allocator_type &a=allocator_type())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#dd8a200b99a8088435a37934b58fe335">concurrent_vector</a> (const <a class="el" href="a00161.html">concurrent_vector</a> &vector, const allocator_type &a=allocator_type())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copying constructor. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="64432f13f7b29bfe4acfb5568f34f3a8"></a><!-- doxytag: member="tbb::concurrent_vector::concurrent_vector" ref="64432f13f7b29bfe4acfb5568f34f3a8" args="(const concurrent_vector< T, M > &vector, const allocator_type &a=allocator_type())" -->
+template<class M> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00161.html#64432f13f7b29bfe4acfb5568f34f3a8">concurrent_vector</a> (const <a class="el" href="a00161.html">concurrent_vector</a>< T, M > &vector, const allocator_type &a=allocator_type())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copying constructor for vector with different allocator type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2a2e261dfe1cab3f73f7b1a94137cfca"></a><!-- doxytag: member="tbb::concurrent_vector::concurrent_vector" ref="2a2e261dfe1cab3f73f7b1a94137cfca" args="(size_type n)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#2a2e261dfe1cab3f73f7b1a94137cfca">concurrent_vector</a> (size_type n)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construction with initial size specified by argument n. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3883a8a908b44e249a57f454de3f55d8"></a><!-- doxytag: member="tbb::concurrent_vector::concurrent_vector" ref="3883a8a908b44e249a57f454de3f55d8" args="(size_type n, const_reference t, const allocator_type &a=allocator_type())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#3883a8a908b44e249a57f454de3f55d8">concurrent_vector</a> (size_type n, const_reference t, const allocator_type &a=allocator_type())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construction with initial size specified by argument n, initialization by copying of t, and given allocator instance. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="4450de83c5862ea4bcd9443fd7e67419"></a><!-- doxytag: member="tbb::concurrent_vector::concurrent_vector" ref="4450de83c5862ea4bcd9443fd7e67419" args="(I first, I last, const allocator_type &a=allocator_type())" -->
+template<class I> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00161.html#4450de83c5862ea4bcd9443fd7e67419">concurrent_vector</a> (I first, I last, const allocator_type &a=allocator_type())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construction with copying iteration range and given allocator instance. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="691f0f3cda3e489c37a657016e375eaf"></a><!-- doxytag: member="tbb::concurrent_vector::operator=" ref="691f0f3cda3e489c37a657016e375eaf" args="(const concurrent_vector &vector)" -->
+<a class="el" href="a00161.html">concurrent_vector</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#691f0f3cda3e489c37a657016e375eaf">operator=</a> (const <a class="el" href="a00161.html">concurrent_vector</a> &vector)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Assignment. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="19f4ab88a01b0fd056af3bba463e7bd6"></a><!-- doxytag: member="tbb::concurrent_vector::operator=" ref="19f4ab88a01b0fd056af3bba463e7bd6" args="(const concurrent_vector< T, M > &vector)" -->
+template<class M> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"><a class="el" href="a00161.html">concurrent_vector</a> & </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00161.html#19f4ab88a01b0fd056af3bba463e7bd6">operator=</a> (const <a class="el" href="a00161.html">concurrent_vector</a>< T, M > &vector)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Assignment for vector with different allocator type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#30484e3959892fd5392fa93c873c31f0">grow_by</a> (size_type delta)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Grow by "delta" elements. <a href="#30484e3959892fd5392fa93c873c31f0"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#c8177b1865270ea68aa1ab9148e5e35e">grow_by</a> (size_type delta)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#38274ab3f772ecba600c7daca7690102">grow_by</a> (size_type delta, const_reference t)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Grow by "delta" elements using copying constuctor. <a href="#38274ab3f772ecba600c7daca7690102"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#473a59a4c9308b93411b898b3110d26c">grow_by</a> (size_type delta, const_reference t)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#47fe588214dd5fa06ab6e8ab78d83874">grow_to_at_least</a> (size_type n)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Append minimal sequence of elements such that <a class="el" href="a00161.html#715fe313c4a9c22731cc404dd80c9ec9">size()</a>>=n. <a href="#47fe588214dd5fa06ab6e8ab78d83874"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#a7e3b67c8ccab16d0aecc80899ae799d">grow_to_at_least</a> (size_type n)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a> (const_reference item) iterator push_back(const _reference item)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Push item. <a href="#e94e038f915c0268fdf2d3d7f87d81b8"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#4c52f2950bb1832886bd4458eb09d7eb">operator[]</a> (size_type index)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Get reference to element at given index. <a href="#4c52f2950bb1832886bd4458eb09d7eb"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c6fade5c732cc95274d1d8277ea619d1"></a><!-- doxytag: member="tbb::concurrent_vector::operator[]" ref="c6fade5c732cc95274d1d8277ea619d1" args="(size_type index) const " -->
+const_reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#c6fade5c732cc95274d1d8277ea619d1">operator[]</a> (size_type index) const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Get const reference to element at given index. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0c073ca43e787c7cbf7b0e26d2221748"></a><!-- doxytag: member="tbb::concurrent_vector::at" ref="0c073ca43e787c7cbf7b0e26d2221748" args="(size_type index)" -->
+reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#0c073ca43e787c7cbf7b0e26d2221748">at</a> (size_type index)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Get reference to element at given index. Throws exceptions on errors. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="23e14a38af748edff96a7adc3a0f1c58"></a><!-- doxytag: member="tbb::concurrent_vector::at" ref="23e14a38af748edff96a7adc3a0f1c58" args="(size_type index) const " -->
+const_reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#23e14a38af748edff96a7adc3a0f1c58">at</a> (size_type index) const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Get const reference to element at given index. Throws exceptions on errors. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a4c6ffff3bf08b92939aa2fc516edfba"></a><!-- doxytag: member="tbb::concurrent_vector::range" ref="a4c6ffff3bf08b92939aa2fc516edfba" args="(size_t grainsize=1)" -->
+range_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#a4c6ffff3bf08b92939aa2fc516edfba">range</a> (size_t grainsize=1)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Get range for iterating with parallel algorithms. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3d09ccfb581b879ae64203741035e193"></a><!-- doxytag: member="tbb::concurrent_vector::range" ref="3d09ccfb581b879ae64203741035e193" args="(size_t grainsize=1) const " -->
+const_range_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#3d09ccfb581b879ae64203741035e193">range</a> (size_t grainsize=1) const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Get const range for iterating with parallel algorithms. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="715fe313c4a9c22731cc404dd80c9ec9"></a><!-- doxytag: member="tbb::concurrent_vector::size" ref="715fe313c4a9c22731cc404dd80c9ec9" args="() const " -->
+size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#715fe313c4a9c22731cc404dd80c9ec9">size</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Return size of vector. It may include elements under construction. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c6426cb93cf20d3af40f3c90f1f0481a"></a><!-- doxytag: member="tbb::concurrent_vector::empty" ref="c6426cb93cf20d3af40f3c90f1f0481a" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#c6426cb93cf20d3af40f3c90f1f0481a">empty</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Return true if vector is not empty or has elements under construction at least. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3ed6b9ae7217af5103d974045b6f5cd5"></a><!-- doxytag: member="tbb::concurrent_vector::capacity" ref="3ed6b9ae7217af5103d974045b6f5cd5" args="() const " -->
+size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#3ed6b9ae7217af5103d974045b6f5cd5">capacity</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Maximum size to which array can grow without allocating more memory. Concurrent allocations are not included in the value. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#5a0ce05026994b010018f72cfdeb72c1">reserve</a> (size_type n)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Allocate enough space to grow to size n without having to allocate more memory later. <a href="#5a0ce05026994b010018f72cfdeb72c1"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8dfb0cb0eef96d440b4dcf801807a718"></a><!-- doxytag: member="tbb::concurrent_vector::resize" ref="8dfb0cb0eef96d440b4dcf801807a718" args="(size_type n)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#8dfb0cb0eef96d440b4dcf801807a718">resize</a> (size_type n)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Resize the vector. Not thread-safe. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="98ce6b2c6d2622f0c030b46dfac3880c"></a><!-- doxytag: member="tbb::concurrent_vector::resize" ref="98ce6b2c6d2622f0c030b46dfac3880c" args="(size_type n, const_reference t)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#98ce6b2c6d2622f0c030b46dfac3880c">resize</a> (size_type n, const_reference t)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Resize the vector, copy t for new elements. Not thread-safe. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1693d1da41b1a8235871be9c6633be35"></a><!-- doxytag: member="tbb::concurrent_vector::compact" ref="1693d1da41b1a8235871be9c6633be35" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#1693d1da41b1a8235871be9c6633be35">compact</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">An alias for <a class="el" href="a00161.html#03c6f4cf66532bf4cc907ee738a9a186">shrink_to_fit()</a>. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="03c6f4cf66532bf4cc907ee738a9a186"></a><!-- doxytag: member="tbb::concurrent_vector::shrink_to_fit" ref="03c6f4cf66532bf4cc907ee738a9a186" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#03c6f4cf66532bf4cc907ee738a9a186">shrink_to_fit</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Optimize memory usage and fragmentation. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c248a017f0576df3e7cd99627836fd6"></a><!-- doxytag: member="tbb::concurrent_vector::max_size" ref="2c248a017f0576df3e7cd99627836fd6" args="() const " -->
+size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#2c248a017f0576df3e7cd99627836fd6">max_size</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Upper bound on argument to reserve. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="730b23a251ecb6d37f692fb22f38e029"></a><!-- doxytag: member="tbb::concurrent_vector::begin" ref="730b23a251ecb6d37f692fb22f38e029" args="()" -->
+iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#730b23a251ecb6d37f692fb22f38e029">begin</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">start iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c0b51160e5a764982ec97a455f94f2c6"></a><!-- doxytag: member="tbb::concurrent_vector::end" ref="c0b51160e5a764982ec97a455f94f2c6" args="()" -->
+iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#c0b51160e5a764982ec97a455f94f2c6">end</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">end iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="78a06182276ff758788d4c0623ae0d71"></a><!-- doxytag: member="tbb::concurrent_vector::begin" ref="78a06182276ff758788d4c0623ae0d71" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#78a06182276ff758788d4c0623ae0d71">begin</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">start const iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1e6aa764ce5a1cbd24526f68bc0a2f6b"></a><!-- doxytag: member="tbb::concurrent_vector::end" ref="1e6aa764ce5a1cbd24526f68bc0a2f6b" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">end</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">end const iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f88fcf1c920693c39bd9709db33c199f"></a><!-- doxytag: member="tbb::concurrent_vector::cbegin" ref="f88fcf1c920693c39bd9709db33c199f" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#f88fcf1c920693c39bd9709db33c199f">cbegin</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">start const iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0c15a5d0f1cf75d687dabba07da1d46b"></a><!-- doxytag: member="tbb::concurrent_vector::cend" ref="0c15a5d0f1cf75d687dabba07da1d46b" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#0c15a5d0f1cf75d687dabba07da1d46b">cend</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">end const iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5e220926d09236d98f04fe0721e5f9a1"></a><!-- doxytag: member="tbb::concurrent_vector::rbegin" ref="5e220926d09236d98f04fe0721e5f9a1" args="()" -->
+reverse_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#5e220926d09236d98f04fe0721e5f9a1">rbegin</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty queue. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fc092b9082f233482f3513fc3bb670f7"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::concurrent_queue" ref="fc092b9082f233482f3513fc3bb670f7" args="(const concurrent_queue &src, const A &a=A())" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#fc092b9082f233482f3513fc3bb670f7">concurrent_queue</a> (const <a class="el" href="a00161.html">concurrent_queue</a> &src, const A &a=A())</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">reverse start iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="290119a4eb43cd6a9e98fa17016ba3c2"></a><!-- doxytag: member="tbb::concurrent_vector::rend" ref="290119a4eb43cd6a9e98fa17016ba3c2" args="()" -->
+reverse_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#290119a4eb43cd6a9e98fa17016ba3c2">rend</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="9102b897776bd2d9e908e6604ff16b5f"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::concurrent_queue" ref="9102b897776bd2d9e908e6604ff16b5f" args="(InputIterator b, InputIterator e, const A &a=A())" -->
-template<typename InputIterator> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00161.html#9102b897776bd2d9e908e6604ff16b5f">concurrent_queue</a> (InputIterator b, InputIterator e, const A &a=A())</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">reverse end iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9f9c103e18d5f212703805354074ad44"></a><!-- doxytag: member="tbb::concurrent_vector::rbegin" ref="9f9c103e18d5f212703805354074ad44" args="() const " -->
+const_reverse_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#9f9c103e18d5f212703805354074ad44">rbegin</a> () const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">[begin,end) constructor <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#7c45561bafe71107d09b2bc1b8f4e681">push_if_not_full</a> (const T &source)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">reverse start const iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d438b9b32ea3a8ffb703015b6dce055b"></a><!-- doxytag: member="tbb::concurrent_vector::rend" ref="d438b9b32ea3a8ffb703015b6dce055b" args="() const " -->
+const_reverse_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#d438b9b32ea3a8ffb703015b6dce055b">rend</a> () const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Enqueue an item at tail of queue if queue is not already full. <a href="#7c45561bafe71107d09b2bc1b8f4e681"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#48da3536245318af6cb5fd58bac78039">pop_if_present</a> (T &destination)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">reverse end const iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="db78a1d28c9c966050e8a2926d834a33"></a><!-- doxytag: member="tbb::concurrent_vector::crbegin" ref="db78a1d28c9c966050e8a2926d834a33" args="() const " -->
+const_reverse_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#db78a1d28c9c966050e8a2926d834a33">crbegin</a> () const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Attempt to dequeue an item from head of queue. <a href="#48da3536245318af6cb5fd58bac78039"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ed7202cd273ae36463e6ac57e9472670"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::begin" ref="ed7202cd273ae36463e6ac57e9472670" args="()" -->
-iterator </td><td class="memItemRight" valign="bottom"><b>begin</b> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">reverse start const iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fff9cece89438587997ebedf93c5e962"></a><!-- doxytag: member="tbb::concurrent_vector::crend" ref="fff9cece89438587997ebedf93c5e962" args="() const " -->
+const_reverse_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#fff9cece89438587997ebedf93c5e962">crend</a> () const </td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="35fbb0d7e135545eb1daec2b4ae894cd"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::end" ref="35fbb0d7e135545eb1daec2b4ae894cd" args="()" -->
-iterator </td><td class="memItemRight" valign="bottom"><b>end</b> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">reverse end const iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="15181759c0bfa2ddce5d10c7550e0002"></a><!-- doxytag: member="tbb::concurrent_vector::front" ref="15181759c0bfa2ddce5d10c7550e0002" args="()" -->
+reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#15181759c0bfa2ddce5d10c7550e0002">front</a> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="62f31fe653e1158e64ddb0e163d0335c"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::begin" ref="62f31fe653e1158e64ddb0e163d0335c" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><b>begin</b> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">the first item <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="502615a858eb9fa0390ee59169065e90"></a><!-- doxytag: member="tbb::concurrent_vector::front" ref="502615a858eb9fa0390ee59169065e90" args="() const " -->
+const_reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#502615a858eb9fa0390ee59169065e90">front</a> () const </td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3d42ddc4a6fe42350750a930302863d1"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::end" ref="3d42ddc4a6fe42350750a930302863d1" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><b>end</b> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">the first item const <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="41ce48d6015a1a2812d41cf620ec3476"></a><!-- doxytag: member="tbb::concurrent_vector::back" ref="41ce48d6015a1a2812d41cf620ec3476" args="()" -->
+reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#41ce48d6015a1a2812d41cf620ec3476">back</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">the last item <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bd518e204107d07fd08d0ec5bdfd383d"></a><!-- doxytag: member="tbb::concurrent_vector::back" ref="bd518e204107d07fd08d0ec5bdfd383d" args="() const " -->
+const_reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#bd518e204107d07fd08d0ec5bdfd383d">back</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">the last item const <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2fdba8e90de6a4d2300222236d46758e"></a><!-- doxytag: member="tbb::concurrent_vector::get_allocator" ref="2fdba8e90de6a4d2300222236d46758e" args="() const " -->
+allocator_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#2fdba8e90de6a4d2300222236d46758e">get_allocator</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">return allocator object <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="423e5aa15e0e3309ad86d026fd85f6f6"></a><!-- doxytag: member="tbb::concurrent_vector::assign" ref="423e5aa15e0e3309ad86d026fd85f6f6" args="(size_type n, const_reference t)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#423e5aa15e0e3309ad86d026fd85f6f6">assign</a> (size_type n, const_reference t)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">assign n items by copying t item <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="93a06b3112cb804f42f40efb5e7387b4"></a><!-- doxytag: member="tbb::concurrent_vector::assign" ref="93a06b3112cb804f42f40efb5e7387b4" args="(I first, I last)" -->
+template<class I> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00161.html#93a06b3112cb804f42f40efb5e7387b4">assign</a> (I first, I last)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">assign range [first, last) <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="96c9c4bd968ed3edb8dd276854d2dae0"></a><!-- doxytag: member="tbb::concurrent_vector::swap" ref="96c9c4bd968ed3edb8dd276854d2dae0" args="(concurrent_vector &vector)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#96c9c4bd968ed3edb8dd276854d2dae0">swap</a> (<a class="el" href="a00161.html">concurrent_vector</a> &vector)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">swap two instances <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#26f937a359a66b6aae904c3cd9a3c444">clear</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Clear container while keeping memory allocated. <a href="#26f937a359a66b6aae904c3cd9a3c444"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="da2444b28bb840d38f60d0030333a5fc"></a><!-- doxytag: member="tbb::concurrent_vector::~concurrent_vector" ref="da2444b28bb840d38f60d0030333a5fc" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html#da2444b28bb840d38f60d0030333a5fc">~concurrent_vector</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Clear and destroy vector. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bb5ae659871478f1f5c68039e1273e12"></a><!-- doxytag: member="tbb::concurrent_vector::internal_vector_base" ref="bb5ae659871478f1f5c68039e1273e12" args="() const " -->
+const internal::concurrent_vector_base_v3 & </td><td class="memItemRight" valign="bottom"><b>internal_vector_base</b> () const </td></tr>
<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05bffad9626d51abbd4bb82ae2a1cceb"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::internal::concurrent_queue_iterator" ref="05bffad9626d51abbd4bb82ae2a1cceb" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::concurrent_queue_iterator</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="30086a58bff79a91103723be20916b96"></a><!-- doxytag: member="tbb::concurrent_vector::internal::vector_iterator" ref="30086a58bff79a91103723be20916b96" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::vector_iterator</b></td></tr>
+
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>generic_range_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>internal_loop_guide</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Exception-aware helper class for filling a segment by exception-danger operators of user class. <br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T, class A = cache_aligned_allocator<T>><br>
- class tbb::deprecated::concurrent_queue< T, A ></h3>
+<h3>template<typename T, class A><br>
+ class tbb::concurrent_vector< T, A ></h3>
-A high-performance thread-safe blocking concurrent bounded queue.
+Concurrent vector container.
<p>
-This is the pre-PPL TBB concurrent queue which support boundedness and blocking semantics. Note that method names agree with the PPL-style concurrent queue. Multiple threads may each push and pop concurrently. Assignment construction is not allowed.
+<a class="el" href="a00161.html">concurrent_vector</a> is a container having the following main properties:<ul>
+<li>It provides random indexed access to its elements. The index of the first element is 0.</li><li>It ensures safe concurrent growing its size (different threads can safely append new elements).</li><li>Adding new elements does not invalidate existing iterators and does not change indices of existing items.</li></ul>
+<p>
+<dl compact><dt><b>Compatibility</b></dt><dd>The class meets all Container Requirements and Reversible Container Requirements from C++ Standard (See ISO/IEC 14882:2003(E), clause 23.1). But it doesn't meet Sequence Requirements due to absence of insert() and erase() methods.</dd></dl>
+<dl compact><dt><b>Exception Safety</b></dt><dd>Methods working with memory allocation and/or new elements construction can throw an exception if allocator fails to allocate memory or element's default constructor throws one. Concurrent vector's element of type T must conform to the following requirements:<ul>
+<li>Throwing an exception is forbidden for destructor of T.</li><li>Default constructor of T must not throw an exception OR its non-virtual destructor must safely work when its object memory is zero-initialized.</li></ul>
+Otherwise, the program's behavior is undefined. </dd></dl>
+<dl compact><dt><b></b></dt><dd>If an exception happens inside growth or assignment operation, an instance of the vector becomes invalid unless it is stated otherwise in the method documentation. Invalid state means:<ul>
+<li>There are no guaranties that all items were initialized by a constructor. The rest of items is zero-filled, including item where exception happens.</li><li>An invalid vector instance cannot be repaired; it is unable to grow anymore.</li><li>Size and capacity reported by the vector are incorrect, and calculated as if the failed operation were successful.</li><li>Attempt to access not allocated elements using operator[] or iterators results in access violation or segmentation fault exc [...]
+If a concurrent grow operation successfully completes, all the elements it has added to the vector will remain valid and accessible even if one of subsequent grow operations fails.</dd></dl>
+<dl compact><dt><b>Fragmentation</b></dt><dd>Unlike an STL vector, a <a class="el" href="a00161.html">concurrent_vector</a> does not move existing elements if it needs to allocate more memory. The container is divided into a series of contiguous arrays of elements. The first reservation, growth, or assignment operation determines the size of the first array. Using small number of elements as initial size incurs fragmentation that may increase element access time. Internal layout can be o [...]
+<dl compact><dt><b>Changes since TBB 2.1</b></dt><dd><ul>
+<li>Fixed guarantees of <a class="el" href="a00161.html#715fe313c4a9c22731cc404dd80c9ec9">concurrent_vector::size()</a> and <a class="el" href="a00161.html#47fe588214dd5fa06ab6e8ab78d83874">grow_to_at_least()</a> methods to assure elements are allocated.</li><li>Methods <a class="el" href="a00161.html#c0b51160e5a764982ec97a455f94f2c6">end()</a>/rbegin()/back() are partly thread-safe since they use <a class="el" href="a00161.html#715fe313c4a9c22731cc404dd80c9ec9">size()</a> to get the end [...]
+</dd></dl>
+<dl compact><dt><b>Changes since TBB 2.0</b></dt><dd><ul>
+<li>Implemented exception-safety guaranties</li><li>Added template argument for allocator</li><li>Added allocator argument in constructors</li><li>Faster index calculation</li><li>First growth call specifies a number of segments to be merged in the first allocation.</li><li>Fixed memory blow up for swarm of vector's instances of small size</li><li>Added <a class="el" href="a00161.html#38274ab3f772ecba600c7daca7690102">grow_by(size_type n, const_reference t)</a> growth using copying const [...]
+</dd></dl>
+
<p>
<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="48da3536245318af6cb5fd58bac78039"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::pop_if_present" ref="48da3536245318af6cb5fd58bac78039" args="(T &destination)" -->
+<a class="anchor" name="26f937a359a66b6aae904c3cd9a3c444"></a><!-- doxytag: member="tbb::concurrent_vector::clear" ref="26f937a359a66b6aae904c3cd9a3c444" args="()" -->
<div class="memitem">
<div class="memproto">
<div class="memtemplate">
-template<typename T, class A = cache_aligned_allocator<T>> </div>
+template<typename T, class A> </div>
<table class="memname">
<tr>
- <td class="memname">bool <a class="el" href="a00161.html">tbb::deprecated::concurrent_queue</a>< T, A >::pop_if_present </td>
+ <td class="memname">void <a class="el" href="a00161.html">tbb::concurrent_vector</a>< T, A >::clear </td>
<td>(</td>
- <td class="paramtype">T & </td>
- <td class="paramname"> <em>destination</em> </td>
+ <td class="paramname"> </td>
<td> ) </td>
<td width="100%"><code> [inline]</code></td>
</tr>
@@ -111,23 +350,226 @@ template<typename T, class A = cache_aligned_allocator<T>> </div>
<div class="memdoc">
<p>
-Attempt to dequeue an item from head of queue.
+Clear container while keeping memory allocated.
<p>
-Does not wait for item to become available. Returns true if successful; false otherwise. <dl compact><dt><b><a class="el" href="deprecated.html#_deprecated000001">Deprecated:</a></b></dt><dd>Use <a class="el" href="a00155.html#0ca487019bbb00a196442aff78a1e4f7">try_pop()</a> </dd></dl>
+To free up the memory, use in conjunction with method <a class="el" href="a00161.html#1693d1da41b1a8235871be9c6633be35">compact()</a>. Not thread safe
+</div>
+</div><p>
+<a class="anchor" name="473a59a4c9308b93411b898b3110d26c"></a><!-- doxytag: member="tbb::concurrent_vector::grow_by" ref="473a59a4c9308b93411b898b3110d26c" args="(size_type delta, const_reference t)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, class A> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">iterator <a class="el" href="a00161.html">tbb::concurrent_vector</a>< T, A >::grow_by </td>
+ <td>(</td>
+ <td class="paramtype">size_type </td>
+ <td class="paramname"> <em>delta</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const_reference </td>
+ <td class="paramname"> <em>t</em></td><td> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Returns iterator pointing to the first new element.
+</div>
+</div><p>
+<a class="anchor" name="38274ab3f772ecba600c7daca7690102"></a><!-- doxytag: member="tbb::concurrent_vector::grow_by" ref="38274ab3f772ecba600c7daca7690102" args="(size_type delta, const_reference t)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, class A> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">size_type <a class="el" href="a00161.html">tbb::concurrent_vector</a>< T, A >::grow_by </td>
+ <td>(</td>
+ <td class="paramtype">size_type </td>
+ <td class="paramname"> <em>delta</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const_reference </td>
+ <td class="paramname"> <em>t</em></td><td> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+<p>
+Grow by "delta" elements using copying constuctor.
+<p>
+Returns old size.
+</div>
+</div><p>
+<a class="anchor" name="c8177b1865270ea68aa1ab9148e5e35e"></a><!-- doxytag: member="tbb::concurrent_vector::grow_by" ref="c8177b1865270ea68aa1ab9148e5e35e" args="(size_type delta)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, class A> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">iterator <a class="el" href="a00161.html">tbb::concurrent_vector</a>< T, A >::grow_by </td>
+ <td>(</td>
+ <td class="paramtype">size_type </td>
+ <td class="paramname"> <em>delta</em> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Returns iterator pointing to the first new element.
+</div>
+</div><p>
+<a class="anchor" name="30484e3959892fd5392fa93c873c31f0"></a><!-- doxytag: member="tbb::concurrent_vector::grow_by" ref="30484e3959892fd5392fa93c873c31f0" args="(size_type delta)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, class A> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">size_type <a class="el" href="a00161.html">tbb::concurrent_vector</a>< T, A >::grow_by </td>
+ <td>(</td>
+ <td class="paramtype">size_type </td>
+ <td class="paramname"> <em>delta</em> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Grow by "delta" elements.
+<p>
+Returns old size.
+</div>
+</div><p>
+<a class="anchor" name="a7e3b67c8ccab16d0aecc80899ae799d"></a><!-- doxytag: member="tbb::concurrent_vector::grow_to_at_least" ref="a7e3b67c8ccab16d0aecc80899ae799d" args="(size_type n)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, class A> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">iterator <a class="el" href="a00161.html">tbb::concurrent_vector</a>< T, A >::grow_to_at_least </td>
+ <td>(</td>
+ <td class="paramtype">size_type </td>
+ <td class="paramname"> <em>n</em> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+The new elements are default constructed. Blocks until all elements in range [0..n) are allocated. May return while other elements are being constructed by other threads. Returns iterator that points to beginning of appended sequence. If no elements were appended, returns iterator pointing to nth element.
+</div>
+</div><p>
+<a class="anchor" name="47fe588214dd5fa06ab6e8ab78d83874"></a><!-- doxytag: member="tbb::concurrent_vector::grow_to_at_least" ref="47fe588214dd5fa06ab6e8ab78d83874" args="(size_type n)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, class A> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="a00161.html">tbb::concurrent_vector</a>< T, A >::grow_to_at_least </td>
+ <td>(</td>
+ <td class="paramtype">size_type </td>
+ <td class="paramname"> <em>n</em> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Append minimal sequence of elements such that <a class="el" href="a00161.html#715fe313c4a9c22731cc404dd80c9ec9">size()</a>>=n.
+<p>
+The new elements are default constructed. Blocks until all elements in range [0..n) are allocated. May return while other elements are being constructed by other threads.
+</div>
+</div><p>
+<a class="anchor" name="4c52f2950bb1832886bd4458eb09d7eb"></a><!-- doxytag: member="tbb::concurrent_vector::operator[]" ref="4c52f2950bb1832886bd4458eb09d7eb" args="(size_type index)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, class A> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">reference <a class="el" href="a00161.html">tbb::concurrent_vector</a>< T, A >::operator[] </td>
+ <td>(</td>
+ <td class="paramtype">size_type </td>
+ <td class="paramname"> <em>index</em> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Get reference to element at given index.
+<p>
+This method is thread-safe for concurrent reads, and also while growing the vector, as long as the calling thread has checked that index<<a class="el" href="a00161.html#715fe313c4a9c22731cc404dd80c9ec9">size()</a>.
+</div>
+</div><p>
+<a class="anchor" name="e94e038f915c0268fdf2d3d7f87d81b8"></a><!-- doxytag: member="tbb::concurrent_vector::push_back" ref="e94e038f915c0268fdf2d3d7f87d81b8" args="(const_reference item) iterator push_back(const _reference item)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, class A> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">size_type <a class="el" href="a00161.html">tbb::concurrent_vector</a>< T, A >::push_back </td>
+ <td>(</td>
+ <td class="paramtype">const_reference </td>
+ <td class="paramname"> <em>item</em> </td>
+ <td> ) </td>
+ <td width="100%"> const<code> [inline]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Push item.
+<p>
+Returns iterator pointing to the new element.
</div>
</div><p>
-<a class="anchor" name="7c45561bafe71107d09b2bc1b8f4e681"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::push_if_not_full" ref="7c45561bafe71107d09b2bc1b8f4e681" args="(const T &source)" -->
+<a class="anchor" name="5a0ce05026994b010018f72cfdeb72c1"></a><!-- doxytag: member="tbb::concurrent_vector::reserve" ref="5a0ce05026994b010018f72cfdeb72c1" args="(size_type n)" -->
<div class="memitem">
<div class="memproto">
<div class="memtemplate">
-template<typename T, class A = cache_aligned_allocator<T>> </div>
+template<typename T, class A> </div>
<table class="memname">
<tr>
- <td class="memname">bool <a class="el" href="a00161.html">tbb::deprecated::concurrent_queue</a>< T, A >::push_if_not_full </td>
+ <td class="memname">void <a class="el" href="a00161.html">tbb::concurrent_vector</a>< T, A >::reserve </td>
<td>(</td>
- <td class="paramtype">const T & </td>
- <td class="paramname"> <em>source</em> </td>
+ <td class="paramtype">size_type </td>
+ <td class="paramname"> <em>n</em> </td>
<td> ) </td>
<td width="100%"><code> [inline]</code></td>
</tr>
@@ -136,13 +578,13 @@ template<typename T, class A = cache_aligned_allocator<T>> </div>
<div class="memdoc">
<p>
-Enqueue an item at tail of queue if queue is not already full.
+Allocate enough space to grow to size n without having to allocate more memory later.
<p>
-Does not wait for queue to become not full. Returns true if item is pushed; false if queue was already full.
+Like most of the methods provided for STL compatibility, this method is *not* thread safe. The capacity afterwards may be bigger than the requested reservation.
</div>
</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00335.html">concurrent_queue.h</a></ul>
+<li><a class="el" href="a00342.html">concurrent_vector.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00162.html b/doc/html/a00162.html
index feece1c..774ea02 100644
--- a/doc/html/a00162.html
+++ b/doc/html/a00162.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::concurrent_vector< T, A > Class Template Reference</title>
+<title>tbb::empty_task Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,570 +21,28 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00162.html">concurrent_vector</a></div>
-<h1>tbb::concurrent_vector< T, A > Class Template Reference<br>
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00162.html">empty_task</a></div>
+<h1>tbb::empty_task Class Reference<br>
<small>
-[<a class="el" href="a00275.html">Containers</a>]</small>
-</h1><!-- doxytag: class="tbb::concurrent_vector" -->Concurrent vector container.
+[<a class="el" href="a00280.html">Task Scheduling</a>]</small>
+</h1><!-- doxytag: class="tbb::empty_task" --><!-- doxytag: inherits="tbb::task" -->task that does nothing. Useful for synchronization.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00341.html">concurrent_vector.h</a>></code>
+<code>#include <<a class="el" href="a00433.html">task.h</a>></code>
<p>
-<a href="a00026.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::empty_task:
+<p><center><img src="a00162.png" usemap="#tbb::empty_task_map" border="0" alt=""></center>
+<map name="tbb::empty_task_map">
+<area href="a00199.html" alt="tbb::task" shape="rect" coords="0,0,97,24">
+</map>
+<a href="a00076.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bc85684238d4bb5e422cb8ea0bdc438f"></a><!-- doxytag: member="tbb::concurrent_vector::size_type" ref="bc85684238d4bb5e422cb8ea0bdc438f" args="" -->
-typedef internal::concurrent_vector_base_v3::size_type </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ac7083635ab59834e9afc15e6c168df5"></a><!-- doxytag: member="tbb::concurrent_vector::allocator_type" ref="ac7083635ab59834e9afc15e6c168df5" args="" -->
-typedef internal::allocator_base<<br>
- T, A >::allocator_type </td><td class="memItemRight" valign="bottom"><b>allocator_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4543d7d45b2e461d3f8ef416974ec1f1"></a><!-- doxytag: member="tbb::concurrent_vector::value_type" ref="4543d7d45b2e461d3f8ef416974ec1f1" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e655e67dd14ed6d0cbfe7981d5fa350e"></a><!-- doxytag: member="tbb::concurrent_vector::difference_type" ref="e655e67dd14ed6d0cbfe7981d5fa350e" args="" -->
-typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><b>difference_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8c29033785d76e240ea96ae40610275d"></a><!-- doxytag: member="tbb::concurrent_vector::reference" ref="8c29033785d76e240ea96ae40610275d" args="" -->
-typedef T & </td><td class="memItemRight" valign="bottom"><b>reference</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b0b2a6241ab3fa9ab4f4074893fecd47"></a><!-- doxytag: member="tbb::concurrent_vector::const_reference" ref="b0b2a6241ab3fa9ab4f4074893fecd47" args="" -->
-typedef const T & </td><td class="memItemRight" valign="bottom"><b>const_reference</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="74319c908a32d5dcdc6a080f9c2b8803"></a><!-- doxytag: member="tbb::concurrent_vector::pointer" ref="74319c908a32d5dcdc6a080f9c2b8803" args="" -->
-typedef T * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dd80729019220cdb80872ea6b905ffb1"></a><!-- doxytag: member="tbb::concurrent_vector::const_pointer" ref="dd80729019220cdb80872ea6b905ffb1" args="" -->
-typedef const T * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a049674e7f386de3ea09ff2ed6d6bbbe"></a><!-- doxytag: member="tbb::concurrent_vector::iterator" ref="a049674e7f386de3ea09ff2ed6d6bbbe" args="" -->
-typedef internal::vector_iterator<<br>
- <a class="el" href="a00162.html">concurrent_vector</a>, T > </td><td class="memItemRight" valign="bottom"><b>iterator</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b51a1baa7da67e283806c0d4f2fe9c69"></a><!-- doxytag: member="tbb::concurrent_vector::const_iterator" ref="b51a1baa7da67e283806c0d4f2fe9c69" args="" -->
-typedef internal::vector_iterator<<br>
- <a class="el" href="a00162.html">concurrent_vector</a>, const <br>
-T > </td><td class="memItemRight" valign="bottom"><b>const_iterator</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c7e4d252bef7af22286041c39c62abe"></a><!-- doxytag: member="tbb::concurrent_vector::reverse_iterator" ref="2c7e4d252bef7af22286041c39c62abe" args="" -->
-typedef std::reverse_iterator<<br>
- iterator > </td><td class="memItemRight" valign="bottom"><b>reverse_iterator</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c59c3f9412b666a31a9052b789fb58bc"></a><!-- doxytag: member="tbb::concurrent_vector::const_reverse_iterator" ref="c59c3f9412b666a31a9052b789fb58bc" args="" -->
-typedef std::reverse_iterator<<br>
- const_iterator > </td><td class="memItemRight" valign="bottom"><b>const_reverse_iterator</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0c3901b092e9e8185bdc3cae5913e625"></a><!-- doxytag: member="tbb::concurrent_vector::reverse_iterator" ref="0c3901b092e9e8185bdc3cae5913e625" args="" -->
-typedef std::reverse_iterator<<br>
- iterator, T, T &, T * > </td><td class="memItemRight" valign="bottom"><b>reverse_iterator</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="426145d7bd5913bc08e701c14b221046"></a><!-- doxytag: member="tbb::concurrent_vector::const_reverse_iterator" ref="426145d7bd5913bc08e701c14b221046" args="" -->
-typedef std::reverse_iterator<<br>
- const_iterator, T, const <br>
-T &, const T * > </td><td class="memItemRight" valign="bottom"><b>const_reverse_iterator</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="61fd90288dba6f8808d6dafe9a249ec5"></a><!-- doxytag: member="tbb::concurrent_vector::range_type" ref="61fd90288dba6f8808d6dafe9a249ec5" args="" -->
-typedef generic_range_type<<br>
- iterator > </td><td class="memItemRight" valign="bottom"><b>range_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d6ddf0312a820a98efd9a5f394cb9dbd"></a><!-- doxytag: member="tbb::concurrent_vector::const_range_type" ref="d6ddf0312a820a98efd9a5f394cb9dbd" args="" -->
-typedef generic_range_type<<br>
- const_iterator > </td><td class="memItemRight" valign="bottom"><b>const_range_type</b></td></tr>
-
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c8ca9cabfcd30ad5943324c853664b5"></a><!-- doxytag: member="tbb::concurrent_vector::concurrent_vector" ref="2c8ca9cabfcd30ad5943324c853664b5" args="(const allocator_type &a=allocator_type())" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#2c8ca9cabfcd30ad5943324c853664b5">concurrent_vector</a> (const allocator_type &a=allocator_type())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty vector. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dd8a200b99a8088435a37934b58fe335"></a><!-- doxytag: member="tbb::concurrent_vector::concurrent_vector" ref="dd8a200b99a8088435a37934b58fe335" args="(const concurrent_vector &vector, const allocator_type &a=allocator_type())" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#dd8a200b99a8088435a37934b58fe335">concurrent_vector</a> (const <a class="el" href="a00162.html">concurrent_vector</a> &vector, const allocator_type &a=allocator_type())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Copying constructor. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="64432f13f7b29bfe4acfb5568f34f3a8"></a><!-- doxytag: member="tbb::concurrent_vector::concurrent_vector" ref="64432f13f7b29bfe4acfb5568f34f3a8" args="(const concurrent_vector< T, M > &vector, const allocator_type &a=allocator_type())" -->
-template<class M> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00162.html#64432f13f7b29bfe4acfb5568f34f3a8">concurrent_vector</a> (const <a class="el" href="a00162.html">concurrent_vector</a>< T, M > &vector, const allocator_type &a=allocator_type())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Copying constructor for vector with different allocator type. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2a2e261dfe1cab3f73f7b1a94137cfca"></a><!-- doxytag: member="tbb::concurrent_vector::concurrent_vector" ref="2a2e261dfe1cab3f73f7b1a94137cfca" args="(size_type n)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#2a2e261dfe1cab3f73f7b1a94137cfca">concurrent_vector</a> (size_type n)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construction with initial size specified by argument n. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3883a8a908b44e249a57f454de3f55d8"></a><!-- doxytag: member="tbb::concurrent_vector::concurrent_vector" ref="3883a8a908b44e249a57f454de3f55d8" args="(size_type n, const_reference t, const allocator_type &a=allocator_type())" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#3883a8a908b44e249a57f454de3f55d8">concurrent_vector</a> (size_type n, const_reference t, const allocator_type &a=allocator_type())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construction with initial size specified by argument n, initialization by copying of t, and given allocator instance. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="4450de83c5862ea4bcd9443fd7e67419"></a><!-- doxytag: member="tbb::concurrent_vector::concurrent_vector" ref="4450de83c5862ea4bcd9443fd7e67419" args="(I first, I last, const allocator_type &a=allocator_type())" -->
-template<class I> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00162.html#4450de83c5862ea4bcd9443fd7e67419">concurrent_vector</a> (I first, I last, const allocator_type &a=allocator_type())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construction with copying iteration range and given allocator instance. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="691f0f3cda3e489c37a657016e375eaf"></a><!-- doxytag: member="tbb::concurrent_vector::operator=" ref="691f0f3cda3e489c37a657016e375eaf" args="(const concurrent_vector &vector)" -->
-<a class="el" href="a00162.html">concurrent_vector</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#691f0f3cda3e489c37a657016e375eaf">operator=</a> (const <a class="el" href="a00162.html">concurrent_vector</a> &vector)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Assignment. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="19f4ab88a01b0fd056af3bba463e7bd6"></a><!-- doxytag: member="tbb::concurrent_vector::operator=" ref="19f4ab88a01b0fd056af3bba463e7bd6" args="(const concurrent_vector< T, M > &vector)" -->
-template<class M> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"><a class="el" href="a00162.html">concurrent_vector</a> & </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00162.html#19f4ab88a01b0fd056af3bba463e7bd6">operator=</a> (const <a class="el" href="a00162.html">concurrent_vector</a>< T, M > &vector)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Assignment for vector with different allocator type. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#30484e3959892fd5392fa93c873c31f0">grow_by</a> (size_type delta)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Grow by "delta" elements. <a href="#30484e3959892fd5392fa93c873c31f0"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#c8177b1865270ea68aa1ab9148e5e35e">grow_by</a> (size_type delta)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#38274ab3f772ecba600c7daca7690102">grow_by</a> (size_type delta, const_reference t)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Grow by "delta" elements using copying constuctor. <a href="#38274ab3f772ecba600c7daca7690102"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#473a59a4c9308b93411b898b3110d26c">grow_by</a> (size_type delta, const_reference t)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#47fe588214dd5fa06ab6e8ab78d83874">grow_to_at_least</a> (size_type n)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Append minimal sequence of elements such that <a class="el" href="a00162.html#715fe313c4a9c22731cc404dd80c9ec9">size()</a>>=n. <a href="#47fe588214dd5fa06ab6e8ab78d83874"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#a7e3b67c8ccab16d0aecc80899ae799d">grow_to_at_least</a> (size_type n)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a> (const_reference item) iterator push_back(const _reference item)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Push item. <a href="#e94e038f915c0268fdf2d3d7f87d81b8"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#4c52f2950bb1832886bd4458eb09d7eb">operator[]</a> (size_type index)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Get reference to element at given index. <a href="#4c52f2950bb1832886bd4458eb09d7eb"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c6fade5c732cc95274d1d8277ea619d1"></a><!-- doxytag: member="tbb::concurrent_vector::operator[]" ref="c6fade5c732cc95274d1d8277ea619d1" args="(size_type index) const " -->
-const_reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#c6fade5c732cc95274d1d8277ea619d1">operator[]</a> (size_type index) const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Get const reference to element at given index. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0c073ca43e787c7cbf7b0e26d2221748"></a><!-- doxytag: member="tbb::concurrent_vector::at" ref="0c073ca43e787c7cbf7b0e26d2221748" args="(size_type index)" -->
-reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#0c073ca43e787c7cbf7b0e26d2221748">at</a> (size_type index)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Get reference to element at given index. Throws exceptions on errors. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="23e14a38af748edff96a7adc3a0f1c58"></a><!-- doxytag: member="tbb::concurrent_vector::at" ref="23e14a38af748edff96a7adc3a0f1c58" args="(size_type index) const " -->
-const_reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#23e14a38af748edff96a7adc3a0f1c58">at</a> (size_type index) const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Get const reference to element at given index. Throws exceptions on errors. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a4c6ffff3bf08b92939aa2fc516edfba"></a><!-- doxytag: member="tbb::concurrent_vector::range" ref="a4c6ffff3bf08b92939aa2fc516edfba" args="(size_t grainsize=1)" -->
-range_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#a4c6ffff3bf08b92939aa2fc516edfba">range</a> (size_t grainsize=1)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Get range for iterating with parallel algorithms. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3d09ccfb581b879ae64203741035e193"></a><!-- doxytag: member="tbb::concurrent_vector::range" ref="3d09ccfb581b879ae64203741035e193" args="(size_t grainsize=1) const " -->
-const_range_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#3d09ccfb581b879ae64203741035e193">range</a> (size_t grainsize=1) const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Get const range for iterating with parallel algorithms. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="715fe313c4a9c22731cc404dd80c9ec9"></a><!-- doxytag: member="tbb::concurrent_vector::size" ref="715fe313c4a9c22731cc404dd80c9ec9" args="() const " -->
-size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#715fe313c4a9c22731cc404dd80c9ec9">size</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Return size of vector. It may include elements under construction. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c6426cb93cf20d3af40f3c90f1f0481a"></a><!-- doxytag: member="tbb::concurrent_vector::empty" ref="c6426cb93cf20d3af40f3c90f1f0481a" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#c6426cb93cf20d3af40f3c90f1f0481a">empty</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Return true if vector is not empty or has elements under construction at least. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3ed6b9ae7217af5103d974045b6f5cd5"></a><!-- doxytag: member="tbb::concurrent_vector::capacity" ref="3ed6b9ae7217af5103d974045b6f5cd5" args="() const " -->
-size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#3ed6b9ae7217af5103d974045b6f5cd5">capacity</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Maximum size to which array can grow without allocating more memory. Concurrent allocations are not included in the value. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#5a0ce05026994b010018f72cfdeb72c1">reserve</a> (size_type n)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Allocate enough space to grow to size n without having to allocate more memory later. <a href="#5a0ce05026994b010018f72cfdeb72c1"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8dfb0cb0eef96d440b4dcf801807a718"></a><!-- doxytag: member="tbb::concurrent_vector::resize" ref="8dfb0cb0eef96d440b4dcf801807a718" args="(size_type n)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#8dfb0cb0eef96d440b4dcf801807a718">resize</a> (size_type n)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Resize the vector. Not thread-safe. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="98ce6b2c6d2622f0c030b46dfac3880c"></a><!-- doxytag: member="tbb::concurrent_vector::resize" ref="98ce6b2c6d2622f0c030b46dfac3880c" args="(size_type n, const_reference t)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#98ce6b2c6d2622f0c030b46dfac3880c">resize</a> (size_type n, const_reference t)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Resize the vector, copy t for new elements. Not thread-safe. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1693d1da41b1a8235871be9c6633be35"></a><!-- doxytag: member="tbb::concurrent_vector::compact" ref="1693d1da41b1a8235871be9c6633be35" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#1693d1da41b1a8235871be9c6633be35">compact</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">An alias for <a class="el" href="a00162.html#03c6f4cf66532bf4cc907ee738a9a186">shrink_to_fit()</a>. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="03c6f4cf66532bf4cc907ee738a9a186"></a><!-- doxytag: member="tbb::concurrent_vector::shrink_to_fit" ref="03c6f4cf66532bf4cc907ee738a9a186" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#03c6f4cf66532bf4cc907ee738a9a186">shrink_to_fit</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Optimize memory usage and fragmentation. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c248a017f0576df3e7cd99627836fd6"></a><!-- doxytag: member="tbb::concurrent_vector::max_size" ref="2c248a017f0576df3e7cd99627836fd6" args="() const " -->
-size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#2c248a017f0576df3e7cd99627836fd6">max_size</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Upper bound on argument to reserve. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="730b23a251ecb6d37f692fb22f38e029"></a><!-- doxytag: member="tbb::concurrent_vector::begin" ref="730b23a251ecb6d37f692fb22f38e029" args="()" -->
-iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#730b23a251ecb6d37f692fb22f38e029">begin</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">start iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c0b51160e5a764982ec97a455f94f2c6"></a><!-- doxytag: member="tbb::concurrent_vector::end" ref="c0b51160e5a764982ec97a455f94f2c6" args="()" -->
-iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#c0b51160e5a764982ec97a455f94f2c6">end</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">end iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="78a06182276ff758788d4c0623ae0d71"></a><!-- doxytag: member="tbb::concurrent_vector::begin" ref="78a06182276ff758788d4c0623ae0d71" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#78a06182276ff758788d4c0623ae0d71">begin</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">start const iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1e6aa764ce5a1cbd24526f68bc0a2f6b"></a><!-- doxytag: member="tbb::concurrent_vector::end" ref="1e6aa764ce5a1cbd24526f68bc0a2f6b" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">end</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">end const iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f88fcf1c920693c39bd9709db33c199f"></a><!-- doxytag: member="tbb::concurrent_vector::cbegin" ref="f88fcf1c920693c39bd9709db33c199f" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#f88fcf1c920693c39bd9709db33c199f">cbegin</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">start const iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0c15a5d0f1cf75d687dabba07da1d46b"></a><!-- doxytag: member="tbb::concurrent_vector::cend" ref="0c15a5d0f1cf75d687dabba07da1d46b" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#0c15a5d0f1cf75d687dabba07da1d46b">cend</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">end const iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5e220926d09236d98f04fe0721e5f9a1"></a><!-- doxytag: member="tbb::concurrent_vector::rbegin" ref="5e220926d09236d98f04fe0721e5f9a1" args="()" -->
-reverse_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#5e220926d09236d98f04fe0721e5f9a1">rbegin</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">reverse start iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="290119a4eb43cd6a9e98fa17016ba3c2"></a><!-- doxytag: member="tbb::concurrent_vector::rend" ref="290119a4eb43cd6a9e98fa17016ba3c2" args="()" -->
-reverse_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#290119a4eb43cd6a9e98fa17016ba3c2">rend</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">reverse end iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9f9c103e18d5f212703805354074ad44"></a><!-- doxytag: member="tbb::concurrent_vector::rbegin" ref="9f9c103e18d5f212703805354074ad44" args="() const " -->
-const_reverse_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#9f9c103e18d5f212703805354074ad44">rbegin</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">reverse start const iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d438b9b32ea3a8ffb703015b6dce055b"></a><!-- doxytag: member="tbb::concurrent_vector::rend" ref="d438b9b32ea3a8ffb703015b6dce055b" args="() const " -->
-const_reverse_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#d438b9b32ea3a8ffb703015b6dce055b">rend</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">reverse end const iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="db78a1d28c9c966050e8a2926d834a33"></a><!-- doxytag: member="tbb::concurrent_vector::crbegin" ref="db78a1d28c9c966050e8a2926d834a33" args="() const " -->
-const_reverse_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#db78a1d28c9c966050e8a2926d834a33">crbegin</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">reverse start const iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fff9cece89438587997ebedf93c5e962"></a><!-- doxytag: member="tbb::concurrent_vector::crend" ref="fff9cece89438587997ebedf93c5e962" args="() const " -->
-const_reverse_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#fff9cece89438587997ebedf93c5e962">crend</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">reverse end const iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="15181759c0bfa2ddce5d10c7550e0002"></a><!-- doxytag: member="tbb::concurrent_vector::front" ref="15181759c0bfa2ddce5d10c7550e0002" args="()" -->
-reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#15181759c0bfa2ddce5d10c7550e0002">front</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">the first item <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="502615a858eb9fa0390ee59169065e90"></a><!-- doxytag: member="tbb::concurrent_vector::front" ref="502615a858eb9fa0390ee59169065e90" args="() const " -->
-const_reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#502615a858eb9fa0390ee59169065e90">front</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">the first item const <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="41ce48d6015a1a2812d41cf620ec3476"></a><!-- doxytag: member="tbb::concurrent_vector::back" ref="41ce48d6015a1a2812d41cf620ec3476" args="()" -->
-reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#41ce48d6015a1a2812d41cf620ec3476">back</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">the last item <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bd518e204107d07fd08d0ec5bdfd383d"></a><!-- doxytag: member="tbb::concurrent_vector::back" ref="bd518e204107d07fd08d0ec5bdfd383d" args="() const " -->
-const_reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#bd518e204107d07fd08d0ec5bdfd383d">back</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">the last item const <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2fdba8e90de6a4d2300222236d46758e"></a><!-- doxytag: member="tbb::concurrent_vector::get_allocator" ref="2fdba8e90de6a4d2300222236d46758e" args="() const " -->
-allocator_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#2fdba8e90de6a4d2300222236d46758e">get_allocator</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">return allocator object <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="423e5aa15e0e3309ad86d026fd85f6f6"></a><!-- doxytag: member="tbb::concurrent_vector::assign" ref="423e5aa15e0e3309ad86d026fd85f6f6" args="(size_type n, const_reference t)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#423e5aa15e0e3309ad86d026fd85f6f6">assign</a> (size_type n, const_reference t)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">assign n items by copying t item <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="93a06b3112cb804f42f40efb5e7387b4"></a><!-- doxytag: member="tbb::concurrent_vector::assign" ref="93a06b3112cb804f42f40efb5e7387b4" args="(I first, I last)" -->
-template<class I> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00162.html#93a06b3112cb804f42f40efb5e7387b4">assign</a> (I first, I last)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">assign range [first, last) <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="96c9c4bd968ed3edb8dd276854d2dae0"></a><!-- doxytag: member="tbb::concurrent_vector::swap" ref="96c9c4bd968ed3edb8dd276854d2dae0" args="(concurrent_vector &vector)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#96c9c4bd968ed3edb8dd276854d2dae0">swap</a> (<a class="el" href="a00162.html">concurrent_vector</a> &vector)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">swap two instances <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#26f937a359a66b6aae904c3cd9a3c444">clear</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Clear container while keeping memory allocated. <a href="#26f937a359a66b6aae904c3cd9a3c444"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="da2444b28bb840d38f60d0030333a5fc"></a><!-- doxytag: member="tbb::concurrent_vector::~concurrent_vector" ref="da2444b28bb840d38f60d0030333a5fc" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html#da2444b28bb840d38f60d0030333a5fc">~concurrent_vector</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Clear and destroy vector. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bb5ae659871478f1f5c68039e1273e12"></a><!-- doxytag: member="tbb::concurrent_vector::internal_vector_base" ref="bb5ae659871478f1f5c68039e1273e12" args="() const " -->
-const internal::concurrent_vector_base_v3 & </td><td class="memItemRight" valign="bottom"><b>internal_vector_base</b> () const </td></tr>
-
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="30086a58bff79a91103723be20916b96"></a><!-- doxytag: member="tbb::concurrent_vector::internal::vector_iterator" ref="30086a58bff79a91103723be20916b96" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::vector_iterator</b></td></tr>
-
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>generic_range_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>internal_loop_guide</b></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Exception-aware helper class for filling a segment by exception-danger operators of user class. <br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T, class A><br>
- class tbb::concurrent_vector< T, A ></h3>
-
-Concurrent vector container.
+task that does nothing. Useful for synchronization.
<p>
-<a class="el" href="a00162.html">concurrent_vector</a> is a container having the following main properties:<ul>
-<li>It provides random indexed access to its elements. The index of the first element is 0.</li><li>It ensures safe concurrent growing its size (different threads can safely append new elements).</li><li>Adding new elements does not invalidate existing iterators and does not change indices of existing items.</li></ul>
-<p>
-<dl compact><dt><b>Compatibility</b></dt><dd>The class meets all Container Requirements and Reversible Container Requirements from C++ Standard (See ISO/IEC 14882:2003(E), clause 23.1). But it doesn't meet Sequence Requirements due to absence of insert() and erase() methods.</dd></dl>
-<dl compact><dt><b>Exception Safety</b></dt><dd>Methods working with memory allocation and/or new elements construction can throw an exception if allocator fails to allocate memory or element's default constructor throws one. Concurrent vector's element of type T must conform to the following requirements:<ul>
-<li>Throwing an exception is forbidden for destructor of T.</li><li>Default constructor of T must not throw an exception OR its non-virtual destructor must safely work when its object memory is zero-initialized.</li></ul>
-Otherwise, the program's behavior is undefined. </dd></dl>
-<dl compact><dt><b></b></dt><dd>If an exception happens inside growth or assignment operation, an instance of the vector becomes invalid unless it is stated otherwise in the method documentation. Invalid state means:<ul>
-<li>There are no guaranties that all items were initialized by a constructor. The rest of items is zero-filled, including item where exception happens.</li><li>An invalid vector instance cannot be repaired; it is unable to grow anymore.</li><li>Size and capacity reported by the vector are incorrect, and calculated as if the failed operation were successful.</li><li>Attempt to access not allocated elements using operator[] or iterators results in access violation or segmentation fault exc [...]
-If a concurrent grow operation successfully completes, all the elements it has added to the vector will remain valid and accessible even if one of subsequent grow operations fails.</dd></dl>
-<dl compact><dt><b>Fragmentation</b></dt><dd>Unlike an STL vector, a <a class="el" href="a00162.html">concurrent_vector</a> does not move existing elements if it needs to allocate more memory. The container is divided into a series of contiguous arrays of elements. The first reservation, growth, or assignment operation determines the size of the first array. Using small number of elements as initial size incurs fragmentation that may increase element access time. Internal layout can be o [...]
-<dl compact><dt><b>Changes since TBB 2.1</b></dt><dd><ul>
-<li>Fixed guarantees of <a class="el" href="a00162.html#715fe313c4a9c22731cc404dd80c9ec9">concurrent_vector::size()</a> and <a class="el" href="a00162.html#47fe588214dd5fa06ab6e8ab78d83874">grow_to_at_least()</a> methods to assure elements are allocated.</li><li>Methods <a class="el" href="a00162.html#c0b51160e5a764982ec97a455f94f2c6">end()</a>/rbegin()/back() are partly thread-safe since they use <a class="el" href="a00162.html#715fe313c4a9c22731cc404dd80c9ec9">size()</a> to get the end [...]
-</dd></dl>
-<dl compact><dt><b>Changes since TBB 2.0</b></dt><dd><ul>
-<li>Implemented exception-safety guaranties</li><li>Added template argument for allocator</li><li>Added allocator argument in constructors</li><li>Faster index calculation</li><li>First growth call specifies a number of segments to be merged in the first allocation.</li><li>Fixed memory blow up for swarm of vector's instances of small size</li><li>Added <a class="el" href="a00162.html#38274ab3f772ecba600c7daca7690102">grow_by(size_type n, const_reference t)</a> growth using copying const [...]
-</dd></dl>
-
-<p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="26f937a359a66b6aae904c3cd9a3c444"></a><!-- doxytag: member="tbb::concurrent_vector::clear" ref="26f937a359a66b6aae904c3cd9a3c444" args="()" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, class A> </div>
- <table class="memname">
- <tr>
- <td class="memname">void <a class="el" href="a00162.html">tbb::concurrent_vector</a>< T, A >::clear </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Clear container while keeping memory allocated.
-<p>
-To free up the memory, use in conjunction with method <a class="el" href="a00162.html#1693d1da41b1a8235871be9c6633be35">compact()</a>. Not thread safe
-</div>
-</div><p>
-<a class="anchor" name="473a59a4c9308b93411b898b3110d26c"></a><!-- doxytag: member="tbb::concurrent_vector::grow_by" ref="473a59a4c9308b93411b898b3110d26c" args="(size_type delta, const_reference t)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, class A> </div>
- <table class="memname">
- <tr>
- <td class="memname">iterator <a class="el" href="a00162.html">tbb::concurrent_vector</a>< T, A >::grow_by </td>
- <td>(</td>
- <td class="paramtype">size_type </td>
- <td class="paramname"> <em>delta</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">const_reference </td>
- <td class="paramname"> <em>t</em></td><td> </td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Returns iterator pointing to the first new element.
-</div>
-</div><p>
-<a class="anchor" name="38274ab3f772ecba600c7daca7690102"></a><!-- doxytag: member="tbb::concurrent_vector::grow_by" ref="38274ab3f772ecba600c7daca7690102" args="(size_type delta, const_reference t)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, class A> </div>
- <table class="memname">
- <tr>
- <td class="memname">size_type <a class="el" href="a00162.html">tbb::concurrent_vector</a>< T, A >::grow_by </td>
- <td>(</td>
- <td class="paramtype">size_type </td>
- <td class="paramname"> <em>delta</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">const_reference </td>
- <td class="paramname"> <em>t</em></td><td> </td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Grow by "delta" elements using copying constuctor.
-<p>
-Returns old size.
-</div>
-</div><p>
-<a class="anchor" name="c8177b1865270ea68aa1ab9148e5e35e"></a><!-- doxytag: member="tbb::concurrent_vector::grow_by" ref="c8177b1865270ea68aa1ab9148e5e35e" args="(size_type delta)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, class A> </div>
- <table class="memname">
- <tr>
- <td class="memname">iterator <a class="el" href="a00162.html">tbb::concurrent_vector</a>< T, A >::grow_by </td>
- <td>(</td>
- <td class="paramtype">size_type </td>
- <td class="paramname"> <em>delta</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Returns iterator pointing to the first new element.
-</div>
-</div><p>
-<a class="anchor" name="30484e3959892fd5392fa93c873c31f0"></a><!-- doxytag: member="tbb::concurrent_vector::grow_by" ref="30484e3959892fd5392fa93c873c31f0" args="(size_type delta)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, class A> </div>
- <table class="memname">
- <tr>
- <td class="memname">size_type <a class="el" href="a00162.html">tbb::concurrent_vector</a>< T, A >::grow_by </td>
- <td>(</td>
- <td class="paramtype">size_type </td>
- <td class="paramname"> <em>delta</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Grow by "delta" elements.
-<p>
-Returns old size.
-</div>
-</div><p>
-<a class="anchor" name="a7e3b67c8ccab16d0aecc80899ae799d"></a><!-- doxytag: member="tbb::concurrent_vector::grow_to_at_least" ref="a7e3b67c8ccab16d0aecc80899ae799d" args="(size_type n)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, class A> </div>
- <table class="memname">
- <tr>
- <td class="memname">iterator <a class="el" href="a00162.html">tbb::concurrent_vector</a>< T, A >::grow_to_at_least </td>
- <td>(</td>
- <td class="paramtype">size_type </td>
- <td class="paramname"> <em>n</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-The new elements are default constructed. Blocks until all elements in range [0..n) are allocated. May return while other elements are being constructed by other threads. Returns iterator that points to beginning of appended sequence. If no elements were appended, returns iterator pointing to nth element.
-</div>
-</div><p>
-<a class="anchor" name="47fe588214dd5fa06ab6e8ab78d83874"></a><!-- doxytag: member="tbb::concurrent_vector::grow_to_at_least" ref="47fe588214dd5fa06ab6e8ab78d83874" args="(size_type n)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, class A> </div>
- <table class="memname">
- <tr>
- <td class="memname">void <a class="el" href="a00162.html">tbb::concurrent_vector</a>< T, A >::grow_to_at_least </td>
- <td>(</td>
- <td class="paramtype">size_type </td>
- <td class="paramname"> <em>n</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Append minimal sequence of elements such that <a class="el" href="a00162.html#715fe313c4a9c22731cc404dd80c9ec9">size()</a>>=n.
-<p>
-The new elements are default constructed. Blocks until all elements in range [0..n) are allocated. May return while other elements are being constructed by other threads.
-</div>
-</div><p>
-<a class="anchor" name="4c52f2950bb1832886bd4458eb09d7eb"></a><!-- doxytag: member="tbb::concurrent_vector::operator[]" ref="4c52f2950bb1832886bd4458eb09d7eb" args="(size_type index)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, class A> </div>
- <table class="memname">
- <tr>
- <td class="memname">reference <a class="el" href="a00162.html">tbb::concurrent_vector</a>< T, A >::operator[] </td>
- <td>(</td>
- <td class="paramtype">size_type </td>
- <td class="paramname"> <em>index</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Get reference to element at given index.
-<p>
-This method is thread-safe for concurrent reads, and also while growing the vector, as long as the calling thread has checked that index<<a class="el" href="a00162.html#715fe313c4a9c22731cc404dd80c9ec9">size()</a>.
-</div>
-</div><p>
-<a class="anchor" name="e94e038f915c0268fdf2d3d7f87d81b8"></a><!-- doxytag: member="tbb::concurrent_vector::push_back" ref="e94e038f915c0268fdf2d3d7f87d81b8" args="(const_reference item) iterator push_back(const _reference item)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, class A> </div>
- <table class="memname">
- <tr>
- <td class="memname">size_type <a class="el" href="a00162.html">tbb::concurrent_vector</a>< T, A >::push_back </td>
- <td>(</td>
- <td class="paramtype">const_reference </td>
- <td class="paramname"> <em>item</em> </td>
- <td> ) </td>
- <td width="100%"> const<code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Push item.
-<p>
-Returns iterator pointing to the new element.
-</div>
-</div><p>
-<a class="anchor" name="5a0ce05026994b010018f72cfdeb72c1"></a><!-- doxytag: member="tbb::concurrent_vector::reserve" ref="5a0ce05026994b010018f72cfdeb72c1" args="(size_type n)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, class A> </div>
- <table class="memname">
- <tr>
- <td class="memname">void <a class="el" href="a00162.html">tbb::concurrent_vector</a>< T, A >::reserve </td>
- <td>(</td>
- <td class="paramtype">size_type </td>
- <td class="paramname"> <em>n</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Allocate enough space to grow to size n without having to allocate more memory later.
-<p>
-Like most of the methods provided for STL compatibility, this method is *not* thread safe. The capacity afterwards may be bigger than the requested reservation.
-</div>
-</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00341.html">concurrent_vector.h</a></ul>
+<li><a class="el" href="a00433.html">task.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00163.png b/doc/html/a00162.png
similarity index 100%
rename from doc/html/a00163.png
rename to doc/html/a00162.png
diff --git a/doc/html/a00163.html b/doc/html/a00163.html
index 2a662f0..65c82ce 100644
--- a/doc/html/a00163.html
+++ b/doc/html/a00163.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::empty_task Class Reference</title>
+<title>tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,28 +21,171 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00163.html">empty_task</a></div>
-<h1>tbb::empty_task Class Reference<br>
+<a class="el" href="a00267.html">tbb</a>::<b>interface6</b>::<a class="el" href="a00163.html">enumerable_thread_specific</a></div>
+<h1>tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type > Class Template Reference<br>
<small>
-[<a class="el" href="a00279.html">Task Scheduling</a>]</small>
-</h1><!-- doxytag: class="tbb::empty_task" --><!-- doxytag: inherits="tbb::task" -->task that does nothing. Useful for synchronization.
+[<a class="el" href="a00276.html">Containers</a>]</small>
+</h1><!-- doxytag: class="tbb::interface6::enumerable_thread_specific" -->The <a class="el" href="a00163.html">enumerable_thread_specific</a> container.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00427.html">task.h</a>></code>
+<code>#include <<a class="el" href="a00354.html">enumerable_thread_specific.h</a>></code>
<p>
-<p>Inheritance diagram for tbb::empty_task:
-<p><center><img src="a00163.png" usemap="#tbb::empty_task_map" border="0" alt=""></center>
-<map name="tbb::empty_task_map">
-<area href="a00199.html" alt="tbb::task" shape="rect" coords="0,0,97,24">
-</map>
-<a href="a00076.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00031.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3c03eb40955b933b01987222722ac4bd"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::allocator_type" ref="3c03eb40955b933b01987222722ac4bd" args="" -->
+typedef Allocator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00163.html#3c03eb40955b933b01987222722ac4bd">allocator_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Basic types. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e93f3b75e82eaa845cc1a0514eaba31a"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::value_type" ref="e93f3b75e82eaa845cc1a0514eaba31a" args="" -->
+typedef T </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0fd259a6b20641c768079f41d3213904"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::reference" ref="0fd259a6b20641c768079f41d3213904" args="" -->
+typedef T & </td><td class="memItemRight" valign="bottom"><b>reference</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c1d47e24439524fea72d9c10df25d54"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::const_reference" ref="2c1d47e24439524fea72d9c10df25d54" args="" -->
+typedef const T & </td><td class="memItemRight" valign="bottom"><b>const_reference</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="27cf20b87f4381a69203aed11e5a34dc"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::pointer" ref="27cf20b87f4381a69203aed11e5a34dc" args="" -->
+typedef T * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0e132e2a40dd6ce5472f8e13a1e80947"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::const_pointer" ref="0e132e2a40dd6ce5472f8e13a1e80947" args="" -->
+typedef const T * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c67c208bec3e8b77190d545bd1f150e3"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::size_type" ref="c67c208bec3e8b77190d545bd1f150e3" args="" -->
+typedef internal_collection_type::size_type </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eda9be9a80bed094d4657948b5b7831f"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::difference_type" ref="eda9be9a80bed094d4657948b5b7831f" args="" -->
+typedef internal_collection_type::difference_type </td><td class="memItemRight" valign="bottom"><b>difference_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bd6f8e0af3c5e5166a4223f88b03e0a5"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::iterator" ref="bd6f8e0af3c5e5166a4223f88b03e0a5" args="" -->
+typedef internal::enumerable_thread_specific_iterator<<br>
+ <a class="el" href="a00161.html">internal_collection_type</a>,<br>
+ value_type > </td><td class="memItemRight" valign="bottom"><b>iterator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8ff2ff1a117048f5d57aedebb12d57e1"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::const_iterator" ref="8ff2ff1a117048f5d57aedebb12d57e1" args="" -->
+typedef internal::enumerable_thread_specific_iterator<<br>
+ <a class="el" href="a00161.html">internal_collection_type</a>,<br>
+ const value_type > </td><td class="memItemRight" valign="bottom"><b>const_iterator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d4c23a666adbf88bd3280873de9d7f39"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::range_type" ref="d4c23a666adbf88bd3280873de9d7f39" args="" -->
+typedef generic_range_type<<br>
+ iterator > </td><td class="memItemRight" valign="bottom"><b>range_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0ce41c6603d8f547f11df05d1ccb2184"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::const_range_type" ref="0ce41c6603d8f547f11df05d1ccb2184" args="" -->
+typedef generic_range_type<<br>
+ const_iterator > </td><td class="memItemRight" valign="bottom"><b>const_range_type</b></td></tr>
+
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0cfa3a5c8f2be3bbf313d93b1fa8cdb3"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::enumerable_thread_specific" ref="0cfa3a5c8f2be3bbf313d93b1fa8cdb3" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00163.html#0cfa3a5c8f2be3bbf313d93b1fa8cdb3">enumerable_thread_specific</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Default constructor. Each local instance of T is default constructed. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="8d4b456ff9d7b289c73254eccc11db45"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::enumerable_thread_specific" ref="8d4b456ff9d7b289c73254eccc11db45" args="(Finit finit)" -->
+template<typename Finit> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00163.html#8d4b456ff9d7b289c73254eccc11db45">enumerable_thread_specific</a> (Finit finit)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor with initializer functor. Each local instance of T is constructed by T(finit()). <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7bce6829981c9efe3f59cae2355e383e"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::enumerable_thread_specific" ref="7bce6829981c9efe3f59cae2355e383e" args="(const T &exemplar)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00163.html#7bce6829981c9efe3f59cae2355e383e">enumerable_thread_specific</a> (const T &exemplar)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Constuctor with exemplar. Each local instance of T is copied-constructed from the exemplar. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5a7907d9e3e5b18e7a7b55211ef3213f"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::~enumerable_thread_specific" ref="5a7907d9e3e5b18e7a7b55211ef3213f" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00163.html#5a7907d9e3e5b18e7a7b55211ef3213f">~enumerable_thread_specific</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c8d5265ccbd5e4485996b3f3baaa5ba1"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::local" ref="c8d5265ccbd5e4485996b3f3baaa5ba1" args="()" -->
+reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00163.html#c8d5265ccbd5e4485996b3f3baaa5ba1">local</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">returns reference to local, discarding exists <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7dc79058d2832f7447de8e691c3455ea"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::local" ref="7dc79058d2832f7447de8e691c3455ea" args="(bool &exists)" -->
+reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00163.html#7dc79058d2832f7447de8e691c3455ea">local</a> (bool &exists)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns reference to calling thread's local copy, creating one if necessary. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="33fd6593da1ed14340f10f67d5a69130"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::size" ref="33fd6593da1ed14340f10f67d5a69130" args="() const " -->
+size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00163.html#33fd6593da1ed14340f10f67d5a69130">size</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Get the number of local copies. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="72595886d0ac8fd0543f90038570510d"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::empty" ref="72595886d0ac8fd0543f90038570510d" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00163.html#72595886d0ac8fd0543f90038570510d">empty</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">true if there have been no local copies created <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="01d7baf8e913ab2819e97917a2ac795f"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::begin" ref="01d7baf8e913ab2819e97917a2ac795f" args="()" -->
+iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00163.html#01d7baf8e913ab2819e97917a2ac795f">begin</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">begin iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2456ff88252fc921b01cd8907628a4ee"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::end" ref="2456ff88252fc921b01cd8907628a4ee" args="()" -->
+iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00163.html#2456ff88252fc921b01cd8907628a4ee">end</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">end iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="84afb3906a39e399cde1c950d6351300"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::begin" ref="84afb3906a39e399cde1c950d6351300" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00163.html#84afb3906a39e399cde1c950d6351300">begin</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">begin const iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cb448bb4977ce366ceb7344085cc7050"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::end" ref="cb448bb4977ce366ceb7344085cc7050" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00163.html#cb448bb4977ce366ceb7344085cc7050">end</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">end const iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b22c54990b2362cd93c1a8f73de140bc"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::range" ref="b22c54990b2362cd93c1a8f73de140bc" args="(size_t grainsize=1)" -->
+range_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00163.html#b22c54990b2362cd93c1a8f73de140bc">range</a> (size_t grainsize=1)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Get range for parallel algorithms. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3b068000cf4dbf9b40f8bb7e3fc53e0b"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::range" ref="3b068000cf4dbf9b40f8bb7e3fc53e0b" args="(size_t grainsize=1) const " -->
+const_range_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00163.html#3b068000cf4dbf9b40f8bb7e3fc53e0b">range</a> (size_t grainsize=1) const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Get const range for parallel algorithms. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a8764176d4b6014c5d65f1051851abc8"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::clear" ref="a8764176d4b6014c5d65f1051851abc8" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00163.html#a8764176d4b6014c5d65f1051851abc8">clear</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys local copies. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="43bbf3a313c5431559df2946f76221e0"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::enumerable_thread_specific" ref="43bbf3a313c5431559df2946f76221e0" args="(const enumerable_thread_specific< U, Alloc, Cachetype > &other)" -->
+template<typename U, typename Alloc, ets_key_usage_type Cachetype> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>enumerable_thread_specific</b> (const <a class="el" href="a00163.html">enumerable_thread_specific</a>< U, Alloc, Cachetype > &other)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="25a9c336cfd5a171c29cbdd0feb84249"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::enumerable_thread_specific" ref="25a9c336cfd5a171c29cbdd0feb84249" args="(const enumerable_thread_specific &other)" -->
+ </td><td class="memItemRight" valign="bottom"><b>enumerable_thread_specific</b> (const <a class="el" href="a00163.html">enumerable_thread_specific</a> &other)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1f8f467eb4c44c58614d0f9dce687477"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::operator=" ref="1f8f467eb4c44c58614d0f9dce687477" args="(const enumerable_thread_specific &other)" -->
+<a class="el" href="a00163.html">enumerable_thread_specific</a> & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00163.html">enumerable_thread_specific</a> &other)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="0e7ebbfd8e04eb22fe59b581206e7888"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::operator=" ref="0e7ebbfd8e04eb22fe59b581206e7888" args="(const enumerable_thread_specific< U, Alloc, Cachetype > &other)" -->
+template<typename U, typename Alloc, ets_key_usage_type Cachetype> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"><a class="el" href="a00163.html">enumerable_thread_specific</a> & </td><td class="memTemplItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00163.html">enumerable_thread_specific</a>< U, Alloc, Cachetype > &other)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="1eac7eff6e21b7fc299b67acb36eb3c7"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::combine" ref="1eac7eff6e21b7fc299b67acb36eb3c7" args="(combine_func_t f_combine)" -->
+template<typename combine_func_t> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">T </td><td class="memTemplItemRight" valign="bottom"><b>combine</b> (combine_func_t f_combine)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="f671d7bd4c1d3a750b4be4c32a489c55"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::combine_each" ref="f671d7bd4c1d3a750b4be4c32a489c55" args="(combine_func_t f_combine)" -->
+template<typename combine_func_t> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>combine_each</b> (combine_func_t f_combine)</td></tr>
+
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="45364b2f249ceb935cff05c29fcfcf5c"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::enumerable_thread_specific" ref="45364b2f249ceb935cff05c29fcfcf5c" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>enumerable_thread_specific</b></td></tr>
+
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>generic_range_type</b></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A generic range, used to create range objects from the iterators. <br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-task that does nothing. Useful for synchronization.
+<h3>template<typename T, typename Allocator = cache_aligned_allocator<T>, ets_key_usage_type ETS_key_type = ets_no_key><br>
+ class tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></h3>
+
+The <a class="el" href="a00163.html">enumerable_thread_specific</a> container.
+<p>
+<a class="el" href="a00163.html">enumerable_thread_specific</a> has the following properties:<ul>
+<li>thread-local copies are lazily created, with default, exemplar or function initialization.</li><li>thread-local copies do not move (during lifetime, and excepting <a class="el" href="a00163.html#a8764176d4b6014c5d65f1051851abc8">clear()</a>) so the address of a copy is invariant.</li><li>the contained objects need not have operator=() defined if combine is not used.</li><li><a class="el" href="a00163.html">enumerable_thread_specific</a> containers may be copy-constructed or assigned. [...]
+<p>
+<dl compact><dt><b>Segmented iterator</b></dt><dd>When the thread-local objects are containers with input_iterators defined, a segmented iterator may be used to iterate over all the elements of all thread-local copies.</dd></dl>
+<dl compact><dt><b>combine and combine_each</b></dt><dd><ul>
+<li>Both methods are defined for <a class="el" href="a00163.html">enumerable_thread_specific</a>.</li><li>combine() requires the the type T have operator=() defined.</li><li>neither method modifies the contents of the object (though there is no guarantee that the applied methods do not modify the object.)</li><li>Both are evaluated in serial context (the methods are assumed to be non-benign.) </li></ul>
+</dd></dl>
+
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00427.html">task.h</a></ul>
+<li><a class="el" href="a00354.html">enumerable_thread_specific.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00164.html b/doc/html/a00164.html
index 76cc614..8f0e1c6 100644
--- a/doc/html/a00164.html
+++ b/doc/html/a00164.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type > Class Template Reference</title>
+<title>tbb::filter Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,171 +21,130 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00267.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00164.html">enumerable_thread_specific</a></div>
-<h1>tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type > Class Template Reference<br>
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00164.html">filter</a></div>
+<h1>tbb::filter Class Reference<br>
<small>
-[<a class="el" href="a00275.html">Containers</a>]</small>
-</h1><!-- doxytag: class="tbb::interface5::enumerable_thread_specific" -->The <a class="el" href="a00164.html">enumerable_thread_specific</a> container.
+[<a class="el" href="a00275.html">Algorithms</a>]</small>
+</h1><!-- doxytag: class="tbb::filter" -->A stage in a pipeline.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00353.html">enumerable_thread_specific.h</a>></code>
+<code>#include <<a class="el" href="a00414.html">pipeline.h</a>></code>
<p>
-<a href="a00031.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::filter:
+<p><center><img src="a00164.png" usemap="#tbb::filter_map" border="0" alt=""></center>
+<map name="tbb::filter_map">
+<area href="a00209.html" alt="tbb::thread_bound_filter" shape="rect" coords="0,56,145,80">
+</map>
+<a href="a00049.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="da7721b6c35d333ec89a37b63d0d82d3"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::allocator_type" ref="da7721b6c35d333ec89a37b63d0d82d3" args="" -->
-typedef Allocator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00164.html#da7721b6c35d333ec89a37b63d0d82d3">allocator_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Basic types. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="976852701d9d4018bca74907c80422af"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::value_type" ref="976852701d9d4018bca74907c80422af" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ca057d1cd23e99fb9d391d4af32ea3c3"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::reference" ref="ca057d1cd23e99fb9d391d4af32ea3c3" args="" -->
-typedef T & </td><td class="memItemRight" valign="bottom"><b>reference</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="518d24e759a14ed3d4b5ad13abc54b4c"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::const_reference" ref="518d24e759a14ed3d4b5ad13abc54b4c" args="" -->
-typedef const T & </td><td class="memItemRight" valign="bottom"><b>const_reference</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="68d25e2e57106ce3805f8f14b9c13d8c"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::pointer" ref="68d25e2e57106ce3805f8f14b9c13d8c" args="" -->
-typedef T * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dc48472e808339c40eb55c3fa4e68dc5"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::const_pointer" ref="dc48472e808339c40eb55c3fa4e68dc5" args="" -->
-typedef const T * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5c822bff644fb5245386486cc1ddaf7c"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::size_type" ref="5c822bff644fb5245386486cc1ddaf7c" args="" -->
-typedef internal_collection_type::size_type </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5e3fa161ff14516769519d3a555ccfb3"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::difference_type" ref="5e3fa161ff14516769519d3a555ccfb3" args="" -->
-typedef internal_collection_type::difference_type </td><td class="memItemRight" valign="bottom"><b>difference_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="00c3c2708bf7618b80060c2703aaf261"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::iterator" ref="00c3c2708bf7618b80060c2703aaf261" args="" -->
-typedef internal::enumerable_thread_specific_iterator<<br>
- <a class="el" href="a00162.html">internal_collection_type</a>,<br>
- value_type > </td><td class="memItemRight" valign="bottom"><b>iterator</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c575f3574d5d82b98e6a07314dcdc17f"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::const_iterator" ref="c575f3574d5d82b98e6a07314dcdc17f" args="" -->
-typedef internal::enumerable_thread_specific_iterator<<br>
- <a class="el" href="a00162.html">internal_collection_type</a>,<br>
- const value_type > </td><td class="memItemRight" valign="bottom"><b>const_iterator</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b914933105a8b56b961dd87c35908077"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::range_type" ref="b914933105a8b56b961dd87c35908077" args="" -->
-typedef generic_range_type<<br>
- iterator > </td><td class="memItemRight" valign="bottom"><b>range_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c914d5e2d64af34ae7399010057999c9"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::const_range_type" ref="c914d5e2d64af34ae7399010057999c9" args="" -->
-typedef generic_range_type<<br>
- const_iterator > </td><td class="memItemRight" valign="bottom"><b>const_range_type</b></td></tr>
-
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ca9994099ebd88e92be061452687422e"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::enumerable_thread_specific" ref="ca9994099ebd88e92be061452687422e" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00164.html#ca9994099ebd88e92be061452687422e">enumerable_thread_specific</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Default constructor, which leads to default construction of local copies. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="724ed4c846493da62b4efe032e16eb4a"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::enumerable_thread_specific" ref="724ed4c846493da62b4efe032e16eb4a" args="(Finit _finit)" -->
-template<typename Finit> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00164.html#724ed4c846493da62b4efe032e16eb4a">enumerable_thread_specific</a> (Finit _finit)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">construction with initializer method <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="105a6487c8c4113ba89891b75243780c"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::enumerable_thread_specific" ref="105a6487c8c4113ba89891b75243780c" args="(const T &_exemplar)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00164.html#105a6487c8c4113ba89891b75243780c">enumerable_thread_specific</a> (const T &_exemplar)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Constuction with exemplar, which leads to copy construction of local copies. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7f6e5b3654712ea003cbb7ebaffa8dd9"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::~enumerable_thread_specific" ref="7f6e5b3654712ea003cbb7ebaffa8dd9" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00164.html#7f6e5b3654712ea003cbb7ebaffa8dd9">~enumerable_thread_specific</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8bcc55bfecc81937872b13f6db962b16"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::local" ref="8bcc55bfecc81937872b13f6db962b16" args="()" -->
-reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00164.html#8bcc55bfecc81937872b13f6db962b16">local</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fcfec27656a69ff2072802ac001e936f"></a><!-- doxytag: member="tbb::filter::is_serial" ref="fcfec27656a69ff2072802ac001e936f" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00164.html#fcfec27656a69ff2072802ac001e936f">is_serial</a> () const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">returns reference to local, discarding exists <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="34423652c3add42563b1d5d44ca78158"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::local" ref="34423652c3add42563b1d5d44ca78158" args="(bool &exists)" -->
-reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00164.html#34423652c3add42563b1d5d44ca78158">local</a> (bool &exists)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">True if filter is serial. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cd53206c4795ef2df5df26b795caf692"></a><!-- doxytag: member="tbb::filter::is_ordered" ref="cd53206c4795ef2df5df26b795caf692" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00164.html#cd53206c4795ef2df5df26b795caf692">is_ordered</a> () const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns reference to calling thread's local copy, creating one if necessary. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="101ecd32efae3ce1331c3d8a791c645b"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::size" ref="101ecd32efae3ce1331c3d8a791c645b" args="() const " -->
-size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00164.html#101ecd32efae3ce1331c3d8a791c645b">size</a> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">True if filter must receive stream in order. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="15c29cae5d237e6d63dbfe5c94af89d5"></a><!-- doxytag: member="tbb::filter::is_bound" ref="15c29cae5d237e6d63dbfe5c94af89d5" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00164.html#15c29cae5d237e6d63dbfe5c94af89d5">is_bound</a> () const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Get the number of local copies. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="af91306d8e10e093226788a733ee59b4"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::empty" ref="af91306d8e10e093226788a733ee59b4" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00164.html#af91306d8e10e093226788a733ee59b4">empty</a> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">True if filter is thread-bound. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual void * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00164.html#fa1b3dc1f4f47563ccab7f4d92f5b543">operator()</a> (void *item)=0</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">true if there have been no local copies created <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="efd1e3d008ec5cd69c6b10c6dcac1e2c"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::begin" ref="efd1e3d008ec5cd69c6b10c6dcac1e2c" args="()" -->
-iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00164.html#efd1e3d008ec5cd69c6b10c6dcac1e2c">begin</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Operate on an item from the input stream, and return item for output stream. <a href="#fa1b3dc1f4f47563ccab7f4d92f5b543"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00164.html#66d159f362293e3964ba3da8bc1d2604">~filter</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">begin iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3156594e622924c094c45faa261dba5a"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::end" ref="3156594e622924c094c45faa261dba5a" args="()" -->
-iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00164.html#3156594e622924c094c45faa261dba5a">end</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy filter. <a href="#66d159f362293e3964ba3da8bc1d2604"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00164.html#56275eb889c77c4807967133e21401bd">finalize</a> (void *)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">end iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5f94cdb3a743e8b57c70dcb1041cfdf9"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::begin" ref="5f94cdb3a743e8b57c70dcb1041cfdf9" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00164.html#5f94cdb3a743e8b57c70dcb1041cfdf9">begin</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">begin const iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9909c01ec91ef10908c5155d6350db2d"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::end" ref="9909c01ec91ef10908c5155d6350db2d" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00164.html#9909c01ec91ef10908c5155d6350db2d">end</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">end const iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ab3f04b8d355b5d311e955d3bb63562c"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::range" ref="ab3f04b8d355b5d311e955d3bb63562c" args="(size_t grainsize=1)" -->
-range_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00164.html#ab3f04b8d355b5d311e955d3bb63562c">range</a> (size_t grainsize=1)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Get range for parallel algorithms. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="48f5ab20db3c77faa7219deb28076e6c"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::range" ref="48f5ab20db3c77faa7219deb28076e6c" args="(size_t grainsize=1) const " -->
-const_range_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00164.html#48f5ab20db3c77faa7219deb28076e6c">range</a> (size_t grainsize=1) const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Get const range for parallel algorithms. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e7be0d504ba71ae6c7479eb373a361ab"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::clear" ref="e7be0d504ba71ae6c7479eb373a361ab" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00164.html#e7be0d504ba71ae6c7479eb373a361ab">clear</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys local copies. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="a2f7ac9445823125ad1df2aaa06b5b92"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::enumerable_thread_specific" ref="a2f7ac9445823125ad1df2aaa06b5b92" args="(const enumerable_thread_specific< U, Alloc, Cachetype > &other)" -->
-template<typename U, typename Alloc, ets_key_usage_type Cachetype> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>enumerable_thread_specific</b> (const <a class="el" href="a00164.html">enumerable_thread_specific</a>< U, Alloc, Cachetype > &other)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8efb1e66e999d19e293964876da6414c"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::enumerable_thread_specific" ref="8efb1e66e999d19e293964876da6414c" args="(const enumerable_thread_specific &other)" -->
- </td><td class="memItemRight" valign="bottom"><b>enumerable_thread_specific</b> (const <a class="el" href="a00164.html">enumerable_thread_specific</a> &other)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a9b097f10dc5f035c73a0393b1820f4d"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::operator=" ref="a9b097f10dc5f035c73a0393b1820f4d" args="(const enumerable_thread_specific &other)" -->
-<a class="el" href="a00164.html">enumerable_thread_specific</a> & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00164.html">enumerable_thread_specific</a> &other)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="f96ff60333760809cbf29850ed31cae3"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::operator=" ref="f96ff60333760809cbf29850ed31cae3" args="(const enumerable_thread_specific< U, Alloc, Cachetype > &other)" -->
-template<typename U, typename Alloc, ets_key_usage_type Cachetype> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"><a class="el" href="a00164.html">enumerable_thread_specific</a> & </td><td class="memTemplItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00164.html">enumerable_thread_specific</a>< U, Alloc, Cachetype > &other)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="8203013705240cba76052ec7b828aaa8"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::combine" ref="8203013705240cba76052ec7b828aaa8" args="(combine_func_t f_combine)" -->
-template<typename combine_func_t> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">T </td><td class="memTemplItemRight" valign="bottom"><b>combine</b> (combine_func_t f_combine)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys item if pipeline was cancelled. <a href="#56275eb889c77c4807967133e21401bd"></a><br></td></tr>
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8228ce0751009045e8158d2e642715a6"></a><!-- doxytag: member="tbb::filter::internal::stage_task" ref="8228ce0751009045e8158d2e642715a6" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::stage_task</b></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="665463cc7bb56143d9cdbb35fc3616b0"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::combine_each" ref="665463cc7bb56143d9cdbb35fc3616b0" args="(combine_func_t f_combine)" -->
-template<typename combine_func_t> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>combine_each</b> (combine_func_t f_combine)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05d67150ca324698ba852553e223d3eb"></a><!-- doxytag: member="tbb::filter::internal::pipeline_root_task" ref="05d67150ca324698ba852553e223d3eb" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::pipeline_root_task</b></td></tr>
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="45364b2f249ceb935cff05c29fcfcf5c"></a><!-- doxytag: member="tbb::interface5::enumerable_thread_specific::enumerable_thread_specific" ref="45364b2f249ceb935cff05c29fcfcf5c" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>enumerable_thread_specific</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b211ee58bada099e24280d478017cbff"></a><!-- doxytag: member="tbb::filter::pipeline" ref="b211ee58bada099e24280d478017cbff" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>pipeline</b></td></tr>
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>generic_range_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e43b69a482df8e053cb199af69eb5139"></a><!-- doxytag: member="tbb::filter::thread_bound_filter" ref="e43b69a482df8e053cb199af69eb5139" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>thread_bound_filter</b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A generic range, used to create range objects from the iterators. <br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T, typename Allocator = cache_aligned_allocator<T>, ets_key_usage_type ETS_key_type = ets_no_key><br>
- class tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></h3>
+A stage in a pipeline.
+<p>
+<hr><h2>Constructor & Destructor Documentation</h2>
+<a class="anchor" name="66d159f362293e3964ba3da8bc1d2604"></a><!-- doxytag: member="tbb::filter::~filter" ref="66d159f362293e3964ba3da8bc1d2604" args="()" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual __TBB_EXPORTED_METHOD tbb::filter::~filter </td>
+ <td>(</td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"><code> [virtual]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
-The <a class="el" href="a00164.html">enumerable_thread_specific</a> container.
<p>
-<a class="el" href="a00164.html">enumerable_thread_specific</a> has the following properties:<ul>
-<li>thread-local copies are lazily created, with default, exemplar or function initialization.</li><li>thread-local copies do not move (during lifetime, and excepting <a class="el" href="a00164.html#e7be0d504ba71ae6c7479eb373a361ab">clear()</a>) so the address of a copy is invariant.</li><li>the contained objects need not have operator=() defined if combine is not used.</li><li><a class="el" href="a00164.html">enumerable_thread_specific</a> containers may be copy-constructed or assigned. [...]
+Destroy filter.
<p>
-<dl compact><dt><b>Segmented iterator</b></dt><dd>When the thread-local objects are containers with input_iterators defined, a segmented iterator may be used to iterate over all the elements of all thread-local copies.</dd></dl>
-<dl compact><dt><b>combine and combine_each</b></dt><dd><ul>
-<li>Both methods are defined for <a class="el" href="a00164.html">enumerable_thread_specific</a>.</li><li>combine() requires the the type T have operator=() defined.</li><li>neither method modifies the contents of the object (though there is no guarantee that the applied methods do not modify the object.)</li><li>Both are evaluated in serial context (the methods are assumed to be non-benign.) </li></ul>
-</dd></dl>
+If the filter was added to a pipeline, the pipeline must be destroyed first.
+</div>
+</div><p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="56275eb889c77c4807967133e21401bd"></a><!-- doxytag: member="tbb::filter::finalize" ref="56275eb889c77c4807967133e21401bd" args="(void *)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual void tbb::filter::finalize </td>
+ <td>(</td>
+ <td class="paramtype">void * </td>
+ <td class="paramname"> </td>
+ <td> ) </td>
+ <td width="100%"><code> [inline, virtual]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
<p>
+Destroys item if pipeline was cancelled.
+<p>
+Required to prevent memory leaks. Note it can be called concurrently even for serial filters.
+</div>
+</div><p>
+<a class="anchor" name="fa1b3dc1f4f47563ccab7f4d92f5b543"></a><!-- doxytag: member="tbb::filter::operator()" ref="fa1b3dc1f4f47563ccab7f4d92f5b543" args="(void *item)=0" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual void* tbb::filter::operator() </td>
+ <td>(</td>
+ <td class="paramtype">void * </td>
+ <td class="paramname"> <em>item</em> </td>
+ <td> ) </td>
+ <td width="100%"><code> [pure virtual]</code></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Operate on an item from the input stream, and return item for output stream.
+<p>
+Returns NULL if filter is a sink.
+</div>
+</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00353.html">enumerable_thread_specific.h</a></ul>
+<li><a class="el" href="a00414.html">pipeline.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00165.png b/doc/html/a00164.png
similarity index 100%
rename from doc/html/a00165.png
rename to doc/html/a00164.png
diff --git a/doc/html/a00165.html b/doc/html/a00165.html
index d7bac4c..a0ff3f0 100644
--- a/doc/html/a00165.html
+++ b/doc/html/a00165.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::filter Class Reference</title>
+<title>tbb::interface5::filter_t< T, U > Class Template Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,130 +21,50 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00165.html">filter</a></div>
-<h1>tbb::filter Class Reference<br>
-<small>
-[<a class="el" href="a00274.html">Algorithms</a>]</small>
-</h1><!-- doxytag: class="tbb::filter" -->A stage in a pipeline.
+<a class="el" href="a00267.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00165.html">filter_t</a></div>
+<h1>tbb::interface5::filter_t< T, U > Class Template Reference</h1><!-- doxytag: class="tbb::interface5::filter_t" -->Class representing a chain of type-safe pipeline filters.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00409.html">pipeline.h</a>></code>
+<code>#include <<a class="el" href="a00414.html">pipeline.h</a>></code>
<p>
-<p>Inheritance diagram for tbb::filter:
-<p><center><img src="a00165.png" usemap="#tbb::filter_map" border="0" alt=""></center>
-<map name="tbb::filter_map">
-<area href="a00209.html" alt="tbb::thread_bound_filter" shape="rect" coords="0,56,145,80">
-</map>
-<a href="a00049.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00053.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fcfec27656a69ff2072802ac001e936f"></a><!-- doxytag: member="tbb::filter::is_serial" ref="fcfec27656a69ff2072802ac001e936f" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00165.html#fcfec27656a69ff2072802ac001e936f">is_serial</a> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e03acdfacd859b954ee45c41fad09992"></a><!-- doxytag: member="tbb::interface5::filter_t::filter_t" ref="e03acdfacd859b954ee45c41fad09992" args="(const filter_t< T, U > &rhs)" -->
+ </td><td class="memItemRight" valign="bottom"><b>filter_t</b> (const <a class="el" href="a00165.html">filter_t</a>< T, U > &rhs)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">True if filter is serial. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cd53206c4795ef2df5df26b795caf692"></a><!-- doxytag: member="tbb::filter::is_ordered" ref="cd53206c4795ef2df5df26b795caf692" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00165.html#cd53206c4795ef2df5df26b795caf692">is_ordered</a> () const </td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="08960002b559318d985ab1c90344ed06"></a><!-- doxytag: member="tbb::interface5::filter_t::filter_t" ref="08960002b559318d985ab1c90344ed06" args="(tbb::filter::mode mode, const Body &body)" -->
+template<typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>filter_t</b> (tbb::filter::mode mode, const Body &body)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">True if filter must receive stream in order. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="15c29cae5d237e6d63dbfe5c94af89d5"></a><!-- doxytag: member="tbb::filter::is_bound" ref="15c29cae5d237e6d63dbfe5c94af89d5" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00165.html#15c29cae5d237e6d63dbfe5c94af89d5">is_bound</a> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a022e50a3f46111e385d8859699d5b33"></a><!-- doxytag: member="tbb::interface5::filter_t::operator=" ref="a022e50a3f46111e385d8859699d5b33" args="(const filter_t< T, U > &rhs)" -->
+void </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00165.html">filter_t</a>< T, U > &rhs)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">True if filter is thread-bound. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual void * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00165.html#fa1b3dc1f4f47563ccab7f4d92f5b543">operator()</a> (void *item)=0</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9785b1fbc87683bcfe0383b117b41a69"></a><!-- doxytag: member="tbb::interface5::filter_t::clear" ref="9785b1fbc87683bcfe0383b117b41a69" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><b>clear</b> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Operate on an item from the input stream, and return item for output stream. <a href="#fa1b3dc1f4f47563ccab7f4d92f5b543"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00165.html#66d159f362293e3964ba3da8bc1d2604">~filter</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy filter. <a href="#66d159f362293e3964ba3da8bc1d2604"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00165.html#56275eb889c77c4807967133e21401bd">finalize</a> (void *)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys item if pipeline was cancelled. <a href="#56275eb889c77c4807967133e21401bd"></a><br></td></tr>
<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8228ce0751009045e8158d2e642715a6"></a><!-- doxytag: member="tbb::filter::internal::stage_task" ref="8228ce0751009045e8158d2e642715a6" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::stage_task</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05d67150ca324698ba852553e223d3eb"></a><!-- doxytag: member="tbb::filter::internal::pipeline_root_task" ref="05d67150ca324698ba852553e223d3eb" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::pipeline_root_task</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fff802cb5656e3788a89f3314aed2efe"></a><!-- doxytag: member="tbb::interface5::filter_t::internal::pipeline_proxy" ref="fff802cb5656e3788a89f3314aed2efe" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::pipeline_proxy</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b211ee58bada099e24280d478017cbff"></a><!-- doxytag: member="tbb::filter::pipeline" ref="b211ee58bada099e24280d478017cbff" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>pipeline</b></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="85c2892eff1fddcd06e28911e75838bd"></a><!-- doxytag: member="tbb::interface5::filter_t::make_filter" ref="85c2892eff1fddcd06e28911e75838bd" args="(tbb::filter::mode, const Body &)" -->
+template<typename T_, typename U_, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"><a class="el" href="a00165.html">filter_t</a>< T_, U_ > </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00165.html#85c2892eff1fddcd06e28911e75838bd">make_filter</a> (tbb::filter::mode, const Body &)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e43b69a482df8e053cb199af69eb5139"></a><!-- doxytag: member="tbb::filter::thread_bound_filter" ref="e43b69a482df8e053cb199af69eb5139" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>thread_bound_filter</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Create a filter to participate in parallel_pipeline. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="6b9b1f5ce7f2121f093b8cd1d84707ad"></a><!-- doxytag: member="tbb::interface5::filter_t::operator &" ref="6b9b1f5ce7f2121f093b8cd1d84707ad" args="(const filter_t< T_, V_ > &, const filter_t< V_, U_ > &)" -->
+template<typename T_, typename V_, typename U_> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"><a class="el" href="a00165.html">filter_t</a>< T_, U_ > </td><td class="memTemplItemRight" valign="bottom"><b>operator &</b> (const <a class="el" href="a00165.html">filter_t</a>< T_, V_ > &, const <a class="el" href="a00165.html">filter_t</a>< V_, U_ > &)</td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-A stage in a pipeline.
-<p>
-<hr><h2>Constructor & Destructor Documentation</h2>
-<a class="anchor" name="66d159f362293e3964ba3da8bc1d2604"></a><!-- doxytag: member="tbb::filter::~filter" ref="66d159f362293e3964ba3da8bc1d2604" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">virtual __TBB_EXPORTED_METHOD tbb::filter::~filter </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [virtual]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
+<h3>template<typename T, typename U><br>
+ class tbb::interface5::filter_t< T, U ></h3>
+Class representing a chain of type-safe pipeline filters.
<p>
-Destroy filter.
-<p>
-If the filter was added to a pipeline, the pipeline must be destroyed first.
-</div>
-</div><p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="56275eb889c77c4807967133e21401bd"></a><!-- doxytag: member="tbb::filter::finalize" ref="56275eb889c77c4807967133e21401bd" args="(void *)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">virtual void tbb::filter::finalize </td>
- <td>(</td>
- <td class="paramtype">void * </td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [inline, virtual]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Destroys item if pipeline was cancelled.
-<p>
-Required to prevent memory leaks. Note it can be called concurrently even for serial filters.
-</div>
-</div><p>
-<a class="anchor" name="fa1b3dc1f4f47563ccab7f4d92f5b543"></a><!-- doxytag: member="tbb::filter::operator()" ref="fa1b3dc1f4f47563ccab7f4d92f5b543" args="(void *item)=0" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">virtual void* tbb::filter::operator() </td>
- <td>(</td>
- <td class="paramtype">void * </td>
- <td class="paramname"> <em>item</em> </td>
- <td> ) </td>
- <td width="100%"><code> [pure virtual]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Operate on an item from the input stream, and return item for output stream.
-<p>
-Returns NULL if filter is a sink.
-</div>
-</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00409.html">pipeline.h</a></ul>
+<li><a class="el" href="a00414.html">pipeline.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00166.html b/doc/html/a00166.html
index c74d628..a536980 100644
--- a/doc/html/a00166.html
+++ b/doc/html/a00166.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::interface5::filter_t< T, U > Class Template Reference</title>
+<title>tbb::final_scan_tag Struct Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,49 +21,27 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00267.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00166.html">filter_t</a></div>
-<h1>tbb::interface5::filter_t< T, U > Class Template Reference</h1><!-- doxytag: class="tbb::interface5::filter_t" -->Class representing a chain of type-safe pipeline filters.
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00166.html">final_scan_tag</a></div>
+<h1>tbb::final_scan_tag Struct Reference<br>
+<small>
+[<a class="el" href="a00275.html">Algorithms</a>]</small>
+</h1><!-- doxytag: class="tbb::final_scan_tag" -->Used to indicate that the final scan is being performed.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00409.html">pipeline.h</a>></code>
+<code>#include <<a class="el" href="a00396.html">parallel_scan.h</a>></code>
<p>
-<a href="a00053.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00042.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e03acdfacd859b954ee45c41fad09992"></a><!-- doxytag: member="tbb::interface5::filter_t::filter_t" ref="e03acdfacd859b954ee45c41fad09992" args="(const filter_t< T, U > &rhs)" -->
- </td><td class="memItemRight" valign="bottom"><b>filter_t</b> (const <a class="el" href="a00166.html">filter_t</a>< T, U > &rhs)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="08960002b559318d985ab1c90344ed06"></a><!-- doxytag: member="tbb::interface5::filter_t::filter_t" ref="08960002b559318d985ab1c90344ed06" args="(tbb::filter::mode mode, const Body &body)" -->
-template<typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>filter_t</b> (tbb::filter::mode mode, const Body &body)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a022e50a3f46111e385d8859699d5b33"></a><!-- doxytag: member="tbb::interface5::filter_t::operator=" ref="a022e50a3f46111e385d8859699d5b33" args="(const filter_t< T, U > &rhs)" -->
-void </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00166.html">filter_t</a>< T, U > &rhs)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9785b1fbc87683bcfe0383b117b41a69"></a><!-- doxytag: member="tbb::interface5::filter_t::clear" ref="9785b1fbc87683bcfe0383b117b41a69" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><b>clear</b> ()</td></tr>
-
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fff802cb5656e3788a89f3314aed2efe"></a><!-- doxytag: member="tbb::interface5::filter_t::internal::pipeline_proxy" ref="fff802cb5656e3788a89f3314aed2efe" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::pipeline_proxy</b></td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="85c2892eff1fddcd06e28911e75838bd"></a><!-- doxytag: member="tbb::interface5::filter_t::make_filter" ref="85c2892eff1fddcd06e28911e75838bd" args="(tbb::filter::mode, const Body &)" -->
-template<typename T_, typename U_, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"><a class="el" href="a00166.html">filter_t</a>< T_, U_ > </td><td class="memTemplItemRight" valign="bottom"><b>make_filter</b> (tbb::filter::mode, const Body &)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="6b9b1f5ce7f2121f093b8cd1d84707ad"></a><!-- doxytag: member="tbb::interface5::filter_t::operator &" ref="6b9b1f5ce7f2121f093b8cd1d84707ad" args="(const filter_t< T_, V_ > &, const filter_t< V_, U_ > &)" -->
-template<typename T_, typename V_, typename U_> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"><a class="el" href="a00166.html">filter_t</a>< T_, U_ > </td><td class="memTemplItemRight" valign="bottom"><b>operator &</b> (const <a class="el" href="a00166.html">filter_t</a>< T_, V_ > &, const <a class="el" href="a00166.html">filter_t</a>< V_, U_ > &)</td></tr>
+<tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="06888e4a548788fcb2c15542d428d8c9"></a><!-- doxytag: member="tbb::final_scan_tag::is_final_scan" ref="06888e4a548788fcb2c15542d428d8c9" args="()" -->
+static bool </td><td class="memItemRight" valign="bottom"><b>is_final_scan</b> ()</td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T, typename U><br>
- class tbb::interface5::filter_t< T, U ></h3>
-
-Class representing a chain of type-safe pipeline filters.
+Used to indicate that the final scan is being performed.
<p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00409.html">pipeline.h</a></ul>
+<hr>The documentation for this struct was generated from the following file:<ul>
+<li><a class="el" href="a00396.html">parallel_scan.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00167.html b/doc/html/a00167.html
index a523e47..45f1df3 100644
--- a/doc/html/a00167.html
+++ b/doc/html/a00167.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::final_scan_tag Struct Reference</title>
+<title>tbb::interface5::flow_control Class Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -21,27 +21,28 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00167.html">final_scan_tag</a></div>
-<h1>tbb::final_scan_tag Struct Reference<br>
-<small>
-[<a class="el" href="a00274.html">Algorithms</a>]</small>
-</h1><!-- doxytag: class="tbb::final_scan_tag" -->Used to indicate that the final scan is being performed.
+<a class="el" href="a00267.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00167.html">flow_control</a></div>
+<h1>tbb::interface5::flow_control Class Reference</h1><!-- doxytag: class="tbb::interface5::flow_control" -->input_filter control to signal end-of-input for parallel_pipeline
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00391.html">parallel_scan.h</a>></code>
+<code>#include <<a class="el" href="a00414.html">pipeline.h</a>></code>
<p>
-<a href="a00042.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00052.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="06888e4a548788fcb2c15542d428d8c9"></a><!-- doxytag: member="tbb::final_scan_tag::is_final_scan" ref="06888e4a548788fcb2c15542d428d8c9" args="()" -->
-static bool </td><td class="memItemRight" valign="bottom"><b>is_final_scan</b> ()</td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f907b38fcfbb48d2e949147fa3379037"></a><!-- doxytag: member="tbb::interface5::flow_control::stop" ref="f907b38fcfbb48d2e949147fa3379037" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><b>stop</b> ()</td></tr>
+
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="15bb80e25fbcc4213e0053d558df6462"></a><!-- doxytag: member="tbb::interface5::flow_control::internal::concrete_filter" ref="15bb80e25fbcc4213e0053d558df6462" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::concrete_filter</b></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Used to indicate that the final scan is being performed.
+input_filter control to signal end-of-input for parallel_pipeline
<p>
-<hr>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="a00391.html">parallel_scan.h</a></ul>
+<hr>The documentation for this class was generated from the following file:<ul>
+<li><a class="el" href="a00414.html">pipeline.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00168.html b/doc/html/a00168.html
index 8b85fc9..cc97337 100644
--- a/doc/html/a00168.html
+++ b/doc/html/a00168.html
@@ -25,7 +25,7 @@
<h1>tbb::improper_lock Class Reference</h1><!-- doxytag: class="tbb::improper_lock" -->Exception for PPL locks.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00453.html">tbb_exception.h</a>></code>
+<code>#include <<a class="el" href="a00459.html">tbb_exception.h</a>></code>
<p>
<a href="a00095.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -38,7 +38,7 @@ const char * </td><td class="memItemRight" valign="bottom"><b>what</b> () c
Exception for PPL locks.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00453.html">tbb_exception.h</a></ul>
+<li><a class="el" href="a00459.html">tbb_exception.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00169.html b/doc/html/a00169.html
index 7e94816..4907b53 100644
--- a/doc/html/a00169.html
+++ b/doc/html/a00169.html
@@ -25,7 +25,7 @@
<h1>tbb::invalid_multiple_scheduling Class Reference</h1><!-- doxytag: class="tbb::invalid_multiple_scheduling" -->Exception for repeated scheduling of the same task_handle.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00453.html">tbb_exception.h</a>></code>
+<code>#include <<a class="el" href="a00459.html">tbb_exception.h</a>></code>
<p>
<a href="a00097.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -38,7 +38,7 @@ const char * </td><td class="memItemRight" valign="bottom"><b>what</b> () c
Exception for repeated scheduling of the same task_handle.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00453.html">tbb_exception.h</a></ul>
+<li><a class="el" href="a00459.html">tbb_exception.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00170.html b/doc/html/a00170.html
index 9122906..9bff25f 100644
--- a/doc/html/a00170.html
+++ b/doc/html/a00170.html
@@ -25,7 +25,7 @@
<h1>tbb::missing_wait Class Reference</h1><!-- doxytag: class="tbb::missing_wait" -->Exception for missing wait on structured_task_group.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00453.html">tbb_exception.h</a>></code>
+<code>#include <<a class="el" href="a00459.html">tbb_exception.h</a>></code>
<p>
<a href="a00096.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -38,7 +38,7 @@ const char * </td><td class="memItemRight" valign="bottom"><b>what</b> () c
Exception for missing wait on structured_task_group.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00453.html">tbb_exception.h</a></ul>
+<li><a class="el" href="a00459.html">tbb_exception.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00171.html b/doc/html/a00171.html
index ca54bca..05eb181 100644
--- a/doc/html/a00171.html
+++ b/doc/html/a00171.html
@@ -25,7 +25,7 @@
<h1>tbb::movable_exception< ExceptionData > Class Template Reference</h1><!-- doxytag: class="tbb::movable_exception" --><!-- doxytag: inherits="tbb::tbb_exception" -->Template that can be used to implement exception that transfers arbitrary ExceptionData to the root thread.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00453.html">tbb_exception.h</a>></code>
+<code>#include <<a class="el" href="a00459.html">tbb_exception.h</a>></code>
<p>
<p>Inheritance diagram for tbb::movable_exception< ExceptionData >:
<p><center><img src="a00171.png" usemap="#tbb::movable_exception< ExceptionData >_map" border="0" alt=""></center>
@@ -159,7 +159,7 @@ Implements <a class="el" href="a00206.html#8588e07fa49692f4d734e4f2e4f048f4">tbb
</div>
</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00453.html">tbb_exception.h</a></ul>
+<li><a class="el" href="a00459.html">tbb_exception.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00172.html b/doc/html/a00172.html
index 65621cf..f1fdb78 100644
--- a/doc/html/a00172.html
+++ b/doc/html/a00172.html
@@ -24,11 +24,11 @@
<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00172.html">mutex</a></div>
<h1>tbb::mutex Class Reference<br>
<small>
-[<a class="el" href="a00277.html">Synchronization</a>]</small>
+[<a class="el" href="a00278.html">Synchronization</a>]</small>
</h1><!-- doxytag: class="tbb::mutex" -->Wrapper around the platform's native reader-writer lock.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00362.html">mutex.h</a>></code>
+<code>#include <<a class="el" href="a00367.html">mutex.h</a>></code>
<p>
<a href="a00034.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -124,7 +124,7 @@ Return true if lock acquired; false otherwise.
</div>
</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00362.html">mutex.h</a></ul>
+<li><a class="el" href="a00367.html">mutex.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00173.html b/doc/html/a00173.html
index 609542c..acdd664 100644
--- a/doc/html/a00173.html
+++ b/doc/html/a00173.html
@@ -25,7 +25,7 @@
<h1>tbb::mutex::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::mutex::scoped_lock" -->The scoped locking pattern.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00362.html">mutex.h</a>></code>
+<code>#include <<a class="el" href="a00367.html">mutex.h</a>></code>
<p>
<a href="a00035.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -65,7 +65,7 @@ The scoped locking pattern.
It helps to avoid the common problem of forgetting to release lock. It also nicely provides the "node" for queuing locks.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00362.html">mutex.h</a></ul>
+<li><a class="el" href="a00367.html">mutex.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00174.html b/doc/html/a00174.html
index 1f51cb6..d491ee8 100644
--- a/doc/html/a00174.html
+++ b/doc/html/a00174.html
@@ -24,11 +24,11 @@
<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00174.html">null_mutex</a></div>
<h1>tbb::null_mutex Class Reference<br>
<small>
-[<a class="el" href="a00277.html">Synchronization</a>]</small>
+[<a class="el" href="a00278.html">Synchronization</a>]</small>
</h1><!-- doxytag: class="tbb::null_mutex" -->A mutex which does nothing.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00364.html">null_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00369.html">null_mutex.h</a>></code>
<p>
<a href="a00036.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -53,7 +53,7 @@ A mutex which does nothing.
A <a class="el" href="a00174.html">null_mutex</a> does no operation and simulates success.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00364.html">null_mutex.h</a></ul>
+<li><a class="el" href="a00369.html">null_mutex.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00175.html b/doc/html/a00175.html
index 03906e3..6a938c6 100644
--- a/doc/html/a00175.html
+++ b/doc/html/a00175.html
@@ -25,7 +25,7 @@
<h1>tbb::null_mutex::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::null_mutex::scoped_lock" -->Represents acquisition of a mutex.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00364.html">null_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00369.html">null_mutex.h</a>></code>
<p>
<a href="a00037.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -47,7 +47,7 @@ void </td><td class="memItemRight" valign="bottom"><b>release</b> ()</td></
Represents acquisition of a mutex.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00364.html">null_mutex.h</a></ul>
+<li><a class="el" href="a00369.html">null_mutex.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00176.html b/doc/html/a00176.html
index 886e5c3..fd0aa0a 100644
--- a/doc/html/a00176.html
+++ b/doc/html/a00176.html
@@ -24,11 +24,11 @@
<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00176.html">null_rw_mutex</a></div>
<h1>tbb::null_rw_mutex Class Reference<br>
<small>
-[<a class="el" href="a00277.html">Synchronization</a>]</small>
+[<a class="el" href="a00278.html">Synchronization</a>]</small>
</h1><!-- doxytag: class="tbb::null_rw_mutex" -->A rw mutex which does nothing.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00365.html">null_rw_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00370.html">null_rw_mutex.h</a>></code>
<p>
<a href="a00038.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -53,7 +53,7 @@ A rw mutex which does nothing.
A <a class="el" href="a00176.html">null_rw_mutex</a> is a rw mutex that does nothing and simulates successful operation.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00365.html">null_rw_mutex.h</a></ul>
+<li><a class="el" href="a00370.html">null_rw_mutex.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00177.html b/doc/html/a00177.html
index 76cbb7e..3405736 100644
--- a/doc/html/a00177.html
+++ b/doc/html/a00177.html
@@ -25,7 +25,7 @@
<h1>tbb::null_rw_mutex::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::null_rw_mutex::scoped_lock" -->Represents acquisition of a mutex.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00365.html">null_rw_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00370.html">null_rw_mutex.h</a>></code>
<p>
<a href="a00039.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -53,7 +53,7 @@ void </td><td class="memItemRight" valign="bottom"><b>release</b> ()</td></
Represents acquisition of a mutex.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00365.html">null_rw_mutex.h</a></ul>
+<li><a class="el" href="a00370.html">null_rw_mutex.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00178.html b/doc/html/a00178.html
index 4ce4ca1..38b69aa 100644
--- a/doc/html/a00178.html
+++ b/doc/html/a00178.html
@@ -25,7 +25,7 @@
<h1>tbb::parallel_do_feeder< Item > Class Template Reference</h1><!-- doxytag: class="tbb::parallel_do_feeder" -->Class the user supplied algorithm body uses to add new tasks.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00366.html">parallel_do.h</a>></code>
+<code>#include <<a class="el" href="a00371.html">parallel_do.h</a>></code>
<p>
<a href="a00040.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -53,7 +53,7 @@ Class the user supplied algorithm body uses to add new tasks.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00366.html">parallel_do.h</a></ul>
+<li><a class="el" href="a00371.html">parallel_do.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00179.html b/doc/html/a00179.html
index df29520..df15ef5 100644
--- a/doc/html/a00179.html
+++ b/doc/html/a00179.html
@@ -24,11 +24,11 @@
<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00179.html">parallel_while</a></div>
<h1>tbb::parallel_while< Body > Class Template Reference<br>
<small>
-[<a class="el" href="a00274.html">Algorithms</a>]</small>
+[<a class="el" href="a00275.html">Algorithms</a>]</small>
</h1><!-- doxytag: class="tbb::parallel_while" -->Parallel iteration over a stream, with optional addition of more work.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00400.html">parallel_while.h</a>></code>
+<code>#include <<a class="el" href="a00405.html">parallel_while.h</a>></code>
<p>
<a href="a00043.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -128,7 +128,7 @@ A Stream s has the requirements <br>
</div>
</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00400.html">parallel_while.h</a></ul>
+<li><a class="el" href="a00405.html">parallel_while.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00180.html b/doc/html/a00180.html
index 2dab623..63434d8 100644
--- a/doc/html/a00180.html
+++ b/doc/html/a00180.html
@@ -24,11 +24,11 @@
<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00180.html">pipeline</a></div>
<h1>tbb::pipeline Class Reference<br>
<small>
-[<a class="el" href="a00274.html">Algorithms</a>]</small>
-</h1><!-- doxytag: class="tbb::pipeline" -->A processing pipeling that applies filters to items.
+[<a class="el" href="a00275.html">Algorithms</a>]</small>
+</h1><!-- doxytag: class="tbb::pipeline" -->A processing pipeline that applies filters to items.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00409.html">pipeline.h</a>></code>
+<code>#include <<a class="el" href="a00414.html">pipeline.h</a>></code>
<p>
<a href="a00051.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -40,7 +40,7 @@ __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a clas
<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00180.html#49513c6c24f9d5bbbb27edca5efe01c9">~pipeline</a> ()</td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="38fb5c9c8395dd6f89a4ae2011a83e0d"></a><!-- doxytag: member="tbb::pipeline::add_filter" ref="38fb5c9c8395dd6f89a4ae2011a83e0d" args="(filter &filter_)" -->
-void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00180.html#38fb5c9c8395dd6f89a4ae2011a83e0d">add_filter</a> (<a class="el" href="a00165.html">filter</a> &filter_)</td></tr>
+void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00180.html#38fb5c9c8395dd6f89a4ae2011a83e0d">add_filter</a> (<a class="el" href="a00164.html">filter</a> &filter_)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Add filter to end of pipeline. <br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f627616049b3fe36801f37ee40403ef8"></a><!-- doxytag: member="tbb::pipeline::run" ref="f627616049b3fe36801f37ee40403ef8" args="(size_t max_number_of_live_tokens)" -->
@@ -76,7 +76,7 @@ class </td><td class="memItemRight" valign="bottom"><b>tbb::interface5::int
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-A processing pipeling that applies filters to items.
+A processing pipeline that applies filters to items.
<p>
<hr><h2>Constructor & Destructor Documentation</h2>
<a class="anchor" name="49513c6c24f9d5bbbb27edca5efe01c9"></a><!-- doxytag: member="tbb::pipeline::~pipeline" ref="49513c6c24f9d5bbbb27edca5efe01c9" args="()" -->
@@ -99,7 +99,7 @@ Though the current implementation declares the destructor virtual, do not rely o
</div>
</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00409.html">pipeline.h</a></ul>
+<li><a class="el" href="a00414.html">pipeline.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00181.html b/doc/html/a00181.html
index a5bbd5e..76df8ff 100644
--- a/doc/html/a00181.html
+++ b/doc/html/a00181.html
@@ -24,11 +24,11 @@
<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00181.html">pre_scan_tag</a></div>
<h1>tbb::pre_scan_tag Struct Reference<br>
<small>
-[<a class="el" href="a00274.html">Algorithms</a>]</small>
+[<a class="el" href="a00275.html">Algorithms</a>]</small>
</h1><!-- doxytag: class="tbb::pre_scan_tag" -->Used to indicate that the initial scan is being performed.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00391.html">parallel_scan.h</a>></code>
+<code>#include <<a class="el" href="a00396.html">parallel_scan.h</a>></code>
<p>
<a href="a00041.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -41,7 +41,7 @@ static bool </td><td class="memItemRight" valign="bottom"><b>is_final_scan<
Used to indicate that the initial scan is being performed.
<p>
<hr>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="a00391.html">parallel_scan.h</a></ul>
+<li><a class="el" href="a00396.html">parallel_scan.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00182.html b/doc/html/a00182.html
index 1446339..a3bde33 100644
--- a/doc/html/a00182.html
+++ b/doc/html/a00182.html
@@ -24,11 +24,11 @@
<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00182.html">queuing_mutex</a></div>
<h1>tbb::queuing_mutex Class Reference<br>
<small>
-[<a class="el" href="a00277.html">Synchronization</a>]</small>
+[<a class="el" href="a00278.html">Synchronization</a>]</small>
</h1><!-- doxytag: class="tbb::queuing_mutex" -->Queuing lock with local-only spinning.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00420.html">queuing_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00426.html">queuing_mutex.h</a>></code>
<p>
<a href="a00054.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -63,7 +63,7 @@ class </td><td class="memItemRight" valign="bottom"><b>scoped_lock</b></td>
Queuing lock with local-only spinning.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00420.html">queuing_mutex.h</a></ul>
+<li><a class="el" href="a00426.html">queuing_mutex.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00183.html b/doc/html/a00183.html
index e014c8b..ffdc301 100644
--- a/doc/html/a00183.html
+++ b/doc/html/a00183.html
@@ -25,7 +25,7 @@
<h1>tbb::queuing_mutex::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::queuing_mutex::scoped_lock" -->The scoped locking pattern.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00420.html">queuing_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00426.html">queuing_mutex.h</a>></code>
<p>
<a href="a00055.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -82,7 +82,7 @@ Equivalent to zero-initialization of *this.
</div>
</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00420.html">queuing_mutex.h</a></ul>
+<li><a class="el" href="a00426.html">queuing_mutex.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00184.html b/doc/html/a00184.html
index d680ca5..e799d05 100644
--- a/doc/html/a00184.html
+++ b/doc/html/a00184.html
@@ -24,11 +24,11 @@
<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00184.html">queuing_rw_mutex</a></div>
<h1>tbb::queuing_rw_mutex Class Reference<br>
<small>
-[<a class="el" href="a00277.html">Synchronization</a>]</small>
+[<a class="el" href="a00278.html">Synchronization</a>]</small>
</h1><!-- doxytag: class="tbb::queuing_rw_mutex" -->Reader-writer lock with local-only spinning.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00421.html">queuing_rw_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00427.html">queuing_rw_mutex.h</a>></code>
<p>
<a href="a00056.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -69,7 +69,7 @@ Reader-writer lock with local-only spinning.
Adapted from Krieger, Stumm, et al. pseudocode at <a href="http://www.eecg.toronto.edu/parallel/pubs_abs.html#Krieger_etal_ICPP93">http://www.eecg.toronto.edu/parallel/pubs_abs.html#Krieger_etal_ICPP93</a>
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00421.html">queuing_rw_mutex.h</a></ul>
+<li><a class="el" href="a00427.html">queuing_rw_mutex.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00185.html b/doc/html/a00185.html
index ebc2b22..e6c23ec 100644
--- a/doc/html/a00185.html
+++ b/doc/html/a00185.html
@@ -25,7 +25,7 @@
<h1>tbb::queuing_rw_mutex::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::queuing_rw_mutex::scoped_lock" -->The scoped locking pattern.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00421.html">queuing_rw_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00427.html">queuing_rw_mutex.h</a>></code>
<p>
<a href="a00057.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -111,7 +111,7 @@ Returns true if the upgrade happened without re-acquiring the lock and false if
</div>
</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00421.html">queuing_rw_mutex.h</a></ul>
+<li><a class="el" href="a00427.html">queuing_rw_mutex.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00186.html b/doc/html/a00186.html
index 9fb13cd..00d8f54 100644
--- a/doc/html/a00186.html
+++ b/doc/html/a00186.html
@@ -24,11 +24,11 @@
<a class="el" href="a00267.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00186.html">reader_writer_lock</a></div>
<h1>tbb::interface5::reader_writer_lock Class Reference<br>
<small>
-[<a class="el" href="a00277.html">Synchronization</a>]</small>
+[<a class="el" href="a00278.html">Synchronization</a>]</small>
</h1><!-- doxytag: class="tbb::interface5::reader_writer_lock" -->Writer-preference reader-writer lock with local-only spinning on readers.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00422.html">reader_writer_lock.h</a>></code>
+<code>#include <<a class="el" href="a00428.html">reader_writer_lock.h</a>></code>
<p>
<a href="a00058.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -209,7 +209,7 @@ This function does not block. Return Value: True or false, depending on whether
</div>
</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00422.html">reader_writer_lock.h</a></ul>
+<li><a class="el" href="a00428.html">reader_writer_lock.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00187.html b/doc/html/a00187.html
index afe7630..e2b1ba3 100644
--- a/doc/html/a00187.html
+++ b/doc/html/a00187.html
@@ -25,7 +25,7 @@
<h1>tbb::interface5::reader_writer_lock::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::interface5::reader_writer_lock::scoped_lock" -->The scoped lock pattern for write locks.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00422.html">reader_writer_lock.h</a>></code>
+<code>#include <<a class="el" href="a00428.html">reader_writer_lock.h</a>></code>
<p>
<a href="a00059.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -55,7 +55,7 @@ The scoped lock pattern for write locks.
Scoped locks help avoid the common problem of forgetting to release the lock. This type is also serves as the node for queuing locks.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00422.html">reader_writer_lock.h</a></ul>
+<li><a class="el" href="a00428.html">reader_writer_lock.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00188.html b/doc/html/a00188.html
index 3c6a02f..50186d0 100644
--- a/doc/html/a00188.html
+++ b/doc/html/a00188.html
@@ -25,7 +25,7 @@
<h1>tbb::interface5::reader_writer_lock::scoped_lock_read Class Reference</h1><!-- doxytag: class="tbb::interface5::reader_writer_lock::scoped_lock_read" -->The scoped lock pattern for read locks.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00422.html">reader_writer_lock.h</a>></code>
+<code>#include <<a class="el" href="a00428.html">reader_writer_lock.h</a>></code>
<p>
<a href="a00060.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -53,7 +53,7 @@ class </td><td class="memItemRight" valign="bottom"><b>reader_writer_lock</
The scoped lock pattern for read locks.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00422.html">reader_writer_lock.h</a></ul>
+<li><a class="el" href="a00428.html">reader_writer_lock.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00189.html b/doc/html/a00189.html
index 34805fe..5ec864e 100644
--- a/doc/html/a00189.html
+++ b/doc/html/a00189.html
@@ -24,11 +24,11 @@
<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00189.html">recursive_mutex</a></div>
<h1>tbb::recursive_mutex Class Reference<br>
<small>
-[<a class="el" href="a00277.html">Synchronization</a>]</small>
+[<a class="el" href="a00278.html">Synchronization</a>]</small>
</h1><!-- doxytag: class="tbb::recursive_mutex" -->Mutex that allows recursive mutex acquisition.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00423.html">recursive_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00429.html">recursive_mutex.h</a>></code>
<p>
<a href="a00061.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -106,7 +106,7 @@ Return true if lock acquired; false otherwise.
</div>
</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00423.html">recursive_mutex.h</a></ul>
+<li><a class="el" href="a00429.html">recursive_mutex.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00190.html b/doc/html/a00190.html
index 6f72ddd..9a901db 100644
--- a/doc/html/a00190.html
+++ b/doc/html/a00190.html
@@ -25,7 +25,7 @@
<h1>tbb::recursive_mutex::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::recursive_mutex::scoped_lock" -->The scoped locking pattern.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00423.html">recursive_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00429.html">recursive_mutex.h</a>></code>
<p>
<a href="a00062.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -65,7 +65,7 @@ The scoped locking pattern.
It helps to avoid the common problem of forgetting to release lock. It also nicely provides the "node" for queuing locks.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00423.html">recursive_mutex.h</a></ul>
+<li><a class="el" href="a00429.html">recursive_mutex.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00191.html b/doc/html/a00191.html
index 217d1ca..f81e926 100644
--- a/doc/html/a00191.html
+++ b/doc/html/a00191.html
@@ -24,11 +24,11 @@
<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00191.html">scalable_allocator</a></div>
<h1>tbb::scalable_allocator< T > Class Template Reference<br>
<small>
-[<a class="el" href="a00276.html">Memory Allocation</a>]</small>
+[<a class="el" href="a00277.html">Memory Allocation</a>]</small>
</h1><!-- doxytag: class="tbb::scalable_allocator" -->Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00424.html">scalable_allocator.h</a>></code>
+<code>#include <<a class="el" href="a00430.html">scalable_allocator.h</a>></code>
<p>
<a href="a00063.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -100,7 +100,7 @@ Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.
The members are ordered the same way they are in section 20.4.1 of the ISO C++ standard.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00424.html">scalable_allocator.h</a></ul>
+<li><a class="el" href="a00430.html">scalable_allocator.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00192.html b/doc/html/a00192.html
index 37a57d1..15d0809 100644
--- a/doc/html/a00192.html
+++ b/doc/html/a00192.html
@@ -24,11 +24,11 @@
<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00192.html">scalable_allocator< void ></a></div>
<h1>tbb::scalable_allocator< void > Class Template Reference<br>
<small>
-[<a class="el" href="a00276.html">Memory Allocation</a>]</small>
+[<a class="el" href="a00277.html">Memory Allocation</a>]</small>
</h1><!-- doxytag: class="tbb::scalable_allocator< void >" -->Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00424.html">scalable_allocator.h</a>></code>
+<code>#include <<a class="el" href="a00430.html">scalable_allocator.h</a>></code>
<p>
<a href="a00065.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -53,7 +53,7 @@ typedef void </td><td class="memItemRight" valign="bottom"><b>value_type</b
Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00424.html">scalable_allocator.h</a></ul>
+<li><a class="el" href="a00430.html">scalable_allocator.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00193.html b/doc/html/a00193.html
index ed3bd5d..185befb 100644
--- a/doc/html/a00193.html
+++ b/doc/html/a00193.html
@@ -24,11 +24,11 @@
<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00193.html">simple_partitioner</a></div>
<h1>tbb::simple_partitioner Class Reference<br>
<small>
-[<a class="el" href="a00274.html">Algorithms</a>]</small>
+[<a class="el" href="a00275.html">Algorithms</a>]</small>
</h1><!-- doxytag: class="tbb::simple_partitioner" -->A simple partitioner.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00404.html">partitioner.h</a>></code>
+<code>#include <<a class="el" href="a00409.html">partitioner.h</a>></code>
<p>
<a href="a00044.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -52,7 +52,7 @@ A simple partitioner.
Divides the range until the range is not divisible.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00404.html">partitioner.h</a></ul>
+<li><a class="el" href="a00409.html">partitioner.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00194.html b/doc/html/a00194.html
index 5b8f327..b533ca6 100644
--- a/doc/html/a00194.html
+++ b/doc/html/a00194.html
@@ -24,11 +24,11 @@
<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00194.html">spin_mutex</a></div>
<h1>tbb::spin_mutex Class Reference<br>
<small>
-[<a class="el" href="a00277.html">Synchronization</a>]</small>
+[<a class="el" href="a00278.html">Synchronization</a>]</small>
</h1><!-- doxytag: class="tbb::spin_mutex" -->A lock that occupies a single byte.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00425.html">spin_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00431.html">spin_mutex.h</a>></code>
<p>
<a href="a00067.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -119,7 +119,7 @@ Return true if lock acquired; false otherwise.
</div>
</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00425.html">spin_mutex.h</a></ul>
+<li><a class="el" href="a00431.html">spin_mutex.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00195.html b/doc/html/a00195.html
index cbc6071..b8e2928 100644
--- a/doc/html/a00195.html
+++ b/doc/html/a00195.html
@@ -25,7 +25,7 @@
<h1>tbb::spin_mutex::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::spin_mutex::scoped_lock" -->Represents acquisition of a mutex.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00425.html">spin_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00431.html">spin_mutex.h</a>></code>
<p>
<a href="a00068.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -85,7 +85,7 @@ Return true if lock acquired; false otherwise.
</div>
</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00425.html">spin_mutex.h</a></ul>
+<li><a class="el" href="a00431.html">spin_mutex.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00196.html b/doc/html/a00196.html
index 2622c23..974baff 100644
--- a/doc/html/a00196.html
+++ b/doc/html/a00196.html
@@ -24,11 +24,11 @@
<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00196.html">spin_rw_mutex_v3</a></div>
<h1>tbb::spin_rw_mutex_v3 Class Reference<br>
<small>
-[<a class="el" href="a00277.html">Synchronization</a>]</small>
+[<a class="el" href="a00278.html">Synchronization</a>]</small>
</h1><!-- doxytag: class="tbb::spin_rw_mutex_v3" -->Fast, unfair, spinning reader-writer lock with backoff and writer-preference.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00426.html">spin_rw_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00432.html">spin_rw_mutex.h</a>></code>
<p>
<a href="a00069.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -121,7 +121,7 @@ Return true if reader lock acquired; false otherwise.
</div>
</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00426.html">spin_rw_mutex.h</a></ul>
+<li><a class="el" href="a00432.html">spin_rw_mutex.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00197.html b/doc/html/a00197.html
index 804c194..117bb7c 100644
--- a/doc/html/a00197.html
+++ b/doc/html/a00197.html
@@ -25,7 +25,7 @@
<h1>tbb::spin_rw_mutex_v3::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::spin_rw_mutex_v3::scoped_lock" -->The scoped locking pattern.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00426.html">spin_rw_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00432.html">spin_rw_mutex.h</a>></code>
<p>
<a href="a00070.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -111,7 +111,7 @@ Returns true if the upgrade happened without re-acquiring the lock and false if
</div>
</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00426.html">spin_rw_mutex.h</a></ul>
+<li><a class="el" href="a00432.html">spin_rw_mutex.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00198.html b/doc/html/a00198.html
index 71b25d5..269a537 100644
--- a/doc/html/a00198.html
+++ b/doc/html/a00198.html
@@ -24,11 +24,11 @@
<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00198.html">split</a></div>
<h1>tbb::split Class Reference<br>
<small>
-[<a class="el" href="a00274.html">Algorithms</a>]</small>
+[<a class="el" href="a00275.html">Algorithms</a>]</small>
</h1><!-- doxytag: class="tbb::split" -->Dummy type that distinguishes splitting constructor from copy constructor.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00459.html">tbb_stddef.h</a>></code>
+<code>#include <<a class="el" href="a00465.html">tbb_stddef.h</a>></code>
<p>
<table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -39,7 +39,7 @@ Dummy type that distinguishes splitting constructor from copy constructor.
See description of parallel_for and parallel_reduce for example usages.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00459.html">tbb_stddef.h</a></ul>
+<li><a class="el" href="a00465.html">tbb_stddef.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00199.html b/doc/html/a00199.html
index fb0921f..b6920f2 100644
--- a/doc/html/a00199.html
+++ b/doc/html/a00199.html
@@ -24,16 +24,16 @@
<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00199.html">task</a></div>
<h1>tbb::task Class Reference<br>
<small>
-[<a class="el" href="a00279.html">Task Scheduling</a>]</small>
+[<a class="el" href="a00280.html">Task Scheduling</a>]</small>
</h1><!-- doxytag: class="tbb::task" -->Base class for user-defined tasks.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00427.html">task.h</a>></code>
+<code>#include <<a class="el" href="a00433.html">task.h</a>></code>
<p>
<p>Inheritance diagram for tbb::task:
<p><center><img src="a00199.png" usemap="#tbb::task_map" border="0" alt=""></center>
<map name="tbb::task_map">
-<area href="a00163.html" alt="tbb::empty_task" shape="rect" coords="0,56,97,80">
+<area href="a00162.html" alt="tbb::empty_task" shape="rect" coords="0,56,97,80">
</map>
<a href="a00075.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -524,7 +524,7 @@ Works on tasks while waiting.
</div>
</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00427.html">task.h</a></ul>
+<li><a class="el" href="a00433.html">task.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00200.html b/doc/html/a00200.html
index 054dd46..1dfcd93 100644
--- a/doc/html/a00200.html
+++ b/doc/html/a00200.html
@@ -25,7 +25,7 @@
<h1>tbb::interface5::internal::task_base Class Reference</h1><!-- doxytag: class="tbb::interface5::internal::task_base" -->Base class for methods that became static in TBB 3.0.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00427.html">task.h</a>></code>
+<code>#include <<a class="el" href="a00433.html">task.h</a>></code>
<p>
<a href="a00072.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -36,7 +36,7 @@ Base class for methods that became static in TBB 3.0.
TBB's evolution caused the "this" argument for several methods to become obsolete. However, for backwards binary compatibility, the new methods need distinct names, otherwise the One Definition Rule would be broken. Hence the new methods are defined in this private base class, and then exposed in class task via using declarations.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00427.html">task.h</a></ul>
+<li><a class="el" href="a00433.html">task.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00201.html b/doc/html/a00201.html
index c57da67..47812cf 100644
--- a/doc/html/a00201.html
+++ b/doc/html/a00201.html
@@ -24,11 +24,11 @@
<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00201.html">task_group_context</a></div>
<h1>tbb::task_group_context Class Reference<br>
<small>
-[<a class="el" href="a00279.html">Task Scheduling</a>]</small>
+[<a class="el" href="a00280.html">Task Scheduling</a>]</small>
</h1><!-- doxytag: class="tbb::task_group_context" -->Used to form groups of tasks.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00427.html">task.h</a>></code>
+<code>#include <<a class="el" href="a00433.html">task.h</a>></code>
<p>
<a href="a00073.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -219,7 +219,7 @@ The method does not change the context's parent if it is set.
</div>
</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00427.html">task.h</a></ul>
+<li><a class="el" href="a00433.html">task.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00202.html b/doc/html/a00202.html
index 194ee33..304599f 100644
--- a/doc/html/a00202.html
+++ b/doc/html/a00202.html
@@ -24,11 +24,11 @@
<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00202.html">task_list</a></div>
<h1>tbb::task_list Class Reference<br>
<small>
-[<a class="el" href="a00279.html">Task Scheduling</a>]</small>
+[<a class="el" href="a00280.html">Task Scheduling</a>]</small>
</h1><!-- doxytag: class="tbb::task_list" -->A list of children.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00427.html">task.h</a>></code>
+<code>#include <<a class="el" href="a00433.html">task.h</a>></code>
<p>
<a href="a00077.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -71,7 +71,7 @@ A list of children.
Used for method task::spawn_children
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00427.html">task.h</a></ul>
+<li><a class="el" href="a00433.html">task.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00203.html b/doc/html/a00203.html
index 24c2ce3..9e46fe6 100644
--- a/doc/html/a00203.html
+++ b/doc/html/a00203.html
@@ -24,11 +24,11 @@
<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00203.html">task_scheduler_init</a></div>
<h1>tbb::task_scheduler_init Class Reference<br>
<small>
-[<a class="el" href="a00279.html">Task Scheduling</a>]</small>
+[<a class="el" href="a00280.html">Task Scheduling</a>]</small>
</h1><!-- doxytag: class="tbb::task_scheduler_init" -->Class representing reference to tbb scheduler.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00443.html">task_scheduler_init.h</a>></code>
+<code>#include <<a class="el" href="a00449.html">task_scheduler_init.h</a>></code>
<p>
<a href="a00084.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -152,7 +152,7 @@ The number_of_threads is ignored if any other task_scheduler_inits currently exi
</div>
</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00443.html">task_scheduler_init.h</a></ul>
+<li><a class="el" href="a00449.html">task_scheduler_init.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00204.html b/doc/html/a00204.html
index 47f153a..c445927 100644
--- a/doc/html/a00204.html
+++ b/doc/html/a00204.html
@@ -24,11 +24,11 @@
<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00204.html">tbb_allocator</a></div>
<h1>tbb::tbb_allocator< T > Class Template Reference<br>
<small>
-[<a class="el" href="a00276.html">Memory Allocation</a>]</small>
+[<a class="el" href="a00277.html">Memory Allocation</a>]</small>
</h1><!-- doxytag: class="tbb::tbb_allocator" -->Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00447.html">tbb_allocator.h</a>></code>
+<code>#include <<a class="el" href="a00453.html">tbb_allocator.h</a>></code>
<p>
<a href="a00086.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -118,7 +118,7 @@ Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.
The class selects the best memory allocation mechanism available from scalable_malloc and standard malloc. The members are ordered the same way they are in section 20.4.1 of the ISO C++ standard.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00447.html">tbb_allocator.h</a></ul>
+<li><a class="el" href="a00453.html">tbb_allocator.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00205.html b/doc/html/a00205.html
index 1da6c0a..15e6ac8 100644
--- a/doc/html/a00205.html
+++ b/doc/html/a00205.html
@@ -24,11 +24,11 @@
<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00205.html">tbb_allocator< void ></a></div>
<h1>tbb::tbb_allocator< void > Class Template Reference<br>
<small>
-[<a class="el" href="a00276.html">Memory Allocation</a>]</small>
+[<a class="el" href="a00277.html">Memory Allocation</a>]</small>
</h1><!-- doxytag: class="tbb::tbb_allocator< void >" -->Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00447.html">tbb_allocator.h</a>></code>
+<code>#include <<a class="el" href="a00453.html">tbb_allocator.h</a>></code>
<p>
<a href="a00088.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -53,7 +53,7 @@ typedef void </td><td class="memItemRight" valign="bottom"><b>value_type</b
Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00447.html">tbb_allocator.h</a></ul>
+<li><a class="el" href="a00453.html">tbb_allocator.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00206.html b/doc/html/a00206.html
index 7eead76..ef07af1 100644
--- a/doc/html/a00206.html
+++ b/doc/html/a00206.html
@@ -25,12 +25,12 @@
<h1>tbb::tbb_exception Class Reference</h1><!-- doxytag: class="tbb::tbb_exception" -->Interface to be implemented by all exceptions TBB recognizes and propagates across the threads.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00453.html">tbb_exception.h</a>></code>
+<code>#include <<a class="el" href="a00459.html">tbb_exception.h</a>></code>
<p>
<p>Inheritance diagram for tbb::tbb_exception:
<p><center><img src="a00206.png" usemap="#tbb::tbb_exception_map" border="0" alt=""></center>
<map name="tbb::tbb_exception_map">
-<area href="a00153.html" alt="tbb::captured_exception" shape="rect" coords="0,56,248,80">
+<area href="a00152.html" alt="tbb::captured_exception" shape="rect" coords="0,56,248,80">
<area href="a00171.html" alt="tbb::movable_exception< ExceptionData >" shape="rect" coords="258,56,506,80">
</map>
<a href="a00098.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
@@ -62,7 +62,7 @@ Interface to be implemented by all exceptions TBB recognizes and propagates acro
If an unhandled exception of the type derived from <a class="el" href="a00206.html">tbb::tbb_exception</a> is intercepted by the TBB scheduler in one of the worker threads, it is delivered to and re-thrown in the root thread. The root thread is the thread that has started the outermost algorithm or root task sharing the same <a class="el" href="a00201.html">task_group_context</a> with the guilty algorithm/task (the one that threw the exception first).<p>
Note: when documentation mentions workers with respect to exception handling, masters are implied as well, because they are completely equivalent in this context. Consequently a root thread can be master or worker thread.<p>
NOTE: In case of nested algorithms or complex task hierarchies when the nested levels share (explicitly or by means of implicit inheritance) the task group context of the outermost level, the exception may be (re-)thrown multiple times (ultimately - in each worker on each nesting level) before reaching the root thread at the outermost level. IMPORTANT: if you intercept an exception derived from this class on a nested level, you must re-throw it in the catch block by means of the "throw;" [...]
-TBB provides two implementations of this interface: <a class="el" href="a00153.html">tbb::captured_exception</a> and template class <a class="el" href="a00171.html">tbb::movable_exception</a>. See their declarations for more info.
+TBB provides two implementations of this interface: <a class="el" href="a00152.html">tbb::captured_exception</a> and template class <a class="el" href="a00171.html">tbb::movable_exception</a>. See their declarations for more info.
<p>
<hr><h2>Member Function Documentation</h2>
<a class="anchor" name="66c94938eca8bf88b76f3eccaaf215d8"></a><!-- doxytag: member="tbb::tbb_exception::destroy" ref="66c94938eca8bf88b76f3eccaaf215d8" args="()=0" -->
@@ -85,7 +85,7 @@ Destroys objects created by the <a class="el" href="a00206.html#3e3482bf264d4ca4
<p>
Frees memory and calls destructor for this exception object. Can and must be used only on objects created by the move method.
<p>
-Implemented in <a class="el" href="a00153.html#93d875d3555502ff6f18513525de204c">tbb::captured_exception</a>, and <a class="el" href="a00171.html#7a46873119d9f85a7b0009c13e41a258">tbb::movable_exception< ExceptionData ></a>.
+Implemented in <a class="el" href="a00152.html#93d875d3555502ff6f18513525de204c">tbb::captured_exception</a>, and <a class="el" href="a00171.html#7a46873119d9f85a7b0009c13e41a258">tbb::movable_exception< ExceptionData ></a>.
</div>
</div><p>
<a class="anchor" name="3e3482bf264d4ca4dde046cd9c02c766"></a><!-- doxytag: member="tbb::tbb_exception::move" ref="3e3482bf264d4ca4dde046cd9c02c766" args="()=0" -->
@@ -108,7 +108,7 @@ Creates and returns pointer to the deep copy of this exception object.
<p>
Move semantics is allowed.
<p>
-Implemented in <a class="el" href="a00153.html#837a50b8f6a800bda225c39d1699643f">tbb::captured_exception</a>, and <a class="el" href="a00171.html#1aea0ad179d6f0481fe7f3495f66adf9">tbb::movable_exception< ExceptionData ></a>.
+Implemented in <a class="el" href="a00152.html#837a50b8f6a800bda225c39d1699643f">tbb::captured_exception</a>, and <a class="el" href="a00171.html#1aea0ad179d6f0481fe7f3495f66adf9">tbb::movable_exception< ExceptionData ></a>.
</div>
</div><p>
<a class="anchor" name="3f2da7f3d8a6e4c1df522af1213afb5a"></a><!-- doxytag: member="tbb::tbb_exception::operator delete" ref="3f2da7f3d8a6e4c1df522af1213afb5a" args="(void *p)" -->
@@ -152,11 +152,11 @@ Throws this exception object.
<p>
Make sure that if you have several levels of derivation from this interface you implement or override this method on the most derived level. The implementation is as simple as "throw *this;". Failure to do this will result in exception of a base class type being thrown.
<p>
-Implemented in <a class="el" href="a00153.html#2dd1be66ab32fa27e0ddef5707fa67ef">tbb::captured_exception</a>, and <a class="el" href="a00171.html#17cffba35811c92b7e65d63506b69602">tbb::movable_exception< ExceptionData ></a>.
+Implemented in <a class="el" href="a00152.html#2dd1be66ab32fa27e0ddef5707fa67ef">tbb::captured_exception</a>, and <a class="el" href="a00171.html#17cffba35811c92b7e65d63506b69602">tbb::movable_exception< ExceptionData ></a>.
</div>
</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00453.html">tbb_exception.h</a></ul>
+<li><a class="el" href="a00459.html">tbb_exception.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00207.html b/doc/html/a00207.html
index ce332cc..642e1eb 100644
--- a/doc/html/a00207.html
+++ b/doc/html/a00207.html
@@ -25,7 +25,7 @@
<h1>tbb::internal::tbb_exception_ptr Class Reference</h1><!-- doxytag: class="tbb::internal::tbb_exception_ptr" -->Exception container that preserves the exact copy of the original exception.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00453.html">tbb_exception.h</a>></code>
+<code>#include <<a class="el" href="a00459.html">tbb_exception.h</a>></code>
<p>
<a href="a00101.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -45,7 +45,7 @@ static <a class="el" href="a00207.html">tbb_exception_ptr</a> * </td><td cl
static <a class="el" href="a00207.html">tbb_exception_ptr</a> * </td><td class="memItemRight" valign="bottom"><b>allocate</b> (const <a class="el" href="a00206.html">tbb_exception</a> &tag)</td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c35e5db8e9cdff5d1387db5b0bad2e4a"></a><!-- doxytag: member="tbb::internal::tbb_exception_ptr::allocate" ref="c35e5db8e9cdff5d1387db5b0bad2e4a" args="(captured_exception &src)" -->
-static <a class="el" href="a00207.html">tbb_exception_ptr</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00207.html#c35e5db8e9cdff5d1387db5b0bad2e4a">allocate</a> (<a class="el" href="a00153.html">captured_exception</a> &src)</td></tr>
+static <a class="el" href="a00207.html">tbb_exception_ptr</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00207.html#c35e5db8e9cdff5d1387db5b0bad2e4a">allocate</a> (<a class="el" href="a00152.html">captured_exception</a> &src)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">This overload uses move semantics (i.e. it empties src). <br></td></tr>
</table>
@@ -77,7 +77,7 @@ Note that objects of this type can be created only by the allocate() method.
</div>
</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00453.html">tbb_exception.h</a></ul>
+<li><a class="el" href="a00459.html">tbb_exception.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00208.html b/doc/html/a00208.html
index ea2c89f..2ca1daf 100644
--- a/doc/html/a00208.html
+++ b/doc/html/a00208.html
@@ -25,7 +25,7 @@
<h1>tbb::tbb_hash_compare< Key > Struct Template Reference</h1><!-- doxytag: class="tbb::tbb_hash_compare" -->hash_compare that is default argument for concurrent_hash_map
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00325.html">concurrent_hash_map.h</a>></code>
+<code>#include <<a class="el" href="a00326.html">concurrent_hash_map.h</a>></code>
<p>
<a href="a00012.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -44,7 +44,7 @@ static bool </td><td class="memItemRight" valign="bottom"><b>equal</b> (con
hash_compare that is default argument for concurrent_hash_map
<p>
<hr>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="a00325.html">concurrent_hash_map.h</a></ul>
+<li><a class="el" href="a00326.html">concurrent_hash_map.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00209.html b/doc/html/a00209.html
index 913e80d..825fb0d 100644
--- a/doc/html/a00209.html
+++ b/doc/html/a00209.html
@@ -24,16 +24,16 @@
<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00209.html">thread_bound_filter</a></div>
<h1>tbb::thread_bound_filter Class Reference<br>
<small>
-[<a class="el" href="a00274.html">Algorithms</a>]</small>
+[<a class="el" href="a00275.html">Algorithms</a>]</small>
</h1><!-- doxytag: class="tbb::thread_bound_filter" --><!-- doxytag: inherits="tbb::filter" -->A stage in a pipeline served by a user thread.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00409.html">pipeline.h</a>></code>
+<code>#include <<a class="el" href="a00414.html">pipeline.h</a>></code>
<p>
<p>Inheritance diagram for tbb::thread_bound_filter:
<p><center><img src="a00209.png" usemap="#tbb::thread_bound_filter_map" border="0" alt=""></center>
<map name="tbb::thread_bound_filter_map">
-<area href="a00165.html" alt="tbb::filter" shape="rect" coords="0,0,145,24">
+<area href="a00164.html" alt="tbb::filter" shape="rect" coords="0,0,145,24">
</map>
<a href="a00050.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -111,7 +111,7 @@ This interface is non-blocking. Returns 'success' if an item was processed. Retu
</div>
</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00409.html">pipeline.h</a></ul>
+<li><a class="el" href="a00414.html">pipeline.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00210.html b/doc/html/a00210.html
index d187626..f4c6fa2 100644
--- a/doc/html/a00210.html
+++ b/doc/html/a00210.html
@@ -24,11 +24,11 @@
<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00210.html">tick_count</a></div>
<h1>tbb::tick_count Class Reference<br>
<small>
-[<a class="el" href="a00278.html">Timing</a>]</small>
+[<a class="el" href="a00279.html">Timing</a>]</small>
</h1><!-- doxytag: class="tbb::tick_count" -->Absolute timestamp.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00476.html">tick_count.h</a>></code>
+<code>#include <<a class="el" href="a00482.html">tick_count.h</a>></code>
<p>
<a href="a00113.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -56,7 +56,7 @@ static <a class="el" href="a00210.html">tick_count</a> </td><td class="memI
Absolute timestamp.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00476.html">tick_count.h</a></ul>
+<li><a class="el" href="a00482.html">tick_count.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00211.html b/doc/html/a00211.html
index 1d39455..67770bb 100644
--- a/doc/html/a00211.html
+++ b/doc/html/a00211.html
@@ -25,7 +25,7 @@
<h1>tbb::tick_count::interval_t Class Reference</h1><!-- doxytag: class="tbb::tick_count::interval_t" -->Relative time interval.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00476.html">tick_count.h</a>></code>
+<code>#include <<a class="el" href="a00482.html">tick_count.h</a>></code>
<p>
<a href="a00114.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -71,7 +71,7 @@ class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00
Relative time interval.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00476.html">tick_count.h</a></ul>
+<li><a class="el" href="a00482.html">tick_count.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00212.html b/doc/html/a00212.html
index 4709dd7..0351df6 100644
--- a/doc/html/a00212.html
+++ b/doc/html/a00212.html
@@ -25,7 +25,7 @@
<h1>tbb::internal::work_around_alignment_bug< Size, T > Struct Template Reference</h1><!-- doxytag: class="tbb::internal::work_around_alignment_bug" -->Work around for bug in GNU 3.2 and MSVC compilers.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00454.html">tbb_machine.h</a>></code>
+<code>#include <<a class="el" href="a00460.html">tbb_machine.h</a>></code>
<p>
<a href="a00109.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -43,7 +43,7 @@ Work around for bug in GNU 3.2 and MSVC compilers.
Bug is that compiler sometimes returns 0 for __alignof(T) when T has not yet been instantiated. The work-around forces instantiation by forcing computation of sizeof(T) before __alignof(T).
<p>
<hr>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="a00454.html">tbb_machine.h</a></ul>
+<li><a class="el" href="a00460.html">tbb_machine.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00213.html b/doc/html/a00213.html
index be4d723..b757b16 100644
--- a/doc/html/a00213.html
+++ b/doc/html/a00213.html
@@ -24,11 +24,11 @@
<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00213.html">zero_allocator</a></div>
<h1>tbb::zero_allocator< T, Allocator > Class Template Reference<br>
<small>
-[<a class="el" href="a00276.html">Memory Allocation</a>]</small>
+[<a class="el" href="a00277.html">Memory Allocation</a>]</small>
</h1><!-- doxytag: class="tbb::zero_allocator" -->Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00447.html">tbb_allocator.h</a>></code>
+<code>#include <<a class="el" href="a00453.html">tbb_allocator.h</a>></code>
<p>
<a href="a00090.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -81,7 +81,7 @@ Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.
The class is an adapter over an actual allocator that fills the allocation using memset function with template argument C as the value. The members are ordered the same way they are in section 20.4.1 of the ISO C++ standard.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00447.html">tbb_allocator.h</a></ul>
+<li><a class="el" href="a00453.html">tbb_allocator.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00214.html b/doc/html/a00214.html
index 26be386..39c15e1 100644
--- a/doc/html/a00214.html
+++ b/doc/html/a00214.html
@@ -24,11 +24,11 @@
<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00214.html">zero_allocator< void, Allocator ></a></div>
<h1>tbb::zero_allocator< void, Allocator > Class Template Reference<br>
<small>
-[<a class="el" href="a00276.html">Memory Allocation</a>]</small>
+[<a class="el" href="a00277.html">Memory Allocation</a>]</small>
</h1><!-- doxytag: class="tbb::zero_allocator< void, Allocator >" -->Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00447.html">tbb_allocator.h</a>></code>
+<code>#include <<a class="el" href="a00453.html">tbb_allocator.h</a>></code>
<p>
<a href="a00092.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -56,7 +56,7 @@ typedef base_allocator_type::const_pointer </td><td class="memItemRight" va
Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00447.html">tbb_allocator.h</a></ul>
+<li><a class="el" href="a00453.html">tbb_allocator.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00248.html b/doc/html/a00248.html
index 471efb5..9b2a84c 100644
--- a/doc/html/a00248.html
+++ b/doc/html/a00248.html
@@ -21,7 +21,7 @@
</ul></div>
<h1>scalable_allocator.h File Reference</h1>
<p>
-<a href="a00424.html">Go to the source code of this file.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00430.html">Go to the source code of this file.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Namespaces</h2></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top">namespace </td><td class="memItemRight" valign="bottom"><a class="el" href="a00267.html">tbb</a></td></tr>
@@ -38,23 +38,23 @@
<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><b>tbb::scalable_allocator< void >::rebind< U ></b></td></tr>
<tr><td colspan="2"><br><h2>Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_malloc</a> (size_t size)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00277.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_malloc</a> (size_t size)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#gca3579c21244dba9f0c351e5984d4565">scalable_free</a> (void *ptr)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00277.html#gca3579c21244dba9f0c351e5984d4565">scalable_free</a> (void *ptr)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#g951bbbbd2d041acb59ba5fa910b52543">scalable_realloc</a> (void *ptr, size_t size)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00277.html#g951bbbbd2d041acb59ba5fa910b52543">scalable_realloc</a> (void *ptr, size_t size)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#g3f5a2fde0bcaa3eda35be32c8658f444">scalable_calloc</a> (size_t nobj, size_t size)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00277.html#g3f5a2fde0bcaa3eda35be32c8658f444">scalable_calloc</a> (size_t nobj, size_t size)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">int __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#g05dcec987480bb2c82ecdead6a085899">scalable_posix_memalign</a> (void **memptr, size_t alignment, size_t size)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">int __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00277.html#g05dcec987480bb2c82ecdead6a085899">scalable_posix_memalign</a> (void **memptr, size_t alignment, size_t size)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#gc1c7aaa1fe85c17ba5a3a96f7e8d89e7">scalable_aligned_malloc</a> (size_t size, size_t alignment)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00277.html#gc1c7aaa1fe85c17ba5a3a96f7e8d89e7">scalable_aligned_malloc</a> (size_t size, size_t alignment)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#gbaea91376be80dfabd7c93eaffd9abaa">scalable_aligned_realloc</a> (void *ptr, size_t size, size_t alignment)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00277.html#gbaea91376be80dfabd7c93eaffd9abaa">scalable_aligned_realloc</a> (void *ptr, size_t size, size_t alignment)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#g65a20e812012f15ec7442d5b45d0cba5">scalable_aligned_free</a> (void *ptr)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00277.html#g65a20e812012f15ec7442d5b45d0cba5">scalable_aligned_free</a> (void *ptr)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">size_t __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_msize</a> (void *ptr)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">size_t __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00277.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_msize</a> (void *ptr)</td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="906ebb461ecb0446989739fd0399e4b8"></a><!-- doxytag: member="scalable_allocator.h::operator==" ref="906ebb461ecb0446989739fd0399e4b8" args="(const scalable_allocator< T > &, const scalable_allocator< U > &)" -->
template<typename T, typename U> </td></tr>
diff --git a/doc/html/a00267.html b/doc/html/a00267.html
index 2f17efb..7ce88df 100644
--- a/doc/html/a00267.html
+++ b/doc/html/a00267.html
@@ -25,44 +25,44 @@
<table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00142.html">aligned_space</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00141.html">aligned_space</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Block of space aligned sufficiently to construct an array T with N elements. <a href="a00142.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><a class="el" href="a00143.html">atomic</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Block of space aligned sufficiently to construct an array T with N elements. <a href="a00141.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><a class="el" href="a00142.html">atomic</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Primary template for atomic. <a href="a00143.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><a class="el" href="a00144.html">atomic< void * ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Primary template for atomic. <a href="a00142.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><a class="el" href="a00143.html">atomic< void * ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Specialization for <a class="el" href="a00144.html">atomic<void*></a>, for sake of not allowing arithmetic or operator->. <a href="a00144.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00148.html">blocked_range</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Specialization for <a class="el" href="a00143.html">atomic<void*></a>, for sake of not allowing arithmetic or operator->. <a href="a00143.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00147.html">blocked_range</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A range over which to iterate. <a href="a00148.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00149.html">blocked_range2d</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A range over which to iterate. <a href="a00147.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00148.html">blocked_range2d</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A 2-dimensional range that models the Range concept. <a href="a00149.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00150.html">blocked_range3d</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A 2-dimensional range that models the Range concept. <a href="a00148.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00149.html">blocked_range3d</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A 3-dimensional range that models the Range concept. <a href="a00150.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00151.html">cache_aligned_allocator</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A 3-dimensional range that models the Range concept. <a href="a00149.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00150.html">cache_aligned_allocator</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. <a href="a00151.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00152.html">cache_aligned_allocator< void ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. <a href="a00150.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00151.html">cache_aligned_allocator< void ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. <a href="a00152.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00154.html">combinable</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. <a href="a00151.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00153.html">combinable</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Thread-local storage with optional reduction. <a href="a00154.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Thread-local storage with optional reduction. <a href="a00153.html#_details">More...</a><br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><a class="el" href="a00208.html">tbb_hash_compare</a></td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">hash_compare that is default argument for concurrent_hash_map <a href="a00208.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html">concurrent_bounded_queue</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00154.html">concurrent_bounded_queue</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A high-performance thread-safe blocking concurrent bounded queue. <a href="a00155.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A high-performance thread-safe blocking concurrent bounded queue. <a href="a00154.html#_details">More...</a><br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>tbb_hash</b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html">concurrent_vector</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html">concurrent_vector</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Concurrent vector container. <a href="a00162.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Concurrent vector container. <a href="a00161.html#_details">More...</a><br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00172.html">mutex</a></td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Wrapper around the platform's native reader-writer lock. <a href="a00172.html#_details">More...</a><br></td></tr>
@@ -78,30 +78,30 @@
<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><a class="el" href="a00181.html">pre_scan_tag</a></td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to indicate that the initial scan is being performed. <a href="a00181.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><a class="el" href="a00167.html">final_scan_tag</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><a class="el" href="a00166.html">final_scan_tag</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to indicate that the final scan is being performed. <a href="a00167.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to indicate that the final scan is being performed. <a href="a00166.html#_details">More...</a><br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00179.html">parallel_while</a></td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over a stream, with optional addition of more work. <a href="a00179.html#_details">More...</a><br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00193.html">simple_partitioner</a></td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">A simple partitioner. <a href="a00193.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00146.html">auto_partitioner</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00145.html">auto_partitioner</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">An auto partitioner. <a href="a00146.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00141.html">affinity_partitioner</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">An auto partitioner. <a href="a00145.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00140.html">affinity_partitioner</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">An affinity partitioner. <a href="a00141.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00165.html">filter</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">An affinity partitioner. <a href="a00140.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00164.html">filter</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A stage in a pipeline. <a href="a00165.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A stage in a pipeline. <a href="a00164.html#_details">More...</a><br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00209.html">thread_bound_filter</a></td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">A stage in a pipeline served by a user thread. <a href="a00209.html#_details">More...</a><br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00180.html">pipeline</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A processing pipeling that applies filters to items. <a href="a00180.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A processing pipeline that applies filters to items. <a href="a00180.html#_details">More...</a><br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00182.html">queuing_mutex</a></td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Queuing lock with local-only spinning. <a href="a00182.html#_details">More...</a><br></td></tr>
@@ -129,9 +129,9 @@
<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00199.html">task</a></td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Base class for user-defined tasks. <a href="a00199.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00163.html">empty_task</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html">empty_task</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">task that does nothing. Useful for synchronization. <a href="a00163.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">task that does nothing. Useful for synchronization. <a href="a00162.html#_details">More...</a><br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00202.html">task_list</a></td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">A list of children. <a href="a00202.html#_details">More...</a><br></td></tr>
@@ -156,9 +156,9 @@
<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00214.html">zero_allocator< void, Allocator ></a></td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. <a href="a00214.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00147.html">bad_last_alloc</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00146.html">bad_last_alloc</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Exception for concurrent containers. <a href="a00147.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Exception for concurrent containers. <a href="a00146.html#_details">More...</a><br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00168.html">improper_lock</a></td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Exception for PPL locks. <a href="a00168.html#_details">More...</a><br></td></tr>
@@ -171,9 +171,9 @@
<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00206.html">tbb_exception</a></td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Interface to be implemented by all exceptions TBB recognizes and propagates across the threads. <a href="a00206.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00153.html">captured_exception</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00152.html">captured_exception</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">This class is used by TBB to propagate information about unhandled exceptions into the root thread. <a href="a00153.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">This class is used by TBB to propagate information about unhandled exceptions into the root thread. <a href="a00152.html#_details">More...</a><br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00171.html">movable_exception</a></td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Template that can be used to implement exception that transfers arbitrary ExceptionData to the root thread. <a href="a00171.html#_details">More...</a><br></td></tr>
@@ -184,7 +184,7 @@
<tr><td class="mdescLeft"> </td><td class="mdescRight">Absolute timestamp. <a href="a00210.html#_details">More...</a><br></td></tr>
<tr><td colspan="2"><br><h2>Namespaces</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">namespace </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html">strict_ppl</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">namespace </td><td class="memItemRight" valign="bottom"><a class="el" href="a00274.html">strict_ppl</a></td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">For internal use only. <br></td></tr>
@@ -193,66 +193,66 @@
<tr><td colspan="2">See also requirements on <a class="el" href="parallel_do_body_req.html">parallel_do Body</a>. <br><br></td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g3383e2703977012b6f384d673410f1f7"></a><!-- doxytag: member="tbb::parallel_do" ref="g3383e2703977012b6f384d673410f1f7" args="(Iterator first, Iterator last, const Body &body)" -->
template<typename Iterator, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#g3383e2703977012b6f384d673410f1f7">parallel_do</a> (Iterator first, Iterator last, const Body &body)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#g3383e2703977012b6f384d673410f1f7">parallel_do</a> (Iterator first, Iterator last, const Body &body)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over a range, with optional addition of more work. <br></td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g2617dc9b88b3285a7212599d49f74228"></a><!-- doxytag: member="tbb::parallel_do" ref="g2617dc9b88b3285a7212599d49f74228" args="(Iterator first, Iterator last, const Body &body, task_group_context &context)" -->
template<typename Iterator, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#g2617dc9b88b3285a7212599d49f74228">parallel_do</a> (Iterator first, Iterator last, const Body &body, <a class="el" href="a00201.html">task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#g2617dc9b88b3285a7212599d49f74228">parallel_do</a> (Iterator first, Iterator last, const Body &body, <a class="el" href="a00201.html">task_group_context</a> &context)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over a range, with optional addition of more work and user-supplied context. <br></td></tr>
<tr><td colspan="2"><br><h2>parallel_for</h2></td></tr>
<tr><td colspan="2">See also requirements on <a class="el" href="range_req.html">Range</a> and <a class="el" href="parallel_for_body_req.html">parallel_for Body</a>. <br><br></td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g68cc046ef72c42ce205fccbc435a0d81"></a><!-- doxytag: member="tbb::parallel_for" ref="g68cc046ef72c42ce205fccbc435a0d81" args="(const Range &range, const Body &body)" -->
template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a> (const Range &range, const Body &body)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a> (const Range &range, const Body &body)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with default partitioner. <br></td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g13cac5dd55c7533bccea43a51c33d0e5"></a><!-- doxytag: member="tbb::parallel_for" ref="g13cac5dd55c7533bccea43a51c33d0e5" args="(const Range &range, const Body &body, const simple_partitioner &partitioner)" -->
template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#g13cac5dd55c7533bccea43a51c33d0e5">parallel_for</a> (const Range &range, const Body &body, const <a class="el" href="a00193.html">simple_partitioner</a> &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#g13cac5dd55c7533bccea43a51c33d0e5">parallel_for</a> (const Range &range, const Body &body, const <a class="el" href="a00193.html">simple_partitioner</a> &partitioner)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with simple partitioner. <br></td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="ga7ac75d532389b55b9247f3fdb0b00d1"></a><!-- doxytag: member="tbb::parallel_for" ref="ga7ac75d532389b55b9247f3fdb0b00d1" args="(const Range &range, const Body &body, const auto_partitioner &partitioner)" -->
template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#ga7ac75d532389b55b9247f3fdb0b00d1">parallel_for</a> (const Range &range, const Body &body, const <a class="el" href="a00146.html">auto_partitioner</a> &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#ga7ac75d532389b55b9247f3fdb0b00d1">parallel_for</a> (const Range &range, const Body &body, const <a class="el" href="a00145.html">auto_partitioner</a> &partitioner)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00146.html">auto_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00145.html">auto_partitioner</a>. <br></td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g9cd1b210ceb1c040f30e390b4a21bde8"></a><!-- doxytag: member="tbb::parallel_for" ref="g9cd1b210ceb1c040f30e390b4a21bde8" args="(const Range &range, const Body &body, affinity_partitioner &partitioner)" -->
template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#g9cd1b210ceb1c040f30e390b4a21bde8">parallel_for</a> (const Range &range, const Body &body, <a class="el" href="a00141.html">affinity_partitioner</a> &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#g9cd1b210ceb1c040f30e390b4a21bde8">parallel_for</a> (const Range &range, const Body &body, <a class="el" href="a00140.html">affinity_partitioner</a> &partitioner)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00141.html">affinity_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00140.html">affinity_partitioner</a>. <br></td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g2d317a5e0078cd193125439fed60dfdc"></a><!-- doxytag: member="tbb::parallel_for" ref="g2d317a5e0078cd193125439fed60dfdc" args="(const Range &range, const Body &body, const simple_partitioner &partitioner, task_group_context &context)" -->
template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#g2d317a5e0078cd193125439fed60dfdc">parallel_for</a> (const Range &range, const Body &body, const <a class="el" href="a00193.html">simple_partitioner</a> &partitioner, <a class="el" href="a00201.html">task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#g2d317a5e0078cd193125439fed60dfdc">parallel_for</a> (const Range &range, const Body &body, const <a class="el" href="a00193.html">simple_partitioner</a> &partitioner, <a class="el" href="a00201.html">task_group_context</a> &context)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with simple partitioner and user-supplied context. <br></td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1c0700e3f85e83a788ff3ede88ebb7e9"></a><!-- doxytag: member="tbb::parallel_for" ref="g1c0700e3f85e83a788ff3ede88ebb7e9" args="(const Range &range, const Body &body, const auto_partitioner &partitioner, task_group_context &context)" -->
template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#g1c0700e3f85e83a788ff3ede88ebb7e9">parallel_for</a> (const Range &range, const Body &body, const <a class="el" href="a00146.html">auto_partitioner</a> &partitioner, <a class="el" href="a00201.html">task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#g1c0700e3f85e83a788ff3ede88ebb7e9">parallel_for</a> (const Range &range, const Body &body, const <a class="el" href="a00145.html">auto_partitioner</a> &partitioner, <a class="el" href="a00201.html">task_group_context</a> &context)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00146.html">auto_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00145.html">auto_partitioner</a> and user-supplied context. <br></td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g04b4696b67370c01353ff5974c8f1196"></a><!-- doxytag: member="tbb::parallel_for" ref="g04b4696b67370c01353ff5974c8f1196" args="(const Range &range, const Body &body, affinity_partitioner &partitioner, task_group_context &context)" -->
template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#g04b4696b67370c01353ff5974c8f1196">parallel_for</a> (const Range &range, const Body &body, <a class="el" href="a00141.html">affinity_partitioner</a> &partitioner, <a class="el" href="a00201.html">task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#g04b4696b67370c01353ff5974c8f1196">parallel_for</a> (const Range &range, const Body &body, <a class="el" href="a00140.html">affinity_partitioner</a> &partitioner, <a class="el" href="a00201.html">task_group_context</a> &context)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00141.html">affinity_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00140.html">affinity_partitioner</a> and user-supplied context. <br></td></tr>
<tr><td colspan="2"><br><h2>parallel_for_each</h2></td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gcd40c32f319747e61a8f73fcfc452001"></a><!-- doxytag: member="tbb::parallel_for_each" ref="gcd40c32f319747e61a8f73fcfc452001" args="(InputIterator first, InputIterator last, const Function &f, task_group_context &context)" -->
template<typename InputIterator, typename Function> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#gcd40c32f319747e61a8f73fcfc452001">parallel_for_each</a> (InputIterator first, InputIterator last, const Function &f, <a class="el" href="a00201.html">task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#gcd40c32f319747e61a8f73fcfc452001">parallel_for_each</a> (InputIterator first, InputIterator last, const Function &f, <a class="el" href="a00201.html">task_group_context</a> &context)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Calls function f for all items from [first, last) interval using user-supplied context. <br></td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc2d710ca573f0a9bd94379cba3772def"></a><!-- doxytag: member="tbb::parallel_for_each" ref="gc2d710ca573f0a9bd94379cba3772def" args="(InputIterator first, InputIterator last, const Function &f)" -->
template<typename InputIterator, typename Function> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#gc2d710ca573f0a9bd94379cba3772def">parallel_for_each</a> (InputIterator first, InputIterator last, const Function &f)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#gc2d710ca573f0a9bd94379cba3772def">parallel_for_each</a> (InputIterator first, InputIterator last, const Function &f)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Uses default context. <br></td></tr>
<tr><td colspan="2"><br><h2>parallel_invoke</h2></td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gd3e2998f171494f94c2103f4eb924084"></a><!-- doxytag: member="tbb::parallel_invoke" ref="gd3e2998f171494f94c2103f4eb924084" args="(const F0 &f0, const F1 &f1, tbb::task_group_context &context)" -->
template<typename F0, typename F1> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a> (const F0 &f0, const F1 &f1, <a class="el" href="a00201.html">tbb::task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a> (const F0 &f0, const F1 &f1, <a class="el" href="a00201.html">tbb::task_group_context</a> &context)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Executes a list of tasks in parallel and waits for all tasks to complete. <br></td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g4eb73562e4145c8343ed9f996267f039"></a><!-- doxytag: member="tbb::parallel_invoke" ref="g4eb73562e4145c8343ed9f996267f039" args="(const F0 &f0, const F1 &f1, const F2 &f2, tbb::task_group_context &context)" -->
@@ -327,105 +327,105 @@ template<typename F0, typename F1, typename F2, typename F3, typename F4, typ
<tr><td colspan="2">See also requirements on <a class="el" href="range_req.html">Range</a> and <a class="el" href="parallel_reduce_body_req.html">parallel_reduce Body</a>. <br><br></td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1b3d59c5eb62683c5754db6970392fa3"></a><!-- doxytag: member="tbb::parallel_reduce" ref="g1b3d59c5eb62683c5754db6970392fa3" args="(const Range &range, Body &body)" -->
template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a> (const Range &range, Body &body)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a> (const Range &range, Body &body)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and default partitioner. <br></td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gec1b7c03f9da909bef5db12e3d41bed3"></a><!-- doxytag: member="tbb::parallel_reduce" ref="gec1b7c03f9da909bef5db12e3d41bed3" args="(const Range &range, Body &body, const simple_partitioner &partitioner)" -->
template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#gec1b7c03f9da909bef5db12e3d41bed3">parallel_reduce</a> (const Range &range, Body &body, const <a class="el" href="a00193.html">simple_partitioner</a> &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#gec1b7c03f9da909bef5db12e3d41bed3">parallel_reduce</a> (const Range &range, Body &body, const <a class="el" href="a00193.html">simple_partitioner</a> &partitioner)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00193.html">simple_partitioner</a>. <br></td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g18a19157e6245992fc00ca0adeb7dd37"></a><!-- doxytag: member="tbb::parallel_reduce" ref="g18a19157e6245992fc00ca0adeb7dd37" args="(const Range &range, Body &body, const auto_partitioner &partitioner)" -->
template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#g18a19157e6245992fc00ca0adeb7dd37">parallel_reduce</a> (const Range &range, Body &body, const <a class="el" href="a00146.html">auto_partitioner</a> &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#g18a19157e6245992fc00ca0adeb7dd37">parallel_reduce</a> (const Range &range, Body &body, const <a class="el" href="a00145.html">auto_partitioner</a> &partitioner)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00146.html">auto_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00145.html">auto_partitioner</a>. <br></td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc61e73fcc36c92d79a217fc355ff4a6b"></a><!-- doxytag: member="tbb::parallel_reduce" ref="gc61e73fcc36c92d79a217fc355ff4a6b" args="(const Range &range, Body &body, affinity_partitioner &partitioner)" -->
template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#gc61e73fcc36c92d79a217fc355ff4a6b">parallel_reduce</a> (const Range &range, Body &body, <a class="el" href="a00141.html">affinity_partitioner</a> &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#gc61e73fcc36c92d79a217fc355ff4a6b">parallel_reduce</a> (const Range &range, Body &body, <a class="el" href="a00140.html">affinity_partitioner</a> &partitioner)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00141.html">affinity_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00140.html">affinity_partitioner</a>. <br></td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g45cb00c42a18e334bbde8b7535afe460"></a><!-- doxytag: member="tbb::parallel_reduce" ref="g45cb00c42a18e334bbde8b7535afe460" args="(const Range &range, Body &body, const simple_partitioner &partitioner, task_group_context &context)" -->
template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#g45cb00c42a18e334bbde8b7535afe460">parallel_reduce</a> (const Range &range, Body &body, const <a class="el" href="a00193.html">simple_partitioner</a> &partitioner, <a class="el" href="a00201.html">task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#g45cb00c42a18e334bbde8b7535afe460">parallel_reduce</a> (const Range &range, Body &body, const <a class="el" href="a00193.html">simple_partitioner</a> &partitioner, <a class="el" href="a00201.html">task_group_context</a> &context)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, simple partitioner and user-supplied context. <br></td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1c1ea1d7c61b3c225e92c70d669a53a5"></a><!-- doxytag: member="tbb::parallel_reduce" ref="g1c1ea1d7c61b3c225e92c70d669a53a5" args="(const Range &range, Body &body, const auto_partitioner &partitioner, task_group_context &context)" -->
template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#g1c1ea1d7c61b3c225e92c70d669a53a5">parallel_reduce</a> (const Range &range, Body &body, const <a class="el" href="a00146.html">auto_partitioner</a> &partitioner, <a class="el" href="a00201.html">task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#g1c1ea1d7c61b3c225e92c70d669a53a5">parallel_reduce</a> (const Range &range, Body &body, const <a class="el" href="a00145.html">auto_partitioner</a> &partitioner, <a class="el" href="a00201.html">task_group_context</a> &context)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00146.html">auto_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00145.html">auto_partitioner</a> and user-supplied context. <br></td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gd9ac3a3811060314695f33b703c6e11b"></a><!-- doxytag: member="tbb::parallel_reduce" ref="gd9ac3a3811060314695f33b703c6e11b" args="(const Range &range, Body &body, affinity_partitioner &partitioner, task_group_context &context)" -->
template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#gd9ac3a3811060314695f33b703c6e11b">parallel_reduce</a> (const Range &range, Body &body, <a class="el" href="a00141.html">affinity_partitioner</a> &partitioner, <a class="el" href="a00201.html">task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#gd9ac3a3811060314695f33b703c6e11b">parallel_reduce</a> (const Range &range, Body &body, <a class="el" href="a00140.html">affinity_partitioner</a> &partitioner, <a class="el" href="a00201.html">task_group_context</a> &context)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00141.html">affinity_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00140.html">affinity_partitioner</a> and user-supplied context. <br></td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc9412e09fb01fcad8c018ea9cffb28ef"></a><!-- doxytag: member="tbb::parallel_reduce" ref="gc9412e09fb01fcad8c018ea9cffb28ef" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction)" -->
template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#gc9412e09fb01fcad8c018ea9cffb28ef">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#gc9412e09fb01fcad8c018ea9cffb28ef">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and default partitioner. <br></td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gaddffeec0e892ac3d6fc7fc2053e1eca"></a><!-- doxytag: member="tbb::parallel_reduce" ref="gaddffeec0e892ac3d6fc7fc2053e1eca" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const simple_partitioner &partitioner)" -->
template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#gaddffeec0e892ac3d6fc7fc2053e1eca">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const <a class="el" href="a00193.html">simple_partitioner</a> &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#gaddffeec0e892ac3d6fc7fc2053e1eca">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const <a class="el" href="a00193.html">simple_partitioner</a> &partitioner)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00193.html">simple_partitioner</a>. <br></td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gb175401f0729e40dd2c5860a17c14385"></a><!-- doxytag: member="tbb::parallel_reduce" ref="gb175401f0729e40dd2c5860a17c14385" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const auto_partitioner &partitioner)" -->
template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#gb175401f0729e40dd2c5860a17c14385">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const <a class="el" href="a00146.html">auto_partitioner</a> &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#gb175401f0729e40dd2c5860a17c14385">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const <a class="el" href="a00145.html">auto_partitioner</a> &partitioner)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00146.html">auto_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00145.html">auto_partitioner</a>. <br></td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gb7f1f1828ae2b330ce05b8513a495154"></a><!-- doxytag: member="tbb::parallel_reduce" ref="gb7f1f1828ae2b330ce05b8513a495154" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, affinity_partitioner &partitioner)" -->
template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#gb7f1f1828ae2b330ce05b8513a495154">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, <a class="el" href="a00141.html">affinity_partitioner</a> &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#gb7f1f1828ae2b330ce05b8513a495154">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, <a class="el" href="a00140.html">affinity_partitioner</a> &partitioner)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00141.html">affinity_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00140.html">affinity_partitioner</a>. <br></td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gfbc0cc2026d87f11a96bcd62788f5bb5"></a><!-- doxytag: member="tbb::parallel_reduce" ref="gfbc0cc2026d87f11a96bcd62788f5bb5" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const simple_partitioner &partitioner, task_group_context &context)" -->
template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#gfbc0cc2026d87f11a96bcd62788f5bb5">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const <a class="el" href="a00193.html">simple_partitioner</a> &partitioner, <a class="el" href="a00201.html">task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#gfbc0cc2026d87f11a96bcd62788f5bb5">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const <a class="el" href="a00193.html">simple_partitioner</a> &partitioner, <a class="el" href="a00201.html">task_group_context</a> &context)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, simple partitioner and user-supplied context. <br></td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g630c90a399937d9d4ae70ff883186dfd"></a><!-- doxytag: member="tbb::parallel_reduce" ref="g630c90a399937d9d4ae70ff883186dfd" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const auto_partitioner &partitioner, task_group_context &context)" -->
template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#g630c90a399937d9d4ae70ff883186dfd">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const <a class="el" href="a00146.html">auto_partitioner</a> &partitioner, <a class="el" href="a00201.html">task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#g630c90a399937d9d4ae70ff883186dfd">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const <a class="el" href="a00145.html">auto_partitioner</a> &partitioner, <a class="el" href="a00201.html">task_group_context</a> &context)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00146.html">auto_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00145.html">auto_partitioner</a> and user-supplied context. <br></td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g496bd7eadb3b97495ccb5655ef90319e"></a><!-- doxytag: member="tbb::parallel_reduce" ref="g496bd7eadb3b97495ccb5655ef90319e" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, affinity_partitioner &partitioner, task_group_context &context)" -->
template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#g496bd7eadb3b97495ccb5655ef90319e">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, <a class="el" href="a00141.html">affinity_partitioner</a> &partitioner, <a class="el" href="a00201.html">task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#g496bd7eadb3b97495ccb5655ef90319e">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, <a class="el" href="a00140.html">affinity_partitioner</a> &partitioner, <a class="el" href="a00201.html">task_group_context</a> &context)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00141.html">affinity_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00140.html">affinity_partitioner</a> and user-supplied context. <br></td></tr>
<tr><td colspan="2"><br><h2>parallel_scan</h2></td></tr>
<tr><td colspan="2">See also requirements on <a class="el" href="range_req.html">Range</a> and <a class="el" href="parallel_scan_body_req.html">parallel_scan Body</a>. <br><br></td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="ged143f31dd3d96ded02ab3db915b91c7"></a><!-- doxytag: member="tbb::parallel_scan" ref="ged143f31dd3d96ded02ab3db915b91c7" args="(const Range &range, Body &body)" -->
template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#ged143f31dd3d96ded02ab3db915b91c7">parallel_scan</a> (const Range &range, Body &body)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#ged143f31dd3d96ded02ab3db915b91c7">parallel_scan</a> (const Range &range, Body &body)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel prefix with default partitioner. <br></td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc9fac8870b2e6365fb337014404529df"></a><!-- doxytag: member="tbb::parallel_scan" ref="gc9fac8870b2e6365fb337014404529df" args="(const Range &range, Body &body, const simple_partitioner &partitioner)" -->
template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#gc9fac8870b2e6365fb337014404529df">parallel_scan</a> (const Range &range, Body &body, const <a class="el" href="a00193.html">simple_partitioner</a> &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#gc9fac8870b2e6365fb337014404529df">parallel_scan</a> (const Range &range, Body &body, const <a class="el" href="a00193.html">simple_partitioner</a> &partitioner)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel prefix with <a class="el" href="a00193.html">simple_partitioner</a>. <br></td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g62fde400a37bbca1a2fddc8e3d22f556"></a><!-- doxytag: member="tbb::parallel_scan" ref="g62fde400a37bbca1a2fddc8e3d22f556" args="(const Range &range, Body &body, const auto_partitioner &partitioner)" -->
template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#g62fde400a37bbca1a2fddc8e3d22f556">parallel_scan</a> (const Range &range, Body &body, const <a class="el" href="a00146.html">auto_partitioner</a> &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#g62fde400a37bbca1a2fddc8e3d22f556">parallel_scan</a> (const Range &range, Body &body, const <a class="el" href="a00145.html">auto_partitioner</a> &partitioner)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel prefix with <a class="el" href="a00146.html">auto_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel prefix with <a class="el" href="a00145.html">auto_partitioner</a>. <br></td></tr>
<tr><td colspan="2"><br><h2>parallel_sort</h2></td></tr>
<tr><td colspan="2">See also requirements on <a class="el" href="parallel_sort_iter_req.html">iterators for parallel_sort</a>. <br><br></td></tr>
<tr><td class="memTemplParams" nowrap colspan="2">template<typename RandomAccessIterator, typename Compare> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a> (RandomAccessIterator begin, RandomAccessIterator end, const Compare &comp)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a> (RandomAccessIterator begin, RandomAccessIterator end, const Compare &comp)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Sorts the data in [begin,end) using the given comparator. <a href="a00274.html#g49edcf9447cd91a9527a3f8e8512b7aa"></a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Sorts the data in [begin,end) using the given comparator. <a href="a00275.html#g49edcf9447cd91a9527a3f8e8512b7aa"></a><br></td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g16c3eb77d0e530834c51ce3857f01012"></a><!-- doxytag: member="tbb::parallel_sort" ref="g16c3eb77d0e530834c51ce3857f01012" args="(RandomAccessIterator begin, RandomAccessIterator end)" -->
template<typename RandomAccessIterator> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#g16c3eb77d0e530834c51ce3857f01012">parallel_sort</a> (RandomAccessIterator begin, RandomAccessIterator end)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#g16c3eb77d0e530834c51ce3857f01012">parallel_sort</a> (RandomAccessIterator begin, RandomAccessIterator end)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Sorts the data in [begin,end) with a default comparator <code>std::less<RandomAccessIterator></code>. <br></td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc7576f82fdedc8a701a6c17ad9415926"></a><!-- doxytag: member="tbb::parallel_sort" ref="gc7576f82fdedc8a701a6c17ad9415926" args="(T *begin, T *end)" -->
template<typename T> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#gc7576f82fdedc8a701a6c17ad9415926">parallel_sort</a> (T *begin, T *end)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#gc7576f82fdedc8a701a6c17ad9415926">parallel_sort</a> (T *begin, T *end)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Sorts the data in the range <code></code>[begin,end) with a default comparator <code>std::less<T></code>. <br></td></tr>
<tr><td colspan="2"><br><h2>Typedefs</h2></td></tr>
@@ -467,56 +467,56 @@ typedef void(*) </td><td class="memItemRight" valign="bottom"><a class="el"
</td><td class="memItemRight" valign="bottom"><b>__TBB_DECL_ATOMIC</b> (__TBB_LONG_LONG) __TBB_DECL_ATOMIC(unsigned __TBB_LONG_LONG) __TBB_DECL_ATOMIC(long) __TBB_DECL_ATOMIC(unsigned long) __TBB_DECL_ATOMIC_ALT(unsigned</td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ad165cf61abbe349d413df2589679add"></a><!-- doxytag: member="tbb::__TBB_DECL_ATOMIC_ALT" ref="ad165cf61abbe349d413df2589679add" args="(int, ptrdiff_t) __TBB_DECL_ATOMIC(unsigned) __TBB_DECL_ATOMIC(int) __TBB_DECL_ATOMIC(unsigned short) __TBB_DECL_ATOMIC(short) __TBB_DECL_ATOMIC(char) __TBB_DECL_ATOMIC(signed char) __TBB_DECL_ATOMIC(unsigned char) __TBB_DECL_ATOMIC(wchar_t) template< typename T > st [...]
-size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00267.html#ad165cf61abbe349d413df2589679add">__TBB_DECL_ATOMIC_ALT</a> (int, ptrdiff_t) __TBB_DECL_ATOMIC(unsigned) __TBB_DECL_ATOMIC(int) __TBB_DECL_ATOMIC(unsigned short) __TBB_DECL_ATOMIC(short) __TBB_DECL_ATOMIC(char) __TBB_DECL_ATOMIC(signed char) __TBB_DECL_ATOMIC(unsigned char) __TBB_DECL_ATOMIC(wchar_t) template< typename T > struct <a class="el" href="a00143.html">atomic</a>< T * ></td></tr>
+size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00267.html#ad165cf61abbe349d413df2589679add">__TBB_DECL_ATOMIC_ALT</a> (int, ptrdiff_t) __TBB_DECL_ATOMIC(unsigned) __TBB_DECL_ATOMIC(int) __TBB_DECL_ATOMIC(unsigned short) __TBB_DECL_ATOMIC(short) __TBB_DECL_ATOMIC(char) __TBB_DECL_ATOMIC(signed char) __TBB_DECL_ATOMIC(unsigned char) __TBB_DECL_ATOMIC(wchar_t) template< typename T > struct <a class="el" href="a00142.html">atomic</a>< T * ></td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Specialization for atomic<T*> with arithmetic and operator->. <br></td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="7af9509624a62ea848afe775f892ed12"></a><!-- doxytag: member="tbb::operator==" ref="7af9509624a62ea848afe775f892ed12" args="(const cache_aligned_allocator< T > &, const cache_aligned_allocator< U > &)" -->
template<typename T, typename U> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator==</b> (const <a class="el" href="a00151.html">cache_aligned_allocator</a>< T > &, const <a class="el" href="a00151.html">cache_aligned_allocator</a>< U > &)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator==</b> (const <a class="el" href="a00150.html">cache_aligned_allocator</a>< T > &, const <a class="el" href="a00150.html">cache_aligned_allocator</a>< U > &)</td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="426abbf5243087148f5e3767e68c286b"></a><!-- doxytag: member="tbb::operator!=" ref="426abbf5243087148f5e3767e68c286b" args="(const cache_aligned_allocator< T > &, const cache_aligned_allocator< U > &)" -->
template<typename T, typename U> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator!=</b> (const <a class="el" href="a00151.html">cache_aligned_allocator</a>< T > &, const <a class="el" href="a00151.html">cache_aligned_allocator</a>< U > &)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator!=</b> (const <a class="el" href="a00150.html">cache_aligned_allocator</a>< T > &, const <a class="el" href="a00150.html">cache_aligned_allocator</a>< U > &)</td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="f3609fc523a99c101572fdc68f918d66"></a><!-- doxytag: member="tbb::operator==" ref="f3609fc523a99c101572fdc68f918d66" args="(const concurrent_hash_map< Key, T, HashCompare, A1 > &a, const concurrent_hash_map< Key, T, HashCompare, A2 > &b)" -->
template<typename Key, typename T, typename HashCompare, typename A1, typename A2> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator==</b> (const <a class="el" href="a00156.html">concurrent_hash_map</a>< Key, T, HashCompare, A1 > &a, const <a class="el" href="a00156.html">concurrent_hash_map</a>< Key, T, HashCompare, A2 > &b)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator==</b> (const <a class="el" href="a00155.html">concurrent_hash_map</a>< Key, T, HashCompare, A1 > &a, const <a class="el" href="a00155.html">concurrent_hash_map</a>< Key, T, HashCompare, A2 > &b)</td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="2da30ff86b9a39722f45bc35e1c6934d"></a><!-- doxytag: member="tbb::operator!=" ref="2da30ff86b9a39722f45bc35e1c6934d" args="(const concurrent_hash_map< Key, T, HashCompare, A1 > &a, const concurrent_hash_map< Key, T, HashCompare, A2 > &b)" -->
template<typename Key, typename T, typename HashCompare, typename A1, typename A2> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator!=</b> (const <a class="el" href="a00156.html">concurrent_hash_map</a>< Key, T, HashCompare, A1 > &a, const <a class="el" href="a00156.html">concurrent_hash_map</a>< Key, T, HashCompare, A2 > &b)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator!=</b> (const <a class="el" href="a00155.html">concurrent_hash_map</a>< Key, T, HashCompare, A1 > &a, const <a class="el" href="a00155.html">concurrent_hash_map</a>< Key, T, HashCompare, A2 > &b)</td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="817c20df80fe1a933a8557eb76113e24"></a><!-- doxytag: member="tbb::swap" ref="817c20df80fe1a933a8557eb76113e24" args="(concurrent_hash_map< Key, T, HashCompare, A > &a, concurrent_hash_map< Key, T, HashCompare, A > &b)" -->
template<typename Key, typename T, typename HashCompare, typename A> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>swap</b> (<a class="el" href="a00156.html">concurrent_hash_map</a>< Key, T, HashCompare, A > &a, <a class="el" href="a00156.html">concurrent_hash_map</a>< Key, T, HashCompare, A > &b)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>swap</b> (<a class="el" href="a00155.html">concurrent_hash_map</a>< Key, T, HashCompare, A > &a, <a class="el" href="a00155.html">concurrent_hash_map</a>< Key, T, HashCompare, A > &b)</td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="11419db87ac98110907dda08a24f0949"></a><!-- doxytag: member="tbb::operator==" ref="11419db87ac98110907dda08a24f0949" args="(const concurrent_vector< T, A1 > &a, const concurrent_vector< T, A2 > &b)" -->
template<typename T, class A1, class A2> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator==</b> (const <a class="el" href="a00162.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00162.html">concurrent_vector</a>< T, A2 > &b)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator==</b> (const <a class="el" href="a00161.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00161.html">concurrent_vector</a>< T, A2 > &b)</td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="aa9e09f2e9154ffd6658fad8355fb491"></a><!-- doxytag: member="tbb::operator!=" ref="aa9e09f2e9154ffd6658fad8355fb491" args="(const concurrent_vector< T, A1 > &a, const concurrent_vector< T, A2 > &b)" -->
template<typename T, class A1, class A2> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator!=</b> (const <a class="el" href="a00162.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00162.html">concurrent_vector</a>< T, A2 > &b)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator!=</b> (const <a class="el" href="a00161.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00161.html">concurrent_vector</a>< T, A2 > &b)</td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="33267dd805415351956d45b4b5347190"></a><!-- doxytag: member="tbb::operator<" ref="33267dd805415351956d45b4b5347190" args="(const concurrent_vector< T, A1 > &a, const concurrent_vector< T, A2 > &b)" -->
template<typename T, class A1, class A2> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator<</b> (const <a class="el" href="a00162.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00162.html">concurrent_vector</a>< T, A2 > &b)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator<</b> (const <a class="el" href="a00161.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00161.html">concurrent_vector</a>< T, A2 > &b)</td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="14e2968ab20cb714bef1f0352fc152f0"></a><!-- doxytag: member="tbb::operator>" ref="14e2968ab20cb714bef1f0352fc152f0" args="(const concurrent_vector< T, A1 > &a, const concurrent_vector< T, A2 > &b)" -->
template<typename T, class A1, class A2> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator></b> (const <a class="el" href="a00162.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00162.html">concurrent_vector</a>< T, A2 > &b)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator></b> (const <a class="el" href="a00161.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00161.html">concurrent_vector</a>< T, A2 > &b)</td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="0042a36a670a397fb52e713edbaecd0e"></a><!-- doxytag: member="tbb::operator<=" ref="0042a36a670a397fb52e713edbaecd0e" args="(const concurrent_vector< T, A1 > &a, const concurrent_vector< T, A2 > &b)" -->
template<typename T, class A1, class A2> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator<=</b> (const <a class="el" href="a00162.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00162.html">concurrent_vector</a>< T, A2 > &b)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator<=</b> (const <a class="el" href="a00161.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00161.html">concurrent_vector</a>< T, A2 > &b)</td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="f70eb1d931473b69ba4bcf93af8baa33"></a><!-- doxytag: member="tbb::operator>=" ref="f70eb1d931473b69ba4bcf93af8baa33" args="(const concurrent_vector< T, A1 > &a, const concurrent_vector< T, A2 > &b)" -->
template<typename T, class A1, class A2> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator>=</b> (const <a class="el" href="a00162.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00162.html">concurrent_vector</a>< T, A2 > &b)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator>=</b> (const <a class="el" href="a00161.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00161.html">concurrent_vector</a>< T, A2 > &b)</td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="4a3897ea8d8a48e885d764bd7d370d50"></a><!-- doxytag: member="tbb::swap" ref="4a3897ea8d8a48e885d764bd7d370d50" args="(concurrent_vector< T, A > &a, concurrent_vector< T, A > &b)" -->
template<typename T, class A> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>swap</b> (<a class="el" href="a00162.html">concurrent_vector</a>< T, A > &a, <a class="el" href="a00162.html">concurrent_vector</a>< T, A > &b)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>swap</b> (<a class="el" href="a00161.html">concurrent_vector</a>< T, A > &a, <a class="el" href="a00161.html">concurrent_vector</a>< T, A > &b)</td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="906ebb461ecb0446989739fd0399e4b8"></a><!-- doxytag: member="tbb::operator==" ref="906ebb461ecb0446989739fd0399e4b8" args="(const scalable_allocator< T > &, const scalable_allocator< U > &)" -->
template<typename T, typename U> </td></tr>
diff --git a/doc/html/a00273.html b/doc/html/a00273.html
deleted file mode 100644
index a5b00eb..0000000
--- a/doc/html/a00273.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::strict_ppl Namespace Reference</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li id="current"><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="namespaces.html"><span>Namespace List</span></a></li>
- <li><a href="namespacemembers.html"><span>Namespace Members</span></a></li>
- </ul></div>
-<div class="nav">
-<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00273.html">strict_ppl</a></div>
-<h1>tbb::strict_ppl Namespace Reference</h1>For internal use only.
-<a href="#_details">More...</a>
-<p>
-<table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00160.html">concurrent_queue</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A high-performance thread-safe non-blocking concurrent queue. <a href="a00160.html#_details">More...</a><br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="15c764c70c8a32e7a4b8c291d0cc8dde"></a><!-- doxytag: member="tbb::strict_ppl::parallel_for" ref="15c764c70c8a32e7a4b8c291d0cc8dde" args="(Index first, Index last, Index step, const Function &f)" -->
-template<typename Index, typename Function> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00273.html#15c764c70c8a32e7a4b8c291d0cc8dde">parallel_for</a> (Index first, Index last, Index step, const Function &f)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over a range of integers with a step provided. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="fb5925ad98ec9608139661cfd2b9b88f"></a><!-- doxytag: member="tbb::strict_ppl::parallel_for" ref="fb5925ad98ec9608139661cfd2b9b88f" args="(Index first, Index last, Index step, const Function &f, tbb::task_group_context &context)" -->
-template<typename Index, typename Function> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_for</b> (Index first, Index last, Index step, const Function &f, <a class="el" href="a00201.html">tbb::task_group_context</a> &context)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="490399525b1e690ec31d6db964c6b272"></a><!-- doxytag: member="tbb::strict_ppl::parallel_for" ref="490399525b1e690ec31d6db964c6b272" args="(Index first, Index last, const Function &f)" -->
-template<typename Index, typename Function> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00273.html#490399525b1e690ec31d6db964c6b272">parallel_for</a> (Index first, Index last, const Function &f)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over a range of integers with a default step value. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="bda0b331c88a836cb756fff0f661d609"></a><!-- doxytag: member="tbb::strict_ppl::parallel_for" ref="bda0b331c88a836cb756fff0f661d609" args="(Index first, Index last, const Function &f, tbb::task_group_context &context)" -->
-template<typename Index, typename Function> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_for</b> (Index first, Index last, const Function &f, <a class="el" href="a00201.html">tbb::task_group_context</a> &context)</td></tr>
-
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-For internal use only. <hr>
-<p></p>
-Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00274.html b/doc/html/a00274.html
index f82736c..576ceec 100644
--- a/doc/html/a00274.html
+++ b/doc/html/a00274.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Algorithms</title>
+<title>tbb::strict_ppl Namespace Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -9,331 +9,48 @@
<ul>
<li><a href="index.html"><span>Main Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li id="current"><a href="namespaces.html"><span>Namespaces</span></a></li>
<li><a href="annotated.html"><span>Classes</span></a></li>
<li><a href="files.html"><span>Files</span></a></li>
<li><a href="pages.html"><span>Related Pages</span></a></li>
</ul></div>
-<h1>Algorithms</h1><table border="0" cellpadding="0" cellspacing="0">
+<div class="tabs">
+ <ul>
+ <li><a href="namespaces.html"><span>Namespace List</span></a></li>
+ <li><a href="namespacemembers.html"><span>Namespace Members</span></a></li>
+ </ul></div>
+<div class="nav">
+<a class="el" href="a00267.html">tbb</a>::<a class="el" href="a00274.html">strict_ppl</a></div>
+<h1>tbb::strict_ppl Namespace Reference</h1>For internal use only.
+<a href="#_details">More...</a>
+<p>
+<table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00148.html">tbb::blocked_range< Value ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A range over which to iterate. <a href="a00148.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00149.html">tbb::blocked_range2d< RowValue, ColValue ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A 2-dimensional range that models the Range concept. <a href="a00149.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00150.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A 3-dimensional range that models the Range concept. <a href="a00150.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><a class="el" href="a00181.html">tbb::pre_scan_tag</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to indicate that the initial scan is being performed. <a href="a00181.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><a class="el" href="a00167.html">tbb::final_scan_tag</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to indicate that the final scan is being performed. <a href="a00167.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00179.html">tbb::parallel_while< Body ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over a stream, with optional addition of more work. <a href="a00179.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00193.html">tbb::simple_partitioner</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A simple partitioner. <a href="a00193.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00146.html">tbb::auto_partitioner</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">An auto partitioner. <a href="a00146.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00165.html">tbb::filter</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A stage in a pipeline. <a href="a00165.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00209.html">tbb::thread_bound_filter</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A stage in a pipeline served by a user thread. <a href="a00209.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00180.html">tbb::pipeline</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A processing pipeling that applies filters to items. <a href="a00180.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00198.html">tbb::split</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Dummy type that distinguishes splitting constructor from copy constructor. <a href="a00198.html#_details">More...</a><br></td></tr>
-<tr><td colspan="2"><br><h2>parallel_do</h2></td></tr>
-<tr><td colspan="2">See also requirements on <a class="el" href="parallel_do_body_req.html">parallel_do Body</a>. <br><br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g3383e2703977012b6f384d673410f1f7"></a><!-- doxytag: member="algorithms::parallel_do" ref="g3383e2703977012b6f384d673410f1f7" args="(Iterator first, Iterator last, const Body &body)" -->
-template<typename Iterator, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#g3383e2703977012b6f384d673410f1f7">tbb::parallel_do</a> (Iterator first, Iterator last, const Body &body)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over a range, with optional addition of more work. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g2617dc9b88b3285a7212599d49f74228"></a><!-- doxytag: member="algorithms::parallel_do" ref="g2617dc9b88b3285a7212599d49f74228" args="(Iterator first, Iterator last, const Body &body, task_group_context &context)" -->
-template<typename Iterator, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#g2617dc9b88b3285a7212599d49f74228">tbb::parallel_do</a> (Iterator first, Iterator last, const Body &body, task_group_context &context)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over a range, with optional addition of more work and user-supplied context. <br></td></tr>
-<tr><td colspan="2"><br><h2>parallel_for</h2></td></tr>
-<tr><td colspan="2">See also requirements on <a class="el" href="range_req.html">Range</a> and <a class="el" href="parallel_for_body_req.html">parallel_for Body</a>. <br><br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g68cc046ef72c42ce205fccbc435a0d81"></a><!-- doxytag: member="algorithms::parallel_for" ref="g68cc046ef72c42ce205fccbc435a0d81" args="(const Range &range, const Body &body)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#g68cc046ef72c42ce205fccbc435a0d81">tbb::parallel_for</a> (const Range &range, const Body &body)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with default partitioner. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g13cac5dd55c7533bccea43a51c33d0e5"></a><!-- doxytag: member="algorithms::parallel_for" ref="g13cac5dd55c7533bccea43a51c33d0e5" args="(const Range &range, const Body &body, const simple_partitioner &partitioner)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#g13cac5dd55c7533bccea43a51c33d0e5">tbb::parallel_for</a> (const Range &range, const Body &body, const simple_partitioner &partitioner)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with simple partitioner. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="ga7ac75d532389b55b9247f3fdb0b00d1"></a><!-- doxytag: member="algorithms::parallel_for" ref="ga7ac75d532389b55b9247f3fdb0b00d1" args="(const Range &range, const Body &body, const auto_partitioner &partitioner)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#ga7ac75d532389b55b9247f3fdb0b00d1">tbb::parallel_for</a> (const Range &range, const Body &body, const auto_partitioner &partitioner)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00146.html">auto_partitioner</a>. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g9cd1b210ceb1c040f30e390b4a21bde8"></a><!-- doxytag: member="algorithms::parallel_for" ref="g9cd1b210ceb1c040f30e390b4a21bde8" args="(const Range &range, const Body &body, affinity_partitioner &partitioner)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#g9cd1b210ceb1c040f30e390b4a21bde8">tbb::parallel_for</a> (const Range &range, const Body &body, affinity_partitioner &partitioner)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00141.html">affinity_partitioner</a>. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g2d317a5e0078cd193125439fed60dfdc"></a><!-- doxytag: member="algorithms::parallel_for" ref="g2d317a5e0078cd193125439fed60dfdc" args="(const Range &range, const Body &body, const simple_partitioner &partitioner, task_group_context &context)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#g2d317a5e0078cd193125439fed60dfdc">tbb::parallel_for</a> (const Range &range, const Body &body, const simple_partitioner &partitioner, task_group_context &context)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with simple partitioner and user-supplied context. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1c0700e3f85e83a788ff3ede88ebb7e9"></a><!-- doxytag: member="algorithms::parallel_for" ref="g1c0700e3f85e83a788ff3ede88ebb7e9" args="(const Range &range, const Body &body, const auto_partitioner &partitioner, task_group_context &context)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#g1c0700e3f85e83a788ff3ede88ebb7e9">tbb::parallel_for</a> (const Range &range, const Body &body, const auto_partitioner &partitioner, task_group_context &context)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00146.html">auto_partitioner</a> and user-supplied context. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g04b4696b67370c01353ff5974c8f1196"></a><!-- doxytag: member="algorithms::parallel_for" ref="g04b4696b67370c01353ff5974c8f1196" args="(const Range &range, const Body &body, affinity_partitioner &partitioner, task_group_context &context)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#g04b4696b67370c01353ff5974c8f1196">tbb::parallel_for</a> (const Range &range, const Body &body, affinity_partitioner &partitioner, task_group_context &context)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00141.html">affinity_partitioner</a> and user-supplied context. <br></td></tr>
-<tr><td colspan="2"><br><h2>parallel_for_each</h2></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gcd40c32f319747e61a8f73fcfc452001"></a><!-- doxytag: member="algorithms::parallel_for_each" ref="gcd40c32f319747e61a8f73fcfc452001" args="(InputIterator first, InputIterator last, const Function &f, task_group_context &context)" -->
-template<typename InputIterator, typename Function> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#gcd40c32f319747e61a8f73fcfc452001">tbb::parallel_for_each</a> (InputIterator first, InputIterator last, const Function &f, task_group_context &context)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Calls function f for all items from [first, last) interval using user-supplied context. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc2d710ca573f0a9bd94379cba3772def"></a><!-- doxytag: member="algorithms::parallel_for_each" ref="gc2d710ca573f0a9bd94379cba3772def" args="(InputIterator first, InputIterator last, const Function &f)" -->
-template<typename InputIterator, typename Function> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#gc2d710ca573f0a9bd94379cba3772def">tbb::parallel_for_each</a> (InputIterator first, InputIterator last, const Function &f)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Uses default context. <br></td></tr>
-<tr><td colspan="2"><br><h2>parallel_invoke</h2></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gd3e2998f171494f94c2103f4eb924084"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="gd3e2998f171494f94c2103f4eb924084" args="(const F0 &f0, const F1 &f1, tbb::task_group_context &context)" -->
-template<typename F0, typename F1> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#gd3e2998f171494f94c2103f4eb924084">tbb::parallel_invoke</a> (const F0 &f0, const F1 &f1, <a class="el" href="a00201.html">tbb::task_group_context</a> &context)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Executes a list of tasks in parallel and waits for all tasks to complete. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g4eb73562e4145c8343ed9f996267f039"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g4eb73562e4145c8343ed9f996267f039" args="(const F0 &f0, const F1 &f1, const F2 &f2, tbb::task_group_context &context)" -->
-template<typename F0, typename F1, typename F2> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, <a class="el" href="a00201.html">tbb::task_group_context</a> &context)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gd1335c4b54fbf8d3f5be6a5c255c8c60"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="gd1335c4b54fbf8d3f5be6a5c255c8c60" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, tbb::task_group_context &context)" -->
-template<typename F0, typename F1, typename F2, typename F3> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, <a class="el" href="a00201.html">tbb::task_group_context</a> &context)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g40b88e3db7ecb09cbfe0230ea1c24030"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g40b88e3db7ecb09cbfe0230ea1c24030" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, tbb::task_group_context &context)" -->
-template<typename F0, typename F1, typename F2, typename F3, typename F4> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, <a class="el" href="a00201.html">tbb::task_group_context</a> &context)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g98a8b388f7e0b7621a964a8c23752d1d"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g98a8b388f7e0b7621a964a8c23752d1d" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, tbb::task_group_context &context)" -->
-template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, <a class="el" href="a00201.html">tbb::task_group_context</a> &context)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gb95f31638bdde9d909361ad2e96a93eb"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="gb95f31638bdde9d909361ad2e96a93eb" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, tbb::task_group_context &context)" -->
-template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, <a class="el" href="a00201.html">tbb::task_group_context</a> &context)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00159.html">concurrent_queue</a></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1655b24786f010ee0a008907a07bb61d"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g1655b24786f010ee0a008907a07bb61d" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, tbb::task_group_context &context)" -->
-template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, <a class="el" href="a00201.html">tbb::task_group_context</a> &context)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A high-performance thread-safe non-blocking concurrent queue. <a href="a00159.html#_details">More...</a><br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="15c764c70c8a32e7a4b8c291d0cc8dde"></a><!-- doxytag: member="tbb::strict_ppl::parallel_for" ref="15c764c70c8a32e7a4b8c291d0cc8dde" args="(Index first, Index last, Index step, const Function &f)" -->
+template<typename Index, typename Function> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#15c764c70c8a32e7a4b8c291d0cc8dde">parallel_for</a> (Index first, Index last, Index step, const Function &f)</td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g105220f1c95f9888b696a3e47027527b"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g105220f1c95f9888b696a3e47027527b" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, tbb::task_group_context &context)" -->
-template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, <a class="el" href="a00201.html">tbb::task_group_context</a> &context)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over a range of integers with a step provided. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="fb5925ad98ec9608139661cfd2b9b88f"></a><!-- doxytag: member="tbb::strict_ppl::parallel_for" ref="fb5925ad98ec9608139661cfd2b9b88f" args="(Index first, Index last, Index step, const Function &f, tbb::task_group_context &context)" -->
+template<typename Index, typename Function> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_for</b> (Index first, Index last, Index step, const Function &f, <a class="el" href="a00201.html">tbb::task_group_context</a> &context)</td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1ef1774e0fcc4f632fe0af2591781c4c"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g1ef1774e0fcc4f632fe0af2591781c4c" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, const F9 &f9, tbb::task_group_context &context)" -->
-template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8, typename F9> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, const F9 &f9, <a class="el" href="a00201.html">tbb::task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="490399525b1e690ec31d6db964c6b272"></a><!-- doxytag: member="tbb::strict_ppl::parallel_for" ref="490399525b1e690ec31d6db964c6b272" args="(Index first, Index last, const Function &f)" -->
+template<typename Index, typename Function> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#490399525b1e690ec31d6db964c6b272">parallel_for</a> (Index first, Index last, const Function &f)</td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="ge832d8ad8b246c884e3c897ed63f8216"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="ge832d8ad8b246c884e3c897ed63f8216" args="(const F0 &f0, const F1 &f1)" -->
-template<typename F0, typename F1> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over a range of integers with a default step value. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="bda0b331c88a836cb756fff0f661d609"></a><!-- doxytag: member="tbb::strict_ppl::parallel_for" ref="bda0b331c88a836cb756fff0f661d609" args="(Index first, Index last, const Function &f, tbb::task_group_context &context)" -->
+template<typename Index, typename Function> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_for</b> (Index first, Index last, const Function &f, <a class="el" href="a00201.html">tbb::task_group_context</a> &context)</td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gb91fec4e7ba49754ad583ccb127afc66"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="gb91fec4e7ba49754ad583ccb127afc66" args="(const F0 &f0, const F1 &f1, const F2 &f2)" -->
-template<typename F0, typename F1, typename F2> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g421d0f66ee69eea134a35d1ae371d8d6"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g421d0f66ee69eea134a35d1ae371d8d6" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3)" -->
-template<typename F0, typename F1, typename F2, typename F3> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g8aacce74d691b4f44a0f7becadd9578c"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g8aacce74d691b4f44a0f7becadd9578c" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4)" -->
-template<typename F0, typename F1, typename F2, typename F3, typename F4> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g8cc6994f7cd6eaf25feb5d7cc04a2e64"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g8cc6994f7cd6eaf25feb5d7cc04a2e64" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5)" -->
-template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g995ba9583ae24bddb8bd9a599cc8b4c7"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g995ba9583ae24bddb8bd9a599cc8b4c7" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6)" -->
-template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g34341a4c24c6f548886cd14077374c5c"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g34341a4c24c6f548886cd14077374c5c" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7)" -->
-template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g2a11342753488d460866d48370a69517"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g2a11342753488d460866d48370a69517" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8)" -->
-template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gffcf6835ceee43455f310352a3b4faa5"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="gffcf6835ceee43455f310352a3b4faa5" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, const F9 &f9)" -->
-template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8, typename F9> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, const F9 &f9)</td></tr>
-
-<tr><td colspan="2"><br><h2>parallel_reduce</h2></td></tr>
-<tr><td colspan="2">See also requirements on <a class="el" href="range_req.html">Range</a> and <a class="el" href="parallel_reduce_body_req.html">parallel_reduce Body</a>. <br><br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1b3d59c5eb62683c5754db6970392fa3"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="g1b3d59c5eb62683c5754db6970392fa3" args="(const Range &range, Body &body)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#g1b3d59c5eb62683c5754db6970392fa3">tbb::parallel_reduce</a> (const Range &range, Body &body)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and default partitioner. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gec1b7c03f9da909bef5db12e3d41bed3"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="gec1b7c03f9da909bef5db12e3d41bed3" args="(const Range &range, Body &body, const simple_partitioner &partitioner)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#gec1b7c03f9da909bef5db12e3d41bed3">tbb::parallel_reduce</a> (const Range &range, Body &body, const simple_partitioner &partitioner)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00193.html">simple_partitioner</a>. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g18a19157e6245992fc00ca0adeb7dd37"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="g18a19157e6245992fc00ca0adeb7dd37" args="(const Range &range, Body &body, const auto_partitioner &partitioner)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#g18a19157e6245992fc00ca0adeb7dd37">tbb::parallel_reduce</a> (const Range &range, Body &body, const auto_partitioner &partitioner)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00146.html">auto_partitioner</a>. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc61e73fcc36c92d79a217fc355ff4a6b"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="gc61e73fcc36c92d79a217fc355ff4a6b" args="(const Range &range, Body &body, affinity_partitioner &partitioner)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#gc61e73fcc36c92d79a217fc355ff4a6b">tbb::parallel_reduce</a> (const Range &range, Body &body, affinity_partitioner &partitioner)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00141.html">affinity_partitioner</a>. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g45cb00c42a18e334bbde8b7535afe460"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="g45cb00c42a18e334bbde8b7535afe460" args="(const Range &range, Body &body, const simple_partitioner &partitioner, task_group_context &context)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#g45cb00c42a18e334bbde8b7535afe460">tbb::parallel_reduce</a> (const Range &range, Body &body, const simple_partitioner &partitioner, task_group_context &context)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, simple partitioner and user-supplied context. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1c1ea1d7c61b3c225e92c70d669a53a5"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="g1c1ea1d7c61b3c225e92c70d669a53a5" args="(const Range &range, Body &body, const auto_partitioner &partitioner, task_group_context &context)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#g1c1ea1d7c61b3c225e92c70d669a53a5">tbb::parallel_reduce</a> (const Range &range, Body &body, const auto_partitioner &partitioner, task_group_context &context)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00146.html">auto_partitioner</a> and user-supplied context. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gd9ac3a3811060314695f33b703c6e11b"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="gd9ac3a3811060314695f33b703c6e11b" args="(const Range &range, Body &body, affinity_partitioner &partitioner, task_group_context &context)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#gd9ac3a3811060314695f33b703c6e11b">tbb::parallel_reduce</a> (const Range &range, Body &body, affinity_partitioner &partitioner, task_group_context &context)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00141.html">affinity_partitioner</a> and user-supplied context. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc9412e09fb01fcad8c018ea9cffb28ef"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="gc9412e09fb01fcad8c018ea9cffb28ef" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction)" -->
-template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#gc9412e09fb01fcad8c018ea9cffb28ef">tbb::parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and default partitioner. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gaddffeec0e892ac3d6fc7fc2053e1eca"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="gaddffeec0e892ac3d6fc7fc2053e1eca" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const simple_partitioner &partitioner)" -->
-template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#gaddffeec0e892ac3d6fc7fc2053e1eca">tbb::parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const simple_partitioner &partitioner)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00193.html">simple_partitioner</a>. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gb175401f0729e40dd2c5860a17c14385"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="gb175401f0729e40dd2c5860a17c14385" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const auto_partitioner &partitioner)" -->
-template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#gb175401f0729e40dd2c5860a17c14385">tbb::parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const auto_partitioner &partitioner)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00146.html">auto_partitioner</a>. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gb7f1f1828ae2b330ce05b8513a495154"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="gb7f1f1828ae2b330ce05b8513a495154" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, affinity_partitioner &partitioner)" -->
-template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#gb7f1f1828ae2b330ce05b8513a495154">tbb::parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, affinity_partitioner &partitioner)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00141.html">affinity_partitioner</a>. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gfbc0cc2026d87f11a96bcd62788f5bb5"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="gfbc0cc2026d87f11a96bcd62788f5bb5" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const simple_partitioner &partitioner, task_group_context &context)" -->
-template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#gfbc0cc2026d87f11a96bcd62788f5bb5">tbb::parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const simple_partitioner &partitioner, task_group_context &context)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, simple partitioner and user-supplied context. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g630c90a399937d9d4ae70ff883186dfd"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="g630c90a399937d9d4ae70ff883186dfd" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const auto_partitioner &partitioner, task_group_context &context)" -->
-template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#g630c90a399937d9d4ae70ff883186dfd">tbb::parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const auto_partitioner &partitioner, task_group_context &context)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00146.html">auto_partitioner</a> and user-supplied context. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g496bd7eadb3b97495ccb5655ef90319e"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="g496bd7eadb3b97495ccb5655ef90319e" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, affinity_partitioner &partitioner, task_group_context &context)" -->
-template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#g496bd7eadb3b97495ccb5655ef90319e">tbb::parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, affinity_partitioner &partitioner, task_group_context &context)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00141.html">affinity_partitioner</a> and user-supplied context. <br></td></tr>
-<tr><td colspan="2"><br><h2>parallel_scan</h2></td></tr>
-<tr><td colspan="2">See also requirements on <a class="el" href="range_req.html">Range</a> and <a class="el" href="parallel_scan_body_req.html">parallel_scan Body</a>. <br><br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="ged143f31dd3d96ded02ab3db915b91c7"></a><!-- doxytag: member="algorithms::parallel_scan" ref="ged143f31dd3d96ded02ab3db915b91c7" args="(const Range &range, Body &body)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#ged143f31dd3d96ded02ab3db915b91c7">tbb::parallel_scan</a> (const Range &range, Body &body)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel prefix with default partitioner. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc9fac8870b2e6365fb337014404529df"></a><!-- doxytag: member="algorithms::parallel_scan" ref="gc9fac8870b2e6365fb337014404529df" args="(const Range &range, Body &body, const simple_partitioner &partitioner)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#gc9fac8870b2e6365fb337014404529df">tbb::parallel_scan</a> (const Range &range, Body &body, const simple_partitioner &partitioner)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel prefix with <a class="el" href="a00193.html">simple_partitioner</a>. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g62fde400a37bbca1a2fddc8e3d22f556"></a><!-- doxytag: member="algorithms::parallel_scan" ref="g62fde400a37bbca1a2fddc8e3d22f556" args="(const Range &range, Body &body, const auto_partitioner &partitioner)" -->
-template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#g62fde400a37bbca1a2fddc8e3d22f556">tbb::parallel_scan</a> (const Range &range, Body &body, const auto_partitioner &partitioner)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel prefix with <a class="el" href="a00146.html">auto_partitioner</a>. <br></td></tr>
-<tr><td colspan="2"><br><h2>parallel_sort</h2></td></tr>
-<tr><td colspan="2">See also requirements on <a class="el" href="parallel_sort_iter_req.html">iterators for parallel_sort</a>. <br><br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2">template<typename RandomAccessIterator, typename Compare> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#g49edcf9447cd91a9527a3f8e8512b7aa">tbb::parallel_sort</a> (RandomAccessIterator begin, RandomAccessIterator end, const Compare &comp)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Sorts the data in [begin,end) using the given comparator. <a href="#g49edcf9447cd91a9527a3f8e8512b7aa"></a><br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g16c3eb77d0e530834c51ce3857f01012"></a><!-- doxytag: member="algorithms::parallel_sort" ref="g16c3eb77d0e530834c51ce3857f01012" args="(RandomAccessIterator begin, RandomAccessIterator end)" -->
-template<typename RandomAccessIterator> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#g16c3eb77d0e530834c51ce3857f01012">tbb::parallel_sort</a> (RandomAccessIterator begin, RandomAccessIterator end)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Sorts the data in [begin,end) with a default comparator <code>std::less<RandomAccessIterator></code>. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc7576f82fdedc8a701a6c17ad9415926"></a><!-- doxytag: member="algorithms::parallel_sort" ref="gc7576f82fdedc8a701a6c17ad9415926" args="(T *begin, T *end)" -->
-template<typename T> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00274.html#gc7576f82fdedc8a701a6c17ad9415926">tbb::parallel_sort</a> (T *begin, T *end)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Sorts the data in the range <code></code>[begin,end) with a default comparator <code>std::less<T></code>. <br></td></tr>
</table>
-<hr><h2>Function Documentation</h2>
-<a class="anchor" name="g49edcf9447cd91a9527a3f8e8512b7aa"></a><!-- doxytag: member="tbb::parallel_sort" ref="g49edcf9447cd91a9527a3f8e8512b7aa" args="(RandomAccessIterator begin, RandomAccessIterator end, const Compare &comp)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename RandomAccessIterator, typename Compare> </div>
- <table class="memname">
- <tr>
- <td class="memname">void tbb::parallel_sort </td>
- <td>(</td>
- <td class="paramtype">RandomAccessIterator </td>
- <td class="paramname"> <em>begin</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">RandomAccessIterator </td>
- <td class="paramname"> <em>end</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">const Compare & </td>
- <td class="paramname"> <em>comp</em></td><td> </td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Sorts the data in [begin,end) using the given comparator.
-<p>
-The compare function object is used for all comparisons between elements during sorting. The compare object must define a bool operator() function.
-</div>
-</div><p>
-<hr>
+<hr><a name="_details"></a><h2>Detailed Description</h2>
+For internal use only. <hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
diff --git a/doc/html/a00275.html b/doc/html/a00275.html
index 58f6e66..84943d8 100644
--- a/doc/html/a00275.html
+++ b/doc/html/a00275.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Containers</title>
+<title>Algorithms</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -14,31 +14,325 @@
<li><a href="files.html"><span>Files</span></a></li>
<li><a href="pages.html"><span>Related Pages</span></a></li>
</ul></div>
-<h1>Containers</h1><table border="0" cellpadding="0" cellspacing="0">
+<h1>Algorithms</h1><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00154.html">tbb::combinable< T ></a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00147.html">tbb::blocked_range< Value ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Thread-local storage with optional reduction. <a href="a00154.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A range over which to iterate. <a href="a00147.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00148.html">tbb::blocked_range2d< RowValue, ColValue ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Unordered map from Key to T. <a href="a00156.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A 2-dimensional range that models the Range concept. <a href="a00148.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00149.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A high-performance thread-safe non-blocking concurrent queue. <a href="a00160.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A 3-dimensional range that models the Range concept. <a href="a00149.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><a class="el" href="a00181.html">tbb::pre_scan_tag</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A high-performance thread-safe blocking concurrent bounded queue. <a href="a00155.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html">tbb::deprecated::concurrent_queue< T, A ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to indicate that the initial scan is being performed. <a href="a00181.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><a class="el" href="a00166.html">tbb::final_scan_tag</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A high-performance thread-safe blocking concurrent bounded queue. <a href="a00161.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to indicate that the final scan is being performed. <a href="a00166.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00179.html">tbb::parallel_while< Body ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Concurrent vector container. <a href="a00162.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over a stream, with optional addition of more work. <a href="a00179.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00193.html">tbb::simple_partitioner</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The <a class="el" href="a00164.html">enumerable_thread_specific</a> container. <a href="a00164.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A simple partitioner. <a href="a00193.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00145.html">tbb::auto_partitioner</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">An auto partitioner. <a href="a00145.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00164.html">tbb::filter</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A stage in a pipeline. <a href="a00164.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00209.html">tbb::thread_bound_filter</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A stage in a pipeline served by a user thread. <a href="a00209.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00180.html">tbb::pipeline</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A processing pipeline that applies filters to items. <a href="a00180.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00198.html">tbb::split</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Dummy type that distinguishes splitting constructor from copy constructor. <a href="a00198.html#_details">More...</a><br></td></tr>
+<tr><td colspan="2"><br><h2>parallel_do</h2></td></tr>
+<tr><td colspan="2">See also requirements on <a class="el" href="parallel_do_body_req.html">parallel_do Body</a>. <br><br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g3383e2703977012b6f384d673410f1f7"></a><!-- doxytag: member="algorithms::parallel_do" ref="g3383e2703977012b6f384d673410f1f7" args="(Iterator first, Iterator last, const Body &body)" -->
+template<typename Iterator, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#g3383e2703977012b6f384d673410f1f7">tbb::parallel_do</a> (Iterator first, Iterator last, const Body &body)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over a range, with optional addition of more work. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g2617dc9b88b3285a7212599d49f74228"></a><!-- doxytag: member="algorithms::parallel_do" ref="g2617dc9b88b3285a7212599d49f74228" args="(Iterator first, Iterator last, const Body &body, task_group_context &context)" -->
+template<typename Iterator, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#g2617dc9b88b3285a7212599d49f74228">tbb::parallel_do</a> (Iterator first, Iterator last, const Body &body, task_group_context &context)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over a range, with optional addition of more work and user-supplied context. <br></td></tr>
+<tr><td colspan="2"><br><h2>parallel_for</h2></td></tr>
+<tr><td colspan="2">See also requirements on <a class="el" href="range_req.html">Range</a> and <a class="el" href="parallel_for_body_req.html">parallel_for Body</a>. <br><br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g68cc046ef72c42ce205fccbc435a0d81"></a><!-- doxytag: member="algorithms::parallel_for" ref="g68cc046ef72c42ce205fccbc435a0d81" args="(const Range &range, const Body &body)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#g68cc046ef72c42ce205fccbc435a0d81">tbb::parallel_for</a> (const Range &range, const Body &body)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with default partitioner. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g13cac5dd55c7533bccea43a51c33d0e5"></a><!-- doxytag: member="algorithms::parallel_for" ref="g13cac5dd55c7533bccea43a51c33d0e5" args="(const Range &range, const Body &body, const simple_partitioner &partitioner)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#g13cac5dd55c7533bccea43a51c33d0e5">tbb::parallel_for</a> (const Range &range, const Body &body, const simple_partitioner &partitioner)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with simple partitioner. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="ga7ac75d532389b55b9247f3fdb0b00d1"></a><!-- doxytag: member="algorithms::parallel_for" ref="ga7ac75d532389b55b9247f3fdb0b00d1" args="(const Range &range, const Body &body, const auto_partitioner &partitioner)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#ga7ac75d532389b55b9247f3fdb0b00d1">tbb::parallel_for</a> (const Range &range, const Body &body, const auto_partitioner &partitioner)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00145.html">auto_partitioner</a>. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g9cd1b210ceb1c040f30e390b4a21bde8"></a><!-- doxytag: member="algorithms::parallel_for" ref="g9cd1b210ceb1c040f30e390b4a21bde8" args="(const Range &range, const Body &body, affinity_partitioner &partitioner)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#g9cd1b210ceb1c040f30e390b4a21bde8">tbb::parallel_for</a> (const Range &range, const Body &body, affinity_partitioner &partitioner)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00140.html">affinity_partitioner</a>. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g2d317a5e0078cd193125439fed60dfdc"></a><!-- doxytag: member="algorithms::parallel_for" ref="g2d317a5e0078cd193125439fed60dfdc" args="(const Range &range, const Body &body, const simple_partitioner &partitioner, task_group_context &context)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#g2d317a5e0078cd193125439fed60dfdc">tbb::parallel_for</a> (const Range &range, const Body &body, const simple_partitioner &partitioner, task_group_context &context)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with simple partitioner and user-supplied context. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1c0700e3f85e83a788ff3ede88ebb7e9"></a><!-- doxytag: member="algorithms::parallel_for" ref="g1c0700e3f85e83a788ff3ede88ebb7e9" args="(const Range &range, const Body &body, const auto_partitioner &partitioner, task_group_context &context)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#g1c0700e3f85e83a788ff3ede88ebb7e9">tbb::parallel_for</a> (const Range &range, const Body &body, const auto_partitioner &partitioner, task_group_context &context)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00145.html">auto_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g04b4696b67370c01353ff5974c8f1196"></a><!-- doxytag: member="algorithms::parallel_for" ref="g04b4696b67370c01353ff5974c8f1196" args="(const Range &range, const Body &body, affinity_partitioner &partitioner, task_group_context &context)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#g04b4696b67370c01353ff5974c8f1196">tbb::parallel_for</a> (const Range &range, const Body &body, affinity_partitioner &partitioner, task_group_context &context)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00140.html">affinity_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td colspan="2"><br><h2>parallel_for_each</h2></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gcd40c32f319747e61a8f73fcfc452001"></a><!-- doxytag: member="algorithms::parallel_for_each" ref="gcd40c32f319747e61a8f73fcfc452001" args="(InputIterator first, InputIterator last, const Function &f, task_group_context &context)" -->
+template<typename InputIterator, typename Function> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#gcd40c32f319747e61a8f73fcfc452001">tbb::parallel_for_each</a> (InputIterator first, InputIterator last, const Function &f, task_group_context &context)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Calls function f for all items from [first, last) interval using user-supplied context. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc2d710ca573f0a9bd94379cba3772def"></a><!-- doxytag: member="algorithms::parallel_for_each" ref="gc2d710ca573f0a9bd94379cba3772def" args="(InputIterator first, InputIterator last, const Function &f)" -->
+template<typename InputIterator, typename Function> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#gc2d710ca573f0a9bd94379cba3772def">tbb::parallel_for_each</a> (InputIterator first, InputIterator last, const Function &f)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Uses default context. <br></td></tr>
+<tr><td colspan="2"><br><h2>parallel_invoke</h2></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gd3e2998f171494f94c2103f4eb924084"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="gd3e2998f171494f94c2103f4eb924084" args="(const F0 &f0, const F1 &f1, tbb::task_group_context &context)" -->
+template<typename F0, typename F1> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#gd3e2998f171494f94c2103f4eb924084">tbb::parallel_invoke</a> (const F0 &f0, const F1 &f1, <a class="el" href="a00201.html">tbb::task_group_context</a> &context)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Executes a list of tasks in parallel and waits for all tasks to complete. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g4eb73562e4145c8343ed9f996267f039"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g4eb73562e4145c8343ed9f996267f039" args="(const F0 &f0, const F1 &f1, const F2 &f2, tbb::task_group_context &context)" -->
+template<typename F0, typename F1, typename F2> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, <a class="el" href="a00201.html">tbb::task_group_context</a> &context)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gd1335c4b54fbf8d3f5be6a5c255c8c60"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="gd1335c4b54fbf8d3f5be6a5c255c8c60" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, tbb::task_group_context &context)" -->
+template<typename F0, typename F1, typename F2, typename F3> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, <a class="el" href="a00201.html">tbb::task_group_context</a> &context)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g40b88e3db7ecb09cbfe0230ea1c24030"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g40b88e3db7ecb09cbfe0230ea1c24030" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, tbb::task_group_context &context)" -->
+template<typename F0, typename F1, typename F2, typename F3, typename F4> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, <a class="el" href="a00201.html">tbb::task_group_context</a> &context)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g98a8b388f7e0b7621a964a8c23752d1d"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g98a8b388f7e0b7621a964a8c23752d1d" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, tbb::task_group_context &context)" -->
+template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, <a class="el" href="a00201.html">tbb::task_group_context</a> &context)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gb95f31638bdde9d909361ad2e96a93eb"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="gb95f31638bdde9d909361ad2e96a93eb" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, tbb::task_group_context &context)" -->
+template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, <a class="el" href="a00201.html">tbb::task_group_context</a> &context)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1655b24786f010ee0a008907a07bb61d"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g1655b24786f010ee0a008907a07bb61d" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, tbb::task_group_context &context)" -->
+template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, <a class="el" href="a00201.html">tbb::task_group_context</a> &context)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g105220f1c95f9888b696a3e47027527b"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g105220f1c95f9888b696a3e47027527b" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, tbb::task_group_context &context)" -->
+template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, <a class="el" href="a00201.html">tbb::task_group_context</a> &context)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1ef1774e0fcc4f632fe0af2591781c4c"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g1ef1774e0fcc4f632fe0af2591781c4c" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, const F9 &f9, tbb::task_group_context &context)" -->
+template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8, typename F9> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, const F9 &f9, <a class="el" href="a00201.html">tbb::task_group_context</a> &context)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="ge832d8ad8b246c884e3c897ed63f8216"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="ge832d8ad8b246c884e3c897ed63f8216" args="(const F0 &f0, const F1 &f1)" -->
+template<typename F0, typename F1> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gb91fec4e7ba49754ad583ccb127afc66"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="gb91fec4e7ba49754ad583ccb127afc66" args="(const F0 &f0, const F1 &f1, const F2 &f2)" -->
+template<typename F0, typename F1, typename F2> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g421d0f66ee69eea134a35d1ae371d8d6"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g421d0f66ee69eea134a35d1ae371d8d6" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3)" -->
+template<typename F0, typename F1, typename F2, typename F3> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g8aacce74d691b4f44a0f7becadd9578c"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g8aacce74d691b4f44a0f7becadd9578c" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4)" -->
+template<typename F0, typename F1, typename F2, typename F3, typename F4> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g8cc6994f7cd6eaf25feb5d7cc04a2e64"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g8cc6994f7cd6eaf25feb5d7cc04a2e64" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5)" -->
+template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g995ba9583ae24bddb8bd9a599cc8b4c7"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g995ba9583ae24bddb8bd9a599cc8b4c7" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6)" -->
+template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g34341a4c24c6f548886cd14077374c5c"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g34341a4c24c6f548886cd14077374c5c" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7)" -->
+template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g2a11342753488d460866d48370a69517"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g2a11342753488d460866d48370a69517" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8)" -->
+template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gffcf6835ceee43455f310352a3b4faa5"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="gffcf6835ceee43455f310352a3b4faa5" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, const F9 &f9)" -->
+template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8, typename F9> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, const F9 &f9)</td></tr>
+
+<tr><td colspan="2"><br><h2>parallel_reduce</h2></td></tr>
+<tr><td colspan="2">See also requirements on <a class="el" href="range_req.html">Range</a> and <a class="el" href="parallel_reduce_body_req.html">parallel_reduce Body</a>. <br><br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1b3d59c5eb62683c5754db6970392fa3"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="g1b3d59c5eb62683c5754db6970392fa3" args="(const Range &range, Body &body)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#g1b3d59c5eb62683c5754db6970392fa3">tbb::parallel_reduce</a> (const Range &range, Body &body)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and default partitioner. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gec1b7c03f9da909bef5db12e3d41bed3"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="gec1b7c03f9da909bef5db12e3d41bed3" args="(const Range &range, Body &body, const simple_partitioner &partitioner)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#gec1b7c03f9da909bef5db12e3d41bed3">tbb::parallel_reduce</a> (const Range &range, Body &body, const simple_partitioner &partitioner)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00193.html">simple_partitioner</a>. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g18a19157e6245992fc00ca0adeb7dd37"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="g18a19157e6245992fc00ca0adeb7dd37" args="(const Range &range, Body &body, const auto_partitioner &partitioner)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#g18a19157e6245992fc00ca0adeb7dd37">tbb::parallel_reduce</a> (const Range &range, Body &body, const auto_partitioner &partitioner)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00145.html">auto_partitioner</a>. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc61e73fcc36c92d79a217fc355ff4a6b"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="gc61e73fcc36c92d79a217fc355ff4a6b" args="(const Range &range, Body &body, affinity_partitioner &partitioner)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#gc61e73fcc36c92d79a217fc355ff4a6b">tbb::parallel_reduce</a> (const Range &range, Body &body, affinity_partitioner &partitioner)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00140.html">affinity_partitioner</a>. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g45cb00c42a18e334bbde8b7535afe460"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="g45cb00c42a18e334bbde8b7535afe460" args="(const Range &range, Body &body, const simple_partitioner &partitioner, task_group_context &context)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#g45cb00c42a18e334bbde8b7535afe460">tbb::parallel_reduce</a> (const Range &range, Body &body, const simple_partitioner &partitioner, task_group_context &context)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, simple partitioner and user-supplied context. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1c1ea1d7c61b3c225e92c70d669a53a5"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="g1c1ea1d7c61b3c225e92c70d669a53a5" args="(const Range &range, Body &body, const auto_partitioner &partitioner, task_group_context &context)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#g1c1ea1d7c61b3c225e92c70d669a53a5">tbb::parallel_reduce</a> (const Range &range, Body &body, const auto_partitioner &partitioner, task_group_context &context)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00145.html">auto_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gd9ac3a3811060314695f33b703c6e11b"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="gd9ac3a3811060314695f33b703c6e11b" args="(const Range &range, Body &body, affinity_partitioner &partitioner, task_group_context &context)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#gd9ac3a3811060314695f33b703c6e11b">tbb::parallel_reduce</a> (const Range &range, Body &body, affinity_partitioner &partitioner, task_group_context &context)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00140.html">affinity_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc9412e09fb01fcad8c018ea9cffb28ef"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="gc9412e09fb01fcad8c018ea9cffb28ef" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction)" -->
+template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#gc9412e09fb01fcad8c018ea9cffb28ef">tbb::parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and default partitioner. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gaddffeec0e892ac3d6fc7fc2053e1eca"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="gaddffeec0e892ac3d6fc7fc2053e1eca" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const simple_partitioner &partitioner)" -->
+template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#gaddffeec0e892ac3d6fc7fc2053e1eca">tbb::parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const simple_partitioner &partitioner)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00193.html">simple_partitioner</a>. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gb175401f0729e40dd2c5860a17c14385"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="gb175401f0729e40dd2c5860a17c14385" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const auto_partitioner &partitioner)" -->
+template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#gb175401f0729e40dd2c5860a17c14385">tbb::parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const auto_partitioner &partitioner)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00145.html">auto_partitioner</a>. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gb7f1f1828ae2b330ce05b8513a495154"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="gb7f1f1828ae2b330ce05b8513a495154" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, affinity_partitioner &partitioner)" -->
+template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#gb7f1f1828ae2b330ce05b8513a495154">tbb::parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, affinity_partitioner &partitioner)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00140.html">affinity_partitioner</a>. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gfbc0cc2026d87f11a96bcd62788f5bb5"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="gfbc0cc2026d87f11a96bcd62788f5bb5" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const simple_partitioner &partitioner, task_group_context &context)" -->
+template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#gfbc0cc2026d87f11a96bcd62788f5bb5">tbb::parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const simple_partitioner &partitioner, task_group_context &context)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, simple partitioner and user-supplied context. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g630c90a399937d9d4ae70ff883186dfd"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="g630c90a399937d9d4ae70ff883186dfd" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const auto_partitioner &partitioner, task_group_context &context)" -->
+template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#g630c90a399937d9d4ae70ff883186dfd">tbb::parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const auto_partitioner &partitioner, task_group_context &context)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00145.html">auto_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g496bd7eadb3b97495ccb5655ef90319e"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="g496bd7eadb3b97495ccb5655ef90319e" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, affinity_partitioner &partitioner, task_group_context &context)" -->
+template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#g496bd7eadb3b97495ccb5655ef90319e">tbb::parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, affinity_partitioner &partitioner, task_group_context &context)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00140.html">affinity_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td colspan="2"><br><h2>parallel_scan</h2></td></tr>
+<tr><td colspan="2">See also requirements on <a class="el" href="range_req.html">Range</a> and <a class="el" href="parallel_scan_body_req.html">parallel_scan Body</a>. <br><br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="ged143f31dd3d96ded02ab3db915b91c7"></a><!-- doxytag: member="algorithms::parallel_scan" ref="ged143f31dd3d96ded02ab3db915b91c7" args="(const Range &range, Body &body)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#ged143f31dd3d96ded02ab3db915b91c7">tbb::parallel_scan</a> (const Range &range, Body &body)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel prefix with default partitioner. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc9fac8870b2e6365fb337014404529df"></a><!-- doxytag: member="algorithms::parallel_scan" ref="gc9fac8870b2e6365fb337014404529df" args="(const Range &range, Body &body, const simple_partitioner &partitioner)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#gc9fac8870b2e6365fb337014404529df">tbb::parallel_scan</a> (const Range &range, Body &body, const simple_partitioner &partitioner)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel prefix with <a class="el" href="a00193.html">simple_partitioner</a>. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g62fde400a37bbca1a2fddc8e3d22f556"></a><!-- doxytag: member="algorithms::parallel_scan" ref="g62fde400a37bbca1a2fddc8e3d22f556" args="(const Range &range, Body &body, const auto_partitioner &partitioner)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#g62fde400a37bbca1a2fddc8e3d22f556">tbb::parallel_scan</a> (const Range &range, Body &body, const auto_partitioner &partitioner)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel prefix with <a class="el" href="a00145.html">auto_partitioner</a>. <br></td></tr>
+<tr><td colspan="2"><br><h2>parallel_sort</h2></td></tr>
+<tr><td colspan="2">See also requirements on <a class="el" href="parallel_sort_iter_req.html">iterators for parallel_sort</a>. <br><br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2">template<typename RandomAccessIterator, typename Compare> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#g49edcf9447cd91a9527a3f8e8512b7aa">tbb::parallel_sort</a> (RandomAccessIterator begin, RandomAccessIterator end, const Compare &comp)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Sorts the data in [begin,end) using the given comparator. <a href="#g49edcf9447cd91a9527a3f8e8512b7aa"></a><br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g16c3eb77d0e530834c51ce3857f01012"></a><!-- doxytag: member="algorithms::parallel_sort" ref="g16c3eb77d0e530834c51ce3857f01012" args="(RandomAccessIterator begin, RandomAccessIterator end)" -->
+template<typename RandomAccessIterator> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#g16c3eb77d0e530834c51ce3857f01012">tbb::parallel_sort</a> (RandomAccessIterator begin, RandomAccessIterator end)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Sorts the data in [begin,end) with a default comparator <code>std::less<RandomAccessIterator></code>. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc7576f82fdedc8a701a6c17ad9415926"></a><!-- doxytag: member="algorithms::parallel_sort" ref="gc7576f82fdedc8a701a6c17ad9415926" args="(T *begin, T *end)" -->
+template<typename T> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00275.html#gc7576f82fdedc8a701a6c17ad9415926">tbb::parallel_sort</a> (T *begin, T *end)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Sorts the data in the range <code></code>[begin,end) with a default comparator <code>std::less<T></code>. <br></td></tr>
</table>
+<hr><h2>Function Documentation</h2>
+<a class="anchor" name="g49edcf9447cd91a9527a3f8e8512b7aa"></a><!-- doxytag: member="tbb::parallel_sort" ref="g49edcf9447cd91a9527a3f8e8512b7aa" args="(RandomAccessIterator begin, RandomAccessIterator end, const Compare &comp)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename RandomAccessIterator, typename Compare> </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void tbb::parallel_sort </td>
+ <td>(</td>
+ <td class="paramtype">RandomAccessIterator </td>
+ <td class="paramname"> <em>begin</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">RandomAccessIterator </td>
+ <td class="paramname"> <em>end</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const Compare & </td>
+ <td class="paramname"> <em>comp</em></td><td> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td width="100%"></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+Sorts the data in [begin,end) using the given comparator.
+<p>
+The compare function object is used for all comparisons between elements during sorting. The compare object must define a bool operator() function.
+</div>
+</div><p>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00276.html b/doc/html/a00276.html
index 5fd0b2d..b07b762 100644
--- a/doc/html/a00276.html
+++ b/doc/html/a00276.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Memory Allocation</title>
+<title>Containers</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -14,294 +14,31 @@
<li><a href="files.html"><span>Files</span></a></li>
<li><a href="pages.html"><span>Related Pages</span></a></li>
</ul></div>
-<h1>Memory Allocation</h1><table border="0" cellpadding="0" cellspacing="0">
+<h1>Containers</h1><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00142.html">tbb::aligned_space< T, N ></a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00153.html">tbb::combinable< T ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Block of space aligned sufficiently to construct an array T with N elements. <a href="a00142.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00151.html">tbb::cache_aligned_allocator< T ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Thread-local storage with optional reduction. <a href="a00153.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. <a href="a00151.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00152.html">tbb::cache_aligned_allocator< void ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Unordered map from Key to T. <a href="a00155.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00159.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. <a href="a00152.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00191.html">tbb::scalable_allocator< T ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A high-performance thread-safe non-blocking concurrent queue. <a href="a00159.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. <a href="a00191.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00192.html">tbb::scalable_allocator< void ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A high-performance thread-safe blocking concurrent bounded queue. <a href="a00154.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00160.html">tbb::deprecated::concurrent_queue< T, A ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. <a href="a00192.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00204.html">tbb::tbb_allocator< T ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A high-performance thread-safe blocking concurrent bounded queue. <a href="a00160.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. <a href="a00204.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00205.html">tbb::tbb_allocator< void ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. <a href="a00205.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00213.html">tbb::zero_allocator< T, Allocator ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. <a href="a00213.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00214.html">tbb::zero_allocator< void, Allocator ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. <a href="a00214.html#_details">More...</a><br></td></tr>
-<tr><td colspan="2"><br><h2>Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_malloc</a> (size_t size)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#gca3579c21244dba9f0c351e5984d4565">scalable_free</a> (void *ptr)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#g951bbbbd2d041acb59ba5fa910b52543">scalable_realloc</a> (void *ptr, size_t size)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#g3f5a2fde0bcaa3eda35be32c8658f444">scalable_calloc</a> (size_t nobj, size_t size)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">int __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#g05dcec987480bb2c82ecdead6a085899">scalable_posix_memalign</a> (void **memptr, size_t alignment, size_t size)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#gc1c7aaa1fe85c17ba5a3a96f7e8d89e7">scalable_aligned_malloc</a> (size_t size, size_t alignment)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#gbaea91376be80dfabd7c93eaffd9abaa">scalable_aligned_realloc</a> (void *ptr, size_t size, size_t alignment)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#g65a20e812012f15ec7442d5b45d0cba5">scalable_aligned_free</a> (void *ptr)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">size_t __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_msize</a> (void *ptr)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Concurrent vector container. <a href="a00161.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The <a class="el" href="a00163.html">enumerable_thread_specific</a> container. <a href="a00163.html#_details">More...</a><br></td></tr>
</table>
-<hr><h2>Function Documentation</h2>
-<a class="anchor" name="g65a20e812012f15ec7442d5b45d0cba5"></a><!-- doxytag: member="scalable_allocator.h::scalable_aligned_free" ref="g65a20e812012f15ec7442d5b45d0cba5" args="(void *ptr)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void __TBB_EXPORTED_FUNC scalable_aligned_free </td>
- <td>(</td>
- <td class="paramtype">void * </td>
- <td class="paramname"> <em>ptr</em> </td>
- <td> ) </td>
- <td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-The "_aligned_free" analogue.
-</div>
-</div><p>
-<a class="anchor" name="gc1c7aaa1fe85c17ba5a3a96f7e8d89e7"></a><!-- doxytag: member="scalable_allocator.h::scalable_aligned_malloc" ref="gc1c7aaa1fe85c17ba5a3a96f7e8d89e7" args="(size_t size, size_t alignment)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void* __TBB_EXPORTED_FUNC scalable_aligned_malloc </td>
- <td>(</td>
- <td class="paramtype">size_t </td>
- <td class="paramname"> <em>size</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">size_t </td>
- <td class="paramname"> <em>alignment</em></td><td> </td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-The "_aligned_malloc" analogue.
-</div>
-</div><p>
-<a class="anchor" name="gbaea91376be80dfabd7c93eaffd9abaa"></a><!-- doxytag: member="scalable_allocator.h::scalable_aligned_realloc" ref="gbaea91376be80dfabd7c93eaffd9abaa" args="(void *ptr, size_t size, size_t alignment)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void* __TBB_EXPORTED_FUNC scalable_aligned_realloc </td>
- <td>(</td>
- <td class="paramtype">void * </td>
- <td class="paramname"> <em>ptr</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">size_t </td>
- <td class="paramname"> <em>size</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">size_t </td>
- <td class="paramname"> <em>alignment</em></td><td> </td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-The "_aligned_realloc" analogue.
-</div>
-</div><p>
-<a class="anchor" name="g3f5a2fde0bcaa3eda35be32c8658f444"></a><!-- doxytag: member="scalable_allocator.h::scalable_calloc" ref="g3f5a2fde0bcaa3eda35be32c8658f444" args="(size_t nobj, size_t size)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void* __TBB_EXPORTED_FUNC scalable_calloc </td>
- <td>(</td>
- <td class="paramtype">size_t </td>
- <td class="paramname"> <em>nobj</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">size_t </td>
- <td class="paramname"> <em>size</em></td><td> </td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-The "calloc" analogue complementing scalable_malloc.
-</div>
-</div><p>
-<a class="anchor" name="gca3579c21244dba9f0c351e5984d4565"></a><!-- doxytag: member="scalable_allocator.h::scalable_free" ref="gca3579c21244dba9f0c351e5984d4565" args="(void *ptr)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void __TBB_EXPORTED_FUNC scalable_free </td>
- <td>(</td>
- <td class="paramtype">void * </td>
- <td class="paramname"> <em>ptr</em> </td>
- <td> ) </td>
- <td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-The "free" analogue to discard a previously allocated piece of memory.
-</div>
-</div><p>
-<a class="anchor" name="gc25b8e6c76db0b346a8249796a7a2475"></a><!-- doxytag: member="scalable_allocator.h::scalable_malloc" ref="gc25b8e6c76db0b346a8249796a7a2475" args="(size_t size)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void* __TBB_EXPORTED_FUNC scalable_malloc </td>
- <td>(</td>
- <td class="paramtype">size_t </td>
- <td class="paramname"> <em>size</em> </td>
- <td> ) </td>
- <td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-The "malloc" analogue to allocate block of memory of size bytes.
-</div>
-</div><p>
-<a class="anchor" name="g0965ce1b4b7835f92869c7fd867265f7"></a><!-- doxytag: member="scalable_allocator.h::scalable_msize" ref="g0965ce1b4b7835f92869c7fd867265f7" args="(void *ptr)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">size_t __TBB_EXPORTED_FUNC scalable_msize </td>
- <td>(</td>
- <td class="paramtype">void * </td>
- <td class="paramname"> <em>ptr</em> </td>
- <td> ) </td>
- <td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-The analogue of _msize/malloc_size/malloc_usable_size. Returns the usable size of a memory block previously allocated by scalable_*, or 0 (zero) if ptr does not point to such a block.
-</div>
-</div><p>
-<a class="anchor" name="g05dcec987480bb2c82ecdead6a085899"></a><!-- doxytag: member="scalable_allocator.h::scalable_posix_memalign" ref="g05dcec987480bb2c82ecdead6a085899" args="(void **memptr, size_t alignment, size_t size)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">int __TBB_EXPORTED_FUNC scalable_posix_memalign </td>
- <td>(</td>
- <td class="paramtype">void ** </td>
- <td class="paramname"> <em>memptr</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">size_t </td>
- <td class="paramname"> <em>alignment</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">size_t </td>
- <td class="paramname"> <em>size</em></td><td> </td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-The "posix_memalign" analogue.
-</div>
-</div><p>
-<a class="anchor" name="g951bbbbd2d041acb59ba5fa910b52543"></a><!-- doxytag: member="scalable_allocator.h::scalable_realloc" ref="g951bbbbd2d041acb59ba5fa910b52543" args="(void *ptr, size_t size)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void* __TBB_EXPORTED_FUNC scalable_realloc </td>
- <td>(</td>
- <td class="paramtype">void * </td>
- <td class="paramname"> <em>ptr</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">size_t </td>
- <td class="paramname"> <em>size</em></td><td> </td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-The "realloc" analogue complementing scalable_malloc.
-</div>
-</div><p>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00277.html b/doc/html/a00277.html
index bc43e52..ccf8013 100644
--- a/doc/html/a00277.html
+++ b/doc/html/a00277.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Synchronization</title>
+<title>Memory Allocation</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -14,40 +14,294 @@
<li><a href="files.html"><span>Files</span></a></li>
<li><a href="pages.html"><span>Related Pages</span></a></li>
</ul></div>
-<h1>Synchronization</h1><table border="0" cellpadding="0" cellspacing="0">
+<h1>Memory Allocation</h1><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><a class="el" href="a00143.html">tbb::atomic< T ></a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00141.html">tbb::aligned_space< T, N ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Primary template for atomic. <a href="a00143.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00172.html">tbb::mutex</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Block of space aligned sufficiently to construct an array T with N elements. <a href="a00141.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00150.html">tbb::cache_aligned_allocator< T ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Wrapper around the platform's native reader-writer lock. <a href="a00172.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00174.html">tbb::null_mutex</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. <a href="a00150.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00151.html">tbb::cache_aligned_allocator< void ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A mutex which does nothing. <a href="a00174.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00176.html">tbb::null_rw_mutex</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. <a href="a00151.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00191.html">tbb::scalable_allocator< T ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A rw mutex which does nothing. <a href="a00176.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00182.html">tbb::queuing_mutex</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. <a href="a00191.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00192.html">tbb::scalable_allocator< void ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Queuing lock with local-only spinning. <a href="a00182.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00184.html">tbb::queuing_rw_mutex</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. <a href="a00192.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00204.html">tbb::tbb_allocator< T ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Reader-writer lock with local-only spinning. <a href="a00184.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00186.html">tbb::interface5::reader_writer_lock</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. <a href="a00204.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00205.html">tbb::tbb_allocator< void ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Writer-preference reader-writer lock with local-only spinning on readers. <a href="a00186.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00189.html">tbb::recursive_mutex</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. <a href="a00205.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00213.html">tbb::zero_allocator< T, Allocator ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Mutex that allows recursive mutex acquisition. <a href="a00189.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00194.html">tbb::spin_mutex</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. <a href="a00213.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00214.html">tbb::zero_allocator< void, Allocator ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A lock that occupies a single byte. <a href="a00194.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00196.html">tbb::spin_rw_mutex_v3</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. <a href="a00214.html#_details">More...</a><br></td></tr>
+<tr><td colspan="2"><br><h2>Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00277.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_malloc</a> (size_t size)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00277.html#gca3579c21244dba9f0c351e5984d4565">scalable_free</a> (void *ptr)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00277.html#g951bbbbd2d041acb59ba5fa910b52543">scalable_realloc</a> (void *ptr, size_t size)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00277.html#g3f5a2fde0bcaa3eda35be32c8658f444">scalable_calloc</a> (size_t nobj, size_t size)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">int __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00277.html#g05dcec987480bb2c82ecdead6a085899">scalable_posix_memalign</a> (void **memptr, size_t alignment, size_t size)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00277.html#gc1c7aaa1fe85c17ba5a3a96f7e8d89e7">scalable_aligned_malloc</a> (size_t size, size_t alignment)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00277.html#gbaea91376be80dfabd7c93eaffd9abaa">scalable_aligned_realloc</a> (void *ptr, size_t size, size_t alignment)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00277.html#g65a20e812012f15ec7442d5b45d0cba5">scalable_aligned_free</a> (void *ptr)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">size_t __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00277.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_msize</a> (void *ptr)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Fast, unfair, spinning reader-writer lock with backoff and writer-preference. <a href="a00196.html#_details">More...</a><br></td></tr>
</table>
+<hr><h2>Function Documentation</h2>
+<a class="anchor" name="g65a20e812012f15ec7442d5b45d0cba5"></a><!-- doxytag: member="scalable_allocator.h::scalable_aligned_free" ref="g65a20e812012f15ec7442d5b45d0cba5" args="(void *ptr)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void __TBB_EXPORTED_FUNC scalable_aligned_free </td>
+ <td>(</td>
+ <td class="paramtype">void * </td>
+ <td class="paramname"> <em>ptr</em> </td>
+ <td> ) </td>
+ <td width="100%"></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+The "_aligned_free" analogue.
+</div>
+</div><p>
+<a class="anchor" name="gc1c7aaa1fe85c17ba5a3a96f7e8d89e7"></a><!-- doxytag: member="scalable_allocator.h::scalable_aligned_malloc" ref="gc1c7aaa1fe85c17ba5a3a96f7e8d89e7" args="(size_t size, size_t alignment)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void* __TBB_EXPORTED_FUNC scalable_aligned_malloc </td>
+ <td>(</td>
+ <td class="paramtype">size_t </td>
+ <td class="paramname"> <em>size</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t </td>
+ <td class="paramname"> <em>alignment</em></td><td> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td width="100%"></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+The "_aligned_malloc" analogue.
+</div>
+</div><p>
+<a class="anchor" name="gbaea91376be80dfabd7c93eaffd9abaa"></a><!-- doxytag: member="scalable_allocator.h::scalable_aligned_realloc" ref="gbaea91376be80dfabd7c93eaffd9abaa" args="(void *ptr, size_t size, size_t alignment)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void* __TBB_EXPORTED_FUNC scalable_aligned_realloc </td>
+ <td>(</td>
+ <td class="paramtype">void * </td>
+ <td class="paramname"> <em>ptr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t </td>
+ <td class="paramname"> <em>size</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t </td>
+ <td class="paramname"> <em>alignment</em></td><td> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td width="100%"></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+The "_aligned_realloc" analogue.
+</div>
+</div><p>
+<a class="anchor" name="g3f5a2fde0bcaa3eda35be32c8658f444"></a><!-- doxytag: member="scalable_allocator.h::scalable_calloc" ref="g3f5a2fde0bcaa3eda35be32c8658f444" args="(size_t nobj, size_t size)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void* __TBB_EXPORTED_FUNC scalable_calloc </td>
+ <td>(</td>
+ <td class="paramtype">size_t </td>
+ <td class="paramname"> <em>nobj</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t </td>
+ <td class="paramname"> <em>size</em></td><td> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td width="100%"></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+The "calloc" analogue complementing scalable_malloc.
+</div>
+</div><p>
+<a class="anchor" name="gca3579c21244dba9f0c351e5984d4565"></a><!-- doxytag: member="scalable_allocator.h::scalable_free" ref="gca3579c21244dba9f0c351e5984d4565" args="(void *ptr)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void __TBB_EXPORTED_FUNC scalable_free </td>
+ <td>(</td>
+ <td class="paramtype">void * </td>
+ <td class="paramname"> <em>ptr</em> </td>
+ <td> ) </td>
+ <td width="100%"></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+The "free" analogue to discard a previously allocated piece of memory.
+</div>
+</div><p>
+<a class="anchor" name="gc25b8e6c76db0b346a8249796a7a2475"></a><!-- doxytag: member="scalable_allocator.h::scalable_malloc" ref="gc25b8e6c76db0b346a8249796a7a2475" args="(size_t size)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void* __TBB_EXPORTED_FUNC scalable_malloc </td>
+ <td>(</td>
+ <td class="paramtype">size_t </td>
+ <td class="paramname"> <em>size</em> </td>
+ <td> ) </td>
+ <td width="100%"></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+The "malloc" analogue to allocate block of memory of size bytes.
+</div>
+</div><p>
+<a class="anchor" name="g0965ce1b4b7835f92869c7fd867265f7"></a><!-- doxytag: member="scalable_allocator.h::scalable_msize" ref="g0965ce1b4b7835f92869c7fd867265f7" args="(void *ptr)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">size_t __TBB_EXPORTED_FUNC scalable_msize </td>
+ <td>(</td>
+ <td class="paramtype">void * </td>
+ <td class="paramname"> <em>ptr</em> </td>
+ <td> ) </td>
+ <td width="100%"></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+The analogue of _msize/malloc_size/malloc_usable_size. Returns the usable size of a memory block previously allocated by scalable_*, or 0 (zero) if ptr does not point to such a block.
+</div>
+</div><p>
+<a class="anchor" name="g05dcec987480bb2c82ecdead6a085899"></a><!-- doxytag: member="scalable_allocator.h::scalable_posix_memalign" ref="g05dcec987480bb2c82ecdead6a085899" args="(void **memptr, size_t alignment, size_t size)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int __TBB_EXPORTED_FUNC scalable_posix_memalign </td>
+ <td>(</td>
+ <td class="paramtype">void ** </td>
+ <td class="paramname"> <em>memptr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t </td>
+ <td class="paramname"> <em>alignment</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t </td>
+ <td class="paramname"> <em>size</em></td><td> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td width="100%"></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+The "posix_memalign" analogue.
+</div>
+</div><p>
+<a class="anchor" name="g951bbbbd2d041acb59ba5fa910b52543"></a><!-- doxytag: member="scalable_allocator.h::scalable_realloc" ref="g951bbbbd2d041acb59ba5fa910b52543" args="(void *ptr, size_t size)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void* __TBB_EXPORTED_FUNC scalable_realloc </td>
+ <td>(</td>
+ <td class="paramtype">void * </td>
+ <td class="paramname"> <em>ptr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t </td>
+ <td class="paramname"> <em>size</em></td><td> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td width="100%"></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+The "realloc" analogue complementing scalable_malloc.
+</div>
+</div><p>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00278.html b/doc/html/a00278.html
index 5879d12..d292a79 100644
--- a/doc/html/a00278.html
+++ b/doc/html/a00278.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Timing</title>
+<title>Synchronization</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -14,12 +14,39 @@
<li><a href="files.html"><span>Files</span></a></li>
<li><a href="pages.html"><span>Related Pages</span></a></li>
</ul></div>
-<h1>Timing</h1><table border="0" cellpadding="0" cellspacing="0">
+<h1>Synchronization</h1><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00210.html">tbb::tick_count</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><a class="el" href="a00142.html">tbb::atomic< T ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Absolute timestamp. <a href="a00210.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Primary template for atomic. <a href="a00142.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00172.html">tbb::mutex</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Wrapper around the platform's native reader-writer lock. <a href="a00172.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00174.html">tbb::null_mutex</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A mutex which does nothing. <a href="a00174.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00176.html">tbb::null_rw_mutex</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A rw mutex which does nothing. <a href="a00176.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00182.html">tbb::queuing_mutex</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Queuing lock with local-only spinning. <a href="a00182.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00184.html">tbb::queuing_rw_mutex</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Reader-writer lock with local-only spinning. <a href="a00184.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00186.html">tbb::interface5::reader_writer_lock</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Writer-preference reader-writer lock with local-only spinning on readers. <a href="a00186.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00189.html">tbb::recursive_mutex</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Mutex that allows recursive mutex acquisition. <a href="a00189.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00194.html">tbb::spin_mutex</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A lock that occupies a single byte. <a href="a00194.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00196.html">tbb::spin_rw_mutex_v3</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Fast, unfair, spinning reader-writer lock with backoff and writer-preference. <a href="a00196.html#_details">More...</a><br></td></tr>
</table>
<hr>
<p></p>
diff --git a/doc/html/a00279.html b/doc/html/a00279.html
index 2fa7494..5879d12 100644
--- a/doc/html/a00279.html
+++ b/doc/html/a00279.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Task Scheduling</title>
+<title>Timing</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -14,24 +14,12 @@
<li><a href="files.html"><span>Files</span></a></li>
<li><a href="pages.html"><span>Related Pages</span></a></li>
</ul></div>
-<h1>Task Scheduling</h1><table border="0" cellpadding="0" cellspacing="0">
+<h1>Timing</h1><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00201.html">tbb::task_group_context</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00210.html">tbb::tick_count</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to form groups of tasks. <a href="a00201.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00199.html">tbb::task</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Base class for user-defined tasks. <a href="a00199.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00163.html">tbb::empty_task</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">task that does nothing. Useful for synchronization. <a href="a00163.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00202.html">tbb::task_list</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A list of children. <a href="a00202.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00203.html">tbb::task_scheduler_init</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Class representing reference to tbb scheduler. <a href="a00203.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Absolute timestamp. <a href="a00210.html#_details">More...</a><br></td></tr>
</table>
<hr>
<p></p>
diff --git a/doc/html/a00280.html b/doc/html/a00280.html
index 94ec695..200ccea 100644
--- a/doc/html/a00280.html
+++ b/doc/html/a00280.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>_concurrent_queue_internal.h Source File</title>
+<title>Task Scheduling</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -11,924 +11,29 @@
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="namespaces.html"><span>Namespaces</span></a></li>
<li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
<li><a href="pages.html"><span>Related Pages</span></a></li>
</ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>_concurrent_queue_internal.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_concurrent_queue_internal_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_concurrent_queue_internal_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "tbb_machine.h"</span>
-<a name="l00026"></a>00026 <span class="preprocessor">#include "atomic.h"</span>
-<a name="l00027"></a>00027 <span class="preprocessor">#include "spin_mutex.h"</span>
-<a name="l00028"></a>00028 <span class="preprocessor">#include "cache_aligned_allocator.h"</span>
-<a name="l00029"></a>00029 <span class="preprocessor">#include "tbb_exception.h"</span>
-<a name="l00030"></a>00030 <span class="preprocessor">#include <new></span>
-<a name="l00031"></a>00031
-<a name="l00032"></a>00032 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
-<a name="l00033"></a>00033 <span class="preprocessor"></span> <span class="comment">// Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers</span>
-<a name="l00034"></a>00034 <span class="preprocessor"> #pragma warning (push)</span>
-<a name="l00035"></a>00035 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4530)</span>
-<a name="l00036"></a>00036 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00037"></a>00037 <span class="preprocessor"></span>
-<a name="l00038"></a>00038 <span class="preprocessor">#include <iterator></span>
-<a name="l00039"></a>00039
-<a name="l00040"></a>00040 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
-<a name="l00041"></a>00041 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
-<a name="l00042"></a>00042 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00043"></a>00043 <span class="preprocessor"></span>
-<a name="l00044"></a>00044
-<a name="l00045"></a><a class="code" href="a00267.html">00045</a> <span class="keyword">namespace </span>tbb {
-<a name="l00046"></a>00046
-<a name="l00047"></a>00047 <span class="preprocessor">#if !__TBB_TEMPLATE_FRIENDS_BROKEN</span>
-<a name="l00048"></a>00048 <span class="preprocessor"></span>
-<a name="l00049"></a>00049 <span class="comment">// forward declaration</span>
-<a name="l00050"></a><a class="code" href="a00273.html">00050</a> <span class="keyword">namespace </span>strict_ppl {
-<a name="l00051"></a>00051 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> A> <span class="keyword">class </span><a class="code" href="a00160.html">concurrent_queue</a>;
-<a name="l00052"></a>00052 }
-<a name="l00053"></a>00053
-<a name="l00054"></a>00054 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> A> <span class="keyword">class </span><a class="code" href="a00155.html">concurrent_bounded_queue</a>;
-<a name="l00055"></a>00055
-<a name="l00056"></a>00056 <span class="keyword">namespace </span>deprecated {
-<a name="l00057"></a>00057 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> A> <span class="keyword">class </span><a class="code" href="a00160.html">concurrent_queue</a>;
-<a name="l00058"></a>00058 }
-<a name="l00059"></a>00059 <span class="preprocessor">#endif</span>
-<a name="l00060"></a>00060 <span class="preprocessor"></span>
-<a name="l00062"></a>00062 <span class="keyword">namespace </span>strict_ppl {
-<a name="l00063"></a>00063
-<a name="l00065"></a>00065 <span class="keyword">namespace </span>internal {
-<a name="l00066"></a>00066
-<a name="l00067"></a>00067 <span class="keyword">using namespace </span>tbb::internal;
-<a name="l00068"></a>00068
-<a name="l00069"></a>00069 <span class="keyword">typedef</span> size_t ticket;
-<a name="l00070"></a>00070
-<a name="l00071"></a>00071 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">class </span>micro_queue ;
-<a name="l00072"></a>00072 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">class </span>micro_queue_pop_finalizer ;
-<a name="l00073"></a>00073 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">class </span>concurrent_queue_base_v3;
-<a name="l00074"></a>00074
-<a name="l00076"></a>00076
-<a name="l00079"></a>00079 <span class="keyword">struct </span>concurrent_queue_rep_base : no_copy {
-<a name="l00080"></a>00080 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">friend</span> <span class="keyword">class </span>micro_queue;
-<a name="l00081"></a>00081 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">friend</span> <span class="keyword">class </span>concurrent_queue_base_v3;
-<a name="l00082"></a>00082
-<a name="l00083"></a>00083 <span class="keyword">protected</span>:
-<a name="l00085"></a>00085 <span class="keyword">static</span> <span class="keyword">const</span> size_t phi = 3;
-<a name="l00086"></a>00086
-<a name="l00087"></a>00087 <span class="keyword">public</span>:
-<a name="l00088"></a>00088 <span class="comment">// must be power of 2</span>
-<a name="l00089"></a>00089 <span class="keyword">static</span> <span class="keyword">const</span> size_t n_queue = 8;
-<a name="l00090"></a>00090
-<a name="l00092"></a>00092 <span class="keyword">struct </span>page {
-<a name="l00093"></a>00093 page* next;
-<a name="l00094"></a>00094 uintptr_t mask;
-<a name="l00095"></a>00095 };
-<a name="l00096"></a>00096
-<a name="l00097"></a>00097 atomic<ticket> head_counter;
-<a name="l00098"></a>00098 <span class="keywordtype">char</span> pad1[NFS_MaxLineSize-<span class="keyword">sizeof</span>(atomic<ticket>)];
-<a name="l00099"></a>00099 atomic<ticket> tail_counter;
-<a name="l00100"></a>00100 <span class="keywordtype">char</span> pad2[NFS_MaxLineSize-<span class="keyword">sizeof</span>(atomic<ticket>)];
-<a name="l00101"></a>00101
-<a name="l00103"></a>00103 size_t items_per_page;
-<a name="l00104"></a>00104
-<a name="l00106"></a>00106 size_t item_size;
-<a name="l00107"></a>00107
-<a name="l00109"></a>00109 atomic<size_t> n_invalid_entries;
-<a name="l00110"></a>00110
-<a name="l00111"></a>00111 <span class="keywordtype">char</span> pad3[NFS_MaxLineSize-<span class="keyword">sizeof</span>(size_t)-<span class="keyword">sizeof</span>(size_t)-<span class="keyword">sizeof</span>(atomic<size_t>)];
-<a name="l00112"></a>00112 } ;
-<a name="l00113"></a>00113
-<a name="l00114"></a>00114 <span class="keyword">inline</span> <span class="keywordtype">bool</span> is_valid_page(<span class="keyword">const</span> concurrent_queue_rep_base::page* p) {
-<a name="l00115"></a>00115 <span class="keywordflow">return</span> uintptr_t(p)>1;
-<a name="l00116"></a>00116 }
-<a name="l00117"></a>00117
-<a name="l00119"></a>00119
-<a name="l00122"></a>00122 <span class="keyword">class </span>concurrent_queue_page_allocator
-<a name="l00123"></a>00123 {
-<a name="l00124"></a>00124 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">friend</span> <span class="keyword">class </span>micro_queue ;
-<a name="l00125"></a>00125 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">friend</span> <span class="keyword">class </span>micro_queue_pop_finalizer ;
-<a name="l00126"></a>00126 <span class="keyword">protected</span>:
-<a name="l00127"></a>00127 <span class="keyword">virtual</span> ~concurrent_queue_page_allocator() {}
-<a name="l00128"></a>00128 <span class="keyword">private</span>:
-<a name="l00129"></a>00129 <span class="keyword">virtual</span> concurrent_queue_rep_base::page* allocate_page() = 0;
-<a name="l00130"></a>00130 <span class="keyword">virtual</span> <span class="keywordtype">void</span> deallocate_page( concurrent_queue_rep_base::page* p ) = 0;
-<a name="l00131"></a>00131 } ;
-<a name="l00132"></a>00132
-<a name="l00133"></a>00133 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
-<a name="l00134"></a>00134 <span class="preprocessor"></span><span class="comment">// unary minus operator applied to unsigned type, result still unsigned</span>
-<a name="l00135"></a>00135 <span class="preprocessor">#pragma warning( push )</span>
-<a name="l00136"></a>00136 <span class="preprocessor"></span><span class="preprocessor">#pragma warning( disable: 4146 )</span>
-<a name="l00137"></a>00137 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00138"></a>00138 <span class="preprocessor"></span>
-<a name="l00140"></a>00140
-<a name="l00142"></a>00142 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00143"></a>00143 <span class="keyword">class </span>micro_queue : no_copy {
-<a name="l00144"></a>00144 <span class="keyword">typedef</span> concurrent_queue_rep_base::page page;
-<a name="l00145"></a>00145
-<a name="l00147"></a>00147 <span class="keyword">class </span>destroyer: no_copy {
-<a name="l00148"></a>00148 T& my_value;
-<a name="l00149"></a>00149 <span class="keyword">public</span>:
-<a name="l00150"></a>00150 destroyer( T& value ) : my_value(value) {}
-<a name="l00151"></a>00151 ~destroyer() {my_value.~T();}
-<a name="l00152"></a>00152 };
-<a name="l00153"></a>00153
-<a name="l00154"></a>00154 <span class="keywordtype">void</span> copy_item( page& dst, size_t index, <span class="keyword">const</span> <span class="keywordtype">void</span>* src ) {
-<a name="l00155"></a>00155 <span class="keyword">new</span>( &get_ref(dst,index) ) T(*static_cast<const T*>(src));
-<a name="l00156"></a>00156 }
-<a name="l00157"></a>00157
-<a name="l00158"></a>00158 <span class="keywordtype">void</span> copy_item( page& dst, size_t dindex, <span class="keyword">const</span> page& src, size_t sindex ) {
-<a name="l00159"></a>00159 <span class="keyword">new</span>( &get_ref(dst,dindex) ) T( get_ref(const_cast<page&>(src),sindex) );
-<a name="l00160"></a>00160 }
-<a name="l00161"></a>00161
-<a name="l00162"></a>00162 <span class="keywordtype">void</span> assign_and_destroy_item( <span class="keywordtype">void</span>* dst, page& src, size_t index ) {
-<a name="l00163"></a>00163 T& from = get_ref(src,index);
-<a name="l00164"></a>00164 destroyer d(from);
-<a name="l00165"></a>00165 *static_cast<T*>(dst) = from;
-<a name="l00166"></a>00166 }
-<a name="l00167"></a>00167
-<a name="l00168"></a>00168 <span class="keywordtype">void</span> spin_wait_until_my_turn( atomic<ticket>& counter, ticket k, concurrent_queue_rep_base& rb ) <span class="keyword">const </span>;
-<a name="l00169"></a>00169
-<a name="l00170"></a>00170 <span class="keyword">public</span>:
-<a name="l00171"></a>00171 <span class="keyword">friend</span> <span class="keyword">class </span>micro_queue_pop_finalizer<T>;
-<a name="l00172"></a>00172
-<a name="l00173"></a>00173 <span class="keyword">struct </span>padded_page: page {
-<a name="l00175"></a>00175 padded_page();
-<a name="l00177"></a>00177 <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> padded_page& );
-<a name="l00179"></a>00179 T last;
-<a name="l00180"></a>00180 };
-<a name="l00181"></a>00181
-<a name="l00182"></a>00182 <span class="keyword">static</span> T& get_ref( page& p, size_t index ) {
-<a name="l00183"></a>00183 <span class="keywordflow">return</span> (&static_cast<padded_page*>(static_cast<void*>(&p))->last)[index];
-<a name="l00184"></a>00184 }
-<a name="l00185"></a>00185
-<a name="l00186"></a>00186 atomic<page*> head_page;
-<a name="l00187"></a>00187 atomic<ticket> head_counter;
-<a name="l00188"></a>00188
-<a name="l00189"></a>00189 atomic<page*> tail_page;
-<a name="l00190"></a>00190 atomic<ticket> tail_counter;
-<a name="l00191"></a>00191
-<a name="l00192"></a>00192 spin_mutex page_mutex;
-<a name="l00193"></a>00193
-<a name="l00194"></a>00194 <span class="keywordtype">void</span> push( <span class="keyword">const</span> <span class="keywordtype">void</span>* item, ticket k, concurrent_queue_base_v3<T>& base ) ;
-<a name="l00195"></a>00195
-<a name="l00196"></a>00196 <span class="keywordtype">bool</span> pop( <span class="keywordtype">void</span>* dst, ticket k, concurrent_queue_base_v3<T>& base ) ;
-<a name="l00197"></a>00197
-<a name="l00198"></a>00198 micro_queue& assign( <span class="keyword">const</span> micro_queue& src, concurrent_queue_base_v3<T>& base ) ;
-<a name="l00199"></a>00199
-<a name="l00200"></a>00200 page* make_copy( concurrent_queue_base_v3<T>& base, <span class="keyword">const</span> page* src_page, size_t begin_in_page, size_t end_in_page, ticket& g_index ) ;
-<a name="l00201"></a>00201
-<a name="l00202"></a>00202 <span class="keywordtype">void</span> invalidate_page_and_rethrow( ticket k ) ;
-<a name="l00203"></a>00203 };
-<a name="l00204"></a>00204
-<a name="l00205"></a>00205 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00206"></a>00206 <span class="keywordtype">void</span> micro_queue<T>::spin_wait_until_my_turn( atomic<ticket>& counter, ticket k, concurrent_queue_rep_base& rb )<span class="keyword"> const </span>{
-<a name="l00207"></a>00207 atomic_backoff backoff;
-<a name="l00208"></a>00208 <span class="keywordflow">do</span> {
-<a name="l00209"></a>00209 backoff.pause();
-<a name="l00210"></a>00210 <span class="keywordflow">if</span>( counter&1 ) {
-<a name="l00211"></a>00211 ++rb.n_invalid_entries;
-<a name="l00212"></a>00212 throw_exception( eid_bad_last_alloc );
-<a name="l00213"></a>00213 }
-<a name="l00214"></a>00214 } <span class="keywordflow">while</span>( counter!=k ) ;
-<a name="l00215"></a>00215 }
-<a name="l00216"></a>00216
-<a name="l00217"></a>00217 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00218"></a>00218 <span class="keywordtype">void</span> micro_queue<T>::push( <span class="keyword">const</span> <span class="keywordtype">void</span>* item, ticket k, concurrent_queue_base_v3<T>& base ) {
-<a name="l00219"></a>00219 k &= -concurrent_queue_rep_base::n_queue;
-<a name="l00220"></a>00220 page* p = NULL;
-<a name="l00221"></a>00221 size_t index = k/concurrent_queue_rep_base::n_queue & (base.my_rep->items_per_page-1);
-<a name="l00222"></a>00222 <span class="keywordflow">if</span>( !index ) {
-<a name="l00223"></a>00223 __TBB_TRY {
-<a name="l00224"></a>00224 concurrent_queue_page_allocator& pa = base;
-<a name="l00225"></a>00225 p = pa.allocate_page();
-<a name="l00226"></a>00226 } __TBB_CATCH (...) {
-<a name="l00227"></a>00227 ++base.my_rep->n_invalid_entries;
-<a name="l00228"></a>00228 invalidate_page_and_rethrow( k );
-<a name="l00229"></a>00229 }
-<a name="l00230"></a>00230 p->mask = 0;
-<a name="l00231"></a>00231 p->next = NULL;
-<a name="l00232"></a>00232 }
-<a name="l00233"></a>00233
-<a name="l00234"></a>00234 <span class="keywordflow">if</span>( tail_counter!=k ) spin_wait_until_my_turn( tail_counter, k, *base.my_rep );
-<a name="l00235"></a>00235
-<a name="l00236"></a>00236 <span class="keywordflow">if</span>( p ) {
-<a name="l00237"></a>00237 spin_mutex::scoped_lock lock( page_mutex );
-<a name="l00238"></a>00238 page* q = tail_page;
-<a name="l00239"></a>00239 <span class="keywordflow">if</span>( is_valid_page(q) )
-<a name="l00240"></a>00240 q->next = p;
-<a name="l00241"></a>00241 <span class="keywordflow">else</span>
-<a name="l00242"></a>00242 head_page = p;
-<a name="l00243"></a>00243 tail_page = p;
-<a name="l00244"></a>00244 } <span class="keywordflow">else</span> {
-<a name="l00245"></a>00245 p = tail_page;
-<a name="l00246"></a>00246 }
-<a name="l00247"></a>00247
-<a name="l00248"></a>00248 __TBB_TRY {
-<a name="l00249"></a>00249 copy_item( *p, index, item );
-<a name="l00250"></a>00250 <span class="comment">// If no exception was thrown, mark item as present.</span>
-<a name="l00251"></a>00251 p->mask |= uintptr_t(1)<<index;
-<a name="l00252"></a>00252 tail_counter += concurrent_queue_rep_base::n_queue;
-<a name="l00253"></a>00253 } __TBB_CATCH (...) {
-<a name="l00254"></a>00254 ++base.my_rep->n_invalid_entries;
-<a name="l00255"></a>00255 tail_counter += concurrent_queue_rep_base::n_queue;
-<a name="l00256"></a>00256 __TBB_RETHROW();
-<a name="l00257"></a>00257 }
-<a name="l00258"></a>00258 }
-<a name="l00259"></a>00259
-<a name="l00260"></a>00260 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00261"></a>00261 <span class="keywordtype">bool</span> micro_queue<T>::pop( <span class="keywordtype">void</span>* dst, ticket k, concurrent_queue_base_v3<T>& base ) {
-<a name="l00262"></a>00262 k &= -concurrent_queue_rep_base::n_queue;
-<a name="l00263"></a>00263 <span class="keywordflow">if</span>( head_counter!=k ) spin_wait_until_eq( head_counter, k );
-<a name="l00264"></a>00264 <span class="keywordflow">if</span>( tail_counter==k ) spin_wait_while_eq( tail_counter, k );
-<a name="l00265"></a>00265 page& p = *head_page;
-<a name="l00266"></a>00266 __TBB_ASSERT( &p, NULL );
-<a name="l00267"></a>00267 size_t index = k/concurrent_queue_rep_base::n_queue & (base.my_rep->items_per_page-1);
-<a name="l00268"></a>00268 <span class="keywordtype">bool</span> success = <span class="keyword">false</span>;
-<a name="l00269"></a>00269 {
-<a name="l00270"></a>00270 micro_queue_pop_finalizer<T> finalizer( *<span class="keyword">this</span>, base, k+concurrent_queue_rep_base::n_queue, index==base.my_rep->items_per_page-1 ? &p : NULL );
-<a name="l00271"></a>00271 <span class="keywordflow">if</span>( p.mask & uintptr_t(1)<<index ) {
-<a name="l00272"></a>00272 success = <span class="keyword">true</span>;
-<a name="l00273"></a>00273 assign_and_destroy_item( dst, p, index );
-<a name="l00274"></a>00274 } <span class="keywordflow">else</span> {
-<a name="l00275"></a>00275 --base.my_rep->n_invalid_entries;
-<a name="l00276"></a>00276 }
-<a name="l00277"></a>00277 }
-<a name="l00278"></a>00278 <span class="keywordflow">return</span> success;
-<a name="l00279"></a>00279 }
-<a name="l00280"></a>00280
-<a name="l00281"></a>00281 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00282"></a>00282 micro_queue<T>& micro_queue<T>::assign( <span class="keyword">const</span> micro_queue<T>& src, concurrent_queue_base_v3<T>& base ) {
-<a name="l00283"></a>00283 head_counter = src.head_counter;
-<a name="l00284"></a>00284 tail_counter = src.tail_counter;
-<a name="l00285"></a>00285 page_mutex = src.page_mutex;
-<a name="l00286"></a>00286
-<a name="l00287"></a>00287 <span class="keyword">const</span> page* srcp = src.head_page;
-<a name="l00288"></a>00288 <span class="keywordflow">if</span>( is_valid_page(srcp) ) {
-<a name="l00289"></a>00289 ticket g_index = head_counter;
-<a name="l00290"></a>00290 __TBB_TRY {
-<a name="l00291"></a>00291 size_t n_items = (tail_counter-head_counter)/concurrent_queue_rep_base::n_queue;
-<a name="l00292"></a>00292 size_t index = head_counter/concurrent_queue_rep_base::n_queue & (base.my_rep->items_per_page-1);
-<a name="l00293"></a>00293 size_t end_in_first_page = (index+n_items<base.my_rep->items_per_page)?(index+n_items):base.my_rep->items_per_page;
-<a name="l00294"></a>00294
-<a name="l00295"></a>00295 head_page = make_copy( base, srcp, index, end_in_first_page, g_index );
-<a name="l00296"></a>00296 page* cur_page = head_page;
-<a name="l00297"></a>00297
-<a name="l00298"></a>00298 <span class="keywordflow">if</span>( srcp != src.tail_page ) {
-<a name="l00299"></a>00299 <span class="keywordflow">for</span>( srcp = srcp->next; srcp!=src.tail_page; srcp=srcp->next ) {
-<a name="l00300"></a>00300 cur_page->next = make_copy( base, srcp, 0, base.my_rep->items_per_page, g_index );
-<a name="l00301"></a>00301 cur_page = cur_page->next;
-<a name="l00302"></a>00302 }
-<a name="l00303"></a>00303
-<a name="l00304"></a>00304 __TBB_ASSERT( srcp==src.tail_page, NULL );
-<a name="l00305"></a>00305 size_t last_index = tail_counter/concurrent_queue_rep_base::n_queue & (base.my_rep->items_per_page-1);
-<a name="l00306"></a>00306 <span class="keywordflow">if</span>( last_index==0 ) last_index = base.my_rep->items_per_page;
-<a name="l00307"></a>00307
-<a name="l00308"></a>00308 cur_page->next = make_copy( base, srcp, 0, last_index, g_index );
-<a name="l00309"></a>00309 cur_page = cur_page->next;
-<a name="l00310"></a>00310 }
-<a name="l00311"></a>00311 tail_page = cur_page;
-<a name="l00312"></a>00312 } __TBB_CATCH (...) {
-<a name="l00313"></a>00313 invalidate_page_and_rethrow( g_index );
-<a name="l00314"></a>00314 }
-<a name="l00315"></a>00315 } <span class="keywordflow">else</span> {
-<a name="l00316"></a>00316 head_page = tail_page = NULL;
-<a name="l00317"></a>00317 }
-<a name="l00318"></a>00318 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00319"></a>00319 }
-<a name="l00320"></a>00320
-<a name="l00321"></a>00321 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00322"></a>00322 <span class="keywordtype">void</span> micro_queue<T>::invalidate_page_and_rethrow( ticket k ) {
-<a name="l00323"></a>00323 <span class="comment">// Append an invalid page at address 1 so that no more pushes are allowed.</span>
-<a name="l00324"></a>00324 page* invalid_page = (page*)uintptr_t(1);
-<a name="l00325"></a>00325 {
-<a name="l00326"></a>00326 spin_mutex::scoped_lock lock( page_mutex );
-<a name="l00327"></a>00327 tail_counter = k+concurrent_queue_rep_base::n_queue+1;
-<a name="l00328"></a>00328 page* q = tail_page;
-<a name="l00329"></a>00329 <span class="keywordflow">if</span>( is_valid_page(q) )
-<a name="l00330"></a>00330 q->next = invalid_page;
-<a name="l00331"></a>00331 <span class="keywordflow">else</span>
-<a name="l00332"></a>00332 head_page = invalid_page;
-<a name="l00333"></a>00333 tail_page = invalid_page;
-<a name="l00334"></a>00334 }
-<a name="l00335"></a>00335 __TBB_RETHROW();
-<a name="l00336"></a>00336 }
-<a name="l00337"></a>00337
-<a name="l00338"></a>00338 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00339"></a>00339 concurrent_queue_rep_base::page* micro_queue<T>::make_copy( concurrent_queue_base_v3<T>& base, <span class="keyword">const</span> concurrent_queue_rep_base::page* src_page, size_t begin_in_page, size_t end_in_page, ticket& g_index ) {
-<a name="l00340"></a>00340 concurrent_queue_page_allocator& pa = base;
-<a name="l00341"></a>00341 page* new_page = pa.allocate_page();
-<a name="l00342"></a>00342 new_page->next = NULL;
-<a name="l00343"></a>00343 new_page->mask = src_page->mask;
-<a name="l00344"></a>00344 <span class="keywordflow">for</span>( ; begin_in_page!=end_in_page; ++begin_in_page, ++g_index )
-<a name="l00345"></a>00345 <span class="keywordflow">if</span>( new_page->mask & uintptr_t(1)<<begin_in_page )
-<a name="l00346"></a>00346 copy_item( *new_page, begin_in_page, *src_page, begin_in_page );
-<a name="l00347"></a>00347 <span class="keywordflow">return</span> new_page;
-<a name="l00348"></a>00348 }
-<a name="l00349"></a>00349
-<a name="l00350"></a>00350 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00351"></a>00351 <span class="keyword">class </span>micro_queue_pop_finalizer: no_copy {
-<a name="l00352"></a>00352 <span class="keyword">typedef</span> concurrent_queue_rep_base::page page;
-<a name="l00353"></a>00353 ticket my_ticket;
-<a name="l00354"></a>00354 micro_queue<T>& my_queue;
-<a name="l00355"></a>00355 page* my_page;
-<a name="l00356"></a>00356 concurrent_queue_page_allocator& allocator;
-<a name="l00357"></a>00357 <span class="keyword">public</span>:
-<a name="l00358"></a>00358 micro_queue_pop_finalizer( micro_queue<T>& queue, concurrent_queue_base_v3<T>& b, ticket k, page* p ) :
-<a name="l00359"></a>00359 my_ticket(k), my_queue(queue), my_page(p), allocator(b)
-<a name="l00360"></a>00360 {}
-<a name="l00361"></a>00361 ~micro_queue_pop_finalizer() ;
-<a name="l00362"></a>00362 };
-<a name="l00363"></a>00363
-<a name="l00364"></a>00364 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00365"></a>00365 micro_queue_pop_finalizer<T>::~micro_queue_pop_finalizer() {
-<a name="l00366"></a>00366 page* p = my_page;
-<a name="l00367"></a>00367 <span class="keywordflow">if</span>( is_valid_page(p) ) {
-<a name="l00368"></a>00368 spin_mutex::scoped_lock lock( my_queue.page_mutex );
-<a name="l00369"></a>00369 page* q = p->next;
-<a name="l00370"></a>00370 my_queue.head_page = q;
-<a name="l00371"></a>00371 <span class="keywordflow">if</span>( !is_valid_page(q) ) {
-<a name="l00372"></a>00372 my_queue.tail_page = NULL;
-<a name="l00373"></a>00373 }
-<a name="l00374"></a>00374 }
-<a name="l00375"></a>00375 my_queue.head_counter = my_ticket;
-<a name="l00376"></a>00376 <span class="keywordflow">if</span>( is_valid_page(p) ) {
-<a name="l00377"></a>00377 allocator.deallocate_page( p );
-<a name="l00378"></a>00378 }
-<a name="l00379"></a>00379 }
-<a name="l00380"></a>00380
-<a name="l00381"></a>00381 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
-<a name="l00382"></a>00382 <span class="preprocessor"></span><span class="preprocessor">#pragma warning( pop )</span>
-<a name="l00383"></a>00383 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4146 is back</span>
-<a name="l00384"></a>00384 <span class="preprocessor"></span>
-<a name="l00385"></a>00385 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">class </span>concurrent_queue_iterator_rep ;
-<a name="l00386"></a>00386 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">class </span>concurrent_queue_iterator_base_v3;
-<a name="l00387"></a>00387
-<a name="l00389"></a>00389
-<a name="l00392"></a>00392 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00393"></a>00393 <span class="keyword">struct </span>concurrent_queue_rep : <span class="keyword">public</span> concurrent_queue_rep_base {
-<a name="l00394"></a>00394 micro_queue<T> array[n_queue];
-<a name="l00395"></a>00395
-<a name="l00397"></a>00397 <span class="keyword">static</span> size_t index( ticket k ) {
-<a name="l00398"></a>00398 <span class="keywordflow">return</span> k*phi%n_queue;
-<a name="l00399"></a>00399 }
-<a name="l00400"></a>00400
-<a name="l00401"></a>00401 micro_queue<T>& choose( ticket k ) {
-<a name="l00402"></a>00402 <span class="comment">// The formula here approximates LRU in a cache-oblivious way.</span>
-<a name="l00403"></a>00403 <span class="keywordflow">return</span> array[index(k)];
-<a name="l00404"></a>00404 }
-<a name="l00405"></a>00405 };
-<a name="l00406"></a>00406
-<a name="l00408"></a>00408
-<a name="l00412"></a>00412 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00413"></a>00413 <span class="keyword">class </span>concurrent_queue_base_v3: <span class="keyword">public</span> concurrent_queue_page_allocator {
-<a name="l00415"></a>00415 concurrent_queue_rep<T>* my_rep;
-<a name="l00416"></a>00416
-<a name="l00417"></a>00417 <span class="keyword">friend</span> <span class="keyword">struct </span>concurrent_queue_rep<T>;
-<a name="l00418"></a>00418 <span class="keyword">friend</span> <span class="keyword">class </span>micro_queue<T>;
-<a name="l00419"></a>00419 <span class="keyword">friend</span> <span class="keyword">class </span>concurrent_queue_iterator_rep<T>;
-<a name="l00420"></a>00420 <span class="keyword">friend</span> <span class="keyword">class </span>concurrent_queue_iterator_base_v3<T>;
-<a name="l00421"></a>00421
-<a name="l00422"></a>00422 <span class="keyword">protected</span>:
-<a name="l00423"></a>00423 <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_queue_rep<T>::page page;
-<a name="l00424"></a>00424
-<a name="l00425"></a>00425 <span class="keyword">private</span>:
-<a name="l00426"></a>00426 <span class="keyword">typedef</span> <span class="keyword">typename</span> micro_queue<T>::padded_page padded_page;
-<a name="l00427"></a>00427
-<a name="l00428"></a>00428 <span class="comment">/* override */</span> <span class="keyword">virtual</span> page *allocate_page() {
-<a name="l00429"></a>00429 concurrent_queue_rep<T>& r = *my_rep;
-<a name="l00430"></a>00430 size_t n = <span class="keyword">sizeof</span>(padded_page) + (r.items_per_page-1)*<span class="keyword">sizeof</span>(T);
-<a name="l00431"></a>00431 <span class="keywordflow">return</span> reinterpret_cast<page*>(allocate_block ( n ));
-<a name="l00432"></a>00432 }
-<a name="l00433"></a>00433
-<a name="l00434"></a>00434 <span class="comment">/* override */</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> deallocate_page( concurrent_queue_rep_base::page *p ) {
-<a name="l00435"></a>00435 concurrent_queue_rep<T>& r = *my_rep;
-<a name="l00436"></a>00436 size_t n = <span class="keyword">sizeof</span>(padded_page) + (r.items_per_page-1)*<span class="keyword">sizeof</span>(T);
-<a name="l00437"></a>00437 deallocate_block( reinterpret_cast<void*>(p), n );
-<a name="l00438"></a>00438 }
-<a name="l00439"></a>00439
-<a name="l00441"></a>00441 <span class="keyword">virtual</span> <span class="keywordtype">void</span> *allocate_block( size_t n ) = 0;
-<a name="l00442"></a>00442
-<a name="l00444"></a>00444 <span class="keyword">virtual</span> <span class="keywordtype">void</span> deallocate_block( <span class="keywordtype">void</span> *p, size_t n ) = 0;
-<a name="l00445"></a>00445
-<a name="l00446"></a>00446 <span class="keyword">protected</span>:
-<a name="l00447"></a>00447 concurrent_queue_base_v3();
-<a name="l00448"></a>00448
-<a name="l00449"></a>00449 <span class="comment">/* override */</span> <span class="keyword">virtual</span> ~concurrent_queue_base_v3() {
-<a name="l00450"></a>00450 <span class="preprocessor">#if __TBB_USE_ASSERT</span>
-<a name="l00451"></a>00451 <span class="preprocessor"></span> size_t nq = my_rep->n_queue;
-<a name="l00452"></a>00452 <span class="keywordflow">for</span>( size_t i=0; i<nq; i++ )
-<a name="l00453"></a>00453 __TBB_ASSERT( my_rep->array[i].tail_page==NULL, <span class="stringliteral">"pages were not freed properly"</span> );
-<a name="l00454"></a>00454 #endif <span class="comment">/* __TBB_USE_ASSERT */</span>
-<a name="l00455"></a>00455 cache_aligned_allocator<concurrent_queue_rep<T> >().deallocate(my_rep,1);
-<a name="l00456"></a>00456 }
-<a name="l00457"></a>00457
-<a name="l00459"></a>00459 <span class="keywordtype">void</span> internal_push( <span class="keyword">const</span> <span class="keywordtype">void</span>* src ) {
-<a name="l00460"></a>00460 concurrent_queue_rep<T>& r = *my_rep;
-<a name="l00461"></a>00461 ticket k = r.tail_counter++;
-<a name="l00462"></a>00462 r.choose(k).push( src, k, *<span class="keyword">this</span> );
-<a name="l00463"></a>00463 }
-<a name="l00464"></a>00464
-<a name="l00466"></a>00466
-<a name="l00467"></a>00467 <span class="keywordtype">bool</span> internal_try_pop( <span class="keywordtype">void</span>* dst ) ;
-<a name="l00468"></a>00468
-<a name="l00470"></a>00470 size_t internal_size() <span class="keyword">const </span>;
-<a name="l00471"></a>00471
-<a name="l00473"></a>00473 <span class="keywordtype">bool</span> internal_empty() <span class="keyword">const </span>;
-<a name="l00474"></a>00474
-<a name="l00476"></a>00476 <span class="comment">/* note that the name may be misleading, but it remains so due to a historical accident. */</span>
-<a name="l00477"></a>00477 <span class="keywordtype">void</span> internal_finish_clear() ;
-<a name="l00478"></a>00478
-<a name="l00480"></a>00480 <span class="keywordtype">void</span> internal_throw_exception()<span class="keyword"> const </span>{
-<a name="l00481"></a>00481 throw_exception( eid_bad_alloc );
-<a name="l00482"></a>00482 }
-<a name="l00483"></a>00483
-<a name="l00485"></a>00485 <span class="keywordtype">void</span> assign( <span class="keyword">const</span> concurrent_queue_base_v3& src ) ;
-<a name="l00486"></a>00486 };
-<a name="l00487"></a>00487
-<a name="l00488"></a>00488 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00489"></a>00489 concurrent_queue_base_v3<T>::concurrent_queue_base_v3() {
-<a name="l00490"></a>00490 <span class="keyword">const</span> size_t item_size = <span class="keyword">sizeof</span>(T);
-<a name="l00491"></a>00491 my_rep = cache_aligned_allocator<concurrent_queue_rep<T> >().allocate(1);
-<a name="l00492"></a>00492 __TBB_ASSERT( (size_t)my_rep % NFS_GetLineSize()==0, <span class="stringliteral">"alignment error"</span> );
-<a name="l00493"></a>00493 __TBB_ASSERT( (size_t)&my_rep->head_counter % NFS_GetLineSize()==0, <span class="stringliteral">"alignment error"</span> );
-<a name="l00494"></a>00494 __TBB_ASSERT( (size_t)&my_rep->tail_counter % NFS_GetLineSize()==0, <span class="stringliteral">"alignment error"</span> );
-<a name="l00495"></a>00495 __TBB_ASSERT( (size_t)&my_rep->array % NFS_GetLineSize()==0, <span class="stringliteral">"alignment error"</span> );
-<a name="l00496"></a>00496 memset(my_rep,0,<span class="keyword">sizeof</span>(concurrent_queue_rep<T>));
-<a name="l00497"></a>00497 my_rep->item_size = item_size;
-<a name="l00498"></a>00498 my_rep->items_per_page = item_size<=8 ? 32 :
-<a name="l00499"></a>00499 item_size<=16 ? 16 :
-<a name="l00500"></a>00500 item_size<=32 ? 8 :
-<a name="l00501"></a>00501 item_size<=64 ? 4 :
-<a name="l00502"></a>00502 item_size<=128 ? 2 :
-<a name="l00503"></a>00503 1;
-<a name="l00504"></a>00504 }
-<a name="l00505"></a>00505
-<a name="l00506"></a>00506 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00507"></a>00507 <span class="keywordtype">bool</span> concurrent_queue_base_v3<T>::internal_try_pop( <span class="keywordtype">void</span>* dst ) {
-<a name="l00508"></a>00508 concurrent_queue_rep<T>& r = *my_rep;
-<a name="l00509"></a>00509 ticket k;
-<a name="l00510"></a>00510 <span class="keywordflow">do</span> {
-<a name="l00511"></a>00511 k = r.head_counter;
-<a name="l00512"></a>00512 <span class="keywordflow">for</span>(;;) {
-<a name="l00513"></a>00513 <span class="keywordflow">if</span>( r.tail_counter<=k ) {
-<a name="l00514"></a>00514 <span class="comment">// Queue is empty </span>
-<a name="l00515"></a>00515 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00516"></a>00516 }
-<a name="l00517"></a>00517 <span class="comment">// Queue had item with ticket k when we looked. Attempt to get that item.</span>
-<a name="l00518"></a>00518 ticket tk=k;
-<a name="l00519"></a>00519 <span class="preprocessor">#if defined(_MSC_VER) && defined(_Wp64)</span>
-<a name="l00520"></a>00520 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (push)</span>
-<a name="l00521"></a>00521 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4267)</span>
-<a name="l00522"></a>00522 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00523"></a>00523 <span class="preprocessor"></span> k = r.head_counter.compare_and_swap( tk+1, tk );
-<a name="l00524"></a>00524 <span class="preprocessor">#if defined(_MSC_VER) && defined(_Wp64)</span>
-<a name="l00525"></a>00525 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
-<a name="l00526"></a>00526 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00527"></a>00527 <span class="preprocessor"></span> <span class="keywordflow">if</span>( k==tk )
-<a name="l00528"></a>00528 <span class="keywordflow">break</span>;
-<a name="l00529"></a>00529 <span class="comment">// Another thread snatched the item, retry.</span>
-<a name="l00530"></a>00530 }
-<a name="l00531"></a>00531 } <span class="keywordflow">while</span>( !r.choose( k ).pop( dst, k, *<span class="keyword">this</span> ) );
-<a name="l00532"></a>00532 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00533"></a>00533 }
-<a name="l00534"></a>00534
-<a name="l00535"></a>00535 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00536"></a>00536 size_t concurrent_queue_base_v3<T>::internal_size()<span class="keyword"> const </span>{
-<a name="l00537"></a>00537 concurrent_queue_rep<T>& r = *my_rep;
-<a name="l00538"></a>00538 __TBB_ASSERT( <span class="keyword">sizeof</span>(ptrdiff_t)<=<span class="keyword">sizeof</span>(size_t), NULL );
-<a name="l00539"></a>00539 ticket hc = r.head_counter;
-<a name="l00540"></a>00540 size_t nie = r.n_invalid_entries;
-<a name="l00541"></a>00541 ticket tc = r.tail_counter;
-<a name="l00542"></a>00542 __TBB_ASSERT( hc!=tc || !nie, NULL );
-<a name="l00543"></a>00543 ptrdiff_t sz = tc-hc-nie;
-<a name="l00544"></a>00544 <span class="keywordflow">return</span> sz<0 ? 0 : size_t(sz);
-<a name="l00545"></a>00545 }
-<a name="l00546"></a>00546
-<a name="l00547"></a>00547 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00548"></a>00548 <span class="keywordtype">bool</span> concurrent_queue_base_v3<T>::internal_empty()<span class="keyword"> const </span>{
-<a name="l00549"></a>00549 concurrent_queue_rep<T>& r = *my_rep;
-<a name="l00550"></a>00550 ticket tc = r.tail_counter;
-<a name="l00551"></a>00551 ticket hc = r.head_counter;
-<a name="l00552"></a>00552 <span class="comment">// if tc!=r.tail_counter, the queue was not empty at some point between the two reads.</span>
-<a name="l00553"></a>00553 <span class="keywordflow">return</span> tc==r.tail_counter && tc==hc+r.n_invalid_entries ;
-<a name="l00554"></a>00554 }
-<a name="l00555"></a>00555
-<a name="l00556"></a>00556 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00557"></a>00557 <span class="keywordtype">void</span> concurrent_queue_base_v3<T>::internal_finish_clear() {
-<a name="l00558"></a>00558 concurrent_queue_rep<T>& r = *my_rep;
-<a name="l00559"></a>00559 size_t nq = r.n_queue;
-<a name="l00560"></a>00560 <span class="keywordflow">for</span>( size_t i=0; i<nq; ++i ) {
-<a name="l00561"></a>00561 page* tp = r.array[i].tail_page;
-<a name="l00562"></a>00562 <span class="keywordflow">if</span>( is_valid_page(tp) ) {
-<a name="l00563"></a>00563 __TBB_ASSERT( r.array[i].head_page==tp, <span class="stringliteral">"at most one page should remain"</span> );
-<a name="l00564"></a>00564 deallocate_page( tp );
-<a name="l00565"></a>00565 r.array[i].tail_page = NULL;
-<a name="l00566"></a>00566 } <span class="keywordflow">else</span>
-<a name="l00567"></a>00567 __TBB_ASSERT( !is_valid_page(r.array[i].head_page), <span class="stringliteral">"head page pointer corrupt?"</span> );
-<a name="l00568"></a>00568 }
-<a name="l00569"></a>00569 }
-<a name="l00570"></a>00570
-<a name="l00571"></a>00571 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00572"></a>00572 <span class="keywordtype">void</span> concurrent_queue_base_v3<T>::assign( <span class="keyword">const</span> concurrent_queue_base_v3& src ) {
-<a name="l00573"></a>00573 concurrent_queue_rep<T>& r = *my_rep;
-<a name="l00574"></a>00574 r.items_per_page = src.my_rep->items_per_page;
-<a name="l00575"></a>00575
-<a name="l00576"></a>00576 <span class="comment">// copy concurrent_queue_rep.</span>
-<a name="l00577"></a>00577 r.head_counter = src.my_rep->head_counter;
-<a name="l00578"></a>00578 r.tail_counter = src.my_rep->tail_counter;
-<a name="l00579"></a>00579 r.n_invalid_entries = src.my_rep->n_invalid_entries;
-<a name="l00580"></a>00580
-<a name="l00581"></a>00581 <span class="comment">// copy micro_queues</span>
-<a name="l00582"></a>00582 <span class="keywordflow">for</span>( size_t i = 0; i<r.n_queue; ++i )
-<a name="l00583"></a>00583 r.array[i].assign( src.my_rep->array[i], *<span class="keyword">this</span>);
-<a name="l00584"></a>00584
-<a name="l00585"></a>00585 __TBB_ASSERT( r.head_counter==src.my_rep->head_counter && r.tail_counter==src.my_rep->tail_counter,
-<a name="l00586"></a>00586 <span class="stringliteral">"the source concurrent queue should not be concurrently modified."</span> );
-<a name="l00587"></a>00587 }
-<a name="l00588"></a>00588
-<a name="l00589"></a>00589 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value> <span class="keyword">class </span>concurrent_queue_iterator;
-<a name="l00590"></a>00590
-<a name="l00591"></a>00591 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00592"></a>00592 <span class="keyword">class </span>concurrent_queue_iterator_rep: no_assign {
-<a name="l00593"></a>00593 <span class="keyword">typedef</span> <span class="keyword">typename</span> micro_queue<T>::padded_page padded_page;
-<a name="l00594"></a>00594 <span class="keyword">public</span>:
-<a name="l00595"></a>00595 ticket head_counter;
-<a name="l00596"></a>00596 <span class="keyword">const</span> concurrent_queue_base_v3<T>& my_queue;
-<a name="l00597"></a>00597 <span class="keyword">typename</span> concurrent_queue_base_v3<T>::page* array[concurrent_queue_rep<T>::n_queue];
-<a name="l00598"></a>00598 concurrent_queue_iterator_rep( <span class="keyword">const</span> concurrent_queue_base_v3<T>& queue ) :
-<a name="l00599"></a>00599 head_counter(queue.my_rep->head_counter),
-<a name="l00600"></a>00600 my_queue(queue)
-<a name="l00601"></a>00601 {
-<a name="l00602"></a>00602 <span class="keywordflow">for</span>( size_t k=0; k<concurrent_queue_rep<T>::n_queue; ++k )
-<a name="l00603"></a>00603 array[k] = queue.my_rep->array[k].head_page;
-<a name="l00604"></a>00604 }
-<a name="l00605"></a>00605
-<a name="l00607"></a>00607 <span class="keywordtype">bool</span> get_item( T*& item, size_t k ) ;
-<a name="l00608"></a>00608 };
-<a name="l00609"></a>00609
-<a name="l00610"></a>00610 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00611"></a>00611 <span class="keywordtype">bool</span> concurrent_queue_iterator_rep<T>::get_item( T*& item, size_t k ) {
-<a name="l00612"></a>00612 <span class="keywordflow">if</span>( k==my_queue.my_rep->tail_counter ) {
-<a name="l00613"></a>00613 item = NULL;
-<a name="l00614"></a>00614 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00615"></a>00615 } <span class="keywordflow">else</span> {
-<a name="l00616"></a>00616 <span class="keyword">typename</span> concurrent_queue_base_v3<T>::page* p = array[concurrent_queue_rep<T>::index(k)];
-<a name="l00617"></a>00617 __TBB_ASSERT(p,NULL);
-<a name="l00618"></a>00618 size_t i = k/concurrent_queue_rep<T>::n_queue & (my_queue.my_rep->items_per_page-1);
-<a name="l00619"></a>00619 item = µ_queue<T>::get_ref(*p,i);
-<a name="l00620"></a>00620 <span class="keywordflow">return</span> (p->mask & uintptr_t(1)<<i)!=0;
-<a name="l00621"></a>00621 }
-<a name="l00622"></a>00622 }
-<a name="l00623"></a>00623
-<a name="l00625"></a>00625
-<a name="l00626"></a>00626 <span class="keyword">template</span><<span class="keyword">typename</span> Value>
-<a name="l00627"></a>00627 <span class="keyword">class </span>concurrent_queue_iterator_base_v3 : no_assign {
-<a name="l00629"></a>00629
-<a name="l00630"></a>00630 concurrent_queue_iterator_rep<Value>* my_rep;
-<a name="l00631"></a>00631
-<a name="l00632"></a>00632 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00633"></a>00633 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> concurrent_queue_iterator<C,T>& i, <span class="keyword">const</span> concurrent_queue_iterator<C,U>& j );
-<a name="l00634"></a>00634
-<a name="l00635"></a>00635 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00636"></a>00636 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> concurrent_queue_iterator<C,T>& i, <span class="keyword">const</span> concurrent_queue_iterator<C,U>& j );
-<a name="l00637"></a>00637 <span class="keyword">protected</span>:
-<a name="l00639"></a>00639 Value* my_item;
-<a name="l00640"></a>00640
-<a name="l00642"></a>00642 concurrent_queue_iterator_base_v3() : my_rep(NULL), my_item(NULL) {
-<a name="l00643"></a>00643 <span class="preprocessor">#if __GNUC__==4&&__GNUC_MINOR__==3</span>
-<a name="l00644"></a>00644 <span class="preprocessor"></span> <span class="comment">// to get around a possible gcc 4.3 bug</span>
-<a name="l00645"></a>00645 __asm__ __volatile__(<span class="stringliteral">""</span>: : :<span class="stringliteral">"memory"</span>);
-<a name="l00646"></a>00646 <span class="preprocessor">#endif</span>
-<a name="l00647"></a>00647 <span class="preprocessor"></span> }
-<a name="l00648"></a>00648
-<a name="l00650"></a>00650 concurrent_queue_iterator_base_v3( <span class="keyword">const</span> concurrent_queue_iterator_base_v3& i )
-<a name="l00651"></a>00651 : no_assign(), my_rep(NULL), my_item(NULL) {
-<a name="l00652"></a>00652 assign(i);
-<a name="l00653"></a>00653 }
-<a name="l00654"></a>00654
-<a name="l00656"></a>00656 concurrent_queue_iterator_base_v3( <span class="keyword">const</span> concurrent_queue_base_v3<Value>& queue ) ;
-<a name="l00657"></a>00657
-<a name="l00659"></a>00659 <span class="keywordtype">void</span> assign( <span class="keyword">const</span> concurrent_queue_iterator_base_v3<Value>& other ) ;
-<a name="l00660"></a>00660
-<a name="l00662"></a>00662 <span class="keywordtype">void</span> advance() ;
-<a name="l00663"></a>00663
-<a name="l00665"></a>00665 ~concurrent_queue_iterator_base_v3() {
-<a name="l00666"></a>00666 cache_aligned_allocator<concurrent_queue_iterator_rep<Value> >().deallocate(my_rep, 1);
-<a name="l00667"></a>00667 my_rep = NULL;
-<a name="l00668"></a>00668 }
-<a name="l00669"></a>00669 };
-<a name="l00670"></a>00670
-<a name="l00671"></a>00671 <span class="keyword">template</span><<span class="keyword">typename</span> Value>
-<a name="l00672"></a>00672 concurrent_queue_iterator_base_v3<Value>::concurrent_queue_iterator_base_v3( <span class="keyword">const</span> concurrent_queue_base_v3<Value>& queue ) {
-<a name="l00673"></a>00673 my_rep = cache_aligned_allocator<concurrent_queue_iterator_rep<Value> >().allocate(1);
-<a name="l00674"></a>00674 <span class="keyword">new</span>( my_rep ) concurrent_queue_iterator_rep<Value>(queue);
-<a name="l00675"></a>00675 size_t k = my_rep->head_counter;
-<a name="l00676"></a>00676 <span class="keywordflow">if</span>( !my_rep->get_item(my_item, k) ) advance();
-<a name="l00677"></a>00677 }
-<a name="l00678"></a>00678
-<a name="l00679"></a>00679 <span class="keyword">template</span><<span class="keyword">typename</span> Value>
-<a name="l00680"></a>00680 <span class="keywordtype">void</span> concurrent_queue_iterator_base_v3<Value>::assign( <span class="keyword">const</span> concurrent_queue_iterator_base_v3<Value>& other ) {
-<a name="l00681"></a>00681 <span class="keywordflow">if</span>( my_rep!=other.my_rep ) {
-<a name="l00682"></a>00682 <span class="keywordflow">if</span>( my_rep ) {
-<a name="l00683"></a>00683 cache_aligned_allocator<concurrent_queue_iterator_rep<Value> >().deallocate(my_rep, 1);
-<a name="l00684"></a>00684 my_rep = NULL;
-<a name="l00685"></a>00685 }
-<a name="l00686"></a>00686 <span class="keywordflow">if</span>( other.my_rep ) {
-<a name="l00687"></a>00687 my_rep = cache_aligned_allocator<concurrent_queue_iterator_rep<Value> >().allocate(1);
-<a name="l00688"></a>00688 <span class="keyword">new</span>( my_rep ) concurrent_queue_iterator_rep<Value>( *other.my_rep );
-<a name="l00689"></a>00689 }
-<a name="l00690"></a>00690 }
-<a name="l00691"></a>00691 my_item = other.my_item;
-<a name="l00692"></a>00692 }
-<a name="l00693"></a>00693
-<a name="l00694"></a>00694 <span class="keyword">template</span><<span class="keyword">typename</span> Value>
-<a name="l00695"></a>00695 <span class="keywordtype">void</span> concurrent_queue_iterator_base_v3<Value>::advance() {
-<a name="l00696"></a>00696 __TBB_ASSERT( my_item, <span class="stringliteral">"attempt to increment iterator past end of queue"</span> );
-<a name="l00697"></a>00697 size_t k = my_rep->head_counter;
-<a name="l00698"></a>00698 <span class="keyword">const</span> concurrent_queue_base_v3<Value>& queue = my_rep->my_queue;
-<a name="l00699"></a>00699 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00700"></a>00700 <span class="preprocessor"></span> Value* tmp;
-<a name="l00701"></a>00701 my_rep->get_item(tmp,k);
-<a name="l00702"></a>00702 __TBB_ASSERT( my_item==tmp, NULL );
-<a name="l00703"></a>00703 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00704"></a>00704 size_t i = k/concurrent_queue_rep<Value>::n_queue & (queue.my_rep->items_per_page-1);
-<a name="l00705"></a>00705 <span class="keywordflow">if</span>( i==queue.my_rep->items_per_page-1 ) {
-<a name="l00706"></a>00706 <span class="keyword">typename</span> concurrent_queue_base_v3<Value>::page*& root = my_rep->array[concurrent_queue_rep<Value>::index(k)];
-<a name="l00707"></a>00707 root = root->next;
-<a name="l00708"></a>00708 }
-<a name="l00709"></a>00709 <span class="comment">// advance k</span>
-<a name="l00710"></a>00710 my_rep->head_counter = ++k;
-<a name="l00711"></a>00711 <span class="keywordflow">if</span>( !my_rep->get_item(my_item, k) ) advance();
-<a name="l00712"></a>00712 }
-<a name="l00713"></a>00713
-<a name="l00715"></a>00715
-<a name="l00716"></a>00716 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">struct </span>tbb_remove_cv {<span class="keyword">typedef</span> T type;};
-<a name="l00717"></a>00717 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">struct </span>tbb_remove_cv<const T> {<span class="keyword">typedef</span> T type;};
-<a name="l00718"></a>00718 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">struct </span>tbb_remove_cv<volatile T> {<span class="keyword">typedef</span> T type;};
-<a name="l00719"></a>00719 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">struct </span>tbb_remove_cv<const volatile T> {<span class="keyword">typedef</span> T type;};
-<a name="l00720"></a>00720
-<a name="l00722"></a>00722
-<a name="l00724"></a>00724 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value>
-<a name="l00725"></a>00725 <span class="keyword">class </span>concurrent_queue_iterator: <span class="keyword">public</span> concurrent_queue_iterator_base_v3<typename tbb_remove_cv<Value>::type>,
-<a name="l00726"></a>00726 <span class="keyword">public</span> std::iterator<std::forward_iterator_tag,Value> {
-<a name="l00727"></a>00727 <span class="preprocessor">#if !__TBB_TEMPLATE_FRIENDS_BROKEN</span>
-<a name="l00728"></a>00728 <span class="preprocessor"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00729"></a>00729 <span class="keyword">friend</span> class ::tbb::strict_ppl::concurrent_queue;
-<a name="l00730"></a>00730 <span class="preprocessor">#else</span>
-<a name="l00731"></a>00731 <span class="preprocessor"></span><span class="keyword">public</span>: <span class="comment">// workaround for MSVC</span>
-<a name="l00732"></a>00732 <span class="preprocessor">#endif </span>
-<a name="l00734"></a>00734 <span class="preprocessor"> concurrent_queue_iterator( const concurrent_queue_base_v3<Value>& queue ) :</span>
-<a name="l00735"></a>00735 <span class="preprocessor"></span> concurrent_queue_iterator_base_v3<typename tbb_remove_cv<Value>::type>(queue)
-<a name="l00736"></a>00736 {
-<a name="l00737"></a>00737 }
-<a name="l00738"></a>00738
-<a name="l00739"></a>00739 <span class="keyword">public</span>:
-<a name="l00740"></a>00740 concurrent_queue_iterator() {}
-<a name="l00741"></a>00741
-<a name="l00742"></a>00742 concurrent_queue_iterator( <span class="keyword">const</span> concurrent_queue_iterator<Container,typename Container::value_type>& other ) :
-<a name="l00743"></a>00743 concurrent_queue_iterator_base_v3<typename tbb_remove_cv<Value>::type>(other)
-<a name="l00744"></a>00744 {}
-<a name="l00745"></a>00745
-<a name="l00747"></a>00747 concurrent_queue_iterator& operator=( <span class="keyword">const</span> concurrent_queue_iterator& other ) {
-<a name="l00748"></a>00748 assign(other);
-<a name="l00749"></a>00749 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00750"></a>00750 }
-<a name="l00751"></a>00751
-<a name="l00753"></a>00753 Value& operator*()<span class="keyword"> const </span>{
-<a name="l00754"></a>00754 <span class="keywordflow">return</span> *static_cast<Value*>(this->my_item);
-<a name="l00755"></a>00755 }
-<a name="l00756"></a>00756
-<a name="l00757"></a>00757 Value* operator->()<span class="keyword"> const </span>{<span class="keywordflow">return</span> &operator*();}
-<a name="l00758"></a>00758
-<a name="l00760"></a>00760 concurrent_queue_iterator& operator++() {
-<a name="l00761"></a>00761 this->advance();
-<a name="l00762"></a>00762 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00763"></a>00763 }
-<a name="l00764"></a>00764
-<a name="l00766"></a>00766 Value* operator++(<span class="keywordtype">int</span>) {
-<a name="l00767"></a>00767 Value* result = &operator*();
-<a name="l00768"></a>00768 operator++();
-<a name="l00769"></a>00769 <span class="keywordflow">return</span> result;
-<a name="l00770"></a>00770 }
-<a name="l00771"></a>00771 }; <span class="comment">// concurrent_queue_iterator</span>
-<a name="l00772"></a>00772
-<a name="l00773"></a>00773
-<a name="l00774"></a>00774 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00775"></a>00775 <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> concurrent_queue_iterator<C,T>& i, <span class="keyword">const</span> concurrent_queue_iterator<C,U>& j ) {
-<a name="l00776"></a>00776 <span class="keywordflow">return</span> i.my_item==j.my_item;
-<a name="l00777"></a>00777 }
-<a name="l00778"></a>00778
-<a name="l00779"></a>00779 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00780"></a>00780 <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> concurrent_queue_iterator<C,T>& i, <span class="keyword">const</span> concurrent_queue_iterator<C,U>& j ) {
-<a name="l00781"></a>00781 <span class="keywordflow">return</span> i.my_item!=j.my_item;
-<a name="l00782"></a>00782 }
-<a name="l00783"></a>00783
-<a name="l00784"></a>00784 } <span class="comment">// namespace internal</span>
-<a name="l00785"></a>00785
-<a name="l00787"></a>00787
-<a name="l00788"></a>00788 } <span class="comment">// namespace strict_ppl</span>
-<a name="l00789"></a>00789
-<a name="l00791"></a>00791 <span class="keyword">namespace </span>internal {
-<a name="l00792"></a>00792
-<a name="l00793"></a>00793 <span class="keyword">class </span>concurrent_queue_rep;
-<a name="l00794"></a>00794 <span class="keyword">class </span>concurrent_queue_iterator_rep;
-<a name="l00795"></a>00795 <span class="keyword">class </span>concurrent_queue_iterator_base_v3;
-<a name="l00796"></a>00796 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value> <span class="keyword">class </span>concurrent_queue_iterator;
-<a name="l00797"></a>00797
-<a name="l00799"></a>00799
-<a name="l00801"></a>00801 <span class="keyword">class </span>concurrent_queue_base_v3: no_copy {
-<a name="l00803"></a>00803 concurrent_queue_rep* my_rep;
-<a name="l00804"></a>00804
-<a name="l00805"></a>00805 <span class="keyword">friend</span> <span class="keyword">class </span>concurrent_queue_rep;
-<a name="l00806"></a>00806 <span class="keyword">friend</span> <span class="keyword">struct </span>micro_queue;
-<a name="l00807"></a>00807 <span class="keyword">friend</span> <span class="keyword">class </span>micro_queue_pop_finalizer;
-<a name="l00808"></a>00808 <span class="keyword">friend</span> <span class="keyword">class </span>concurrent_queue_iterator_rep;
-<a name="l00809"></a>00809 <span class="keyword">friend</span> <span class="keyword">class </span>concurrent_queue_iterator_base_v3;
-<a name="l00810"></a>00810 <span class="keyword">protected</span>:
-<a name="l00812"></a>00812 <span class="keyword">struct </span>page {
-<a name="l00813"></a>00813 page* next;
-<a name="l00814"></a>00814 uintptr_t mask;
-<a name="l00815"></a>00815 };
-<a name="l00816"></a>00816
-<a name="l00818"></a>00818 ptrdiff_t my_capacity;
-<a name="l00819"></a>00819
-<a name="l00821"></a>00821 size_t items_per_page;
-<a name="l00822"></a>00822
-<a name="l00824"></a>00824 size_t item_size;
-<a name="l00825"></a>00825
-<a name="l00826"></a>00826 <span class="preprocessor">#if __TBB_GCC_3_3_PROTECTED_BROKEN</span>
-<a name="l00827"></a>00827 <span class="preprocessor"></span><span class="keyword">public</span>:
-<a name="l00828"></a>00828 <span class="preprocessor">#endif</span>
-<a name="l00829"></a>00829 <span class="preprocessor"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00830"></a>00830 <span class="keyword">struct </span>padded_page: page {
-<a name="l00832"></a>00832 padded_page();
-<a name="l00834"></a>00834 <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> padded_page& );
-<a name="l00836"></a>00836 T last;
-<a name="l00837"></a>00837 };
-<a name="l00838"></a>00838
-<a name="l00839"></a>00839 <span class="keyword">private</span>:
-<a name="l00840"></a>00840 <span class="keyword">virtual</span> <span class="keywordtype">void</span> copy_item( page& dst, size_t index, <span class="keyword">const</span> <span class="keywordtype">void</span>* src ) = 0;
-<a name="l00841"></a>00841 <span class="keyword">virtual</span> <span class="keywordtype">void</span> assign_and_destroy_item( <span class="keywordtype">void</span>* dst, page& src, size_t index ) = 0;
-<a name="l00842"></a>00842 <span class="keyword">protected</span>:
-<a name="l00843"></a>00843 __TBB_EXPORTED_METHOD concurrent_queue_base_v3( size_t item_size );
-<a name="l00844"></a>00844 <span class="keyword">virtual</span> __TBB_EXPORTED_METHOD ~concurrent_queue_base_v3();
-<a name="l00845"></a>00845
-<a name="l00847"></a>00847 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_push( <span class="keyword">const</span> <span class="keywordtype">void</span>* src );
-<a name="l00848"></a>00848
-<a name="l00850"></a>00850 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_pop( <span class="keywordtype">void</span>* dst );
-<a name="l00851"></a>00851
-<a name="l00853"></a>00853 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD internal_push_if_not_full( <span class="keyword">const</span> <span class="keywordtype">void</span>* src );
-<a name="l00854"></a>00854
-<a name="l00856"></a>00856
-<a name="l00857"></a>00857 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD internal_pop_if_present( <span class="keywordtype">void</span>* dst );
-<a name="l00858"></a>00858
-<a name="l00860"></a>00860 ptrdiff_t __TBB_EXPORTED_METHOD internal_size() <span class="keyword">const</span>;
-<a name="l00861"></a>00861
-<a name="l00863"></a>00863 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD internal_empty() <span class="keyword">const</span>;
-<a name="l00864"></a>00864
-<a name="l00866"></a>00866 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_set_capacity( ptrdiff_t capacity, size_t element_size );
-<a name="l00867"></a>00867
-<a name="l00869"></a>00869 <span class="keyword">virtual</span> page *allocate_page() = 0;
-<a name="l00870"></a>00870
-<a name="l00872"></a>00872 <span class="keyword">virtual</span> <span class="keywordtype">void</span> deallocate_page( page *p ) = 0;
-<a name="l00873"></a>00873
-<a name="l00875"></a>00875 <span class="comment">/* note that the name may be misleading, but it remains so due to a historical accident. */</span>
-<a name="l00876"></a>00876 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_finish_clear() ;
-<a name="l00877"></a>00877
-<a name="l00879"></a>00879 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_throw_exception() <span class="keyword">const</span>;
-<a name="l00880"></a>00880
-<a name="l00882"></a>00882 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD assign( <span class="keyword">const</span> concurrent_queue_base_v3& src ) ;
-<a name="l00883"></a>00883
-<a name="l00884"></a>00884 <span class="keyword">private</span>:
-<a name="l00885"></a>00885 <span class="keyword">virtual</span> <span class="keywordtype">void</span> copy_page_item( page& dst, size_t dindex, <span class="keyword">const</span> page& src, size_t sindex ) = 0;
-<a name="l00886"></a>00886 };
-<a name="l00887"></a>00887
-<a name="l00889"></a>00889
-<a name="l00890"></a>00890 <span class="keyword">class </span>concurrent_queue_iterator_base_v3 {
-<a name="l00892"></a>00892
-<a name="l00893"></a>00893 concurrent_queue_iterator_rep* my_rep;
-<a name="l00894"></a>00894
-<a name="l00895"></a>00895 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00896"></a>00896 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> concurrent_queue_iterator<C,T>& i, <span class="keyword">const</span> concurrent_queue_iterator<C,U>& j );
-<a name="l00897"></a>00897
-<a name="l00898"></a>00898 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00899"></a>00899 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> concurrent_queue_iterator<C,T>& i, <span class="keyword">const</span> concurrent_queue_iterator<C,U>& j );
-<a name="l00900"></a>00900
-<a name="l00901"></a>00901 <span class="keywordtype">void</span> initialize( <span class="keyword">const</span> concurrent_queue_base_v3& queue, size_t offset_of_data );
-<a name="l00902"></a>00902 <span class="keyword">protected</span>:
-<a name="l00904"></a>00904 <span class="keywordtype">void</span>* my_item;
-<a name="l00905"></a>00905
-<a name="l00907"></a>00907 concurrent_queue_iterator_base_v3() : my_rep(NULL), my_item(NULL) {}
-<a name="l00908"></a>00908
-<a name="l00910"></a>00910 concurrent_queue_iterator_base_v3( <span class="keyword">const</span> concurrent_queue_iterator_base_v3& i ) : my_rep(NULL), my_item(NULL) {
-<a name="l00911"></a>00911 assign(i);
-<a name="l00912"></a>00912 }
-<a name="l00913"></a>00913
-<a name="l00915"></a>00915
-<a name="l00916"></a>00916 __TBB_EXPORTED_METHOD concurrent_queue_iterator_base_v3( <span class="keyword">const</span> concurrent_queue_base_v3& queue );
-<a name="l00917"></a>00917
-<a name="l00919"></a>00919 __TBB_EXPORTED_METHOD concurrent_queue_iterator_base_v3( <span class="keyword">const</span> concurrent_queue_base_v3& queue, size_t offset_of_data );
-<a name="l00920"></a>00920
-<a name="l00922"></a>00922 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD assign( <span class="keyword">const</span> concurrent_queue_iterator_base_v3& i );
-<a name="l00923"></a>00923
-<a name="l00925"></a>00925 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD advance();
-<a name="l00926"></a>00926
-<a name="l00928"></a>00928 __TBB_EXPORTED_METHOD ~concurrent_queue_iterator_base_v3();
-<a name="l00929"></a>00929 };
-<a name="l00930"></a>00930
-<a name="l00931"></a>00931 <span class="keyword">typedef</span> concurrent_queue_iterator_base_v3 concurrent_queue_iterator_base;
-<a name="l00932"></a>00932
-<a name="l00934"></a>00934
-<a name="l00936"></a>00936 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value>
-<a name="l00937"></a>00937 <span class="keyword">class </span>concurrent_queue_iterator: <span class="keyword">public</span> concurrent_queue_iterator_base,
-<a name="l00938"></a>00938 <span class="keyword">public</span> std::iterator<std::forward_iterator_tag,Value> {
-<a name="l00939"></a>00939
-<a name="l00940"></a>00940 <span class="preprocessor">#if !defined(_MSC_VER) || defined(__INTEL_COMPILER)</span>
-<a name="l00941"></a>00941 <span class="preprocessor"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00942"></a>00942 <span class="keyword">friend</span> class ::tbb::concurrent_bounded_queue;
-<a name="l00943"></a>00943
-<a name="l00944"></a>00944 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00945"></a>00945 <span class="keyword">friend</span> class ::tbb::deprecated::concurrent_queue;
-<a name="l00946"></a>00946 <span class="preprocessor">#else</span>
-<a name="l00947"></a>00947 <span class="preprocessor"></span><span class="keyword">public</span>: <span class="comment">// workaround for MSVC</span>
-<a name="l00948"></a>00948 <span class="preprocessor">#endif </span>
-<a name="l00950"></a>00950 <span class="preprocessor"> concurrent_queue_iterator( const concurrent_queue_base_v3& queue ) :</span>
-<a name="l00951"></a>00951 <span class="preprocessor"></span> concurrent_queue_iterator_base_v3(queue,__TBB_offsetof(concurrent_queue_base_v3::padded_page<Value>,last))
-<a name="l00952"></a>00952 {
-<a name="l00953"></a>00953 }
-<a name="l00954"></a>00954
-<a name="l00955"></a>00955 <span class="keyword">public</span>:
-<a name="l00956"></a>00956 concurrent_queue_iterator() {}
-<a name="l00957"></a>00957
-<a name="l00960"></a>00960 concurrent_queue_iterator( <span class="keyword">const</span> concurrent_queue_iterator<Container,typename Container::value_type>& other ) :
-<a name="l00961"></a>00961 concurrent_queue_iterator_base_v3(other)
-<a name="l00962"></a>00962 {}
-<a name="l00963"></a>00963
-<a name="l00965"></a>00965 concurrent_queue_iterator& operator=( <span class="keyword">const</span> concurrent_queue_iterator& other ) {
-<a name="l00966"></a>00966 assign(other);
-<a name="l00967"></a>00967 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00968"></a>00968 }
-<a name="l00969"></a>00969
-<a name="l00971"></a>00971 Value& operator*()<span class="keyword"> const </span>{
-<a name="l00972"></a>00972 <span class="keywordflow">return</span> *static_cast<Value*>(my_item);
-<a name="l00973"></a>00973 }
-<a name="l00974"></a>00974
-<a name="l00975"></a>00975 Value* operator->()<span class="keyword"> const </span>{<span class="keywordflow">return</span> &operator*();}
-<a name="l00976"></a>00976
-<a name="l00978"></a>00978 concurrent_queue_iterator& operator++() {
-<a name="l00979"></a>00979 advance();
-<a name="l00980"></a>00980 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00981"></a>00981 }
-<a name="l00982"></a>00982
-<a name="l00984"></a>00984 Value* operator++(<span class="keywordtype">int</span>) {
-<a name="l00985"></a>00985 Value* result = &operator*();
-<a name="l00986"></a>00986 operator++();
-<a name="l00987"></a>00987 <span class="keywordflow">return</span> result;
-<a name="l00988"></a>00988 }
-<a name="l00989"></a>00989 }; <span class="comment">// concurrent_queue_iterator</span>
-<a name="l00990"></a>00990
-<a name="l00991"></a>00991
-<a name="l00992"></a>00992 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00993"></a>00993 <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> concurrent_queue_iterator<C,T>& i, <span class="keyword">const</span> concurrent_queue_iterator<C,U>& j ) {
-<a name="l00994"></a>00994 <span class="keywordflow">return</span> i.my_item==j.my_item;
-<a name="l00995"></a>00995 }
-<a name="l00996"></a>00996
-<a name="l00997"></a>00997 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00998"></a>00998 <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> concurrent_queue_iterator<C,T>& i, <span class="keyword">const</span> concurrent_queue_iterator<C,U>& j ) {
-<a name="l00999"></a>00999 <span class="keywordflow">return</span> i.my_item!=j.my_item;
-<a name="l01000"></a>01000 }
-<a name="l01001"></a>01001
-<a name="l01002"></a>01002 } <span class="comment">// namespace internal;</span>
-<a name="l01003"></a>01003
-<a name="l01005"></a>01005
-<a name="l01006"></a>01006 } <span class="comment">// namespace tbb</span>
-<a name="l01007"></a>01007
-<a name="l01008"></a>01008 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_concurrent_queue_internal_H */</span>
-</pre></div><hr>
+<h1>Task Scheduling</h1><table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00201.html">tbb::task_group_context</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to form groups of tasks. <a href="a00201.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00199.html">tbb::task</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Base class for user-defined tasks. <a href="a00199.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00162.html">tbb::empty_task</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">task that does nothing. Useful for synchronization. <a href="a00162.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00202.html">tbb::task_list</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A list of children. <a href="a00202.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00203.html">tbb::task_scheduler_init</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Class representing reference to tbb scheduler. <a href="a00203.html#_details">More...</a><br></td></tr>
+</table>
+<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
diff --git a/doc/html/a00280.html b/doc/html/a00281.html
similarity index 99%
copy from doc/html/a00280.html
copy to doc/html/a00281.html
index 94ec695..610375a 100644
--- a/doc/html/a00280.html
+++ b/doc/html/a00281.html
@@ -68,14 +68,14 @@
<a name="l00047"></a>00047 <span class="preprocessor">#if !__TBB_TEMPLATE_FRIENDS_BROKEN</span>
<a name="l00048"></a>00048 <span class="preprocessor"></span>
<a name="l00049"></a>00049 <span class="comment">// forward declaration</span>
-<a name="l00050"></a><a class="code" href="a00273.html">00050</a> <span class="keyword">namespace </span>strict_ppl {
-<a name="l00051"></a>00051 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> A> <span class="keyword">class </span><a class="code" href="a00160.html">concurrent_queue</a>;
+<a name="l00050"></a><a class="code" href="a00274.html">00050</a> <span class="keyword">namespace </span>strict_ppl {
+<a name="l00051"></a>00051 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> A> <span class="keyword">class </span><a class="code" href="a00159.html">concurrent_queue</a>;
<a name="l00052"></a>00052 }
<a name="l00053"></a>00053
-<a name="l00054"></a>00054 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> A> <span class="keyword">class </span><a class="code" href="a00155.html">concurrent_bounded_queue</a>;
+<a name="l00054"></a>00054 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> A> <span class="keyword">class </span><a class="code" href="a00154.html">concurrent_bounded_queue</a>;
<a name="l00055"></a>00055
<a name="l00056"></a>00056 <span class="keyword">namespace </span>deprecated {
-<a name="l00057"></a>00057 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> A> <span class="keyword">class </span><a class="code" href="a00160.html">concurrent_queue</a>;
+<a name="l00057"></a>00057 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> A> <span class="keyword">class </span><a class="code" href="a00159.html">concurrent_queue</a>;
<a name="l00058"></a>00058 }
<a name="l00059"></a>00059 <span class="preprocessor">#endif</span>
<a name="l00060"></a>00060 <span class="preprocessor"></span>
diff --git a/doc/html/a00298.html b/doc/html/a00299.html
similarity index 67%
rename from doc/html/a00298.html
rename to doc/html/a00299.html
index 5dbe7df..aacd572 100644
--- a/doc/html/a00298.html
+++ b/doc/html/a00299.html
@@ -63,7 +63,7 @@
<a name="l00042"></a>00042 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
<a name="l00043"></a>00043 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00044"></a>00044 <span class="preprocessor"></span>
-<a name="l00045"></a>00045 <span class="preprocessor">#include "tbb_machine.h"</span>
+<a name="l00045"></a>00045 <span class="preprocessor">#include "atomic.h"</span>
<a name="l00046"></a>00046 <span class="preprocessor">#include "tbb_exception.h"</span>
<a name="l00047"></a>00047 <span class="preprocessor">#include "tbb_allocator.h"</span>
<a name="l00048"></a>00048
@@ -702,739 +702,703 @@
<a name="l00682"></a>00682 <span class="comment">// Constructors/Destructors</span>
<a name="l00683"></a>00683 concurrent_unordered_base(size_type n_of_buckets = initial_bucket_number,
<a name="l00684"></a>00684 <span class="keyword">const</span> hash_compare& hc = hash_compare(), <span class="keyword">const</span> allocator_type& a = allocator_type())
-<a name="l00685"></a>00685 : Traits(hc), my_number_of_buckets(n_of_buckets), my_solist(a),
+<a name="l00685"></a>00685 : Traits(hc), my_solist(a),
<a name="l00686"></a>00686 my_allocator(a), my_maximum_bucket_size((float) initial_bucket_load)
<a name="l00687"></a>00687 {
-<a name="l00688"></a>00688 internal_init();
-<a name="l00689"></a>00689 }
-<a name="l00690"></a>00690
-<a name="l00691"></a>00691 concurrent_unordered_base(<span class="keyword">const</span> concurrent_unordered_base& right, <span class="keyword">const</span> allocator_type& a)
-<a name="l00692"></a>00692 : Traits(right.my_hash_compare), my_solist(a), my_allocator(a)
-<a name="l00693"></a>00693 {
-<a name="l00694"></a>00694 internal_copy(right);
-<a name="l00695"></a>00695 }
-<a name="l00696"></a>00696
-<a name="l00697"></a>00697 concurrent_unordered_base(<span class="keyword">const</span> concurrent_unordered_base& right)
-<a name="l00698"></a>00698 : Traits(right.my_hash_compare), my_solist(right.get_allocator()), my_allocator(right.get_allocator())
-<a name="l00699"></a>00699 {
-<a name="l00700"></a>00700 internal_init();
-<a name="l00701"></a>00701 internal_copy(right);
-<a name="l00702"></a>00702 }
-<a name="l00703"></a>00703
-<a name="l00704"></a>00704 concurrent_unordered_base& operator=(<span class="keyword">const</span> concurrent_unordered_base& right) {
-<a name="l00705"></a>00705 <span class="keywordflow">if</span> (<span class="keyword">this</span> != &right)
-<a name="l00706"></a>00706 internal_copy(right);
-<a name="l00707"></a>00707 <span class="keywordflow">return</span> (*<span class="keyword">this</span>);
-<a name="l00708"></a>00708 }
-<a name="l00709"></a>00709
-<a name="l00710"></a>00710 ~concurrent_unordered_base() {
-<a name="l00711"></a>00711 <span class="comment">// Delete all node segments</span>
-<a name="l00712"></a>00712 internal_clear();
-<a name="l00713"></a>00713 }
-<a name="l00714"></a>00714
-<a name="l00715"></a>00715 <span class="keyword">public</span>:
-<a name="l00716"></a>00716 allocator_type get_allocator()<span class="keyword"> const </span>{
-<a name="l00717"></a>00717 <span class="keywordflow">return</span> my_solist.get_allocator();
-<a name="l00718"></a>00718 }
-<a name="l00719"></a>00719
-<a name="l00720"></a>00720 <span class="comment">// Size and capacity function</span>
-<a name="l00721"></a>00721 <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{
-<a name="l00722"></a>00722 <span class="keywordflow">return</span> my_solist.empty();
-<a name="l00723"></a>00723 }
-<a name="l00724"></a>00724
-<a name="l00725"></a>00725 size_type size()<span class="keyword"> const </span>{
-<a name="l00726"></a>00726 <span class="keywordflow">return</span> my_solist.size();
-<a name="l00727"></a>00727 }
-<a name="l00728"></a>00728
-<a name="l00729"></a>00729 size_type max_size()<span class="keyword"> const </span>{
-<a name="l00730"></a>00730 <span class="keywordflow">return</span> my_solist.max_size();
-<a name="l00731"></a>00731 }
-<a name="l00732"></a>00732
-<a name="l00733"></a>00733 <span class="comment">// Iterators </span>
-<a name="l00734"></a>00734 iterator begin() {
-<a name="l00735"></a>00735 <span class="keywordflow">return</span> my_solist.begin();
-<a name="l00736"></a>00736 }
-<a name="l00737"></a>00737
-<a name="l00738"></a>00738 const_iterator begin()<span class="keyword"> const </span>{
-<a name="l00739"></a>00739 <span class="keywordflow">return</span> my_solist.begin();
-<a name="l00740"></a>00740 }
-<a name="l00741"></a>00741
-<a name="l00742"></a>00742 iterator end() {
-<a name="l00743"></a>00743 <span class="keywordflow">return</span> my_solist.end();
-<a name="l00744"></a>00744 }
-<a name="l00745"></a>00745
-<a name="l00746"></a>00746 const_iterator end()<span class="keyword"> const </span>{
-<a name="l00747"></a>00747 <span class="keywordflow">return</span> my_solist.end();
-<a name="l00748"></a>00748 }
-<a name="l00749"></a>00749
-<a name="l00750"></a>00750 const_iterator cbegin()<span class="keyword"> const </span>{
-<a name="l00751"></a>00751 <span class="keywordflow">return</span> my_solist.cbegin();
-<a name="l00752"></a>00752 }
-<a name="l00753"></a>00753
-<a name="l00754"></a>00754 const_iterator cend()<span class="keyword"> const </span>{
-<a name="l00755"></a>00755 <span class="keywordflow">return</span> my_solist.cend();
-<a name="l00756"></a>00756 }
-<a name="l00757"></a>00757
-<a name="l00758"></a>00758 <span class="comment">// Parallel traversal support</span>
-<a name="l00759"></a>00759 <span class="keyword">class </span>const_range_type : tbb::internal::no_assign {
-<a name="l00760"></a>00760 <span class="keyword">const</span> concurrent_unordered_base &my_table;
-<a name="l00761"></a>00761 raw_const_iterator my_begin_node;
-<a name="l00762"></a>00762 raw_const_iterator my_end_node;
-<a name="l00763"></a>00763 <span class="keyword">mutable</span> raw_const_iterator my_midpoint_node;
-<a name="l00764"></a>00764 <span class="keyword">public</span>:
-<a name="l00766"></a>00766 <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_unordered_base::size_type size_type;
-<a name="l00767"></a>00767 <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_unordered_base::value_type value_type;
-<a name="l00768"></a>00768 <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_unordered_base::reference reference;
-<a name="l00769"></a>00769 <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_unordered_base::difference_type difference_type;
-<a name="l00770"></a>00770 <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_unordered_base::const_iterator iterator;
-<a name="l00771"></a>00771
-<a name="l00773"></a>00773 <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_begin_node == my_end_node;}
-<a name="l00774"></a>00774
-<a name="l00776"></a>00776 <span class="keywordtype">bool</span> is_divisible()<span class="keyword"> const </span>{
-<a name="l00777"></a>00777 <span class="keywordflow">return</span> my_midpoint_node != my_end_node;
-<a name="l00778"></a>00778 }
-<a name="l00780"></a>00780 const_range_type( const_range_type &r, split ) :
-<a name="l00781"></a>00781 my_table(r.my_table), my_end_node(r.my_end_node)
-<a name="l00782"></a>00782 {
-<a name="l00783"></a>00783 r.my_end_node = my_begin_node = r.my_midpoint_node;
-<a name="l00784"></a>00784 __TBB_ASSERT( !empty(), <span class="stringliteral">"Splitting despite the range is not divisible"</span> );
-<a name="l00785"></a>00785 __TBB_ASSERT( !r.empty(), <span class="stringliteral">"Splitting despite the range is not divisible"</span> );
-<a name="l00786"></a>00786 set_midpoint();
-<a name="l00787"></a>00787 r.set_midpoint();
-<a name="l00788"></a>00788 }
-<a name="l00790"></a>00790 const_range_type( <span class="keyword">const</span> concurrent_unordered_base &a_table ) :
-<a name="l00791"></a>00791 my_table(a_table), my_begin_node(a_table.my_solist.begin()),
-<a name="l00792"></a>00792 my_end_node(a_table.my_solist.end())
-<a name="l00793"></a>00793 {
-<a name="l00794"></a>00794 set_midpoint();
-<a name="l00795"></a>00795 }
-<a name="l00796"></a>00796 iterator begin()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_table.my_solist.get_iterator(my_begin_node); }
-<a name="l00797"></a>00797 iterator end()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_table.my_solist.get_iterator(my_end_node); }
-<a name="l00799"></a>00799 size_type grainsize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> 1; }
-<a name="l00800"></a>00800
-<a name="l00802"></a>00802 <span class="keywordtype">void</span> set_midpoint()<span class="keyword"> const </span>{
-<a name="l00803"></a>00803 <span class="keywordflow">if</span>( my_begin_node == my_end_node ) <span class="comment">// not divisible</span>
-<a name="l00804"></a>00804 my_midpoint_node = my_end_node;
-<a name="l00805"></a>00805 <span class="keywordflow">else</span> {
-<a name="l00806"></a>00806 sokey_t begin_key = solist_t::get_safe_order_key(my_begin_node);
-<a name="l00807"></a>00807 sokey_t end_key = solist_t::get_safe_order_key(my_end_node);
-<a name="l00808"></a>00808 size_t mid_bucket = __TBB_ReverseBits( begin_key + (end_key-begin_key)/2 ) % my_table.my_number_of_buckets;
-<a name="l00809"></a>00809 <span class="keywordflow">while</span> ( !my_table.is_initialized(mid_bucket) ) mid_bucket = my_table.get_parent(mid_bucket);
-<a name="l00810"></a>00810 my_midpoint_node = my_table.my_solist.first_real_iterator(my_table.get_bucket( mid_bucket ));
-<a name="l00811"></a>00811 <span class="keywordflow">if</span>( my_midpoint_node == my_begin_node )
-<a name="l00812"></a>00812 my_midpoint_node = my_end_node;
-<a name="l00813"></a>00813 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00814"></a>00814 <span class="preprocessor"></span> <span class="keywordflow">else</span> {
-<a name="l00815"></a>00815 sokey_t mid_key = solist_t::get_safe_order_key(my_midpoint_node);
-<a name="l00816"></a>00816 __TBB_ASSERT( begin_key < mid_key, <span class="stringliteral">"my_begin_node is after my_midpoint_node"</span> );
-<a name="l00817"></a>00817 __TBB_ASSERT( mid_key <= end_key, <span class="stringliteral">"my_midpoint_node is after my_end_node"</span> );
-<a name="l00818"></a>00818 }
-<a name="l00819"></a>00819 <span class="preprocessor">#endif // TBB_USE_ASSERT</span>
-<a name="l00820"></a>00820 <span class="preprocessor"></span> }
-<a name="l00821"></a>00821 }
-<a name="l00822"></a>00822 };
-<a name="l00823"></a>00823
-<a name="l00824"></a>00824 <span class="keyword">class </span>range_type : <span class="keyword">public</span> const_range_type {
-<a name="l00825"></a>00825 <span class="keyword">public</span>:
-<a name="l00826"></a>00826 <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_unordered_base::iterator iterator;
-<a name="l00828"></a>00828 range_type( range_type &r, split ) : const_range_type( r, split() ) {}
-<a name="l00830"></a>00830 range_type( <span class="keyword">const</span> concurrent_unordered_base &a_table ) : const_range_type(a_table) {}
-<a name="l00831"></a>00831
-<a name="l00832"></a>00832 iterator begin()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> solist_t::get_iterator( const_range_type::begin() ); }
-<a name="l00833"></a>00833 iterator end()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> solist_t::get_iterator( const_range_type::end() ); }
-<a name="l00834"></a>00834 };
-<a name="l00835"></a>00835
-<a name="l00836"></a>00836 range_type range() {
-<a name="l00837"></a>00837 <span class="keywordflow">return</span> range_type( *<span class="keyword">this</span> );
-<a name="l00838"></a>00838 }
-<a name="l00839"></a>00839
-<a name="l00840"></a>00840 const_range_type range()<span class="keyword"> const </span>{
-<a name="l00841"></a>00841 <span class="keywordflow">return</span> const_range_type( *<span class="keyword">this</span> );
-<a name="l00842"></a>00842 }
-<a name="l00843"></a>00843
-<a name="l00844"></a>00844 <span class="comment">// Modifiers</span>
-<a name="l00845"></a>00845 std::pair<iterator, bool> insert(<span class="keyword">const</span> value_type& value) {
-<a name="l00846"></a>00846 <span class="keywordflow">return</span> internal_insert(value);
-<a name="l00847"></a>00847 }
-<a name="l00848"></a>00848
-<a name="l00849"></a>00849 iterator insert(const_iterator, <span class="keyword">const</span> value_type& value) {
-<a name="l00850"></a>00850 <span class="comment">// Ignore hint</span>
-<a name="l00851"></a>00851 <span class="keywordflow">return</span> insert(value).first;
-<a name="l00852"></a>00852 }
-<a name="l00853"></a>00853
-<a name="l00854"></a>00854 <span class="keyword">template</span><<span class="keyword">class</span> Iterator>
-<a name="l00855"></a>00855 <span class="keywordtype">void</span> insert(Iterator first, Iterator last) {
-<a name="l00856"></a>00856 <span class="keywordflow">for</span> (Iterator it = first; it != last; ++it)
-<a name="l00857"></a>00857 insert(*it);
-<a name="l00858"></a>00858 }
-<a name="l00859"></a>00859
-<a name="l00860"></a>00860 iterator unsafe_erase(const_iterator where) {
-<a name="l00861"></a>00861 <span class="keywordflow">return</span> internal_erase(where);
-<a name="l00862"></a>00862 }
-<a name="l00863"></a>00863
-<a name="l00864"></a>00864 iterator unsafe_erase(const_iterator first, const_iterator last) {
-<a name="l00865"></a>00865 <span class="keywordflow">while</span> (first != last)
-<a name="l00866"></a>00866 unsafe_erase(first++);
-<a name="l00867"></a>00867 <span class="keywordflow">return</span> my_solist.get_iterator(first);
-<a name="l00868"></a>00868 }
-<a name="l00869"></a>00869
-<a name="l00870"></a>00870 size_type unsafe_erase(<span class="keyword">const</span> key_type& key) {
-<a name="l00871"></a>00871 pairii_t where = equal_range(key);
-<a name="l00872"></a>00872 size_type item_count = internal_distance(where.first, where.second);
-<a name="l00873"></a>00873 unsafe_erase(where.first, where.second);
-<a name="l00874"></a>00874 <span class="keywordflow">return</span> item_count;
-<a name="l00875"></a>00875 }
-<a name="l00876"></a>00876
-<a name="l00877"></a>00877 <span class="keywordtype">void</span> swap(concurrent_unordered_base& right) {
-<a name="l00878"></a>00878 <span class="keywordflow">if</span> (<span class="keyword">this</span> != &right) {
-<a name="l00879"></a>00879 std::swap(my_hash_compare, right.my_hash_compare); <span class="comment">// TODO: check what ADL meant here</span>
-<a name="l00880"></a>00880 my_solist.swap(right.my_solist);
-<a name="l00881"></a>00881 internal_swap_buckets(right);
-<a name="l00882"></a>00882 std::swap(my_number_of_buckets, right.my_number_of_buckets);
-<a name="l00883"></a>00883 std::swap(my_maximum_bucket_size, right.my_maximum_bucket_size);
-<a name="l00884"></a>00884 }
-<a name="l00885"></a>00885 }
-<a name="l00886"></a>00886
-<a name="l00887"></a>00887 <span class="comment">// Observers</span>
-<a name="l00888"></a>00888 <span class="keywordtype">void</span> clear() {
-<a name="l00889"></a>00889 <span class="comment">// Clear list</span>
-<a name="l00890"></a>00890 my_solist.clear();
-<a name="l00891"></a>00891
-<a name="l00892"></a>00892 <span class="comment">// Clear buckets</span>
-<a name="l00893"></a>00893 internal_clear();
-<a name="l00894"></a>00894 }
-<a name="l00895"></a>00895
-<a name="l00896"></a>00896 <span class="comment">// Lookup</span>
-<a name="l00897"></a>00897 iterator find(<span class="keyword">const</span> key_type& key) {
-<a name="l00898"></a>00898 <span class="keywordflow">return</span> internal_find(key);
-<a name="l00899"></a>00899 }
-<a name="l00900"></a>00900
-<a name="l00901"></a>00901 const_iterator find(<span class="keyword">const</span> key_type& key)<span class="keyword"> const </span>{
-<a name="l00902"></a>00902 <span class="keywordflow">return</span> const_cast<self_type*>(<span class="keyword">this</span>)->internal_find(key);
-<a name="l00903"></a>00903 }
-<a name="l00904"></a>00904
-<a name="l00905"></a>00905 size_type count(<span class="keyword">const</span> key_type& key)<span class="keyword"> const </span>{
-<a name="l00906"></a>00906 paircc_t answer = equal_range(key);
-<a name="l00907"></a>00907 size_type item_count = internal_distance(answer.first, answer.second);
-<a name="l00908"></a>00908 <span class="keywordflow">return</span> item_count;
-<a name="l00909"></a>00909 }
-<a name="l00910"></a>00910
-<a name="l00911"></a>00911 std::pair<iterator, iterator> equal_range(<span class="keyword">const</span> key_type& key) {
-<a name="l00912"></a>00912 <span class="keywordflow">return</span> internal_equal_range(key);
-<a name="l00913"></a>00913 }
-<a name="l00914"></a>00914
-<a name="l00915"></a>00915 std::pair<const_iterator, const_iterator> equal_range(<span class="keyword">const</span> key_type& key)<span class="keyword"> const </span>{
-<a name="l00916"></a>00916 <span class="keywordflow">return</span> internal_equal_range(key);
-<a name="l00917"></a>00917 }
-<a name="l00918"></a>00918
-<a name="l00919"></a>00919 <span class="comment">// Bucket interface - for debugging </span>
-<a name="l00920"></a>00920 size_type unsafe_bucket_count()<span class="keyword"> const </span>{
-<a name="l00921"></a>00921 <span class="keywordflow">return</span> my_number_of_buckets;
-<a name="l00922"></a>00922 }
-<a name="l00923"></a>00923
-<a name="l00924"></a>00924 size_type unsafe_max_bucket_count()<span class="keyword"> const </span>{
-<a name="l00925"></a>00925 <span class="keywordflow">return</span> segment_size(pointers_per_table-1);
-<a name="l00926"></a>00926 }
-<a name="l00927"></a>00927
-<a name="l00928"></a>00928 size_type unsafe_bucket_size(size_type bucket) {
-<a name="l00929"></a>00929 size_type item_count = 0;
-<a name="l00930"></a>00930 <span class="keywordflow">if</span> (is_initialized(bucket)) {
-<a name="l00931"></a>00931 raw_iterator it = get_bucket(bucket);
-<a name="l00932"></a>00932 ++it;
-<a name="l00933"></a>00933 <span class="keywordflow">for</span> (; it != my_solist.raw_end() && !it.get_node_ptr()->is_dummy(); ++it)
-<a name="l00934"></a>00934 ++item_count;
-<a name="l00935"></a>00935 }
-<a name="l00936"></a>00936 <span class="keywordflow">return</span> item_count;
-<a name="l00937"></a>00937 }
-<a name="l00938"></a>00938
-<a name="l00939"></a>00939 size_type unsafe_bucket(<span class="keyword">const</span> key_type& key)<span class="keyword"> const </span>{
-<a name="l00940"></a>00940 sokey_t order_key = (sokey_t) my_hash_compare(key);
-<a name="l00941"></a>00941 size_type bucket = order_key % my_number_of_buckets;
-<a name="l00942"></a>00942 <span class="keywordflow">return</span> bucket;
-<a name="l00943"></a>00943 }
-<a name="l00944"></a>00944
-<a name="l00945"></a>00945 <span class="comment">// If the bucket is initialized, return a first non-dummy element in it</span>
-<a name="l00946"></a>00946 local_iterator unsafe_begin(size_type bucket) {
-<a name="l00947"></a>00947 <span class="keywordflow">if</span> (!is_initialized(bucket))
-<a name="l00948"></a>00948 <span class="keywordflow">return</span> end();
-<a name="l00949"></a>00949
-<a name="l00950"></a>00950 raw_iterator it = get_bucket(bucket);
-<a name="l00951"></a>00951 <span class="keywordflow">return</span> my_solist.first_real_iterator(it);
-<a name="l00952"></a>00952 }
-<a name="l00953"></a>00953
-<a name="l00954"></a>00954 <span class="comment">// If the bucket is initialized, return a first non-dummy element in it</span>
-<a name="l00955"></a>00955 const_local_iterator unsafe_begin(size_type bucket)<span class="keyword"> const</span>
-<a name="l00956"></a>00956 <span class="keyword"> </span>{
-<a name="l00957"></a>00957 <span class="keywordflow">if</span> (!is_initialized(bucket))
-<a name="l00958"></a>00958 <span class="keywordflow">return</span> end();
-<a name="l00959"></a>00959
-<a name="l00960"></a>00960 raw_const_iterator it = get_bucket(bucket);
-<a name="l00961"></a>00961 <span class="keywordflow">return</span> my_solist.first_real_iterator(it);
-<a name="l00962"></a>00962 }
-<a name="l00963"></a>00963
-<a name="l00964"></a>00964 <span class="comment">// @REVIEW: Takes O(n)</span>
-<a name="l00965"></a>00965 <span class="comment">// Returns the iterator after the last non-dummy element in the bucket</span>
-<a name="l00966"></a>00966 local_iterator unsafe_end(size_type bucket)
-<a name="l00967"></a>00967 {
-<a name="l00968"></a>00968 <span class="keywordflow">if</span> (!is_initialized(bucket))
-<a name="l00969"></a>00969 <span class="keywordflow">return</span> end();
-<a name="l00970"></a>00970
-<a name="l00971"></a>00971 raw_iterator it = get_bucket(bucket);
-<a name="l00972"></a>00972
-<a name="l00973"></a>00973 <span class="comment">// Find the end of the bucket, denoted by the dummy element</span>
-<a name="l00974"></a>00974 <span class="keywordflow">do</span> ++it;
-<a name="l00975"></a>00975 <span class="keywordflow">while</span>(it != my_solist.raw_end() && !it.get_node_ptr()->is_dummy());
-<a name="l00976"></a>00976
-<a name="l00977"></a>00977 <span class="comment">// Return the first real element past the end of the bucket</span>
-<a name="l00978"></a>00978 <span class="keywordflow">return</span> my_solist.first_real_iterator(it);
-<a name="l00979"></a>00979 }
-<a name="l00980"></a>00980
-<a name="l00981"></a>00981 <span class="comment">// @REVIEW: Takes O(n)</span>
-<a name="l00982"></a>00982 <span class="comment">// Returns the iterator after the last non-dummy element in the bucket</span>
-<a name="l00983"></a>00983 const_local_iterator unsafe_end(size_type bucket)<span class="keyword"> const</span>
-<a name="l00984"></a>00984 <span class="keyword"> </span>{
-<a name="l00985"></a>00985 <span class="keywordflow">if</span> (!is_initialized(bucket))
-<a name="l00986"></a>00986 <span class="keywordflow">return</span> end();
-<a name="l00987"></a>00987
-<a name="l00988"></a>00988 raw_const_iterator it = get_bucket(bucket);
-<a name="l00989"></a>00989
-<a name="l00990"></a>00990 <span class="comment">// Find the end of the bucket, denoted by the dummy element</span>
-<a name="l00991"></a>00991 <span class="keywordflow">do</span> ++it;
-<a name="l00992"></a>00992 <span class="keywordflow">while</span>(it != my_solist.raw_end() && !it.get_node_ptr()->is_dummy());
-<a name="l00993"></a>00993
-<a name="l00994"></a>00994 <span class="comment">// Return the first real element past the end of the bucket</span>
-<a name="l00995"></a>00995 <span class="keywordflow">return</span> my_solist.first_real_iterator(it);
-<a name="l00996"></a>00996 }
-<a name="l00997"></a>00997
-<a name="l00998"></a>00998 const_local_iterator unsafe_cbegin(size_type bucket)<span class="keyword"> const </span>{
-<a name="l00999"></a>00999 <span class="keywordflow">return</span> ((<span class="keyword">const</span> self_type *) <span class="keyword">this</span>)->begin();
-<a name="l01000"></a>01000 }
-<a name="l01001"></a>01001
-<a name="l01002"></a>01002 const_local_iterator unsafe_cend(size_type bucket)<span class="keyword"> const </span>{
-<a name="l01003"></a>01003 <span class="keywordflow">return</span> ((<span class="keyword">const</span> self_type *) <span class="keyword">this</span>)->end();
-<a name="l01004"></a>01004 }
-<a name="l01005"></a>01005
-<a name="l01006"></a>01006 <span class="comment">// Hash policy</span>
-<a name="l01007"></a>01007 <span class="keywordtype">float</span> load_factor()<span class="keyword"> const </span>{
-<a name="l01008"></a>01008 <span class="keywordflow">return</span> (<span class="keywordtype">float</span>) size() / (float) unsafe_bucket_count();
-<a name="l01009"></a>01009 }
-<a name="l01010"></a>01010
-<a name="l01011"></a>01011 <span class="keywordtype">float</span> max_load_factor()<span class="keyword"> const </span>{
-<a name="l01012"></a>01012 <span class="keywordflow">return</span> my_maximum_bucket_size;
-<a name="l01013"></a>01013 }
-<a name="l01014"></a>01014
-<a name="l01015"></a>01015 <span class="keywordtype">void</span> max_load_factor(<span class="keywordtype">float</span> newmax) {
-<a name="l01016"></a>01016 <span class="keywordflow">if</span> (newmax != newmax || newmax < 0)
-<a name="l01017"></a>01017 tbb::internal::throw_exception(tbb::internal::eid_invalid_load_factor);
-<a name="l01018"></a>01018 my_maximum_bucket_size = newmax;
-<a name="l01019"></a>01019 }
-<a name="l01020"></a>01020
-<a name="l01021"></a>01021 <span class="comment">// This function is a noop, because the underlying split-ordered list</span>
-<a name="l01022"></a>01022 <span class="comment">// is already sorted, so an increase in the bucket number will be</span>
-<a name="l01023"></a>01023 <span class="comment">// reflected next time this bucket is touched.</span>
-<a name="l01024"></a>01024 <span class="keywordtype">void</span> rehash(size_type buckets) {
-<a name="l01025"></a>01025 size_type current_buckets = my_number_of_buckets;
-<a name="l01026"></a>01026
-<a name="l01027"></a>01027 <span class="keywordflow">if</span> (current_buckets > buckets)
-<a name="l01028"></a>01028 <span class="keywordflow">return</span>;
-<a name="l01029"></a>01029 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( (buckets & (buckets-1)) != 0 )
-<a name="l01030"></a>01030 tbb::internal::throw_exception(tbb::internal::eid_invalid_buckets_number);
-<a name="l01031"></a>01031 my_number_of_buckets = buckets;
-<a name="l01032"></a>01032 }
-<a name="l01033"></a>01033
-<a name="l01034"></a>01034 <span class="keyword">private</span>:
-<a name="l01035"></a>01035
-<a name="l01036"></a>01036 <span class="comment">// Initialize the hash and keep the first bucket open</span>
-<a name="l01037"></a>01037 <span class="keywordtype">void</span> internal_init() {
-<a name="l01038"></a>01038 <span class="comment">// Allocate an array of segment pointers</span>
-<a name="l01039"></a>01039 memset(my_buckets, 0, pointers_per_table * <span class="keyword">sizeof</span>(<span class="keywordtype">void</span> *));
-<a name="l01040"></a>01040
-<a name="l01041"></a>01041 <span class="comment">// Insert the first element in the split-ordered list</span>
-<a name="l01042"></a>01042 raw_iterator dummy_node = my_solist.raw_begin();
-<a name="l01043"></a>01043 set_bucket(0, dummy_node);
-<a name="l01044"></a>01044 }
-<a name="l01045"></a>01045
-<a name="l01046"></a>01046 <span class="keywordtype">void</span> internal_clear() {
-<a name="l01047"></a>01047 <span class="keywordflow">for</span> (size_type index = 0; index < pointers_per_table; ++index) {
-<a name="l01048"></a>01048 <span class="keywordflow">if</span> (my_buckets[index] != NULL) {
-<a name="l01049"></a>01049 size_type sz = segment_size(index);
-<a name="l01050"></a>01050 <span class="keywordflow">for</span> (size_type index2 = 0; index2 < sz; ++index2)
-<a name="l01051"></a>01051 my_allocator.destroy(&my_buckets[index][index2]);
-<a name="l01052"></a>01052 my_allocator.deallocate(my_buckets[index], sz);
-<a name="l01053"></a>01053 my_buckets[index] = 0;
-<a name="l01054"></a>01054 }
-<a name="l01055"></a>01055 }
-<a name="l01056"></a>01056 }
-<a name="l01057"></a>01057
-<a name="l01058"></a>01058 <span class="keywordtype">void</span> internal_copy(<span class="keyword">const</span> self_type& right) {
-<a name="l01059"></a>01059 clear();
-<a name="l01060"></a>01060
-<a name="l01061"></a>01061 my_maximum_bucket_size = right.my_maximum_bucket_size;
-<a name="l01062"></a>01062 my_number_of_buckets = right.my_number_of_buckets;
-<a name="l01063"></a>01063
-<a name="l01064"></a>01064 __TBB_TRY {
-<a name="l01065"></a>01065 insert(right.begin(), right.end());
-<a name="l01066"></a>01066 my_hash_compare = right.my_hash_compare;
-<a name="l01067"></a>01067 } __TBB_CATCH(...) {
-<a name="l01068"></a>01068 my_solist.clear();
-<a name="l01069"></a>01069 __TBB_RETHROW();
-<a name="l01070"></a>01070 }
-<a name="l01071"></a>01071 }
-<a name="l01072"></a>01072
-<a name="l01073"></a>01073 <span class="keywordtype">void</span> internal_swap_buckets(concurrent_unordered_base& right)
-<a name="l01074"></a>01074 {
-<a name="l01075"></a>01075 <span class="comment">// Swap all node segments</span>
-<a name="l01076"></a>01076 <span class="keywordflow">for</span> (size_type index = 0; index < pointers_per_table; ++index)
-<a name="l01077"></a>01077 {
-<a name="l01078"></a>01078 raw_iterator * iterator_pointer = my_buckets[index];
-<a name="l01079"></a>01079 my_buckets[index] = right.my_buckets[index];
-<a name="l01080"></a>01080 right.my_buckets[index] = iterator_pointer;
-<a name="l01081"></a>01081 }
-<a name="l01082"></a>01082 }
-<a name="l01083"></a>01083
-<a name="l01084"></a>01084 <span class="comment">// Hash APIs</span>
-<a name="l01085"></a>01085 size_type internal_distance(const_iterator first, const_iterator last)<span class="keyword"> const</span>
-<a name="l01086"></a>01086 <span class="keyword"> </span>{
-<a name="l01087"></a>01087 size_type num = 0;
-<a name="l01088"></a>01088
-<a name="l01089"></a>01089 <span class="keywordflow">for</span> (const_iterator it = first; it != last; ++it)
-<a name="l01090"></a>01090 ++num;
-<a name="l01091"></a>01091
-<a name="l01092"></a>01092 <span class="keywordflow">return</span> num;
-<a name="l01093"></a>01093 }
-<a name="l01094"></a>01094
-<a name="l01095"></a>01095 <span class="comment">// Insert an element in the hash given its value</span>
-<a name="l01096"></a>01096 std::pair<iterator, bool> internal_insert(<span class="keyword">const</span> value_type& value)
-<a name="l01097"></a>01097 {
-<a name="l01098"></a>01098 sokey_t order_key = (sokey_t) my_hash_compare(get_key(value));
-<a name="l01099"></a>01099 size_type bucket = order_key % my_number_of_buckets;
-<a name="l01100"></a>01100
-<a name="l01101"></a>01101 <span class="comment">// If bucket is empty, initialize it first</span>
-<a name="l01102"></a>01102 <span class="keywordflow">if</span> (!is_initialized(bucket))
-<a name="l01103"></a>01103 init_bucket(bucket);
-<a name="l01104"></a>01104
-<a name="l01105"></a>01105 size_type new_count;
-<a name="l01106"></a>01106 order_key = split_order_key_regular(order_key);
-<a name="l01107"></a>01107 raw_iterator it = get_bucket(bucket);
-<a name="l01108"></a>01108 raw_iterator last = my_solist.raw_end();
-<a name="l01109"></a>01109 raw_iterator where = it;
-<a name="l01110"></a>01110
-<a name="l01111"></a>01111 __TBB_ASSERT(where != last, <span class="stringliteral">"Invalid head node"</span>);
-<a name="l01112"></a>01112
-<a name="l01113"></a>01113 <span class="comment">// First node is a dummy node</span>
-<a name="l01114"></a>01114 ++where;
-<a name="l01115"></a>01115
-<a name="l01116"></a>01116 <span class="keywordflow">for</span> (;;)
-<a name="l01117"></a>01117 {
-<a name="l01118"></a>01118 <span class="keywordflow">if</span> (where == last || solist_t::get_order_key(where) > order_key)
-<a name="l01119"></a>01119 {
-<a name="l01120"></a>01120 <span class="comment">// Try to insert it in the right place</span>
-<a name="l01121"></a>01121 std::pair<iterator, bool> result = my_solist.try_insert(it, where, value, order_key, &new_count);
-<a name="l01122"></a>01122
-<a name="l01123"></a>01123 <span class="keywordflow">if</span> (result.second)
-<a name="l01124"></a>01124 {
-<a name="l01125"></a>01125 <span class="comment">// Insertion succeeded, adjust the table size, if needed</span>
-<a name="l01126"></a>01126 adjust_table_size(new_count, my_number_of_buckets);
-<a name="l01127"></a>01127 <span class="keywordflow">return</span> result;
-<a name="l01128"></a>01128 }
-<a name="l01129"></a>01129 <span class="keywordflow">else</span>
-<a name="l01130"></a>01130 {
-<a name="l01131"></a>01131 <span class="comment">// Insertion failed: either the same node was inserted by another thread, or</span>
-<a name="l01132"></a>01132 <span class="comment">// another element was inserted at exactly the same place as this node.</span>
-<a name="l01133"></a>01133 <span class="comment">// Proceed with the search from the previous location where order key was</span>
-<a name="l01134"></a>01134 <span class="comment">// known to be larger (note: this is legal only because there is no safe</span>
-<a name="l01135"></a>01135 <span class="comment">// concurrent erase operation supported).</span>
-<a name="l01136"></a>01136 where = it;
-<a name="l01137"></a>01137 ++where;
-<a name="l01138"></a>01138 <span class="keywordflow">continue</span>;
-<a name="l01139"></a>01139 }
-<a name="l01140"></a>01140 }
-<a name="l01141"></a>01141 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!allow_multimapping && solist_t::get_order_key(where) == order_key && my_hash_compare(get_key(*where), get_key(value)) == 0)
-<a name="l01142"></a>01142 {
-<a name="l01143"></a>01143 <span class="comment">// Element already in the list, return it</span>
-<a name="l01144"></a>01144 <span class="keywordflow">return</span> std::pair<iterator, bool>(my_solist.get_iterator(where), <span class="keyword">false</span>);
-<a name="l01145"></a>01145 }
-<a name="l01146"></a>01146
-<a name="l01147"></a>01147 <span class="comment">// Move the iterator forward</span>
-<a name="l01148"></a>01148 it = where;
-<a name="l01149"></a>01149 ++where;
-<a name="l01150"></a>01150 }
-<a name="l01151"></a>01151 }
-<a name="l01152"></a>01152
-<a name="l01153"></a>01153 <span class="comment">// Find the element in the split-ordered list</span>
-<a name="l01154"></a>01154 iterator internal_find(<span class="keyword">const</span> key_type& key)
-<a name="l01155"></a>01155 {
-<a name="l01156"></a>01156 sokey_t order_key = (sokey_t) my_hash_compare(key);
-<a name="l01157"></a>01157 size_type bucket = order_key % my_number_of_buckets;
-<a name="l01158"></a>01158
-<a name="l01159"></a>01159 <span class="comment">// If bucket is empty, initialize it first</span>
-<a name="l01160"></a>01160 <span class="keywordflow">if</span> (!is_initialized(bucket))
-<a name="l01161"></a>01161 init_bucket(bucket);
-<a name="l01162"></a>01162
-<a name="l01163"></a>01163 order_key = split_order_key_regular(order_key);
-<a name="l01164"></a>01164 raw_iterator last = my_solist.raw_end();
-<a name="l01165"></a>01165
-<a name="l01166"></a>01166 <span class="keywordflow">for</span> (raw_iterator it = get_bucket(bucket); it != last; ++it)
-<a name="l01167"></a>01167 {
-<a name="l01168"></a>01168 <span class="keywordflow">if</span> (solist_t::get_order_key(it) > order_key)
-<a name="l01169"></a>01169 {
-<a name="l01170"></a>01170 <span class="comment">// If the order key is smaller than the current order key, the element</span>
-<a name="l01171"></a>01171 <span class="comment">// is not in the hash.</span>
-<a name="l01172"></a>01172 <span class="keywordflow">return</span> end();
-<a name="l01173"></a>01173 }
-<a name="l01174"></a>01174 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (solist_t::get_order_key(it) == order_key)
-<a name="l01175"></a>01175 {
-<a name="l01176"></a>01176 <span class="comment">// The fact that order keys match does not mean that the element is found.</span>
-<a name="l01177"></a>01177 <span class="comment">// Key function comparison has to be performed to check whether this is the</span>
-<a name="l01178"></a>01178 <span class="comment">// right element. If not, keep searching while order key is the same.</span>
-<a name="l01179"></a>01179 <span class="keywordflow">if</span> (!my_hash_compare(get_key(*it), key))
-<a name="l01180"></a>01180 <span class="keywordflow">return</span> my_solist.get_iterator(it);
-<a name="l01181"></a>01181 }
-<a name="l01182"></a>01182 }
-<a name="l01183"></a>01183
-<a name="l01184"></a>01184 <span class="keywordflow">return</span> end();
-<a name="l01185"></a>01185 }
-<a name="l01186"></a>01186
-<a name="l01187"></a>01187 <span class="comment">// Erase an element from the list. This is not a concurrency safe function.</span>
-<a name="l01188"></a>01188 iterator internal_erase(const_iterator it)
-<a name="l01189"></a>01189 {
-<a name="l01190"></a>01190 key_type key = get_key(*it);
-<a name="l01191"></a>01191 sokey_t order_key = (sokey_t) my_hash_compare(key);
-<a name="l01192"></a>01192 size_type bucket = order_key % my_number_of_buckets;
-<a name="l01193"></a>01193
-<a name="l01194"></a>01194 <span class="comment">// If bucket is empty, initialize it first</span>
-<a name="l01195"></a>01195 <span class="keywordflow">if</span> (!is_initialized(bucket))
-<a name="l01196"></a>01196 init_bucket(bucket);
-<a name="l01197"></a>01197
-<a name="l01198"></a>01198 order_key = split_order_key_regular(order_key);
-<a name="l01199"></a>01199
-<a name="l01200"></a>01200 raw_iterator previous = get_bucket(bucket);
-<a name="l01201"></a>01201 raw_iterator last = my_solist.raw_end();
-<a name="l01202"></a>01202 raw_iterator where = previous;
-<a name="l01203"></a>01203
-<a name="l01204"></a>01204 __TBB_ASSERT(where != last, <span class="stringliteral">"Invalid head node"</span>);
-<a name="l01205"></a>01205
-<a name="l01206"></a>01206 <span class="comment">// First node is a dummy node</span>
-<a name="l01207"></a>01207 ++where;
-<a name="l01208"></a>01208
-<a name="l01209"></a>01209 <span class="keywordflow">for</span> (;;) {
-<a name="l01210"></a>01210 <span class="keywordflow">if</span> (where == last)
-<a name="l01211"></a>01211 <span class="keywordflow">return</span> end();
-<a name="l01212"></a>01212 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (my_solist.get_iterator(where) == it)
-<a name="l01213"></a>01213 <span class="keywordflow">return</span> my_solist.erase_node(previous, it);
-<a name="l01214"></a>01214
-<a name="l01215"></a>01215 <span class="comment">// Move the iterator forward</span>
-<a name="l01216"></a>01216 previous = where;
-<a name="l01217"></a>01217 ++where;
-<a name="l01218"></a>01218 }
-<a name="l01219"></a>01219 }
-<a name="l01220"></a>01220
-<a name="l01221"></a>01221 <span class="comment">// Return the [begin, end) pair of iterators with the same key values.</span>
-<a name="l01222"></a>01222 <span class="comment">// This operation makes sense only if mapping is many-to-one.</span>
-<a name="l01223"></a>01223 pairii_t internal_equal_range(<span class="keyword">const</span> key_type& key)
-<a name="l01224"></a>01224 {
-<a name="l01225"></a>01225 sokey_t order_key = (sokey_t) my_hash_compare(key);
-<a name="l01226"></a>01226 size_type bucket = order_key % my_number_of_buckets;
-<a name="l01227"></a>01227
-<a name="l01228"></a>01228 <span class="comment">// If bucket is empty, initialize it first</span>
-<a name="l01229"></a>01229 <span class="keywordflow">if</span> (!is_initialized(bucket))
-<a name="l01230"></a>01230 init_bucket(bucket);
-<a name="l01231"></a>01231
-<a name="l01232"></a>01232 order_key = split_order_key_regular(order_key);
-<a name="l01233"></a>01233 raw_iterator end_it = my_solist.raw_end();
-<a name="l01234"></a>01234
-<a name="l01235"></a>01235 <span class="keywordflow">for</span> (raw_iterator it = get_bucket(bucket); it != end_it; ++it)
-<a name="l01236"></a>01236 {
-<a name="l01237"></a>01237 <span class="keywordflow">if</span> (solist_t::get_order_key(it) > order_key)
-<a name="l01238"></a>01238 {
-<a name="l01239"></a>01239 <span class="comment">// There is no element with the given key</span>
-<a name="l01240"></a>01240 <span class="keywordflow">return</span> pairii_t(end(), end());
-<a name="l01241"></a>01241 }
-<a name="l01242"></a>01242 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (solist_t::get_order_key(it) == order_key && !my_hash_compare(get_key(*it), key))
-<a name="l01243"></a>01243 {
-<a name="l01244"></a>01244 iterator first = my_solist.get_iterator(it);
-<a name="l01245"></a>01245 iterator last = first;
-<a name="l01246"></a>01246
-<a name="l01247"></a>01247 <span class="keywordflow">while</span>( last != end() && !my_hash_compare(get_key(*last), key) )
-<a name="l01248"></a>01248 ++last;
-<a name="l01249"></a>01249 <span class="keywordflow">return</span> pairii_t(first, last);
-<a name="l01250"></a>01250 }
-<a name="l01251"></a>01251 }
-<a name="l01252"></a>01252
-<a name="l01253"></a>01253 <span class="keywordflow">return</span> pairii_t(end(), end());
-<a name="l01254"></a>01254 }
-<a name="l01255"></a>01255
-<a name="l01256"></a>01256 <span class="comment">// Return the [begin, end) pair of const iterators with the same key values.</span>
-<a name="l01257"></a>01257 <span class="comment">// This operation makes sense only if mapping is many-to-one.</span>
-<a name="l01258"></a>01258 paircc_t internal_equal_range(<span class="keyword">const</span> key_type& key)<span class="keyword"> const</span>
-<a name="l01259"></a>01259 <span class="keyword"> </span>{
-<a name="l01260"></a>01260 sokey_t order_key = (sokey_t) my_hash_compare(key);
-<a name="l01261"></a>01261 size_type bucket = order_key % my_number_of_buckets;
-<a name="l01262"></a>01262
-<a name="l01263"></a>01263 <span class="comment">// If bucket is empty, initialize it first</span>
-<a name="l01264"></a>01264 <span class="keywordflow">if</span> (!is_initialized(bucket))
-<a name="l01265"></a>01265 <span class="keywordflow">return</span> paircc_t(end(), end());
-<a name="l01266"></a>01266
-<a name="l01267"></a>01267 order_key = split_order_key_regular(order_key);
-<a name="l01268"></a>01268 raw_const_iterator end_it = my_solist.raw_end();
+<a name="l00688"></a>00688 __TBB_ASSERT( n_of_buckets, <span class="stringliteral">"number of buckets must be greater than 0"</span>);
+<a name="l00689"></a>00689 my_number_of_buckets = 1<<__TBB_Log2((uintptr_t)n_of_buckets*2-1); <span class="comment">// round up to power of 2</span>
+<a name="l00690"></a>00690 internal_init();
+<a name="l00691"></a>00691 }
+<a name="l00692"></a>00692
+<a name="l00693"></a>00693 concurrent_unordered_base(<span class="keyword">const</span> concurrent_unordered_base& right, <span class="keyword">const</span> allocator_type& a)
+<a name="l00694"></a>00694 : Traits(right.my_hash_compare), my_solist(a), my_allocator(a)
+<a name="l00695"></a>00695 {
+<a name="l00696"></a>00696 internal_copy(right);
+<a name="l00697"></a>00697 }
+<a name="l00698"></a>00698
+<a name="l00699"></a>00699 concurrent_unordered_base(<span class="keyword">const</span> concurrent_unordered_base& right)
+<a name="l00700"></a>00700 : Traits(right.my_hash_compare), my_solist(right.get_allocator()), my_allocator(right.get_allocator())
+<a name="l00701"></a>00701 {
+<a name="l00702"></a>00702 internal_init();
+<a name="l00703"></a>00703 internal_copy(right);
+<a name="l00704"></a>00704 }
+<a name="l00705"></a>00705
+<a name="l00706"></a>00706 concurrent_unordered_base& operator=(<span class="keyword">const</span> concurrent_unordered_base& right) {
+<a name="l00707"></a>00707 <span class="keywordflow">if</span> (<span class="keyword">this</span> != &right)
+<a name="l00708"></a>00708 internal_copy(right);
+<a name="l00709"></a>00709 <span class="keywordflow">return</span> (*<span class="keyword">this</span>);
+<a name="l00710"></a>00710 }
+<a name="l00711"></a>00711
+<a name="l00712"></a>00712 ~concurrent_unordered_base() {
+<a name="l00713"></a>00713 <span class="comment">// Delete all node segments</span>
+<a name="l00714"></a>00714 internal_clear();
+<a name="l00715"></a>00715 }
+<a name="l00716"></a>00716
+<a name="l00717"></a>00717 <span class="keyword">public</span>:
+<a name="l00718"></a>00718 allocator_type get_allocator()<span class="keyword"> const </span>{
+<a name="l00719"></a>00719 <span class="keywordflow">return</span> my_solist.get_allocator();
+<a name="l00720"></a>00720 }
+<a name="l00721"></a>00721
+<a name="l00722"></a>00722 <span class="comment">// Size and capacity function</span>
+<a name="l00723"></a>00723 <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{
+<a name="l00724"></a>00724 <span class="keywordflow">return</span> my_solist.empty();
+<a name="l00725"></a>00725 }
+<a name="l00726"></a>00726
+<a name="l00727"></a>00727 size_type size()<span class="keyword"> const </span>{
+<a name="l00728"></a>00728 <span class="keywordflow">return</span> my_solist.size();
+<a name="l00729"></a>00729 }
+<a name="l00730"></a>00730
+<a name="l00731"></a>00731 size_type max_size()<span class="keyword"> const </span>{
+<a name="l00732"></a>00732 <span class="keywordflow">return</span> my_solist.max_size();
+<a name="l00733"></a>00733 }
+<a name="l00734"></a>00734
+<a name="l00735"></a>00735 <span class="comment">// Iterators </span>
+<a name="l00736"></a>00736 iterator begin() {
+<a name="l00737"></a>00737 <span class="keywordflow">return</span> my_solist.begin();
+<a name="l00738"></a>00738 }
+<a name="l00739"></a>00739
+<a name="l00740"></a>00740 const_iterator begin()<span class="keyword"> const </span>{
+<a name="l00741"></a>00741 <span class="keywordflow">return</span> my_solist.begin();
+<a name="l00742"></a>00742 }
+<a name="l00743"></a>00743
+<a name="l00744"></a>00744 iterator end() {
+<a name="l00745"></a>00745 <span class="keywordflow">return</span> my_solist.end();
+<a name="l00746"></a>00746 }
+<a name="l00747"></a>00747
+<a name="l00748"></a>00748 const_iterator end()<span class="keyword"> const </span>{
+<a name="l00749"></a>00749 <span class="keywordflow">return</span> my_solist.end();
+<a name="l00750"></a>00750 }
+<a name="l00751"></a>00751
+<a name="l00752"></a>00752 const_iterator cbegin()<span class="keyword"> const </span>{
+<a name="l00753"></a>00753 <span class="keywordflow">return</span> my_solist.cbegin();
+<a name="l00754"></a>00754 }
+<a name="l00755"></a>00755
+<a name="l00756"></a>00756 const_iterator cend()<span class="keyword"> const </span>{
+<a name="l00757"></a>00757 <span class="keywordflow">return</span> my_solist.cend();
+<a name="l00758"></a>00758 }
+<a name="l00759"></a>00759
+<a name="l00760"></a>00760 <span class="comment">// Parallel traversal support</span>
+<a name="l00761"></a>00761 <span class="keyword">class </span>const_range_type : tbb::internal::no_assign {
+<a name="l00762"></a>00762 <span class="keyword">const</span> concurrent_unordered_base &my_table;
+<a name="l00763"></a>00763 raw_const_iterator my_begin_node;
+<a name="l00764"></a>00764 raw_const_iterator my_end_node;
+<a name="l00765"></a>00765 <span class="keyword">mutable</span> raw_const_iterator my_midpoint_node;
+<a name="l00766"></a>00766 <span class="keyword">public</span>:
+<a name="l00768"></a>00768 <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_unordered_base::size_type size_type;
+<a name="l00769"></a>00769 <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_unordered_base::value_type value_type;
+<a name="l00770"></a>00770 <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_unordered_base::reference reference;
+<a name="l00771"></a>00771 <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_unordered_base::difference_type difference_type;
+<a name="l00772"></a>00772 <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_unordered_base::const_iterator iterator;
+<a name="l00773"></a>00773
+<a name="l00775"></a>00775 <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_begin_node == my_end_node;}
+<a name="l00776"></a>00776
+<a name="l00778"></a>00778 <span class="keywordtype">bool</span> is_divisible()<span class="keyword"> const </span>{
+<a name="l00779"></a>00779 <span class="keywordflow">return</span> my_midpoint_node != my_end_node;
+<a name="l00780"></a>00780 }
+<a name="l00782"></a>00782 const_range_type( const_range_type &r, split ) :
+<a name="l00783"></a>00783 my_table(r.my_table), my_end_node(r.my_end_node)
+<a name="l00784"></a>00784 {
+<a name="l00785"></a>00785 r.my_end_node = my_begin_node = r.my_midpoint_node;
+<a name="l00786"></a>00786 __TBB_ASSERT( !empty(), <span class="stringliteral">"Splitting despite the range is not divisible"</span> );
+<a name="l00787"></a>00787 __TBB_ASSERT( !r.empty(), <span class="stringliteral">"Splitting despite the range is not divisible"</span> );
+<a name="l00788"></a>00788 set_midpoint();
+<a name="l00789"></a>00789 r.set_midpoint();
+<a name="l00790"></a>00790 }
+<a name="l00792"></a>00792 const_range_type( <span class="keyword">const</span> concurrent_unordered_base &a_table ) :
+<a name="l00793"></a>00793 my_table(a_table), my_begin_node(a_table.my_solist.begin()),
+<a name="l00794"></a>00794 my_end_node(a_table.my_solist.end())
+<a name="l00795"></a>00795 {
+<a name="l00796"></a>00796 set_midpoint();
+<a name="l00797"></a>00797 }
+<a name="l00798"></a>00798 iterator begin()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_table.my_solist.get_iterator(my_begin_node); }
+<a name="l00799"></a>00799 iterator end()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_table.my_solist.get_iterator(my_end_node); }
+<a name="l00801"></a>00801 size_type grainsize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> 1; }
+<a name="l00802"></a>00802
+<a name="l00804"></a>00804 <span class="keywordtype">void</span> set_midpoint()<span class="keyword"> const </span>{
+<a name="l00805"></a>00805 <span class="keywordflow">if</span>( my_begin_node == my_end_node ) <span class="comment">// not divisible</span>
+<a name="l00806"></a>00806 my_midpoint_node = my_end_node;
+<a name="l00807"></a>00807 <span class="keywordflow">else</span> {
+<a name="l00808"></a>00808 sokey_t begin_key = solist_t::get_safe_order_key(my_begin_node);
+<a name="l00809"></a>00809 sokey_t end_key = solist_t::get_safe_order_key(my_end_node);
+<a name="l00810"></a>00810 size_t mid_bucket = __TBB_ReverseBits( begin_key + (end_key-begin_key)/2 ) % my_table.my_number_of_buckets;
+<a name="l00811"></a>00811 <span class="keywordflow">while</span> ( !my_table.is_initialized(mid_bucket) ) mid_bucket = my_table.get_parent(mid_bucket);
+<a name="l00812"></a>00812 my_midpoint_node = my_table.my_solist.first_real_iterator(my_table.get_bucket( mid_bucket ));
+<a name="l00813"></a>00813 <span class="keywordflow">if</span>( my_midpoint_node == my_begin_node )
+<a name="l00814"></a>00814 my_midpoint_node = my_end_node;
+<a name="l00815"></a>00815 <span class="preprocessor">#if TBB_USE_ASSERT</span>
+<a name="l00816"></a>00816 <span class="preprocessor"></span> <span class="keywordflow">else</span> {
+<a name="l00817"></a>00817 sokey_t mid_key = solist_t::get_safe_order_key(my_midpoint_node);
+<a name="l00818"></a>00818 __TBB_ASSERT( begin_key < mid_key, <span class="stringliteral">"my_begin_node is after my_midpoint_node"</span> );
+<a name="l00819"></a>00819 __TBB_ASSERT( mid_key <= end_key, <span class="stringliteral">"my_midpoint_node is after my_end_node"</span> );
+<a name="l00820"></a>00820 }
+<a name="l00821"></a>00821 <span class="preprocessor">#endif // TBB_USE_ASSERT</span>
+<a name="l00822"></a>00822 <span class="preprocessor"></span> }
+<a name="l00823"></a>00823 }
+<a name="l00824"></a>00824 };
+<a name="l00825"></a>00825
+<a name="l00826"></a>00826 <span class="keyword">class </span>range_type : <span class="keyword">public</span> const_range_type {
+<a name="l00827"></a>00827 <span class="keyword">public</span>:
+<a name="l00828"></a>00828 <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_unordered_base::iterator iterator;
+<a name="l00830"></a>00830 range_type( range_type &r, split ) : const_range_type( r, split() ) {}
+<a name="l00832"></a>00832 range_type( <span class="keyword">const</span> concurrent_unordered_base &a_table ) : const_range_type(a_table) {}
+<a name="l00833"></a>00833
+<a name="l00834"></a>00834 iterator begin()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> solist_t::get_iterator( const_range_type::begin() ); }
+<a name="l00835"></a>00835 iterator end()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> solist_t::get_iterator( const_range_type::end() ); }
+<a name="l00836"></a>00836 };
+<a name="l00837"></a>00837
+<a name="l00838"></a>00838 range_type range() {
+<a name="l00839"></a>00839 <span class="keywordflow">return</span> range_type( *<span class="keyword">this</span> );
+<a name="l00840"></a>00840 }
+<a name="l00841"></a>00841
+<a name="l00842"></a>00842 const_range_type range()<span class="keyword"> const </span>{
+<a name="l00843"></a>00843 <span class="keywordflow">return</span> const_range_type( *<span class="keyword">this</span> );
+<a name="l00844"></a>00844 }
+<a name="l00845"></a>00845
+<a name="l00846"></a>00846 <span class="comment">// Modifiers</span>
+<a name="l00847"></a>00847 std::pair<iterator, bool> insert(<span class="keyword">const</span> value_type& value) {
+<a name="l00848"></a>00848 <span class="keywordflow">return</span> internal_insert(value);
+<a name="l00849"></a>00849 }
+<a name="l00850"></a>00850
+<a name="l00851"></a>00851 iterator insert(const_iterator, <span class="keyword">const</span> value_type& value) {
+<a name="l00852"></a>00852 <span class="comment">// Ignore hint</span>
+<a name="l00853"></a>00853 <span class="keywordflow">return</span> insert(value).first;
+<a name="l00854"></a>00854 }
+<a name="l00855"></a>00855
+<a name="l00856"></a>00856 <span class="keyword">template</span><<span class="keyword">class</span> Iterator>
+<a name="l00857"></a>00857 <span class="keywordtype">void</span> insert(Iterator first, Iterator last) {
+<a name="l00858"></a>00858 <span class="keywordflow">for</span> (Iterator it = first; it != last; ++it)
+<a name="l00859"></a>00859 insert(*it);
+<a name="l00860"></a>00860 }
+<a name="l00861"></a>00861
+<a name="l00862"></a>00862 iterator unsafe_erase(const_iterator where) {
+<a name="l00863"></a>00863 <span class="keywordflow">return</span> internal_erase(where);
+<a name="l00864"></a>00864 }
+<a name="l00865"></a>00865
+<a name="l00866"></a>00866 iterator unsafe_erase(const_iterator first, const_iterator last) {
+<a name="l00867"></a>00867 <span class="keywordflow">while</span> (first != last)
+<a name="l00868"></a>00868 unsafe_erase(first++);
+<a name="l00869"></a>00869 <span class="keywordflow">return</span> my_solist.get_iterator(first);
+<a name="l00870"></a>00870 }
+<a name="l00871"></a>00871
+<a name="l00872"></a>00872 size_type unsafe_erase(<span class="keyword">const</span> key_type& key) {
+<a name="l00873"></a>00873 pairii_t where = equal_range(key);
+<a name="l00874"></a>00874 size_type item_count = internal_distance(where.first, where.second);
+<a name="l00875"></a>00875 unsafe_erase(where.first, where.second);
+<a name="l00876"></a>00876 <span class="keywordflow">return</span> item_count;
+<a name="l00877"></a>00877 }
+<a name="l00878"></a>00878
+<a name="l00879"></a>00879 <span class="keywordtype">void</span> swap(concurrent_unordered_base& right) {
+<a name="l00880"></a>00880 <span class="keywordflow">if</span> (<span class="keyword">this</span> != &right) {
+<a name="l00881"></a>00881 std::swap(my_hash_compare, right.my_hash_compare); <span class="comment">// TODO: check what ADL meant here</span>
+<a name="l00882"></a>00882 my_solist.swap(right.my_solist);
+<a name="l00883"></a>00883 internal_swap_buckets(right);
+<a name="l00884"></a>00884 std::swap(my_number_of_buckets, right.my_number_of_buckets);
+<a name="l00885"></a>00885 std::swap(my_maximum_bucket_size, right.my_maximum_bucket_size);
+<a name="l00886"></a>00886 }
+<a name="l00887"></a>00887 }
+<a name="l00888"></a>00888
+<a name="l00889"></a>00889 <span class="comment">// Observers</span>
+<a name="l00890"></a>00890 <span class="keywordtype">void</span> clear() {
+<a name="l00891"></a>00891 <span class="comment">// Clear list</span>
+<a name="l00892"></a>00892 my_solist.clear();
+<a name="l00893"></a>00893
+<a name="l00894"></a>00894 <span class="comment">// Clear buckets</span>
+<a name="l00895"></a>00895 internal_clear();
+<a name="l00896"></a>00896 }
+<a name="l00897"></a>00897
+<a name="l00898"></a>00898 <span class="comment">// Lookup</span>
+<a name="l00899"></a>00899 iterator find(<span class="keyword">const</span> key_type& key) {
+<a name="l00900"></a>00900 <span class="keywordflow">return</span> internal_find(key);
+<a name="l00901"></a>00901 }
+<a name="l00902"></a>00902
+<a name="l00903"></a>00903 const_iterator find(<span class="keyword">const</span> key_type& key)<span class="keyword"> const </span>{
+<a name="l00904"></a>00904 <span class="keywordflow">return</span> const_cast<self_type*>(<span class="keyword">this</span>)->internal_find(key);
+<a name="l00905"></a>00905 }
+<a name="l00906"></a>00906
+<a name="l00907"></a>00907 size_type count(<span class="keyword">const</span> key_type& key)<span class="keyword"> const </span>{
+<a name="l00908"></a>00908 paircc_t answer = equal_range(key);
+<a name="l00909"></a>00909 size_type item_count = internal_distance(answer.first, answer.second);
+<a name="l00910"></a>00910 <span class="keywordflow">return</span> item_count;
+<a name="l00911"></a>00911 }
+<a name="l00912"></a>00912
+<a name="l00913"></a>00913 std::pair<iterator, iterator> equal_range(<span class="keyword">const</span> key_type& key) {
+<a name="l00914"></a>00914 <span class="keywordflow">return</span> internal_equal_range(key);
+<a name="l00915"></a>00915 }
+<a name="l00916"></a>00916
+<a name="l00917"></a>00917 std::pair<const_iterator, const_iterator> equal_range(<span class="keyword">const</span> key_type& key)<span class="keyword"> const </span>{
+<a name="l00918"></a>00918 <span class="keywordflow">return</span> const_cast<self_type*>(<span class="keyword">this</span>)->internal_equal_range(key);
+<a name="l00919"></a>00919 }
+<a name="l00920"></a>00920
+<a name="l00921"></a>00921 <span class="comment">// Bucket interface - for debugging </span>
+<a name="l00922"></a>00922 size_type unsafe_bucket_count()<span class="keyword"> const </span>{
+<a name="l00923"></a>00923 <span class="keywordflow">return</span> my_number_of_buckets;
+<a name="l00924"></a>00924 }
+<a name="l00925"></a>00925
+<a name="l00926"></a>00926 size_type unsafe_max_bucket_count()<span class="keyword"> const </span>{
+<a name="l00927"></a>00927 <span class="keywordflow">return</span> segment_size(pointers_per_table-1);
+<a name="l00928"></a>00928 }
+<a name="l00929"></a>00929
+<a name="l00930"></a>00930 size_type unsafe_bucket_size(size_type bucket) {
+<a name="l00931"></a>00931 size_type item_count = 0;
+<a name="l00932"></a>00932 <span class="keywordflow">if</span> (is_initialized(bucket)) {
+<a name="l00933"></a>00933 raw_iterator it = get_bucket(bucket);
+<a name="l00934"></a>00934 ++it;
+<a name="l00935"></a>00935 <span class="keywordflow">for</span> (; it != my_solist.raw_end() && !it.get_node_ptr()->is_dummy(); ++it)
+<a name="l00936"></a>00936 ++item_count;
+<a name="l00937"></a>00937 }
+<a name="l00938"></a>00938 <span class="keywordflow">return</span> item_count;
+<a name="l00939"></a>00939 }
+<a name="l00940"></a>00940
+<a name="l00941"></a>00941 size_type unsafe_bucket(<span class="keyword">const</span> key_type& key)<span class="keyword"> const </span>{
+<a name="l00942"></a>00942 sokey_t order_key = (sokey_t) my_hash_compare(key);
+<a name="l00943"></a>00943 size_type bucket = order_key % my_number_of_buckets;
+<a name="l00944"></a>00944 <span class="keywordflow">return</span> bucket;
+<a name="l00945"></a>00945 }
+<a name="l00946"></a>00946
+<a name="l00947"></a>00947 <span class="comment">// If the bucket is initialized, return a first non-dummy element in it</span>
+<a name="l00948"></a>00948 local_iterator unsafe_begin(size_type bucket) {
+<a name="l00949"></a>00949 <span class="keywordflow">if</span> (!is_initialized(bucket))
+<a name="l00950"></a>00950 <span class="keywordflow">return</span> end();
+<a name="l00951"></a>00951
+<a name="l00952"></a>00952 raw_iterator it = get_bucket(bucket);
+<a name="l00953"></a>00953 <span class="keywordflow">return</span> my_solist.first_real_iterator(it);
+<a name="l00954"></a>00954 }
+<a name="l00955"></a>00955
+<a name="l00956"></a>00956 <span class="comment">// If the bucket is initialized, return a first non-dummy element in it</span>
+<a name="l00957"></a>00957 const_local_iterator unsafe_begin(size_type bucket)<span class="keyword"> const</span>
+<a name="l00958"></a>00958 <span class="keyword"> </span>{
+<a name="l00959"></a>00959 <span class="keywordflow">if</span> (!is_initialized(bucket))
+<a name="l00960"></a>00960 <span class="keywordflow">return</span> end();
+<a name="l00961"></a>00961
+<a name="l00962"></a>00962 raw_const_iterator it = get_bucket(bucket);
+<a name="l00963"></a>00963 <span class="keywordflow">return</span> my_solist.first_real_iterator(it);
+<a name="l00964"></a>00964 }
+<a name="l00965"></a>00965
+<a name="l00966"></a>00966 <span class="comment">// @REVIEW: Takes O(n)</span>
+<a name="l00967"></a>00967 <span class="comment">// Returns the iterator after the last non-dummy element in the bucket</span>
+<a name="l00968"></a>00968 local_iterator unsafe_end(size_type bucket)
+<a name="l00969"></a>00969 {
+<a name="l00970"></a>00970 <span class="keywordflow">if</span> (!is_initialized(bucket))
+<a name="l00971"></a>00971 <span class="keywordflow">return</span> end();
+<a name="l00972"></a>00972
+<a name="l00973"></a>00973 raw_iterator it = get_bucket(bucket);
+<a name="l00974"></a>00974
+<a name="l00975"></a>00975 <span class="comment">// Find the end of the bucket, denoted by the dummy element</span>
+<a name="l00976"></a>00976 <span class="keywordflow">do</span> ++it;
+<a name="l00977"></a>00977 <span class="keywordflow">while</span>(it != my_solist.raw_end() && !it.get_node_ptr()->is_dummy());
+<a name="l00978"></a>00978
+<a name="l00979"></a>00979 <span class="comment">// Return the first real element past the end of the bucket</span>
+<a name="l00980"></a>00980 <span class="keywordflow">return</span> my_solist.first_real_iterator(it);
+<a name="l00981"></a>00981 }
+<a name="l00982"></a>00982
+<a name="l00983"></a>00983 <span class="comment">// @REVIEW: Takes O(n)</span>
+<a name="l00984"></a>00984 <span class="comment">// Returns the iterator after the last non-dummy element in the bucket</span>
+<a name="l00985"></a>00985 const_local_iterator unsafe_end(size_type bucket)<span class="keyword"> const</span>
+<a name="l00986"></a>00986 <span class="keyword"> </span>{
+<a name="l00987"></a>00987 <span class="keywordflow">if</span> (!is_initialized(bucket))
+<a name="l00988"></a>00988 <span class="keywordflow">return</span> end();
+<a name="l00989"></a>00989
+<a name="l00990"></a>00990 raw_const_iterator it = get_bucket(bucket);
+<a name="l00991"></a>00991
+<a name="l00992"></a>00992 <span class="comment">// Find the end of the bucket, denoted by the dummy element</span>
+<a name="l00993"></a>00993 <span class="keywordflow">do</span> ++it;
+<a name="l00994"></a>00994 <span class="keywordflow">while</span>(it != my_solist.raw_end() && !it.get_node_ptr()->is_dummy());
+<a name="l00995"></a>00995
+<a name="l00996"></a>00996 <span class="comment">// Return the first real element past the end of the bucket</span>
+<a name="l00997"></a>00997 <span class="keywordflow">return</span> my_solist.first_real_iterator(it);
+<a name="l00998"></a>00998 }
+<a name="l00999"></a>00999
+<a name="l01000"></a>01000 const_local_iterator unsafe_cbegin(size_type bucket)<span class="keyword"> const </span>{
+<a name="l01001"></a>01001 <span class="keywordflow">return</span> ((<span class="keyword">const</span> self_type *) <span class="keyword">this</span>)->begin();
+<a name="l01002"></a>01002 }
+<a name="l01003"></a>01003
+<a name="l01004"></a>01004 const_local_iterator unsafe_cend(size_type bucket)<span class="keyword"> const </span>{
+<a name="l01005"></a>01005 <span class="keywordflow">return</span> ((<span class="keyword">const</span> self_type *) <span class="keyword">this</span>)->end();
+<a name="l01006"></a>01006 }
+<a name="l01007"></a>01007
+<a name="l01008"></a>01008 <span class="comment">// Hash policy</span>
+<a name="l01009"></a>01009 <span class="keywordtype">float</span> load_factor()<span class="keyword"> const </span>{
+<a name="l01010"></a>01010 <span class="keywordflow">return</span> (<span class="keywordtype">float</span>) size() / (float) unsafe_bucket_count();
+<a name="l01011"></a>01011 }
+<a name="l01012"></a>01012
+<a name="l01013"></a>01013 <span class="keywordtype">float</span> max_load_factor()<span class="keyword"> const </span>{
+<a name="l01014"></a>01014 <span class="keywordflow">return</span> my_maximum_bucket_size;
+<a name="l01015"></a>01015 }
+<a name="l01016"></a>01016
+<a name="l01017"></a>01017 <span class="keywordtype">void</span> max_load_factor(<span class="keywordtype">float</span> newmax) {
+<a name="l01018"></a>01018 <span class="keywordflow">if</span> (newmax != newmax || newmax < 0)
+<a name="l01019"></a>01019 tbb::internal::throw_exception(tbb::internal::eid_invalid_load_factor);
+<a name="l01020"></a>01020 my_maximum_bucket_size = newmax;
+<a name="l01021"></a>01021 }
+<a name="l01022"></a>01022
+<a name="l01023"></a>01023 <span class="comment">// This function is a noop, because the underlying split-ordered list</span>
+<a name="l01024"></a>01024 <span class="comment">// is already sorted, so an increase in the bucket number will be</span>
+<a name="l01025"></a>01025 <span class="comment">// reflected next time this bucket is touched.</span>
+<a name="l01026"></a>01026 <span class="keywordtype">void</span> rehash(size_type buckets) {
+<a name="l01027"></a>01027 size_type current_buckets = my_number_of_buckets;
+<a name="l01028"></a>01028 <span class="keywordflow">if</span> (current_buckets >= buckets)
+<a name="l01029"></a>01029 <span class="keywordflow">return</span>;
+<a name="l01030"></a>01030 my_number_of_buckets = 1<<__TBB_Log2((uintptr_t)buckets*2-1); <span class="comment">// round up to power of 2</span>
+<a name="l01031"></a>01031 }
+<a name="l01032"></a>01032
+<a name="l01033"></a>01033 <span class="keyword">private</span>:
+<a name="l01034"></a>01034
+<a name="l01035"></a>01035 <span class="comment">// Initialize the hash and keep the first bucket open</span>
+<a name="l01036"></a>01036 <span class="keywordtype">void</span> internal_init() {
+<a name="l01037"></a>01037 <span class="comment">// Allocate an array of segment pointers</span>
+<a name="l01038"></a>01038 memset(my_buckets, 0, pointers_per_table * <span class="keyword">sizeof</span>(<span class="keywordtype">void</span> *));
+<a name="l01039"></a>01039
+<a name="l01040"></a>01040 <span class="comment">// Insert the first element in the split-ordered list</span>
+<a name="l01041"></a>01041 raw_iterator dummy_node = my_solist.raw_begin();
+<a name="l01042"></a>01042 set_bucket(0, dummy_node);
+<a name="l01043"></a>01043 }
+<a name="l01044"></a>01044
+<a name="l01045"></a>01045 <span class="keywordtype">void</span> internal_clear() {
+<a name="l01046"></a>01046 <span class="keywordflow">for</span> (size_type index = 0; index < pointers_per_table; ++index) {
+<a name="l01047"></a>01047 <span class="keywordflow">if</span> (my_buckets[index] != NULL) {
+<a name="l01048"></a>01048 size_type sz = segment_size(index);
+<a name="l01049"></a>01049 <span class="keywordflow">for</span> (size_type index2 = 0; index2 < sz; ++index2)
+<a name="l01050"></a>01050 my_allocator.destroy(&my_buckets[index][index2]);
+<a name="l01051"></a>01051 my_allocator.deallocate(my_buckets[index], sz);
+<a name="l01052"></a>01052 my_buckets[index] = 0;
+<a name="l01053"></a>01053 }
+<a name="l01054"></a>01054 }
+<a name="l01055"></a>01055 }
+<a name="l01056"></a>01056
+<a name="l01057"></a>01057 <span class="keywordtype">void</span> internal_copy(<span class="keyword">const</span> self_type& right) {
+<a name="l01058"></a>01058 clear();
+<a name="l01059"></a>01059
+<a name="l01060"></a>01060 my_maximum_bucket_size = right.my_maximum_bucket_size;
+<a name="l01061"></a>01061 my_number_of_buckets = right.my_number_of_buckets;
+<a name="l01062"></a>01062
+<a name="l01063"></a>01063 __TBB_TRY {
+<a name="l01064"></a>01064 insert(right.begin(), right.end());
+<a name="l01065"></a>01065 my_hash_compare = right.my_hash_compare;
+<a name="l01066"></a>01066 } __TBB_CATCH(...) {
+<a name="l01067"></a>01067 my_solist.clear();
+<a name="l01068"></a>01068 __TBB_RETHROW();
+<a name="l01069"></a>01069 }
+<a name="l01070"></a>01070 }
+<a name="l01071"></a>01071
+<a name="l01072"></a>01072 <span class="keywordtype">void</span> internal_swap_buckets(concurrent_unordered_base& right)
+<a name="l01073"></a>01073 {
+<a name="l01074"></a>01074 <span class="comment">// Swap all node segments</span>
+<a name="l01075"></a>01075 <span class="keywordflow">for</span> (size_type index = 0; index < pointers_per_table; ++index)
+<a name="l01076"></a>01076 {
+<a name="l01077"></a>01077 raw_iterator * iterator_pointer = my_buckets[index];
+<a name="l01078"></a>01078 my_buckets[index] = right.my_buckets[index];
+<a name="l01079"></a>01079 right.my_buckets[index] = iterator_pointer;
+<a name="l01080"></a>01080 }
+<a name="l01081"></a>01081 }
+<a name="l01082"></a>01082
+<a name="l01083"></a>01083 <span class="comment">// Hash APIs</span>
+<a name="l01084"></a>01084 size_type internal_distance(const_iterator first, const_iterator last)<span class="keyword"> const</span>
+<a name="l01085"></a>01085 <span class="keyword"> </span>{
+<a name="l01086"></a>01086 size_type num = 0;
+<a name="l01087"></a>01087
+<a name="l01088"></a>01088 <span class="keywordflow">for</span> (const_iterator it = first; it != last; ++it)
+<a name="l01089"></a>01089 ++num;
+<a name="l01090"></a>01090
+<a name="l01091"></a>01091 <span class="keywordflow">return</span> num;
+<a name="l01092"></a>01092 }
+<a name="l01093"></a>01093
+<a name="l01094"></a>01094 <span class="comment">// Insert an element in the hash given its value</span>
+<a name="l01095"></a>01095 std::pair<iterator, bool> internal_insert(<span class="keyword">const</span> value_type& value)
+<a name="l01096"></a>01096 {
+<a name="l01097"></a>01097 sokey_t order_key = (sokey_t) my_hash_compare(get_key(value));
+<a name="l01098"></a>01098 size_type bucket = order_key % my_number_of_buckets;
+<a name="l01099"></a>01099
+<a name="l01100"></a>01100 <span class="comment">// If bucket is empty, initialize it first</span>
+<a name="l01101"></a>01101 <span class="keywordflow">if</span> (!is_initialized(bucket))
+<a name="l01102"></a>01102 init_bucket(bucket);
+<a name="l01103"></a>01103
+<a name="l01104"></a>01104 size_type new_count;
+<a name="l01105"></a>01105 order_key = split_order_key_regular(order_key);
+<a name="l01106"></a>01106 raw_iterator it = get_bucket(bucket);
+<a name="l01107"></a>01107 raw_iterator last = my_solist.raw_end();
+<a name="l01108"></a>01108 raw_iterator where = it;
+<a name="l01109"></a>01109
+<a name="l01110"></a>01110 __TBB_ASSERT(where != last, <span class="stringliteral">"Invalid head node"</span>);
+<a name="l01111"></a>01111
+<a name="l01112"></a>01112 <span class="comment">// First node is a dummy node</span>
+<a name="l01113"></a>01113 ++where;
+<a name="l01114"></a>01114
+<a name="l01115"></a>01115 <span class="keywordflow">for</span> (;;)
+<a name="l01116"></a>01116 {
+<a name="l01117"></a>01117 <span class="keywordflow">if</span> (where == last || solist_t::get_order_key(where) > order_key)
+<a name="l01118"></a>01118 {
+<a name="l01119"></a>01119 <span class="comment">// Try to insert it in the right place</span>
+<a name="l01120"></a>01120 std::pair<iterator, bool> result = my_solist.try_insert(it, where, value, order_key, &new_count);
+<a name="l01121"></a>01121
+<a name="l01122"></a>01122 <span class="keywordflow">if</span> (result.second)
+<a name="l01123"></a>01123 {
+<a name="l01124"></a>01124 <span class="comment">// Insertion succeeded, adjust the table size, if needed</span>
+<a name="l01125"></a>01125 adjust_table_size(new_count, my_number_of_buckets);
+<a name="l01126"></a>01126 <span class="keywordflow">return</span> result;
+<a name="l01127"></a>01127 }
+<a name="l01128"></a>01128 <span class="keywordflow">else</span>
+<a name="l01129"></a>01129 {
+<a name="l01130"></a>01130 <span class="comment">// Insertion failed: either the same node was inserted by another thread, or</span>
+<a name="l01131"></a>01131 <span class="comment">// another element was inserted at exactly the same place as this node.</span>
+<a name="l01132"></a>01132 <span class="comment">// Proceed with the search from the previous location where order key was</span>
+<a name="l01133"></a>01133 <span class="comment">// known to be larger (note: this is legal only because there is no safe</span>
+<a name="l01134"></a>01134 <span class="comment">// concurrent erase operation supported).</span>
+<a name="l01135"></a>01135 where = it;
+<a name="l01136"></a>01136 ++where;
+<a name="l01137"></a>01137 <span class="keywordflow">continue</span>;
+<a name="l01138"></a>01138 }
+<a name="l01139"></a>01139 }
+<a name="l01140"></a>01140 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!allow_multimapping && solist_t::get_order_key(where) == order_key && my_hash_compare(get_key(*where), get_key(value)) == 0)
+<a name="l01141"></a>01141 {
+<a name="l01142"></a>01142 <span class="comment">// Element already in the list, return it</span>
+<a name="l01143"></a>01143 <span class="keywordflow">return</span> std::pair<iterator, bool>(my_solist.get_iterator(where), <span class="keyword">false</span>);
+<a name="l01144"></a>01144 }
+<a name="l01145"></a>01145
+<a name="l01146"></a>01146 <span class="comment">// Move the iterator forward</span>
+<a name="l01147"></a>01147 it = where;
+<a name="l01148"></a>01148 ++where;
+<a name="l01149"></a>01149 }
+<a name="l01150"></a>01150 }
+<a name="l01151"></a>01151
+<a name="l01152"></a>01152 <span class="comment">// Find the element in the split-ordered list</span>
+<a name="l01153"></a>01153 iterator internal_find(<span class="keyword">const</span> key_type& key)
+<a name="l01154"></a>01154 {
+<a name="l01155"></a>01155 sokey_t order_key = (sokey_t) my_hash_compare(key);
+<a name="l01156"></a>01156 size_type bucket = order_key % my_number_of_buckets;
+<a name="l01157"></a>01157
+<a name="l01158"></a>01158 <span class="comment">// If bucket is empty, initialize it first</span>
+<a name="l01159"></a>01159 <span class="keywordflow">if</span> (!is_initialized(bucket))
+<a name="l01160"></a>01160 init_bucket(bucket);
+<a name="l01161"></a>01161
+<a name="l01162"></a>01162 order_key = split_order_key_regular(order_key);
+<a name="l01163"></a>01163 raw_iterator last = my_solist.raw_end();
+<a name="l01164"></a>01164
+<a name="l01165"></a>01165 <span class="keywordflow">for</span> (raw_iterator it = get_bucket(bucket); it != last; ++it)
+<a name="l01166"></a>01166 {
+<a name="l01167"></a>01167 <span class="keywordflow">if</span> (solist_t::get_order_key(it) > order_key)
+<a name="l01168"></a>01168 {
+<a name="l01169"></a>01169 <span class="comment">// If the order key is smaller than the current order key, the element</span>
+<a name="l01170"></a>01170 <span class="comment">// is not in the hash.</span>
+<a name="l01171"></a>01171 <span class="keywordflow">return</span> end();
+<a name="l01172"></a>01172 }
+<a name="l01173"></a>01173 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (solist_t::get_order_key(it) == order_key)
+<a name="l01174"></a>01174 {
+<a name="l01175"></a>01175 <span class="comment">// The fact that order keys match does not mean that the element is found.</span>
+<a name="l01176"></a>01176 <span class="comment">// Key function comparison has to be performed to check whether this is the</span>
+<a name="l01177"></a>01177 <span class="comment">// right element. If not, keep searching while order key is the same.</span>
+<a name="l01178"></a>01178 <span class="keywordflow">if</span> (!my_hash_compare(get_key(*it), key))
+<a name="l01179"></a>01179 <span class="keywordflow">return</span> my_solist.get_iterator(it);
+<a name="l01180"></a>01180 }
+<a name="l01181"></a>01181 }
+<a name="l01182"></a>01182
+<a name="l01183"></a>01183 <span class="keywordflow">return</span> end();
+<a name="l01184"></a>01184 }
+<a name="l01185"></a>01185
+<a name="l01186"></a>01186 <span class="comment">// Erase an element from the list. This is not a concurrency safe function.</span>
+<a name="l01187"></a>01187 iterator internal_erase(const_iterator it)
+<a name="l01188"></a>01188 {
+<a name="l01189"></a>01189 key_type key = get_key(*it);
+<a name="l01190"></a>01190 sokey_t order_key = (sokey_t) my_hash_compare(key);
+<a name="l01191"></a>01191 size_type bucket = order_key % my_number_of_buckets;
+<a name="l01192"></a>01192
+<a name="l01193"></a>01193 <span class="comment">// If bucket is empty, initialize it first</span>
+<a name="l01194"></a>01194 <span class="keywordflow">if</span> (!is_initialized(bucket))
+<a name="l01195"></a>01195 init_bucket(bucket);
+<a name="l01196"></a>01196
+<a name="l01197"></a>01197 order_key = split_order_key_regular(order_key);
+<a name="l01198"></a>01198
+<a name="l01199"></a>01199 raw_iterator previous = get_bucket(bucket);
+<a name="l01200"></a>01200 raw_iterator last = my_solist.raw_end();
+<a name="l01201"></a>01201 raw_iterator where = previous;
+<a name="l01202"></a>01202
+<a name="l01203"></a>01203 __TBB_ASSERT(where != last, <span class="stringliteral">"Invalid head node"</span>);
+<a name="l01204"></a>01204
+<a name="l01205"></a>01205 <span class="comment">// First node is a dummy node</span>
+<a name="l01206"></a>01206 ++where;
+<a name="l01207"></a>01207
+<a name="l01208"></a>01208 <span class="keywordflow">for</span> (;;) {
+<a name="l01209"></a>01209 <span class="keywordflow">if</span> (where == last)
+<a name="l01210"></a>01210 <span class="keywordflow">return</span> end();
+<a name="l01211"></a>01211 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (my_solist.get_iterator(where) == it)
+<a name="l01212"></a>01212 <span class="keywordflow">return</span> my_solist.erase_node(previous, it);
+<a name="l01213"></a>01213
+<a name="l01214"></a>01214 <span class="comment">// Move the iterator forward</span>
+<a name="l01215"></a>01215 previous = where;
+<a name="l01216"></a>01216 ++where;
+<a name="l01217"></a>01217 }
+<a name="l01218"></a>01218 }
+<a name="l01219"></a>01219
+<a name="l01220"></a>01220 <span class="comment">// Return the [begin, end) pair of iterators with the same key values.</span>
+<a name="l01221"></a>01221 <span class="comment">// This operation makes sense only if mapping is many-to-one.</span>
+<a name="l01222"></a>01222 pairii_t internal_equal_range(<span class="keyword">const</span> key_type& key)
+<a name="l01223"></a>01223 {
+<a name="l01224"></a>01224 sokey_t order_key = (sokey_t) my_hash_compare(key);
+<a name="l01225"></a>01225 size_type bucket = order_key % my_number_of_buckets;
+<a name="l01226"></a>01226
+<a name="l01227"></a>01227 <span class="comment">// If bucket is empty, initialize it first</span>
+<a name="l01228"></a>01228 <span class="keywordflow">if</span> (!is_initialized(bucket))
+<a name="l01229"></a>01229 init_bucket(bucket);
+<a name="l01230"></a>01230
+<a name="l01231"></a>01231 order_key = split_order_key_regular(order_key);
+<a name="l01232"></a>01232 raw_iterator end_it = my_solist.raw_end();
+<a name="l01233"></a>01233
+<a name="l01234"></a>01234 <span class="keywordflow">for</span> (raw_iterator it = get_bucket(bucket); it != end_it; ++it)
+<a name="l01235"></a>01235 {
+<a name="l01236"></a>01236 <span class="keywordflow">if</span> (solist_t::get_order_key(it) > order_key)
+<a name="l01237"></a>01237 {
+<a name="l01238"></a>01238 <span class="comment">// There is no element with the given key</span>
+<a name="l01239"></a>01239 <span class="keywordflow">return</span> pairii_t(end(), end());
+<a name="l01240"></a>01240 }
+<a name="l01241"></a>01241 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (solist_t::get_order_key(it) == order_key && !my_hash_compare(get_key(*it), key))
+<a name="l01242"></a>01242 {
+<a name="l01243"></a>01243 iterator first = my_solist.get_iterator(it);
+<a name="l01244"></a>01244 iterator last = first;
+<a name="l01245"></a>01245
+<a name="l01246"></a>01246 <span class="keywordflow">while</span>( last != end() && !my_hash_compare(get_key(*last), key) )
+<a name="l01247"></a>01247 ++last;
+<a name="l01248"></a>01248 <span class="keywordflow">return</span> pairii_t(first, last);
+<a name="l01249"></a>01249 }
+<a name="l01250"></a>01250 }
+<a name="l01251"></a>01251
+<a name="l01252"></a>01252 <span class="keywordflow">return</span> pairii_t(end(), end());
+<a name="l01253"></a>01253 }
+<a name="l01254"></a>01254
+<a name="l01255"></a>01255 <span class="comment">// Bucket APIs</span>
+<a name="l01256"></a>01256 <span class="keywordtype">void</span> init_bucket(size_type bucket)
+<a name="l01257"></a>01257 {
+<a name="l01258"></a>01258 <span class="comment">// Bucket 0 has no parent. Initialize it and return.</span>
+<a name="l01259"></a>01259 <span class="keywordflow">if</span> (bucket == 0) {
+<a name="l01260"></a>01260 internal_init();
+<a name="l01261"></a>01261 <span class="keywordflow">return</span>;
+<a name="l01262"></a>01262 }
+<a name="l01263"></a>01263
+<a name="l01264"></a>01264 size_type parent_bucket = get_parent(bucket);
+<a name="l01265"></a>01265
+<a name="l01266"></a>01266 <span class="comment">// All parent_bucket buckets have to be initialized before this bucket is</span>
+<a name="l01267"></a>01267 <span class="keywordflow">if</span> (!is_initialized(parent_bucket))
+<a name="l01268"></a>01268 init_bucket(parent_bucket);
<a name="l01269"></a>01269
-<a name="l01270"></a>01270 <span class="keywordflow">for</span> (raw_const_iterator it = get_bucket(bucket); it != end_it; ++it)
-<a name="l01271"></a>01271 {
-<a name="l01272"></a>01272 <span class="keywordflow">if</span> (solist_t::get_order_key(it) > order_key)
-<a name="l01273"></a>01273 {
-<a name="l01274"></a>01274 <span class="comment">// There is no element with the given key</span>
-<a name="l01275"></a>01275 <span class="keywordflow">return</span> paircc_t(end(), end());
-<a name="l01276"></a>01276 }
-<a name="l01277"></a>01277 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (solist_t::get_order_key(it) == order_key && !my_hash_compare(get_key(*it), key))
-<a name="l01278"></a>01278 {
-<a name="l01279"></a>01279 const_iterator first = my_solist.get_iterator(it);
-<a name="l01280"></a>01280 const_iterator last = first;
-<a name="l01281"></a>01281
-<a name="l01282"></a>01282 <span class="keywordflow">while</span>( last != end() && !my_hash_compare(get_key(*last), key ) )
-<a name="l01283"></a>01283 ++last;
-<a name="l01284"></a>01284 <span class="keywordflow">return</span> paircc_t(first, last);
-<a name="l01285"></a>01285 }
-<a name="l01286"></a>01286 }
-<a name="l01287"></a>01287
-<a name="l01288"></a>01288 <span class="keywordflow">return</span> paircc_t(end(), end());
-<a name="l01289"></a>01289 }
-<a name="l01290"></a>01290
-<a name="l01291"></a>01291 <span class="comment">// Bucket APIs</span>
-<a name="l01292"></a>01292 <span class="keywordtype">void</span> init_bucket(size_type bucket)
-<a name="l01293"></a>01293 {
-<a name="l01294"></a>01294 <span class="comment">// Bucket 0 has no parent. Initialize it and return.</span>
-<a name="l01295"></a>01295 <span class="keywordflow">if</span> (bucket == 0) {
-<a name="l01296"></a>01296 internal_init();
-<a name="l01297"></a>01297 <span class="keywordflow">return</span>;
-<a name="l01298"></a>01298 }
-<a name="l01299"></a>01299
-<a name="l01300"></a>01300 size_type parent_bucket = get_parent(bucket);
-<a name="l01301"></a>01301
-<a name="l01302"></a>01302 <span class="comment">// All parent_bucket buckets have to be initialized before this bucket is</span>
-<a name="l01303"></a>01303 <span class="keywordflow">if</span> (!is_initialized(parent_bucket))
-<a name="l01304"></a>01304 init_bucket(parent_bucket);
+<a name="l01270"></a>01270 raw_iterator parent = get_bucket(parent_bucket);
+<a name="l01271"></a>01271
+<a name="l01272"></a>01272 <span class="comment">// Create a dummy first node in this bucket</span>
+<a name="l01273"></a>01273 raw_iterator dummy_node = my_solist.insert_dummy(parent, split_order_key_dummy(bucket));
+<a name="l01274"></a>01274 set_bucket(bucket, dummy_node);
+<a name="l01275"></a>01275 }
+<a name="l01276"></a>01276
+<a name="l01277"></a>01277 <span class="keywordtype">void</span> adjust_table_size(size_type total_elements, size_type current_size)
+<a name="l01278"></a>01278 {
+<a name="l01279"></a>01279 <span class="comment">// Grow the table by a factor of 2 if possible and needed</span>
+<a name="l01280"></a>01280 <span class="keywordflow">if</span> ( ((<span class="keywordtype">float</span>) total_elements / (<span class="keywordtype">float</span>) current_size) > my_maximum_bucket_size )
+<a name="l01281"></a>01281 {
+<a name="l01282"></a>01282 <span class="comment">// Double the size of the hash only if size has not changed inbetween loads</span>
+<a name="l01283"></a>01283 __TBB_CompareAndSwapW((uintptr_t*)&my_number_of_buckets, 2 * current_size, current_size );
+<a name="l01284"></a>01284 }
+<a name="l01285"></a>01285 }
+<a name="l01286"></a>01286
+<a name="l01287"></a>01287 size_type get_parent(size_type bucket)<span class="keyword"> const</span>
+<a name="l01288"></a>01288 <span class="keyword"> </span>{
+<a name="l01289"></a>01289 <span class="comment">// Unsets bucket's most significant turned-on bit</span>
+<a name="l01290"></a>01290 size_type msb = __TBB_Log2((uintptr_t)bucket);
+<a name="l01291"></a>01291 <span class="keywordflow">return</span> bucket & ~(size_type(1) << msb);
+<a name="l01292"></a>01292 }
+<a name="l01293"></a>01293
+<a name="l01294"></a>01294
+<a name="l01295"></a>01295 <span class="comment">// Dynamic sized array (segments)</span>
+<a name="l01297"></a>01297 <span class="comment"></span> <span class="keyword">static</span> size_type segment_index_of( size_type index ) {
+<a name="l01298"></a>01298 <span class="keywordflow">return</span> size_type( __TBB_Log2( index|1 ) );
+<a name="l01299"></a>01299 }
+<a name="l01300"></a>01300
+<a name="l01302"></a>01302 <span class="keyword">static</span> size_type segment_base( size_type k ) {
+<a name="l01303"></a>01303 <span class="keywordflow">return</span> (size_type(1)<<k & ~size_type(1));
+<a name="l01304"></a>01304 }
<a name="l01305"></a>01305
-<a name="l01306"></a>01306 raw_iterator parent = get_bucket(parent_bucket);
-<a name="l01307"></a>01307
-<a name="l01308"></a>01308 <span class="comment">// Create a dummy first node in this bucket</span>
-<a name="l01309"></a>01309 raw_iterator dummy_node = my_solist.insert_dummy(parent, split_order_key_dummy(bucket));
-<a name="l01310"></a>01310 set_bucket(bucket, dummy_node);
-<a name="l01311"></a>01311 }
-<a name="l01312"></a>01312
-<a name="l01313"></a>01313 <span class="keywordtype">void</span> adjust_table_size(size_type total_elements, size_type current_size)
-<a name="l01314"></a>01314 {
-<a name="l01315"></a>01315 <span class="comment">// Grow the table by a factor of 2 if possible and needed</span>
-<a name="l01316"></a>01316 <span class="keywordflow">if</span> ( ((<span class="keywordtype">float</span>) total_elements / (<span class="keywordtype">float</span>) current_size) > my_maximum_bucket_size )
-<a name="l01317"></a>01317 {
-<a name="l01318"></a>01318 <span class="comment">// Double the size of the hash only if size has not changed inbetween loads</span>
-<a name="l01319"></a>01319 __TBB_CompareAndSwapW((uintptr_t*)&my_number_of_buckets, 2 * current_size, current_size );
-<a name="l01320"></a>01320 }
-<a name="l01321"></a>01321 }
-<a name="l01322"></a>01322
-<a name="l01323"></a>01323 size_type get_parent(size_type bucket)<span class="keyword"> const</span>
-<a name="l01324"></a>01324 <span class="keyword"> </span>{
-<a name="l01325"></a>01325 <span class="comment">// Unsets bucket's most significant turned-on bit</span>
-<a name="l01326"></a>01326 size_type msb = __TBB_Log2((uintptr_t)bucket);
-<a name="l01327"></a>01327 <span class="keywordflow">return</span> bucket & ~(size_type(1) << msb);
-<a name="l01328"></a>01328 }
-<a name="l01329"></a>01329
+<a name="l01307"></a>01307 <span class="keyword">static</span> size_type segment_size( size_type k ) {
+<a name="l01308"></a>01308 <span class="keywordflow">return</span> k? size_type(1)<<k : 2;
+<a name="l01309"></a>01309 }
+<a name="l01310"></a>01310
+<a name="l01311"></a>01311 raw_iterator get_bucket(size_type bucket)<span class="keyword"> const </span>{
+<a name="l01312"></a>01312 size_type segment = segment_index_of(bucket);
+<a name="l01313"></a>01313 bucket -= segment_base(segment);
+<a name="l01314"></a>01314 __TBB_ASSERT( my_buckets[segment], <span class="stringliteral">"bucket must be in an allocated segment"</span> );
+<a name="l01315"></a>01315 <span class="keywordflow">return</span> my_buckets[segment][bucket];
+<a name="l01316"></a>01316 }
+<a name="l01317"></a>01317
+<a name="l01318"></a>01318 <span class="keywordtype">void</span> set_bucket(size_type bucket, raw_iterator dummy_head) {
+<a name="l01319"></a>01319 size_type segment = segment_index_of(bucket);
+<a name="l01320"></a>01320 bucket -= segment_base(segment);
+<a name="l01321"></a>01321
+<a name="l01322"></a>01322 <span class="keywordflow">if</span> (my_buckets[segment] == NULL) {
+<a name="l01323"></a>01323 size_type sz = segment_size(segment);
+<a name="l01324"></a>01324 raw_iterator * new_segment = my_allocator.allocate(sz);
+<a name="l01325"></a>01325 std::memset(new_segment, 0, sz*<span class="keyword">sizeof</span>(raw_iterator));
+<a name="l01326"></a>01326
+<a name="l01327"></a>01327 <span class="keywordflow">if</span> (__TBB_CompareAndSwapW((<span class="keywordtype">void</span> *) &my_buckets[segment], (uintptr_t)new_segment, 0) != 0)
+<a name="l01328"></a>01328 my_allocator.deallocate(new_segment, sz);
+<a name="l01329"></a>01329 }
<a name="l01330"></a>01330
-<a name="l01331"></a>01331 <span class="comment">// Dynamic sized array (segments)</span>
-<a name="l01333"></a>01333 <span class="comment"></span> <span class="keyword">static</span> size_type segment_index_of( size_type index ) {
-<a name="l01334"></a>01334 <span class="keywordflow">return</span> size_type( __TBB_Log2( index|1 ) );
-<a name="l01335"></a>01335 }
-<a name="l01336"></a>01336
-<a name="l01338"></a>01338 <span class="keyword">static</span> size_type segment_base( size_type k ) {
-<a name="l01339"></a>01339 <span class="keywordflow">return</span> (size_type(1)<<k & ~size_type(1));
-<a name="l01340"></a>01340 }
-<a name="l01341"></a>01341
-<a name="l01343"></a>01343 <span class="keyword">static</span> size_type segment_size( size_type k ) {
-<a name="l01344"></a>01344 <span class="keywordflow">return</span> k? size_type(1)<<k : 2;
-<a name="l01345"></a>01345 }
+<a name="l01331"></a>01331 my_buckets[segment][bucket] = dummy_head;
+<a name="l01332"></a>01332 }
+<a name="l01333"></a>01333
+<a name="l01334"></a>01334 <span class="keywordtype">bool</span> is_initialized(size_type bucket)<span class="keyword"> const </span>{
+<a name="l01335"></a>01335 size_type segment = segment_index_of(bucket);
+<a name="l01336"></a>01336 bucket -= segment_base(segment);
+<a name="l01337"></a>01337
+<a name="l01338"></a>01338 <span class="keywordflow">if</span> (my_buckets[segment] == NULL)
+<a name="l01339"></a>01339 <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l01340"></a>01340
+<a name="l01341"></a>01341 raw_iterator it = my_buckets[segment][bucket];
+<a name="l01342"></a>01342 <span class="keywordflow">return</span> (it.get_node_ptr() != NULL);
+<a name="l01343"></a>01343 }
+<a name="l01344"></a>01344
+<a name="l01345"></a>01345 <span class="comment">// Utilities for keys</span>
<a name="l01346"></a>01346
-<a name="l01347"></a>01347 raw_iterator get_bucket(size_type bucket)<span class="keyword"> const </span>{
-<a name="l01348"></a>01348 size_type segment = segment_index_of(bucket);
-<a name="l01349"></a>01349 bucket -= segment_base(segment);
-<a name="l01350"></a>01350 __TBB_ASSERT( my_buckets[segment], <span class="stringliteral">"bucket must be in an allocated segment"</span> );
-<a name="l01351"></a>01351 <span class="keywordflow">return</span> my_buckets[segment][bucket];
-<a name="l01352"></a>01352 }
-<a name="l01353"></a>01353
-<a name="l01354"></a>01354 <span class="keywordtype">void</span> set_bucket(size_type bucket, raw_iterator dummy_head) {
-<a name="l01355"></a>01355 size_type segment = segment_index_of(bucket);
-<a name="l01356"></a>01356 bucket -= segment_base(segment);
-<a name="l01357"></a>01357
-<a name="l01358"></a>01358 <span class="keywordflow">if</span> (my_buckets[segment] == NULL) {
-<a name="l01359"></a>01359 size_type sz = segment_size(segment);
-<a name="l01360"></a>01360 raw_iterator * new_segment = my_allocator.allocate(sz);
-<a name="l01361"></a>01361 std::memset(new_segment, 0, sz*<span class="keyword">sizeof</span>(raw_iterator));
-<a name="l01362"></a>01362
-<a name="l01363"></a>01363 <span class="keywordflow">if</span> (__TBB_CompareAndSwapW((<span class="keywordtype">void</span> *) &my_buckets[segment], (uintptr_t)new_segment, 0) != 0)
-<a name="l01364"></a>01364 my_allocator.deallocate(new_segment, sz);
-<a name="l01365"></a>01365 }
-<a name="l01366"></a>01366
-<a name="l01367"></a>01367 my_buckets[segment][bucket] = dummy_head;
-<a name="l01368"></a>01368 }
-<a name="l01369"></a>01369
-<a name="l01370"></a>01370 <span class="keywordtype">bool</span> is_initialized(size_type bucket)<span class="keyword"> const </span>{
-<a name="l01371"></a>01371 size_type segment = segment_index_of(bucket);
-<a name="l01372"></a>01372 bucket -= segment_base(segment);
-<a name="l01373"></a>01373
-<a name="l01374"></a>01374 <span class="keywordflow">if</span> (my_buckets[segment] == NULL)
-<a name="l01375"></a>01375 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l01376"></a>01376
-<a name="l01377"></a>01377 raw_iterator it = my_buckets[segment][bucket];
-<a name="l01378"></a>01378 <span class="keywordflow">return</span> (it.get_node_ptr() != NULL);
-<a name="l01379"></a>01379 }
-<a name="l01380"></a>01380
-<a name="l01381"></a>01381 <span class="comment">// Utilities for keys</span>
-<a name="l01382"></a>01382
-<a name="l01383"></a>01383 <span class="comment">// A regular order key has its original hash value reversed and the last bit set</span>
-<a name="l01384"></a>01384 sokey_t split_order_key_regular(sokey_t order_key)<span class="keyword"> const </span>{
-<a name="l01385"></a>01385 <span class="keywordflow">return</span> __TBB_ReverseBits(order_key) | 0x1;
-<a name="l01386"></a>01386 }
-<a name="l01387"></a>01387
-<a name="l01388"></a>01388 <span class="comment">// A dummy order key has its original hash value reversed and the last bit unset</span>
-<a name="l01389"></a>01389 sokey_t split_order_key_dummy(sokey_t order_key)<span class="keyword"> const </span>{
-<a name="l01390"></a>01390 <span class="keywordflow">return</span> __TBB_ReverseBits(order_key) & ~(0x1);
-<a name="l01391"></a>01391 }
-<a name="l01392"></a>01392
-<a name="l01393"></a>01393 <span class="comment">// Shared variables</span>
-<a name="l01394"></a>01394 size_type my_number_of_buckets; <span class="comment">// Current table size</span>
-<a name="l01395"></a>01395 solist_t my_solist; <span class="comment">// List where all the elements are kept</span>
-<a name="l01396"></a>01396 <span class="keyword">typename</span> allocator_type::template rebind<raw_iterator>::other my_allocator; <span class="comment">// Allocator object for segments</span>
-<a name="l01397"></a>01397 <span class="keywordtype">float</span> my_maximum_bucket_size; <span class="comment">// Maximum size of the bucket</span>
-<a name="l01398"></a>01398 raw_iterator *my_buckets[pointers_per_table]; <span class="comment">// The segment table</span>
-<a name="l01399"></a>01399 };
-<a name="l01400"></a>01400 <span class="preprocessor">#if _MSC_VER</span>
-<a name="l01401"></a>01401 <span class="preprocessor"></span><span class="preprocessor">#pragma warning(pop) // warning 4127 -- while (true) has a constant expression in it</span>
-<a name="l01402"></a>01402 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l01403"></a>01403 <span class="preprocessor"></span>
-<a name="l01405"></a>01405 <span class="keyword">static</span> <span class="keyword">const</span> size_t hash_multiplier = <span class="keyword">sizeof</span>(size_t)==4? 2654435769U : 11400714819323198485ULL;
-<a name="l01406"></a>01406 } <span class="comment">// namespace internal</span>
-<a name="l01409"></a>01409 <span class="comment"></span><span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l01410"></a>01410 <span class="keyword">inline</span> size_t tbb_hasher( <span class="keyword">const</span> T& t ) {
-<a name="l01411"></a>01411 <span class="keywordflow">return</span> static_cast<size_t>( t ) * internal::hash_multiplier;
-<a name="l01412"></a>01412 }
-<a name="l01413"></a>01413 <span class="keyword">template</span><<span class="keyword">typename</span> P>
-<a name="l01414"></a>01414 <span class="keyword">inline</span> size_t tbb_hasher( P* ptr ) {
-<a name="l01415"></a>01415 size_t <span class="keyword">const</span> h = reinterpret_cast<size_t>( ptr );
-<a name="l01416"></a>01416 <span class="keywordflow">return</span> (h >> 3) ^ h;
-<a name="l01417"></a>01417 }
-<a name="l01418"></a>01418 <span class="keyword">template</span><<span class="keyword">typename</span> E, <span class="keyword">typename</span> S, <span class="keyword">typename</span> A>
-<a name="l01419"></a>01419 <span class="keyword">inline</span> size_t tbb_hasher( <span class="keyword">const</span> std::basic_string<E,S,A>& s ) {
-<a name="l01420"></a>01420 size_t h = 0;
-<a name="l01421"></a>01421 <span class="keywordflow">for</span>( <span class="keyword">const</span> E* c = s.c_str(); *c; ++c )
-<a name="l01422"></a>01422 h = static_cast<size_t>(*c) ^ (h * internal::hash_multiplier);
-<a name="l01423"></a>01423 <span class="keywordflow">return</span> h;
-<a name="l01424"></a>01424 }
-<a name="l01425"></a>01425 <span class="keyword">template</span><<span class="keyword">typename</span> F, <span class="keyword">typename</span> S>
-<a name="l01426"></a>01426 <span class="keyword">inline</span> size_t tbb_hasher( <span class="keyword">const</span> std::pair<F,S>& p ) {
-<a name="l01427"></a>01427 <span class="keywordflow">return</span> tbb_hasher(p.first) ^ tbb_hasher(p.second);
-<a name="l01428"></a>01428 }
-<a name="l01429"></a>01429 } <span class="comment">// namespace interface5</span>
-<a name="l01430"></a>01430 <span class="keyword">using</span> interface5::tbb_hasher;
-<a name="l01431"></a>01431 } <span class="comment">// namespace tbb</span>
-<a name="l01432"></a>01432 <span class="preprocessor">#endif// __TBB_concurrent_unordered_internal_H</span>
+<a name="l01347"></a>01347 <span class="comment">// A regular order key has its original hash value reversed and the last bit set</span>
+<a name="l01348"></a>01348 sokey_t split_order_key_regular(sokey_t order_key)<span class="keyword"> const </span>{
+<a name="l01349"></a>01349 <span class="keywordflow">return</span> __TBB_ReverseBits(order_key) | 0x1;
+<a name="l01350"></a>01350 }
+<a name="l01351"></a>01351
+<a name="l01352"></a>01352 <span class="comment">// A dummy order key has its original hash value reversed and the last bit unset</span>
+<a name="l01353"></a>01353 sokey_t split_order_key_dummy(sokey_t order_key)<span class="keyword"> const </span>{
+<a name="l01354"></a>01354 <span class="keywordflow">return</span> __TBB_ReverseBits(order_key) & ~(0x1);
+<a name="l01355"></a>01355 }
+<a name="l01356"></a>01356
+<a name="l01357"></a>01357 <span class="comment">// Shared variables</span>
+<a name="l01358"></a>01358 atomic<size_type> my_number_of_buckets; <span class="comment">// Current table size</span>
+<a name="l01359"></a>01359 solist_t my_solist; <span class="comment">// List where all the elements are kept</span>
+<a name="l01360"></a>01360 <span class="keyword">typename</span> allocator_type::template rebind<raw_iterator>::other my_allocator; <span class="comment">// Allocator object for segments</span>
+<a name="l01361"></a>01361 <span class="keywordtype">float</span> my_maximum_bucket_size; <span class="comment">// Maximum size of the bucket</span>
+<a name="l01362"></a>01362 atomic<raw_iterator*> my_buckets[pointers_per_table]; <span class="comment">// The segment table</span>
+<a name="l01363"></a>01363 };
+<a name="l01364"></a>01364 <span class="preprocessor">#if _MSC_VER</span>
+<a name="l01365"></a>01365 <span class="preprocessor"></span><span class="preprocessor">#pragma warning(pop) // warning 4127 -- while (true) has a constant expression in it</span>
+<a name="l01366"></a>01366 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l01367"></a>01367 <span class="preprocessor"></span>
+<a name="l01369"></a>01369 <span class="keyword">static</span> <span class="keyword">const</span> size_t hash_multiplier = <span class="keyword">sizeof</span>(size_t)==4? 2654435769U : 11400714819323198485ULL;
+<a name="l01370"></a>01370 } <span class="comment">// namespace internal</span>
+<a name="l01373"></a>01373 <span class="comment"></span><span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l01374"></a>01374 <span class="keyword">inline</span> size_t tbb_hasher( <span class="keyword">const</span> T& t ) {
+<a name="l01375"></a>01375 <span class="keywordflow">return</span> static_cast<size_t>( t ) * internal::hash_multiplier;
+<a name="l01376"></a>01376 }
+<a name="l01377"></a>01377 <span class="keyword">template</span><<span class="keyword">typename</span> P>
+<a name="l01378"></a>01378 <span class="keyword">inline</span> size_t tbb_hasher( P* ptr ) {
+<a name="l01379"></a>01379 size_t <span class="keyword">const</span> h = reinterpret_cast<size_t>( ptr );
+<a name="l01380"></a>01380 <span class="keywordflow">return</span> (h >> 3) ^ h;
+<a name="l01381"></a>01381 }
+<a name="l01382"></a>01382 <span class="keyword">template</span><<span class="keyword">typename</span> E, <span class="keyword">typename</span> S, <span class="keyword">typename</span> A>
+<a name="l01383"></a>01383 <span class="keyword">inline</span> size_t tbb_hasher( <span class="keyword">const</span> std::basic_string<E,S,A>& s ) {
+<a name="l01384"></a>01384 size_t h = 0;
+<a name="l01385"></a>01385 <span class="keywordflow">for</span>( <span class="keyword">const</span> E* c = s.c_str(); *c; ++c )
+<a name="l01386"></a>01386 h = static_cast<size_t>(*c) ^ (h * internal::hash_multiplier);
+<a name="l01387"></a>01387 <span class="keywordflow">return</span> h;
+<a name="l01388"></a>01388 }
+<a name="l01389"></a>01389 <span class="keyword">template</span><<span class="keyword">typename</span> F, <span class="keyword">typename</span> S>
+<a name="l01390"></a>01390 <span class="keyword">inline</span> size_t tbb_hasher( <span class="keyword">const</span> std::pair<F,S>& p ) {
+<a name="l01391"></a>01391 <span class="keywordflow">return</span> tbb_hasher(p.first) ^ tbb_hasher(p.second);
+<a name="l01392"></a>01392 }
+<a name="l01393"></a>01393 } <span class="comment">// namespace interface5</span>
+<a name="l01394"></a>01394 <span class="keyword">using</span> interface5::tbb_hasher;
+<a name="l01395"></a>01395 } <span class="comment">// namespace tbb</span>
+<a name="l01396"></a>01396 <span class="preprocessor">#endif// __TBB_concurrent_unordered_internal_H</span>
</pre></div><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00308.html b/doc/html/a00309.html
similarity index 100%
rename from doc/html/a00308.html
rename to doc/html/a00309.html
diff --git a/doc/html/a00310.html b/doc/html/a00310.html
deleted file mode 100644
index 183d4ef..0000000
--- a/doc/html/a00310.html
+++ /dev/null
@@ -1,73 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>aligned_space.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>aligned_space.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_aligned_space_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_aligned_space_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "tbb_machine.h"</span>
-<a name="l00026"></a>00026
-<a name="l00027"></a>00027 <span class="keyword">namespace </span>tbb {
-<a name="l00028"></a>00028
-<a name="l00030"></a>00030
-<a name="l00032"></a>00032 <span class="keyword">template</span><<span class="keyword">typename</span> T,size_t N>
-<a name="l00033"></a><a class="code" href="a00142.html">00033</a> <span class="keyword">class </span><a class="code" href="a00142.html">aligned_space</a> {
-<a name="l00034"></a>00034 <span class="keyword">private</span>:
-<a name="l00035"></a>00035 <span class="keyword">typedef</span> __TBB_TypeWithAlignmentAtLeastAsStrict(T) element_type;
-<a name="l00036"></a>00036 element_type array[(<span class="keyword">sizeof</span>(T)*N+<span class="keyword">sizeof</span>(element_type)-1)/<span class="keyword">sizeof</span>(element_type)];
-<a name="l00037"></a>00037 <span class="keyword">public</span>:
-<a name="l00039"></a><a class="code" href="a00142.html#0d702fc6b9e9d061ace3501b3c861cdf">00039</a> T* <a class="code" href="a00142.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>() {<span class="keywordflow">return</span> reinterpret_cast<T*>(<span class="keyword">this</span>);}
-<a name="l00040"></a>00040
-<a name="l00042"></a><a class="code" href="a00142.html#024be075c23c0394c9a2518d993bcd9e">00042</a> T* <a class="code" href="a00142.html#024be075c23c0394c9a2518d993bcd9e">end</a>() {<span class="keywordflow">return</span> <a class="code" href="a00142.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()+N;}
-<a name="l00043"></a>00043 };
-<a name="l00044"></a>00044
-<a name="l00045"></a>00045 } <span class="comment">// namespace tbb </span>
-<a name="l00046"></a>00046
-<a name="l00047"></a>00047 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_aligned_space_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00311.html b/doc/html/a00311.html
index 85cf83c..74e2a7a 100644
--- a/doc/html/a00311.html
+++ b/doc/html/a00311.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>atomic.h Source File</title>
+<title>aligned_space.h Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -19,7 +19,7 @@
<li><a href="files.html"><span>File List</span></a></li>
<li><a href="globals.html"><span>File Members</span></a></li>
</ul></div>
-<h1>atomic.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<h1>aligned_space.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
<a name="l00003"></a>00003 <span class="comment"></span>
<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
@@ -39,357 +39,29 @@
<a name="l00018"></a>00018 <span class="comment"> writing.</span>
<a name="l00019"></a>00019 <span class="comment">*/</span>
<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_atomic_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_atomic_H</span>
+<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_aligned_space_H</span>
+<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_aligned_space_H</span>
<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include <cstddef></span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "tbb_stddef.h"</span>
+<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
+<a name="l00025"></a>00025 <span class="preprocessor">#include "tbb_machine.h"</span>
<a name="l00026"></a>00026
-<a name="l00027"></a>00027 <span class="preprocessor">#if _MSC_VER </span>
-<a name="l00028"></a>00028 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_LONG_LONG __int64</span>
-<a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_LONG_LONG long long</span>
-<a name="l00031"></a>00031 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* _MSC_VER */</span>
-<a name="l00032"></a>00032
-<a name="l00033"></a>00033 <span class="preprocessor">#include "tbb_machine.h"</span>
-<a name="l00034"></a>00034
-<a name="l00035"></a>00035 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)</span>
-<a name="l00036"></a>00036 <span class="preprocessor"></span> <span class="comment">// Workaround for overzealous compiler warnings </span>
-<a name="l00037"></a>00037 <span class="preprocessor"> #pragma warning (push)</span>
-<a name="l00038"></a>00038 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4244 4267)</span>
-<a name="l00039"></a>00039 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00040"></a>00040 <span class="preprocessor"></span>
-<a name="l00041"></a>00041 <span class="keyword">namespace </span>tbb {
-<a name="l00042"></a>00042
-<a name="l00044"></a><a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fef">00044</a> <span class="keyword">enum</span> <a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fef">memory_semantics</a> {
-<a name="l00046"></a>00046 <a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fefc6db01678b1749dff7554688d079520c">__TBB_full_fence</a>,
-<a name="l00048"></a>00048 <a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>,
-<a name="l00050"></a>00050 <a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>
-<a name="l00051"></a>00051 };
-<a name="l00052"></a>00052
-<a name="l00054"></a>00054 <span class="keyword">namespace </span>internal {
-<a name="l00055"></a>00055
-<a name="l00056"></a>00056 <span class="preprocessor">#if __GNUC__ || __SUNPRO_CC</span>
-<a name="l00057"></a>00057 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_DECL_ATOMIC_FIELD(t,f,a) t f __attribute__ ((aligned(a)));</span>
-<a name="l00058"></a>00058 <span class="preprocessor"></span><span class="preprocessor">#elif defined(__INTEL_COMPILER)||_MSC_VER >= 1300</span>
-<a name="l00059"></a>00059 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_DECL_ATOMIC_FIELD(t,f,a) __declspec(align(a)) t f;</span>
-<a name="l00060"></a>00060 <span class="preprocessor"></span><span class="preprocessor">#else </span>
-<a name="l00061"></a>00061 <span class="preprocessor"></span><span class="preprocessor">#error Do not know syntax for forcing alignment.</span>
-<a name="l00062"></a>00062 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __GNUC__ */</span>
-<a name="l00063"></a>00063
-<a name="l00064"></a>00064 <span class="keyword">template</span><size_t S>
-<a name="l00065"></a>00065 <span class="keyword">struct </span>atomic_rep; <span class="comment">// Primary template declared, but never defined.</span>
-<a name="l00066"></a>00066
-<a name="l00067"></a>00067 <span class="keyword">template</span><>
-<a name="l00068"></a>00068 <span class="keyword">struct </span>atomic_rep<1> { <span class="comment">// Specialization</span>
-<a name="l00069"></a>00069 <span class="keyword">typedef</span> int8_t word;
-<a name="l00070"></a>00070 int8_t value;
-<a name="l00071"></a>00071 };
-<a name="l00072"></a>00072 <span class="keyword">template</span><>
-<a name="l00073"></a>00073 <span class="keyword">struct </span>atomic_rep<2> { <span class="comment">// Specialization</span>
-<a name="l00074"></a>00074 <span class="keyword">typedef</span> int16_t word;
-<a name="l00075"></a>00075 __TBB_DECL_ATOMIC_FIELD(int16_t,value,2)
-<a name="l00076"></a>00076 };
-<a name="l00077"></a>00077 <span class="keyword">template</span><>
-<a name="l00078"></a>00078 <span class="keyword">struct </span>atomic_rep<4> { <span class="comment">// Specialization</span>
-<a name="l00079"></a>00079 <span class="preprocessor">#if _MSC_VER && __TBB_WORDSIZE==4</span>
-<a name="l00080"></a>00080 <span class="preprocessor"></span> <span class="comment">// Work-around that avoids spurious /Wp64 warnings</span>
-<a name="l00081"></a>00081 <span class="keyword">typedef</span> intptr_t word;
-<a name="l00082"></a>00082 <span class="preprocessor">#else</span>
-<a name="l00083"></a>00083 <span class="preprocessor"></span> <span class="keyword">typedef</span> int32_t word;
-<a name="l00084"></a>00084 <span class="preprocessor">#endif</span>
-<a name="l00085"></a>00085 <span class="preprocessor"></span> __TBB_DECL_ATOMIC_FIELD(int32_t,value,4)
-<a name="l00086"></a>00086 };
-<a name="l00087"></a>00087 <span class="keyword">template</span><>
-<a name="l00088"></a>00088 <span class="keyword">struct </span>atomic_rep<8> { <span class="comment">// Specialization</span>
-<a name="l00089"></a>00089 <span class="keyword">typedef</span> int64_t word;
-<a name="l00090"></a>00090 __TBB_DECL_ATOMIC_FIELD(int64_t,value,8)
-<a name="l00091"></a>00091 };
-<a name="l00092"></a>00092
-<a name="l00093"></a>00093 <span class="keyword">template</span><size_t Size, memory_semantics M>
-<a name="l00094"></a>00094 <span class="keyword">struct </span>atomic_traits; <span class="comment">// Primary template declared, but not defined.</span>
-<a name="l00095"></a>00095
-<a name="l00096"></a>00096 <span class="preprocessor">#define __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(S,M) \</span>
-<a name="l00097"></a>00097 <span class="preprocessor"> template<> struct atomic_traits<S,M> { \</span>
-<a name="l00098"></a>00098 <span class="preprocessor"> typedef atomic_rep<S>::word word; \</span>
-<a name="l00099"></a>00099 <span class="preprocessor"> inline static word compare_and_swap( volatile void* location, word new_value, word comparand ) {\</span>
-<a name="l00100"></a>00100 <span class="preprocessor"> return __TBB_CompareAndSwap##S##M(location,new_value,comparand); \</span>
-<a name="l00101"></a>00101 <span class="preprocessor"> } \</span>
-<a name="l00102"></a>00102 <span class="preprocessor"> inline static word fetch_and_add( volatile void* location, word addend ) { \</span>
-<a name="l00103"></a>00103 <span class="preprocessor"> return __TBB_FetchAndAdd##S##M(location,addend); \</span>
-<a name="l00104"></a>00104 <span class="preprocessor"> } \</span>
-<a name="l00105"></a>00105 <span class="preprocessor"> inline static word fetch_and_store( volatile void* location, word value ) {\</span>
-<a name="l00106"></a>00106 <span class="preprocessor"> return __TBB_FetchAndStore##S##M(location,value); \</span>
-<a name="l00107"></a>00107 <span class="preprocessor"> } \</span>
-<a name="l00108"></a>00108 <span class="preprocessor"> };</span>
-<a name="l00109"></a>00109 <span class="preprocessor"></span>
-<a name="l00110"></a>00110 <span class="preprocessor">#define __TBB_DECL_ATOMIC_PRIMITIVES(S) \</span>
-<a name="l00111"></a>00111 <span class="preprocessor"> template<memory_semantics M> \</span>
-<a name="l00112"></a>00112 <span class="preprocessor"> struct atomic_traits<S,M> { \</span>
-<a name="l00113"></a>00113 <span class="preprocessor"> typedef atomic_rep<S>::word word; \</span>
-<a name="l00114"></a>00114 <span class="preprocessor"> inline static word compare_and_swap( volatile void* location, word new_value, word comparand ) {\</span>
-<a name="l00115"></a>00115 <span class="preprocessor"> return __TBB_CompareAndSwap##S(location,new_value,comparand); \</span>
-<a name="l00116"></a>00116 <span class="preprocessor"> } \</span>
-<a name="l00117"></a>00117 <span class="preprocessor"> inline static word fetch_and_add( volatile void* location, word addend ) { \</span>
-<a name="l00118"></a>00118 <span class="preprocessor"> return __TBB_FetchAndAdd##S(location,addend); \</span>
-<a name="l00119"></a>00119 <span class="preprocessor"> } \</span>
-<a name="l00120"></a>00120 <span class="preprocessor"> inline static word fetch_and_store( volatile void* location, word value ) {\</span>
-<a name="l00121"></a>00121 <span class="preprocessor"> return __TBB_FetchAndStore##S(location,value); \</span>
-<a name="l00122"></a>00122 <span class="preprocessor"> } \</span>
-<a name="l00123"></a>00123 <span class="preprocessor"> };</span>
-<a name="l00124"></a>00124 <span class="preprocessor"></span>
-<a name="l00125"></a>00125 <span class="preprocessor">#if __TBB_DECL_FENCED_ATOMICS</span>
-<a name="l00126"></a>00126 <span class="preprocessor"></span>__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(1,<a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fefc6db01678b1749dff7554688d079520c">__TBB_full_fence</a>)
-<a name="l00127"></a>00127 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(2,<a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fefc6db01678b1749dff7554688d079520c">__TBB_full_fence</a>)
-<a name="l00128"></a>00128 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(4,<a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fefc6db01678b1749dff7554688d079520c">__TBB_full_fence</a>)
-<a name="l00129"></a>00129 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(8,<a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fefc6db01678b1749dff7554688d079520c">__TBB_full_fence</a>)
-<a name="l00130"></a>00130 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(1,<a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>)
-<a name="l00131"></a>00131 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(2,<a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>)
-<a name="l00132"></a>00132 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(4,<a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>)
-<a name="l00133"></a>00133 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(8,<a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>)
-<a name="l00134"></a>00134 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(1,<a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>)
-<a name="l00135"></a>00135 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(2,<a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>)
-<a name="l00136"></a>00136 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(4,<a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>)
-<a name="l00137"></a>00137 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(8,<a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>)
-<a name="l00138"></a>00138 <span class="preprocessor">#else</span>
-<a name="l00139"></a>00139 <span class="preprocessor"></span>__TBB_DECL_ATOMIC_PRIMITIVES(1)
-<a name="l00140"></a>00140 __TBB_DECL_ATOMIC_PRIMITIVES(2)
-<a name="l00141"></a>00141 __TBB_DECL_ATOMIC_PRIMITIVES(4)
-<a name="l00142"></a>00142 __TBB_DECL_ATOMIC_PRIMITIVES(8)
-<a name="l00143"></a>00143 <span class="preprocessor">#endif</span>
-<a name="l00144"></a>00144 <span class="preprocessor"></span>
-<a name="l00146"></a>00146
-<a name="l00148"></a>00148 <span class="preprocessor">#define __TBB_MINUS_ONE(T) (T(T(0)-T(1)))</span>
-<a name="l00149"></a>00149 <span class="preprocessor"></span>
-<a name="l00151"></a>00151
-<a name="l00153"></a>00153 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00154"></a>00154 <span class="keyword">struct </span>atomic_impl {
-<a name="l00155"></a>00155 <span class="keyword">protected</span>:
-<a name="l00156"></a>00156 atomic_rep<sizeof(T)> rep;
-<a name="l00157"></a>00157 <span class="keyword">private</span>:
-<a name="l00159"></a>00159 <span class="keyword">union </span>converter {
-<a name="l00160"></a>00160 T value;
-<a name="l00161"></a>00161 <span class="keyword">typename</span> atomic_rep<sizeof(T)>::word bits;
-<a name="l00162"></a>00162 };
-<a name="l00163"></a>00163 <span class="keyword">public</span>:
-<a name="l00164"></a>00164 <span class="keyword">typedef</span> T value_type;
-<a name="l00165"></a>00165
-<a name="l00166"></a>00166 <span class="keyword">template</span><memory_semantics M>
-<a name="l00167"></a>00167 value_type fetch_and_store( value_type value ) {
-<a name="l00168"></a>00168 converter u, w;
-<a name="l00169"></a>00169 u.value = value;
-<a name="l00170"></a>00170 w.bits = internal::atomic_traits<sizeof(value_type),M>::fetch_and_store(&rep.value,u.bits);
-<a name="l00171"></a>00171 <span class="keywordflow">return</span> w.value;
-<a name="l00172"></a>00172 }
-<a name="l00173"></a>00173
-<a name="l00174"></a>00174 value_type fetch_and_store( value_type value ) {
-<a name="l00175"></a>00175 <span class="keywordflow">return</span> fetch_and_store<__TBB_full_fence>(value);
-<a name="l00176"></a>00176 }
-<a name="l00177"></a>00177
-<a name="l00178"></a>00178 <span class="keyword">template</span><memory_semantics M>
-<a name="l00179"></a>00179 value_type compare_and_swap( value_type value, value_type comparand ) {
-<a name="l00180"></a>00180 converter u, v, w;
-<a name="l00181"></a>00181 u.value = value;
-<a name="l00182"></a>00182 v.value = comparand;
-<a name="l00183"></a>00183 w.bits = internal::atomic_traits<sizeof(value_type),M>::compare_and_swap(&rep.value,u.bits,v.bits);
-<a name="l00184"></a>00184 <span class="keywordflow">return</span> w.value;
-<a name="l00185"></a>00185 }
-<a name="l00186"></a>00186
-<a name="l00187"></a>00187 value_type compare_and_swap( value_type value, value_type comparand ) {
-<a name="l00188"></a>00188 <span class="keywordflow">return</span> compare_and_swap<__TBB_full_fence>(value,comparand);
-<a name="l00189"></a>00189 }
-<a name="l00190"></a>00190
-<a name="l00191"></a>00191 operator value_type()<span class="keyword"> const volatile </span>{ <span class="comment">// volatile qualifier here for backwards compatibility </span>
-<a name="l00192"></a>00192 converter w;
-<a name="l00193"></a>00193 w.bits = __TBB_load_with_acquire( rep.value );
-<a name="l00194"></a>00194 <span class="keywordflow">return</span> w.value;
-<a name="l00195"></a>00195 }
-<a name="l00196"></a>00196
-<a name="l00197"></a>00197 <span class="keyword">protected</span>:
-<a name="l00198"></a>00198 value_type store_with_release( value_type rhs ) {
-<a name="l00199"></a>00199 converter u;
-<a name="l00200"></a>00200 u.value = rhs;
-<a name="l00201"></a>00201 __TBB_store_with_release(rep.value,u.bits);
-<a name="l00202"></a>00202 <span class="keywordflow">return</span> rhs;
-<a name="l00203"></a>00203 }
-<a name="l00204"></a>00204 };
-<a name="l00205"></a>00205
-<a name="l00207"></a>00207
-<a name="l00210"></a>00210 <span class="keyword">template</span><<span class="keyword">typename</span> I, <span class="keyword">typename</span> D, <span class="keyword">typename</span> StepType>
-<a name="l00211"></a>00211 <span class="keyword">struct </span>atomic_impl_with_arithmetic: atomic_impl<I> {
-<a name="l00212"></a>00212 <span class="keyword">public</span>:
-<a name="l00213"></a>00213 <span class="keyword">typedef</span> I value_type;
-<a name="l00214"></a>00214
-<a name="l00215"></a>00215 <span class="keyword">template</span><memory_semantics M>
-<a name="l00216"></a>00216 value_type fetch_and_add( D addend ) {
-<a name="l00217"></a>00217 <span class="keywordflow">return</span> value_type(internal::atomic_traits<<span class="keyword">sizeof</span>(value_type),M>::fetch_and_add( &this->rep.value, addend*<span class="keyword">sizeof</span>(StepType) ));
-<a name="l00218"></a>00218 }
-<a name="l00219"></a>00219
-<a name="l00220"></a>00220 value_type fetch_and_add( D addend ) {
-<a name="l00221"></a>00221 <span class="keywordflow">return</span> fetch_and_add<__TBB_full_fence>(addend);
-<a name="l00222"></a>00222 }
-<a name="l00223"></a>00223
-<a name="l00224"></a>00224 <span class="keyword">template</span><memory_semantics M>
-<a name="l00225"></a>00225 value_type fetch_and_increment() {
-<a name="l00226"></a>00226 <span class="keywordflow">return</span> fetch_and_add<M>(1);
-<a name="l00227"></a>00227 }
-<a name="l00228"></a>00228
-<a name="l00229"></a>00229 value_type fetch_and_increment() {
-<a name="l00230"></a>00230 <span class="keywordflow">return</span> fetch_and_add(1);
-<a name="l00231"></a>00231 }
-<a name="l00232"></a>00232
-<a name="l00233"></a>00233 <span class="keyword">template</span><memory_semantics M>
-<a name="l00234"></a>00234 value_type fetch_and_decrement() {
-<a name="l00235"></a>00235 <span class="keywordflow">return</span> fetch_and_add<M>(__TBB_MINUS_ONE(D));
-<a name="l00236"></a>00236 }
-<a name="l00237"></a>00237
-<a name="l00238"></a>00238 value_type fetch_and_decrement() {
-<a name="l00239"></a>00239 <span class="keywordflow">return</span> fetch_and_add(__TBB_MINUS_ONE(D));
-<a name="l00240"></a>00240 }
-<a name="l00241"></a>00241
-<a name="l00242"></a>00242 <span class="keyword">public</span>:
-<a name="l00243"></a>00243 value_type operator+=( D addend ) {
-<a name="l00244"></a>00244 <span class="keywordflow">return</span> fetch_and_add(addend)+addend;
-<a name="l00245"></a>00245 }
-<a name="l00246"></a>00246
-<a name="l00247"></a>00247 value_type operator-=( D addend ) {
-<a name="l00248"></a>00248 <span class="comment">// Additive inverse of addend computed using binary minus,</span>
-<a name="l00249"></a>00249 <span class="comment">// instead of unary minus, for sake of avoiding compiler warnings.</span>
-<a name="l00250"></a>00250 <span class="keywordflow">return</span> operator+=(D(0)-addend);
-<a name="l00251"></a>00251 }
-<a name="l00252"></a>00252
-<a name="l00253"></a>00253 value_type operator++() {
-<a name="l00254"></a>00254 <span class="keywordflow">return</span> fetch_and_add(1)+1;
-<a name="l00255"></a>00255 }
-<a name="l00256"></a>00256
-<a name="l00257"></a>00257 value_type operator--() {
-<a name="l00258"></a>00258 <span class="keywordflow">return</span> fetch_and_add(__TBB_MINUS_ONE(D))-1;
-<a name="l00259"></a>00259 }
-<a name="l00260"></a>00260
-<a name="l00261"></a>00261 value_type operator++(<span class="keywordtype">int</span>) {
-<a name="l00262"></a>00262 <span class="keywordflow">return</span> fetch_and_add(1);
-<a name="l00263"></a>00263 }
-<a name="l00264"></a>00264
-<a name="l00265"></a>00265 value_type operator--(<span class="keywordtype">int</span>) {
-<a name="l00266"></a>00266 <span class="keywordflow">return</span> fetch_and_add(__TBB_MINUS_ONE(D));
-<a name="l00267"></a>00267 }
-<a name="l00268"></a>00268 };
-<a name="l00269"></a>00269
-<a name="l00270"></a>00270 <span class="preprocessor">#if __TBB_WORDSIZE == 4</span>
-<a name="l00271"></a>00271 <span class="preprocessor"></span><span class="comment">// Plaforms with 32-bit hardware require special effort for 64-bit loads and stores.</span>
-<a name="l00272"></a>00272 <span class="preprocessor">#if defined(__INTEL_COMPILER)||!defined(_MSC_VER)||_MSC_VER>=1400</span>
-<a name="l00273"></a>00273 <span class="preprocessor"></span>
-<a name="l00274"></a>00274 <span class="keyword">template</span><>
-<a name="l00275"></a>00275 <span class="keyword">inline</span> atomic_impl<__TBB_LONG_LONG>::operator atomic_impl<__TBB_LONG_LONG>::value_type()<span class="keyword"> const volatile </span>{
-<a name="l00276"></a>00276 <span class="keywordflow">return</span> __TBB_Load8(&rep.value);
-<a name="l00277"></a>00277 }
-<a name="l00278"></a>00278
-<a name="l00279"></a>00279 <span class="keyword">template</span><>
-<a name="l00280"></a>00280 <span class="keyword">inline</span> atomic_impl<unsigned __TBB_LONG_LONG>::operator atomic_impl<unsigned __TBB_LONG_LONG>::value_type()<span class="keyword"> const volatile </span>{
-<a name="l00281"></a>00281 <span class="keywordflow">return</span> __TBB_Load8(&rep.value);
-<a name="l00282"></a>00282 }
-<a name="l00283"></a>00283
-<a name="l00284"></a>00284 <span class="keyword">template</span><>
-<a name="l00285"></a>00285 <span class="keyword">inline</span> atomic_impl<__TBB_LONG_LONG>::value_type atomic_impl<__TBB_LONG_LONG>::store_with_release( value_type rhs ) {
-<a name="l00286"></a>00286 __TBB_Store8(&rep.value,rhs);
-<a name="l00287"></a>00287 <span class="keywordflow">return</span> rhs;
-<a name="l00288"></a>00288 }
-<a name="l00289"></a>00289
-<a name="l00290"></a>00290 <span class="keyword">template</span><>
-<a name="l00291"></a>00291 <span class="keyword">inline</span> atomic_impl<unsigned __TBB_LONG_LONG>::value_type atomic_impl<unsigned __TBB_LONG_LONG>::store_with_release( value_type rhs ) {
-<a name="l00292"></a>00292 __TBB_Store8(&rep.value,rhs);
-<a name="l00293"></a>00293 <span class="keywordflow">return</span> rhs;
-<a name="l00294"></a>00294 }
-<a name="l00295"></a>00295
-<a name="l00296"></a>00296 <span class="preprocessor">#endif </span><span class="comment">/* defined(__INTEL_COMPILER)||!defined(_MSC_VER)||_MSC_VER>=1400 */</span>
-<a name="l00297"></a>00297 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_WORDSIZE==4 */</span>
-<a name="l00298"></a>00298
-<a name="l00299"></a>00299 } <span class="comment">/* Internal */</span>
-<a name="l00301"></a>00301
-<a name="l00303"></a>00303
-<a name="l00305"></a>00305 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00306"></a><a class="code" href="a00143.html">00306</a> <span class="keyword">struct </span><a class="code" href="a00143.html">atomic</a>: internal::atomic_impl<T> {
-<a name="l00307"></a>00307 T operator=( T rhs ) {
-<a name="l00308"></a>00308 <span class="comment">// "this" required here in strict ISO C++ because store_with_release is a dependent name</span>
-<a name="l00309"></a>00309 <span class="keywordflow">return</span> this->store_with_release(rhs);
-<a name="l00310"></a>00310 }
-<a name="l00311"></a>00311 <a class="code" href="a00143.html">atomic<T></a>& operator=( <span class="keyword">const</span> <a class="code" href="a00143.html">atomic<T></a>& rhs ) {this->store_with_release(rhs); <span class="keywordflow">return</span> *<span class="keyword">this</span>;}
-<a name="l00312"></a>00312 };
-<a name="l00313"></a>00313
-<a name="l00314"></a>00314 <span class="preprocessor">#define __TBB_DECL_ATOMIC(T) \</span>
-<a name="l00315"></a>00315 <span class="preprocessor"> template<> struct atomic<T>: internal::atomic_impl_with_arithmetic<T,T,char> { \</span>
-<a name="l00316"></a>00316 <span class="preprocessor"> T operator=( T rhs ) {return store_with_release(rhs);} \</span>
-<a name="l00317"></a>00317 <span class="preprocessor"> atomic<T>& operator=( const atomic<T>& rhs ) {store_with_release(rhs); return *this;} \</span>
-<a name="l00318"></a>00318 <span class="preprocessor"> };</span>
-<a name="l00319"></a>00319 <span class="preprocessor"></span>
-<a name="l00320"></a>00320 <span class="preprocessor">#if defined(__INTEL_COMPILER)||!defined(_MSC_VER)||_MSC_VER>=1400</span>
-<a name="l00321"></a>00321 <span class="preprocessor"></span>__TBB_DECL_ATOMIC(__TBB_LONG_LONG)
-<a name="l00322"></a>00322 __TBB_DECL_ATOMIC(<span class="keywordtype">unsigned</span> __TBB_LONG_LONG)
-<a name="l00323"></a>00323 <span class="preprocessor">#else</span>
-<a name="l00324"></a>00324 <span class="preprocessor"></span><span class="comment">// Some old versions of MVSC cannot correctly compile templates with "long long".</span>
-<a name="l00325"></a>00325 <span class="preprocessor">#endif </span><span class="comment">/* defined(__INTEL_COMPILER)||!defined(_MSC_VER)||_MSC_VER>=1400 */</span>
-<a name="l00326"></a>00326
-<a name="l00327"></a>00327 __TBB_DECL_ATOMIC(<span class="keywordtype">long</span>)
-<a name="l00328"></a>00328 __TBB_DECL_ATOMIC(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>)
-<a name="l00329"></a>00329
-<a name="l00330"></a>00330 <span class="preprocessor">#if defined(_MSC_VER) && __TBB_WORDSIZE==4</span>
-<a name="l00331"></a>00331 <span class="preprocessor"></span><span class="comment">/* Special version of __TBB_DECL_ATOMIC that avoids gratuitous warnings from cl /Wp64 option. </span>
-<a name="l00332"></a>00332 <span class="comment"> It is identical to __TBB_DECL_ATOMIC(unsigned) except that it replaces operator=(T) </span>
-<a name="l00333"></a>00333 <span class="comment"> with an operator=(U) that explicitly converts the U to a T. Types T and U should be</span>
-<a name="l00334"></a>00334 <span class="comment"> type synonyms on the platform. Type U should be the wider variant of T from the</span>
-<a name="l00335"></a>00335 <span class="comment"> perspective of /Wp64. */</span>
-<a name="l00336"></a>00336 <span class="preprocessor">#define __TBB_DECL_ATOMIC_ALT(T,U) \</span>
-<a name="l00337"></a>00337 <span class="preprocessor"> template<> struct atomic<T>: internal::atomic_impl_with_arithmetic<T,T,char> { \</span>
-<a name="l00338"></a>00338 <span class="preprocessor"> T operator=( U rhs ) {return store_with_release(T(rhs));} \</span>
-<a name="l00339"></a>00339 <span class="preprocessor"> atomic<T>& operator=( const atomic<T>& rhs ) {store_with_release(rhs); return *this;} \</span>
-<a name="l00340"></a>00340 <span class="preprocessor"> };</span>
-<a name="l00341"></a>00341 <span class="preprocessor"></span><a class="code" href="a00267.html#ad165cf61abbe349d413df2589679add">__TBB_DECL_ATOMIC_ALT</a>(<span class="keywordtype">unsigned</span>,size_t)
-<a name="l00342"></a><a class="code" href="a00267.html#ad165cf61abbe349d413df2589679add">00342</a> __TBB_DECL_ATOMIC_ALT(<span class="keywordtype">int</span>,ptrdiff_t)
-<a name="l00343"></a>00343 <span class="preprocessor">#else</span>
-<a name="l00344"></a>00344 <span class="preprocessor"></span>__TBB_DECL_ATOMIC(<span class="keywordtype">unsigned</span>)
-<a name="l00345"></a>00345 __TBB_DECL_ATOMIC(<span class="keywordtype">int</span>)
-<a name="l00346"></a>00346 <span class="preprocessor">#endif </span><span class="comment">/* defined(_MSC_VER) && __TBB_WORDSIZE==4 */</span>
-<a name="l00347"></a>00347
-<a name="l00348"></a>00348 __TBB_DECL_ATOMIC(<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span>)
-<a name="l00349"></a>00349 __TBB_DECL_ATOMIC(<span class="keywordtype">short</span>)
-<a name="l00350"></a>00350 __TBB_DECL_ATOMIC(<span class="keywordtype">char</span>)
-<a name="l00351"></a>00351 __TBB_DECL_ATOMIC(<span class="keywordtype">signed</span> <span class="keywordtype">char</span>)
-<a name="l00352"></a>00352 __TBB_DECL_ATOMIC(<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)
-<a name="l00353"></a>00353
-<a name="l00354"></a>00354 <span class="preprocessor">#if !defined(_MSC_VER)||defined(_NATIVE_WCHAR_T_DEFINED) </span>
-<a name="l00355"></a>00355 <span class="preprocessor"></span>__TBB_DECL_ATOMIC(<span class="keywordtype">wchar_t</span>)
-<a name="l00356"></a>00356 <span class="preprocessor">#endif </span><span class="comment">/* _MSC_VER||!defined(_NATIVE_WCHAR_T_DEFINED) */</span>
-<a name="l00357"></a>00357
-<a name="l00359"></a>00359 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">struct </span><a class="code" href="a00143.html">atomic</a><T*>: internal::atomic_impl_with_arithmetic<T*,ptrdiff_t,T> {
-<a name="l00360"></a>00360 T* operator=( T* rhs ) {
-<a name="l00361"></a>00361 <span class="comment">// "this" required here in strict ISO C++ because store_with_release is a dependent name</span>
-<a name="l00362"></a>00362 <span class="keywordflow">return</span> this->store_with_release(rhs);
-<a name="l00363"></a>00363 }
-<a name="l00364"></a>00364 <a class="code" href="a00143.html">atomic<T*></a>& operator=( <span class="keyword">const</span> <a class="code" href="a00143.html">atomic<T*></a>& rhs ) {
-<a name="l00365"></a>00365 this->store_with_release(rhs); <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00366"></a>00366 }
-<a name="l00367"></a>00367 T* operator->()<span class="keyword"> const </span>{
-<a name="l00368"></a>00368 <span class="keywordflow">return</span> (*<span class="keyword">this</span>);
-<a name="l00369"></a>00369 }
-<a name="l00370"></a>00370 };
-<a name="l00371"></a>00371
-<a name="l00373"></a><a class="code" href="a00144.html">00373</a> <span class="keyword">template</span><> <span class="keyword">struct </span><a class="code" href="a00143.html">atomic</a><void*>: internal::atomic_impl<void*> {
-<a name="l00374"></a>00374 <span class="keywordtype">void</span>* operator=( <span class="keywordtype">void</span>* rhs ) {
-<a name="l00375"></a>00375 <span class="comment">// "this" required here in strict ISO C++ because store_with_release is a dependent name</span>
-<a name="l00376"></a>00376 <span class="keywordflow">return</span> this->store_with_release(rhs);
-<a name="l00377"></a>00377 }
-<a name="l00378"></a>00378 <a class="code" href="a00143.html">atomic<void*></a>& operator=( <span class="keyword">const</span> <a class="code" href="a00143.html">atomic<void*></a>& rhs ) {
-<a name="l00379"></a>00379 this->store_with_release(rhs); <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00380"></a>00380 }
-<a name="l00381"></a>00381 };
-<a name="l00382"></a>00382
-<a name="l00383"></a>00383 } <span class="comment">// namespace tbb</span>
-<a name="l00384"></a>00384
-<a name="l00385"></a>00385 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)</span>
-<a name="l00386"></a>00386 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
-<a name="l00387"></a>00387 <span class="preprocessor"></span><span class="preprocessor">#endif // warnings 4244, 4267 are back</span>
-<a name="l00388"></a>00388 <span class="preprocessor"></span>
-<a name="l00389"></a>00389 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_atomic_H */</span>
+<a name="l00027"></a>00027 <span class="keyword">namespace </span>tbb {
+<a name="l00028"></a>00028
+<a name="l00030"></a>00030
+<a name="l00032"></a>00032 <span class="keyword">template</span><<span class="keyword">typename</span> T,size_t N>
+<a name="l00033"></a><a class="code" href="a00141.html">00033</a> <span class="keyword">class </span><a class="code" href="a00141.html">aligned_space</a> {
+<a name="l00034"></a>00034 <span class="keyword">private</span>:
+<a name="l00035"></a>00035 <span class="keyword">typedef</span> __TBB_TypeWithAlignmentAtLeastAsStrict(T) element_type;
+<a name="l00036"></a>00036 element_type array[(<span class="keyword">sizeof</span>(T)*N+<span class="keyword">sizeof</span>(element_type)-1)/<span class="keyword">sizeof</span>(element_type)];
+<a name="l00037"></a>00037 <span class="keyword">public</span>:
+<a name="l00039"></a><a class="code" href="a00141.html#0d702fc6b9e9d061ace3501b3c861cdf">00039</a> T* <a class="code" href="a00141.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>() {<span class="keywordflow">return</span> internal::punned_cast<T*>(<span class="keyword">this</span>);}
+<a name="l00040"></a>00040
+<a name="l00042"></a><a class="code" href="a00141.html#024be075c23c0394c9a2518d993bcd9e">00042</a> T* <a class="code" href="a00141.html#024be075c23c0394c9a2518d993bcd9e">end</a>() {<span class="keywordflow">return</span> <a class="code" href="a00141.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()+N;}
+<a name="l00043"></a>00043 };
+<a name="l00044"></a>00044
+<a name="l00045"></a>00045 } <span class="comment">// namespace tbb </span>
+<a name="l00046"></a>00046
+<a name="l00047"></a>00047 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_aligned_space_H */</span>
</pre></div><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00311.html b/doc/html/a00312.html
similarity index 98%
copy from doc/html/a00311.html
copy to doc/html/a00312.html
index 85cf83c..a923726 100644
--- a/doc/html/a00311.html
+++ b/doc/html/a00312.html
@@ -308,12 +308,12 @@
<a name="l00301"></a>00301
<a name="l00303"></a>00303
<a name="l00305"></a>00305 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00306"></a><a class="code" href="a00143.html">00306</a> <span class="keyword">struct </span><a class="code" href="a00143.html">atomic</a>: internal::atomic_impl<T> {
+<a name="l00306"></a><a class="code" href="a00142.html">00306</a> <span class="keyword">struct </span><a class="code" href="a00142.html">atomic</a>: internal::atomic_impl<T> {
<a name="l00307"></a>00307 T operator=( T rhs ) {
<a name="l00308"></a>00308 <span class="comment">// "this" required here in strict ISO C++ because store_with_release is a dependent name</span>
<a name="l00309"></a>00309 <span class="keywordflow">return</span> this->store_with_release(rhs);
<a name="l00310"></a>00310 }
-<a name="l00311"></a>00311 <a class="code" href="a00143.html">atomic<T></a>& operator=( <span class="keyword">const</span> <a class="code" href="a00143.html">atomic<T></a>& rhs ) {this->store_with_release(rhs); <span class="keywordflow">return</span> *<span class="keyword">this</span>;}
+<a name="l00311"></a>00311 <a class="code" href="a00142.html">atomic<T></a>& operator=( <span class="keyword">const</span> <a class="code" href="a00142.html">atomic<T></a>& rhs ) {this->store_with_release(rhs); <span class="keywordflow">return</span> *<span class="keyword">this</span>;}
<a name="l00312"></a>00312 };
<a name="l00313"></a>00313
<a name="l00314"></a>00314 <span class="preprocessor">#define __TBB_DECL_ATOMIC(T) \</span>
@@ -360,12 +360,12 @@
<a name="l00355"></a>00355 <span class="preprocessor"></span>__TBB_DECL_ATOMIC(<span class="keywordtype">wchar_t</span>)
<a name="l00356"></a>00356 <span class="preprocessor">#endif </span><span class="comment">/* _MSC_VER||!defined(_NATIVE_WCHAR_T_DEFINED) */</span>
<a name="l00357"></a>00357
-<a name="l00359"></a>00359 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">struct </span><a class="code" href="a00143.html">atomic</a><T*>: internal::atomic_impl_with_arithmetic<T*,ptrdiff_t,T> {
+<a name="l00359"></a>00359 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">struct </span><a class="code" href="a00142.html">atomic</a><T*>: internal::atomic_impl_with_arithmetic<T*,ptrdiff_t,T> {
<a name="l00360"></a>00360 T* operator=( T* rhs ) {
<a name="l00361"></a>00361 <span class="comment">// "this" required here in strict ISO C++ because store_with_release is a dependent name</span>
<a name="l00362"></a>00362 <span class="keywordflow">return</span> this->store_with_release(rhs);
<a name="l00363"></a>00363 }
-<a name="l00364"></a>00364 <a class="code" href="a00143.html">atomic<T*></a>& operator=( <span class="keyword">const</span> <a class="code" href="a00143.html">atomic<T*></a>& rhs ) {
+<a name="l00364"></a>00364 <a class="code" href="a00142.html">atomic<T*></a>& operator=( <span class="keyword">const</span> <a class="code" href="a00142.html">atomic<T*></a>& rhs ) {
<a name="l00365"></a>00365 this->store_with_release(rhs); <span class="keywordflow">return</span> *<span class="keyword">this</span>;
<a name="l00366"></a>00366 }
<a name="l00367"></a>00367 T* operator->()<span class="keyword"> const </span>{
@@ -373,12 +373,12 @@
<a name="l00369"></a>00369 }
<a name="l00370"></a>00370 };
<a name="l00371"></a>00371
-<a name="l00373"></a><a class="code" href="a00144.html">00373</a> <span class="keyword">template</span><> <span class="keyword">struct </span><a class="code" href="a00143.html">atomic</a><void*>: internal::atomic_impl<void*> {
+<a name="l00373"></a><a class="code" href="a00143.html">00373</a> <span class="keyword">template</span><> <span class="keyword">struct </span><a class="code" href="a00142.html">atomic</a><void*>: internal::atomic_impl<void*> {
<a name="l00374"></a>00374 <span class="keywordtype">void</span>* operator=( <span class="keywordtype">void</span>* rhs ) {
<a name="l00375"></a>00375 <span class="comment">// "this" required here in strict ISO C++ because store_with_release is a dependent name</span>
<a name="l00376"></a>00376 <span class="keywordflow">return</span> this->store_with_release(rhs);
<a name="l00377"></a>00377 }
-<a name="l00378"></a>00378 <a class="code" href="a00143.html">atomic<void*></a>& operator=( <span class="keyword">const</span> <a class="code" href="a00143.html">atomic<void*></a>& rhs ) {
+<a name="l00378"></a>00378 <a class="code" href="a00142.html">atomic<void*></a>& operator=( <span class="keyword">const</span> <a class="code" href="a00142.html">atomic<void*></a>& rhs ) {
<a name="l00379"></a>00379 this->store_with_release(rhs); <span class="keywordflow">return</span> *<span class="keyword">this</span>;
<a name="l00380"></a>00380 }
<a name="l00381"></a>00381 };
diff --git a/doc/html/a00319.html b/doc/html/a00319.html
deleted file mode 100644
index c268905..0000000
--- a/doc/html/a00319.html
+++ /dev/null
@@ -1,127 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>blocked_range.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>blocked_range.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_blocked_range_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_blocked_range_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00025"></a>00025
-<a name="l00026"></a>00026 <span class="keyword">namespace </span>tbb {
-<a name="l00027"></a>00027
-<a name="l00037"></a>00037
-<a name="l00038"></a>00038
-<a name="l00039"></a>00039 <span class="keyword">template</span><<span class="keyword">typename</span> Value>
-<a name="l00040"></a><a class="code" href="a00148.html">00040</a> <span class="keyword">class </span><a class="code" href="a00148.html">blocked_range</a> {
-<a name="l00041"></a>00041 <span class="keyword">public</span>:
-<a name="l00043"></a>00043
-<a name="l00045"></a><a class="code" href="a00148.html#1a8d05842c2b3dfc177bc4d347e4cef7">00045</a> <span class="keyword">typedef</span> Value <a class="code" href="a00148.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a>;
-<a name="l00046"></a>00046
-<a name="l00048"></a><a class="code" href="a00148.html#f5707bffea38eee5c9680f37358afb8e">00048</a> <span class="keyword">typedef</span> std::size_t <a class="code" href="a00148.html#f5707bffea38eee5c9680f37358afb8e">size_type</a>;
-<a name="l00049"></a>00049
-<a name="l00051"></a>00051
-<a name="l00052"></a><a class="code" href="a00148.html#94607755c5110d199202234d58d022ac">00052</a> <a class="code" href="a00148.html#94607755c5110d199202234d58d022ac">blocked_range</a>() : my_end(), my_begin() {}
-<a name="l00053"></a>00053
-<a name="l00055"></a><a class="code" href="a00148.html#14795a36ead1414b4371dbe1a4656359">00055</a> <a class="code" href="a00148.html#94607755c5110d199202234d58d022ac">blocked_range</a>( Value begin_, Value end_, <a class="code" href="a00148.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> grainsize_=1 ) :
-<a name="l00056"></a>00056 my_end(end_), my_begin(begin_), my_grainsize(grainsize_)
-<a name="l00057"></a>00057 {
-<a name="l00058"></a>00058 __TBB_ASSERT( my_grainsize>0, <span class="stringliteral">"grainsize must be positive"</span> );
-<a name="l00059"></a>00059 }
-<a name="l00060"></a>00060
-<a name="l00062"></a><a class="code" href="a00148.html#18d2258400756ac1446dac7676b18df3">00062</a> <a class="code" href="a00148.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> <a class="code" href="a00148.html#18d2258400756ac1446dac7676b18df3">begin</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_begin;}
-<a name="l00063"></a>00063
-<a name="l00065"></a><a class="code" href="a00148.html#8b929d93ddc13f148b11bceef3a3bdf8">00065</a> <a class="code" href="a00148.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> <a class="code" href="a00148.html#8b929d93ddc13f148b11bceef3a3bdf8">end</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_end;}
-<a name="l00066"></a>00066
-<a name="l00068"></a>00068
-<a name="l00069"></a><a class="code" href="a00148.html#9eaa0b6beff1420f688570bbf6b8c462">00069</a> <a class="code" href="a00148.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> <a class="code" href="a00148.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()<span class="keyword"> const </span>{
-<a name="l00070"></a>00070 __TBB_ASSERT( !(<a class="code" href="a00148.html#8b929d93ddc13f148b11bceef3a3bdf8">end</a>()<<a class="code" href="a00148.html#18d2258400756ac1446dac7676b18df3">begin</a>()), <span class="stringliteral">"size() unspecified if end()<begin()"</span> );
-<a name="l00071"></a>00071 <span class="keywordflow">return</span> <a class="code" href="a00148.html#f5707bffea38eee5c9680f37358afb8e">size_type</a>(my_end-my_begin);
-<a name="l00072"></a>00072 }
-<a name="l00073"></a>00073
-<a name="l00075"></a><a class="code" href="a00148.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">00075</a> <a class="code" href="a00148.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> <a class="code" href="a00148.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_grainsize;}
-<a name="l00076"></a>00076
-<a name="l00077"></a>00077 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00078"></a>00078 <span class="comment">// Methods that implement Range concept</span>
-<a name="l00079"></a>00079 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00080"></a>00080
-<a name="l00082"></a><a class="code" href="a00148.html#8f4f02f530eb3f2e7ea26e06f76aef9d">00082</a> <span class="keywordtype">bool</span> <a class="code" href="a00148.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> !(my_begin<my_end);}
-<a name="l00083"></a>00083
-<a name="l00085"></a>00085
-<a name="l00086"></a><a class="code" href="a00148.html#41a58b703d574b6e1ca155df3576f578">00086</a> <span class="keywordtype">bool</span> <a class="code" href="a00148.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_grainsize<<a class="code" href="a00148.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>();}
-<a name="l00087"></a>00087
-<a name="l00089"></a>00089
-<a name="l00091"></a><a class="code" href="a00148.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">00091</a> <a class="code" href="a00148.html#94607755c5110d199202234d58d022ac">blocked_range</a>( <a class="code" href="a00148.html">blocked_range</a>& r, <a class="code" href="a00198.html">split</a> ) :
-<a name="l00092"></a>00092 my_end(r.my_end),
-<a name="l00093"></a>00093 my_begin(do_split(r)),
-<a name="l00094"></a>00094 my_grainsize(r.my_grainsize)
-<a name="l00095"></a>00095 {}
-<a name="l00096"></a>00096
-<a name="l00097"></a>00097 <span class="keyword">private</span>:
-<a name="l00099"></a>00099 Value my_end;
-<a name="l00100"></a>00100 Value my_begin;
-<a name="l00101"></a>00101 <a class="code" href="a00148.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> my_grainsize;
-<a name="l00102"></a>00102
-<a name="l00104"></a>00104
-<a name="l00105"></a>00105 <span class="keyword">static</span> Value do_split( <a class="code" href="a00148.html">blocked_range</a>& r ) {
-<a name="l00106"></a>00106 __TBB_ASSERT( r.<a class="code" href="a00148.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>(), <span class="stringliteral">"cannot split blocked_range that is not divisible"</span> );
-<a name="l00107"></a>00107 Value middle = r.<a class="code" href="a00148.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> + (r.<a class="code" href="a00148.html#1ec95c8988b50064dd603998b16f3930">my_end</a>-r.<a class="code" href="a00148.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a>)/2u;
-<a name="l00108"></a>00108 r.<a class="code" href="a00148.html#1ec95c8988b50064dd603998b16f3930">my_end</a> = middle;
-<a name="l00109"></a>00109 <span class="keywordflow">return</span> middle;
-<a name="l00110"></a>00110 }
-<a name="l00111"></a>00111
-<a name="l00112"></a>00112 <span class="keyword">template</span><<span class="keyword">typename</span> RowValue, <span class="keyword">typename</span> ColValue>
-<a name="l00113"></a>00113 <span class="keyword">friend</span> <span class="keyword">class </span>blocked_range2d;
-<a name="l00114"></a>00114
-<a name="l00115"></a>00115 <span class="keyword">template</span><<span class="keyword">typename</span> RowValue, <span class="keyword">typename</span> ColValue, <span class="keyword">typename</span> PageValue>
-<a name="l00116"></a>00116 <span class="keyword">friend</span> <span class="keyword">class </span>blocked_range3d;
-<a name="l00117"></a>00117 };
-<a name="l00118"></a>00118
-<a name="l00119"></a>00119 } <span class="comment">// namespace tbb </span>
-<a name="l00120"></a>00120
-<a name="l00121"></a>00121 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_blocked_range_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00320.html b/doc/html/a00320.html
index e98c6f3..75d0fb5 100644
--- a/doc/html/a00320.html
+++ b/doc/html/a00320.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>blocked_range2d.h Source File</title>
+<title>blocked_range.h Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -19,7 +19,7 @@
<li><a href="files.html"><span>File List</span></a></li>
<li><a href="globals.html"><span>File Members</span></a></li>
</ul></div>
-<h1>blocked_range2d.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<h1>blocked_range.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
<a name="l00003"></a>00003 <span class="comment"></span>
<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
@@ -39,69 +39,83 @@
<a name="l00018"></a>00018 <span class="comment"> writing.</span>
<a name="l00019"></a>00019 <span class="comment">*/</span>
<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_blocked_range2d_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_blocked_range2d_H</span>
+<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_blocked_range_H</span>
+<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_blocked_range_H</span>
<a name="l00023"></a>00023 <span class="preprocessor"></span>
<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "blocked_range.h"</span>
-<a name="l00026"></a>00026
-<a name="l00027"></a>00027 <span class="keyword">namespace </span>tbb {
-<a name="l00028"></a>00028
-<a name="l00030"></a>00030
-<a name="l00031"></a>00031 <span class="keyword">template</span><<span class="keyword">typename</span> RowValue, <span class="keyword">typename</span> ColValue=RowValue>
-<a name="l00032"></a><a class="code" href="a00149.html">00032</a> <span class="keyword">class </span><a class="code" href="a00149.html">blocked_range2d</a> {
-<a name="l00033"></a>00033 <span class="keyword">public</span>:
-<a name="l00035"></a><a class="code" href="a00149.html#a807a22fe658ec38b8edfd69521d0383">00035</a> <span class="keyword">typedef</span> <a class="code" href="a00148.html">blocked_range<RowValue></a> <a class="code" href="a00148.html">row_range_type</a>;
-<a name="l00036"></a>00036 <span class="keyword">typedef</span> <a class="code" href="a00148.html">blocked_range<ColValue></a> <a class="code" href="a00148.html">col_range_type</a>;
-<a name="l00037"></a>00037
-<a name="l00038"></a>00038 <span class="keyword">private</span>:
-<a name="l00039"></a>00039 <a class="code" href="a00148.html">row_range_type</a> my_rows;
-<a name="l00040"></a>00040 <a class="code" href="a00148.html">col_range_type</a> my_cols;
-<a name="l00041"></a>00041
-<a name="l00042"></a>00042 <span class="keyword">public</span>:
+<a name="l00025"></a>00025
+<a name="l00026"></a>00026 <span class="keyword">namespace </span>tbb {
+<a name="l00027"></a>00027
+<a name="l00037"></a>00037
+<a name="l00038"></a>00038
+<a name="l00039"></a>00039 <span class="keyword">template</span><<span class="keyword">typename</span> Value>
+<a name="l00040"></a><a class="code" href="a00147.html">00040</a> <span class="keyword">class </span><a class="code" href="a00147.html">blocked_range</a> {
+<a name="l00041"></a>00041 <span class="keyword">public</span>:
<a name="l00043"></a>00043
-<a name="l00044"></a>00044 <a class="code" href="a00149.html">blocked_range2d</a>( RowValue row_begin, RowValue row_end, <span class="keyword">typename</span> <a class="code" href="a00148.html#f5707bffea38eee5c9680f37358afb8e">row_range_type::size_type</a> row_grainsize,
-<a name="l00045"></a>00045 ColValue col_begin, ColValue col_end, <span class="keyword">typename</span> <a class="code" href="a00148.html#f5707bffea38eee5c9680f37358afb8e">col_range_type::size_type</a> col_grainsize ) :
-<a name="l00046"></a>00046 my_rows(row_begin,row_end,row_grainsize),
-<a name="l00047"></a>00047 my_cols(col_begin,col_end,col_grainsize)
-<a name="l00048"></a>00048 {
-<a name="l00049"></a>00049 }
-<a name="l00050"></a>00050
-<a name="l00051"></a>00051 <a class="code" href="a00149.html">blocked_range2d</a>( RowValue row_begin, RowValue row_end,
-<a name="l00052"></a>00052 ColValue col_begin, ColValue col_end ) :
-<a name="l00053"></a>00053 my_rows(row_begin,row_end),
-<a name="l00054"></a>00054 my_cols(col_begin,col_end)
-<a name="l00055"></a>00055 {
-<a name="l00056"></a>00056 }
-<a name="l00057"></a>00057
-<a name="l00059"></a><a class="code" href="a00149.html#d144cb2d88cef553420311aca8667a44">00059</a> <span class="keywordtype">bool</span> <a class="code" href="a00149.html#d144cb2d88cef553420311aca8667a44">empty</a>()<span class="keyword"> const </span>{
-<a name="l00060"></a>00060 <span class="comment">// Yes, it is a logical OR here, not AND.</span>
-<a name="l00061"></a>00061 <span class="keywordflow">return</span> my_rows.<a class="code" href="a00148.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>() || my_cols.<a class="code" href="a00148.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>();
-<a name="l00062"></a>00062 }
+<a name="l00045"></a><a class="code" href="a00147.html#1a8d05842c2b3dfc177bc4d347e4cef7">00045</a> <span class="keyword">typedef</span> Value <a class="code" href="a00147.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a>;
+<a name="l00046"></a>00046
+<a name="l00048"></a><a class="code" href="a00147.html#f5707bffea38eee5c9680f37358afb8e">00048</a> <span class="keyword">typedef</span> std::size_t <a class="code" href="a00147.html#f5707bffea38eee5c9680f37358afb8e">size_type</a>;
+<a name="l00049"></a>00049
+<a name="l00051"></a>00051
+<a name="l00052"></a><a class="code" href="a00147.html#94607755c5110d199202234d58d022ac">00052</a> <a class="code" href="a00147.html#94607755c5110d199202234d58d022ac">blocked_range</a>() : my_end(), my_begin() {}
+<a name="l00053"></a>00053
+<a name="l00055"></a><a class="code" href="a00147.html#14795a36ead1414b4371dbe1a4656359">00055</a> <a class="code" href="a00147.html#94607755c5110d199202234d58d022ac">blocked_range</a>( Value begin_, Value end_, <a class="code" href="a00147.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> grainsize_=1 ) :
+<a name="l00056"></a>00056 my_end(end_), my_begin(begin_), my_grainsize(grainsize_)
+<a name="l00057"></a>00057 {
+<a name="l00058"></a>00058 __TBB_ASSERT( my_grainsize>0, <span class="stringliteral">"grainsize must be positive"</span> );
+<a name="l00059"></a>00059 }
+<a name="l00060"></a>00060
+<a name="l00062"></a><a class="code" href="a00147.html#18d2258400756ac1446dac7676b18df3">00062</a> <a class="code" href="a00147.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> <a class="code" href="a00147.html#18d2258400756ac1446dac7676b18df3">begin</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_begin;}
<a name="l00063"></a>00063
-<a name="l00065"></a><a class="code" href="a00149.html#ad36a9b38e4fef26d376f99552ce2d92">00065</a> <span class="keywordtype">bool</span> <a class="code" href="a00149.html#ad36a9b38e4fef26d376f99552ce2d92">is_divisible</a>()<span class="keyword"> const </span>{
-<a name="l00066"></a>00066 <span class="keywordflow">return</span> my_rows.<a class="code" href="a00148.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>() || my_cols.<a class="code" href="a00148.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>();
-<a name="l00067"></a>00067 }
+<a name="l00065"></a><a class="code" href="a00147.html#8b929d93ddc13f148b11bceef3a3bdf8">00065</a> <a class="code" href="a00147.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> <a class="code" href="a00147.html#8b929d93ddc13f148b11bceef3a3bdf8">end</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_end;}
+<a name="l00066"></a>00066
<a name="l00068"></a>00068
-<a name="l00069"></a>00069 <a class="code" href="a00149.html">blocked_range2d</a>( <a class="code" href="a00149.html">blocked_range2d</a>& r, <a class="code" href="a00198.html">split</a> ) :
-<a name="l00070"></a>00070 my_rows(r.my_rows),
-<a name="l00071"></a>00071 my_cols(r.my_cols)
-<a name="l00072"></a>00072 {
-<a name="l00073"></a>00073 <span class="keywordflow">if</span>( my_rows.<a class="code" href="a00148.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_cols.<a class="code" href="a00148.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) < my_cols.<a class="code" href="a00148.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_rows.<a class="code" href="a00148.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) ) {
-<a name="l00074"></a>00074 my_cols.<a class="code" href="a00148.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = col_range_type::do_split(r.<a class="code" href="a00149.html#9837bbaabc5836741fde79512ea1131d">my_cols</a>);
-<a name="l00075"></a>00075 } <span class="keywordflow">else</span> {
-<a name="l00076"></a>00076 my_rows.<a class="code" href="a00148.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = row_range_type::do_split(r.<a class="code" href="a00149.html#4be7c7b39da256afe9c67be735b6f788">my_rows</a>);
-<a name="l00077"></a>00077 }
-<a name="l00078"></a>00078 }
-<a name="l00079"></a>00079
-<a name="l00081"></a><a class="code" href="a00149.html#f496e7348a82652fba581203477cc07c">00081</a> <span class="keyword">const</span> <a class="code" href="a00148.html">row_range_type</a>& <a class="code" href="a00149.html#f496e7348a82652fba581203477cc07c">rows</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_rows;}
-<a name="l00082"></a>00082
-<a name="l00084"></a><a class="code" href="a00149.html#392a46759af2c884957115771affa7f4">00084</a> <span class="keyword">const</span> <a class="code" href="a00148.html">col_range_type</a>& <a class="code" href="a00149.html#392a46759af2c884957115771affa7f4">cols</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_cols;}
-<a name="l00085"></a>00085 };
-<a name="l00086"></a>00086
-<a name="l00087"></a>00087 } <span class="comment">// namespace tbb </span>
-<a name="l00088"></a>00088
-<a name="l00089"></a>00089 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_blocked_range2d_H */</span>
+<a name="l00069"></a><a class="code" href="a00147.html#9eaa0b6beff1420f688570bbf6b8c462">00069</a> <a class="code" href="a00147.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> <a class="code" href="a00147.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()<span class="keyword"> const </span>{
+<a name="l00070"></a>00070 __TBB_ASSERT( !(<a class="code" href="a00147.html#8b929d93ddc13f148b11bceef3a3bdf8">end</a>()<<a class="code" href="a00147.html#18d2258400756ac1446dac7676b18df3">begin</a>()), <span class="stringliteral">"size() unspecified if end()<begin()"</span> );
+<a name="l00071"></a>00071 <span class="keywordflow">return</span> <a class="code" href="a00147.html#f5707bffea38eee5c9680f37358afb8e">size_type</a>(my_end-my_begin);
+<a name="l00072"></a>00072 }
+<a name="l00073"></a>00073
+<a name="l00075"></a><a class="code" href="a00147.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">00075</a> <a class="code" href="a00147.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> <a class="code" href="a00147.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_grainsize;}
+<a name="l00076"></a>00076
+<a name="l00077"></a>00077 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00078"></a>00078 <span class="comment">// Methods that implement Range concept</span>
+<a name="l00079"></a>00079 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00080"></a>00080
+<a name="l00082"></a><a class="code" href="a00147.html#8f4f02f530eb3f2e7ea26e06f76aef9d">00082</a> <span class="keywordtype">bool</span> <a class="code" href="a00147.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> !(my_begin<my_end);}
+<a name="l00083"></a>00083
+<a name="l00085"></a>00085
+<a name="l00086"></a><a class="code" href="a00147.html#41a58b703d574b6e1ca155df3576f578">00086</a> <span class="keywordtype">bool</span> <a class="code" href="a00147.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_grainsize<<a class="code" href="a00147.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>();}
+<a name="l00087"></a>00087
+<a name="l00089"></a>00089
+<a name="l00091"></a><a class="code" href="a00147.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">00091</a> <a class="code" href="a00147.html#94607755c5110d199202234d58d022ac">blocked_range</a>( <a class="code" href="a00147.html">blocked_range</a>& r, <a class="code" href="a00198.html">split</a> ) :
+<a name="l00092"></a>00092 my_end(r.my_end),
+<a name="l00093"></a>00093 my_begin(do_split(r)),
+<a name="l00094"></a>00094 my_grainsize(r.my_grainsize)
+<a name="l00095"></a>00095 {}
+<a name="l00096"></a>00096
+<a name="l00097"></a>00097 <span class="keyword">private</span>:
+<a name="l00099"></a>00099 Value my_end;
+<a name="l00100"></a>00100 Value my_begin;
+<a name="l00101"></a>00101 <a class="code" href="a00147.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> my_grainsize;
+<a name="l00102"></a>00102
+<a name="l00104"></a>00104
+<a name="l00105"></a>00105 <span class="keyword">static</span> Value do_split( <a class="code" href="a00147.html">blocked_range</a>& r ) {
+<a name="l00106"></a>00106 __TBB_ASSERT( r.<a class="code" href="a00147.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>(), <span class="stringliteral">"cannot split blocked_range that is not divisible"</span> );
+<a name="l00107"></a>00107 Value middle = r.<a class="code" href="a00147.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> + (r.<a class="code" href="a00147.html#1ec95c8988b50064dd603998b16f3930">my_end</a>-r.<a class="code" href="a00147.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a>)/2u;
+<a name="l00108"></a>00108 r.<a class="code" href="a00147.html#1ec95c8988b50064dd603998b16f3930">my_end</a> = middle;
+<a name="l00109"></a>00109 <span class="keywordflow">return</span> middle;
+<a name="l00110"></a>00110 }
+<a name="l00111"></a>00111
+<a name="l00112"></a>00112 <span class="keyword">template</span><<span class="keyword">typename</span> RowValue, <span class="keyword">typename</span> ColValue>
+<a name="l00113"></a>00113 <span class="keyword">friend</span> <span class="keyword">class </span>blocked_range2d;
+<a name="l00114"></a>00114
+<a name="l00115"></a>00115 <span class="keyword">template</span><<span class="keyword">typename</span> RowValue, <span class="keyword">typename</span> ColValue, <span class="keyword">typename</span> PageValue>
+<a name="l00116"></a>00116 <span class="keyword">friend</span> <span class="keyword">class </span>blocked_range3d;
+<a name="l00117"></a>00117 };
+<a name="l00118"></a>00118
+<a name="l00119"></a>00119 } <span class="comment">// namespace tbb </span>
+<a name="l00120"></a>00120
+<a name="l00121"></a>00121 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_blocked_range_H */</span>
</pre></div><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00321.html b/doc/html/a00321.html
index a3e9607..d630f20 100644
--- a/doc/html/a00321.html
+++ b/doc/html/a00321.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>blocked_range3d.h Source File</title>
+<title>blocked_range2d.h Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -19,7 +19,7 @@
<li><a href="files.html"><span>File List</span></a></li>
<li><a href="globals.html"><span>File Members</span></a></li>
</ul></div>
-<h1>blocked_range3d.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<h1>blocked_range2d.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
<a name="l00003"></a>00003 <span class="comment"></span>
<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
@@ -39,8 +39,8 @@
<a name="l00018"></a>00018 <span class="comment"> writing.</span>
<a name="l00019"></a>00019 <span class="comment">*/</span>
<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_blocked_range3d_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_blocked_range3d_H</span>
+<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_blocked_range2d_H</span>
+<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_blocked_range2d_H</span>
<a name="l00023"></a>00023 <span class="preprocessor"></span>
<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
<a name="l00025"></a>00025 <span class="preprocessor">#include "blocked_range.h"</span>
@@ -48,78 +48,60 @@
<a name="l00027"></a>00027 <span class="keyword">namespace </span>tbb {
<a name="l00028"></a>00028
<a name="l00030"></a>00030
-<a name="l00031"></a>00031 <span class="keyword">template</span><<span class="keyword">typename</span> PageValue, <span class="keyword">typename</span> RowValue=PageValue, <span class="keyword">typename</span> ColValue=RowValue>
-<a name="l00032"></a><a class="code" href="a00150.html">00032</a> <span class="keyword">class </span><a class="code" href="a00150.html">blocked_range3d</a> {
+<a name="l00031"></a>00031 <span class="keyword">template</span><<span class="keyword">typename</span> RowValue, <span class="keyword">typename</span> ColValue=RowValue>
+<a name="l00032"></a><a class="code" href="a00148.html">00032</a> <span class="keyword">class </span><a class="code" href="a00148.html">blocked_range2d</a> {
<a name="l00033"></a>00033 <span class="keyword">public</span>:
-<a name="l00035"></a><a class="code" href="a00150.html#b8ebf17a552ba47825e9b3887855b719">00035</a> <span class="keyword">typedef</span> <a class="code" href="a00148.html">blocked_range<PageValue></a> <a class="code" href="a00148.html">page_range_type</a>;
-<a name="l00036"></a>00036 <span class="keyword">typedef</span> <a class="code" href="a00148.html">blocked_range<RowValue></a> <a class="code" href="a00148.html">row_range_type</a>;
-<a name="l00037"></a>00037 <span class="keyword">typedef</span> <a class="code" href="a00148.html">blocked_range<ColValue></a> <a class="code" href="a00148.html">col_range_type</a>;
-<a name="l00038"></a>00038
-<a name="l00039"></a>00039 <span class="keyword">private</span>:
-<a name="l00040"></a>00040 <a class="code" href="a00148.html">page_range_type</a> my_pages;
-<a name="l00041"></a>00041 <a class="code" href="a00148.html">row_range_type</a> my_rows;
-<a name="l00042"></a>00042 <a class="code" href="a00148.html">col_range_type</a> my_cols;
+<a name="l00035"></a><a class="code" href="a00148.html#a807a22fe658ec38b8edfd69521d0383">00035</a> <span class="keyword">typedef</span> <a class="code" href="a00147.html">blocked_range<RowValue></a> <a class="code" href="a00147.html">row_range_type</a>;
+<a name="l00036"></a>00036 <span class="keyword">typedef</span> <a class="code" href="a00147.html">blocked_range<ColValue></a> <a class="code" href="a00147.html">col_range_type</a>;
+<a name="l00037"></a>00037
+<a name="l00038"></a>00038 <span class="keyword">private</span>:
+<a name="l00039"></a>00039 <a class="code" href="a00147.html">row_range_type</a> my_rows;
+<a name="l00040"></a>00040 <a class="code" href="a00147.html">col_range_type</a> my_cols;
+<a name="l00041"></a>00041
+<a name="l00042"></a>00042 <span class="keyword">public</span>:
<a name="l00043"></a>00043
-<a name="l00044"></a>00044 <span class="keyword">public</span>:
-<a name="l00045"></a>00045
-<a name="l00046"></a>00046 <a class="code" href="a00150.html">blocked_range3d</a>( PageValue page_begin, PageValue page_end,
-<a name="l00047"></a>00047 RowValue row_begin, RowValue row_end,
-<a name="l00048"></a>00048 ColValue col_begin, ColValue col_end ) :
-<a name="l00049"></a>00049 my_pages(page_begin,page_end),
-<a name="l00050"></a>00050 my_rows(row_begin,row_end),
-<a name="l00051"></a>00051 my_cols(col_begin,col_end)
-<a name="l00052"></a>00052 {
-<a name="l00053"></a>00053 }
-<a name="l00054"></a>00054
-<a name="l00055"></a>00055 <a class="code" href="a00150.html">blocked_range3d</a>( PageValue page_begin, PageValue page_end, <span class="keyword">typename</span> <a class="code" href="a00148.html#f5707bffea38eee5c9680f37358afb8e">page_range_type::size_type</a> page_grainsize,
-<a name="l00056"></a>00056 RowValue row_begin, RowValue row_end, <span class="keyword">typename</span> <a class="code" href="a00148.html#f5707bffea38eee5c9680f37358afb8e">row_range_type::size_type</a> row_grainsize,
-<a name="l00057"></a>00057 ColValue col_begin, ColValue col_end, <span class="keyword">typename</span> <a class="code" href="a00148.html#f5707bffea38eee5c9680f37358afb8e">col_range_type::size_type</a> col_grainsize ) :
-<a name="l00058"></a>00058 my_pages(page_begin,page_end,page_grainsize),
-<a name="l00059"></a>00059 my_rows(row_begin,row_end,row_grainsize),
-<a name="l00060"></a>00060 my_cols(col_begin,col_end,col_grainsize)
-<a name="l00061"></a>00061 {
+<a name="l00044"></a>00044 <a class="code" href="a00148.html">blocked_range2d</a>( RowValue row_begin, RowValue row_end, <span class="keyword">typename</span> <a class="code" href="a00147.html#f5707bffea38eee5c9680f37358afb8e">row_range_type::size_type</a> row_grainsize,
+<a name="l00045"></a>00045 ColValue col_begin, ColValue col_end, <span class="keyword">typename</span> <a class="code" href="a00147.html#f5707bffea38eee5c9680f37358afb8e">col_range_type::size_type</a> col_grainsize ) :
+<a name="l00046"></a>00046 my_rows(row_begin,row_end,row_grainsize),
+<a name="l00047"></a>00047 my_cols(col_begin,col_end,col_grainsize)
+<a name="l00048"></a>00048 {
+<a name="l00049"></a>00049 }
+<a name="l00050"></a>00050
+<a name="l00051"></a>00051 <a class="code" href="a00148.html">blocked_range2d</a>( RowValue row_begin, RowValue row_end,
+<a name="l00052"></a>00052 ColValue col_begin, ColValue col_end ) :
+<a name="l00053"></a>00053 my_rows(row_begin,row_end),
+<a name="l00054"></a>00054 my_cols(col_begin,col_end)
+<a name="l00055"></a>00055 {
+<a name="l00056"></a>00056 }
+<a name="l00057"></a>00057
+<a name="l00059"></a><a class="code" href="a00148.html#d144cb2d88cef553420311aca8667a44">00059</a> <span class="keywordtype">bool</span> <a class="code" href="a00148.html#d144cb2d88cef553420311aca8667a44">empty</a>()<span class="keyword"> const </span>{
+<a name="l00060"></a>00060 <span class="comment">// Yes, it is a logical OR here, not AND.</span>
+<a name="l00061"></a>00061 <span class="keywordflow">return</span> my_rows.<a class="code" href="a00147.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>() || my_cols.<a class="code" href="a00147.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>();
<a name="l00062"></a>00062 }
<a name="l00063"></a>00063
-<a name="l00065"></a><a class="code" href="a00150.html#356860e1c977d91711e8216bd55c0b25">00065</a> <span class="keywordtype">bool</span> <a class="code" href="a00150.html#356860e1c977d91711e8216bd55c0b25">empty</a>()<span class="keyword"> const </span>{
-<a name="l00066"></a>00066 <span class="comment">// Yes, it is a logical OR here, not AND.</span>
-<a name="l00067"></a>00067 <span class="keywordflow">return</span> my_pages.<a class="code" href="a00148.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>() || my_rows.<a class="code" href="a00148.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>() || my_cols.<a class="code" href="a00148.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>();
-<a name="l00068"></a>00068 }
-<a name="l00069"></a>00069
-<a name="l00071"></a><a class="code" href="a00150.html#39d69191721c488e737ae5d9c5336b9c">00071</a> <span class="keywordtype">bool</span> <a class="code" href="a00150.html#39d69191721c488e737ae5d9c5336b9c">is_divisible</a>()<span class="keyword"> const </span>{
-<a name="l00072"></a>00072 <span class="keywordflow">return</span> my_pages.<a class="code" href="a00148.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>() || my_rows.<a class="code" href="a00148.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>() || my_cols.<a class="code" href="a00148.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>();
-<a name="l00073"></a>00073 }
-<a name="l00074"></a>00074
-<a name="l00075"></a>00075 <a class="code" href="a00150.html">blocked_range3d</a>( <a class="code" href="a00150.html">blocked_range3d</a>& r, <a class="code" href="a00198.html">split</a> ) :
-<a name="l00076"></a>00076 my_pages(r.my_pages),
-<a name="l00077"></a>00077 my_rows(r.my_rows),
-<a name="l00078"></a>00078 my_cols(r.my_cols)
-<a name="l00079"></a>00079 {
-<a name="l00080"></a>00080 <span class="keywordflow">if</span>( my_pages.<a class="code" href="a00148.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_rows.<a class="code" href="a00148.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) < my_rows.<a class="code" href="a00148.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_pages.<a class="code" href="a00148.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) ) {
-<a name="l00081"></a>00081 <span class="keywordflow">if</span> ( my_rows.<a class="code" href="a00148.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_cols.<a class="code" href="a00148.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) < my_cols.<a class="code" href="a00148.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_rows.<a class="code" href="a00148.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) ) {
-<a name="l00082"></a>00082 my_cols.<a class="code" href="a00148.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = col_range_type::do_split(r.<a class="code" href="a00150.html#ef7143ddf8f5b1265b5a6d05be00cde5">my_cols</a>);
-<a name="l00083"></a>00083 } <span class="keywordflow">else</span> {
-<a name="l00084"></a>00084 my_rows.<a class="code" href="a00148.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = row_range_type::do_split(r.<a class="code" href="a00150.html#76ead25c280ef630b88a1c8846471707">my_rows</a>);
-<a name="l00085"></a>00085 }
-<a name="l00086"></a>00086 } <span class="keywordflow">else</span> {
-<a name="l00087"></a>00087 <span class="keywordflow">if</span> ( my_pages.<a class="code" href="a00148.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_cols.<a class="code" href="a00148.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) < my_cols.<a class="code" href="a00148.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_pages.<a class="code" href="a00148.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) ) {
-<a name="l00088"></a>00088 my_cols.<a class="code" href="a00148.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = col_range_type::do_split(r.<a class="code" href="a00150.html#ef7143ddf8f5b1265b5a6d05be00cde5">my_cols</a>);
-<a name="l00089"></a>00089 } <span class="keywordflow">else</span> {
-<a name="l00090"></a>00090 my_pages.<a class="code" href="a00148.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = page_range_type::do_split(r.<a class="code" href="a00150.html#b18ae46a01d42745078d9e287ab87baa">my_pages</a>);
-<a name="l00091"></a>00091 }
-<a name="l00092"></a>00092 }
-<a name="l00093"></a>00093 }
-<a name="l00094"></a>00094
-<a name="l00096"></a><a class="code" href="a00150.html#cf971430aa12361d3ed245344b7c6764">00096</a> <span class="keyword">const</span> <a class="code" href="a00148.html">page_range_type</a>& <a class="code" href="a00150.html#cf971430aa12361d3ed245344b7c6764">pages</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_pages;}
-<a name="l00097"></a>00097
-<a name="l00099"></a><a class="code" href="a00150.html#1584623e59ff32a8aa82006827508be4">00099</a> <span class="keyword">const</span> <a class="code" href="a00148.html">row_range_type</a>& <a class="code" href="a00150.html#1584623e59ff32a8aa82006827508be4">rows</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_rows;}
-<a name="l00100"></a>00100
-<a name="l00102"></a><a class="code" href="a00150.html#3336ba9480fd6c43e158f9beb024c050">00102</a> <span class="keyword">const</span> <a class="code" href="a00148.html">col_range_type</a>& <a class="code" href="a00150.html#3336ba9480fd6c43e158f9beb024c050">cols</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_cols;}
-<a name="l00103"></a>00103
-<a name="l00104"></a>00104 };
-<a name="l00105"></a>00105
-<a name="l00106"></a>00106 } <span class="comment">// namespace tbb </span>
-<a name="l00107"></a>00107
-<a name="l00108"></a>00108 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_blocked_range3d_H */</span>
+<a name="l00065"></a><a class="code" href="a00148.html#ad36a9b38e4fef26d376f99552ce2d92">00065</a> <span class="keywordtype">bool</span> <a class="code" href="a00148.html#ad36a9b38e4fef26d376f99552ce2d92">is_divisible</a>()<span class="keyword"> const </span>{
+<a name="l00066"></a>00066 <span class="keywordflow">return</span> my_rows.<a class="code" href="a00147.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>() || my_cols.<a class="code" href="a00147.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>();
+<a name="l00067"></a>00067 }
+<a name="l00068"></a>00068
+<a name="l00069"></a>00069 <a class="code" href="a00148.html">blocked_range2d</a>( <a class="code" href="a00148.html">blocked_range2d</a>& r, <a class="code" href="a00198.html">split</a> ) :
+<a name="l00070"></a>00070 my_rows(r.my_rows),
+<a name="l00071"></a>00071 my_cols(r.my_cols)
+<a name="l00072"></a>00072 {
+<a name="l00073"></a>00073 <span class="keywordflow">if</span>( my_rows.<a class="code" href="a00147.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_cols.<a class="code" href="a00147.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) < my_cols.<a class="code" href="a00147.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_rows.<a class="code" href="a00147.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) ) {
+<a name="l00074"></a>00074 my_cols.<a class="code" href="a00147.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = col_range_type::do_split(r.<a class="code" href="a00148.html#9837bbaabc5836741fde79512ea1131d">my_cols</a>);
+<a name="l00075"></a>00075 } <span class="keywordflow">else</span> {
+<a name="l00076"></a>00076 my_rows.<a class="code" href="a00147.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = row_range_type::do_split(r.<a class="code" href="a00148.html#4be7c7b39da256afe9c67be735b6f788">my_rows</a>);
+<a name="l00077"></a>00077 }
+<a name="l00078"></a>00078 }
+<a name="l00079"></a>00079
+<a name="l00081"></a><a class="code" href="a00148.html#f496e7348a82652fba581203477cc07c">00081</a> <span class="keyword">const</span> <a class="code" href="a00147.html">row_range_type</a>& <a class="code" href="a00148.html#f496e7348a82652fba581203477cc07c">rows</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_rows;}
+<a name="l00082"></a>00082
+<a name="l00084"></a><a class="code" href="a00148.html#392a46759af2c884957115771affa7f4">00084</a> <span class="keyword">const</span> <a class="code" href="a00147.html">col_range_type</a>& <a class="code" href="a00148.html#392a46759af2c884957115771affa7f4">cols</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_cols;}
+<a name="l00085"></a>00085 };
+<a name="l00086"></a>00086
+<a name="l00087"></a>00087 } <span class="comment">// namespace tbb </span>
+<a name="l00088"></a>00088
+<a name="l00089"></a>00089 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_blocked_range2d_H */</span>
</pre></div><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00322.html b/doc/html/a00322.html
index a2e2d81..54be49a 100644
--- a/doc/html/a00322.html
+++ b/doc/html/a00322.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>cache_aligned_allocator.h Source File</title>
+<title>blocked_range3d.h Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -19,7 +19,7 @@
<li><a href="files.html"><span>File List</span></a></li>
<li><a href="globals.html"><span>File Members</span></a></li>
</ul></div>
-<h1>cache_aligned_allocator.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<h1>blocked_range3d.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
<a name="l00003"></a>00003 <span class="comment"></span>
<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
@@ -39,96 +39,87 @@
<a name="l00018"></a>00018 <span class="comment"> writing.</span>
<a name="l00019"></a>00019 <span class="comment">*/</span>
<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_cache_aligned_allocator_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_cache_aligned_allocator_H</span>
+<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_blocked_range3d_H</span>
+<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_blocked_range3d_H</span>
<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include <new></span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "tbb_stddef.h"</span>
+<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
+<a name="l00025"></a>00025 <span class="preprocessor">#include "blocked_range.h"</span>
<a name="l00026"></a>00026
<a name="l00027"></a>00027 <span class="keyword">namespace </span>tbb {
<a name="l00028"></a>00028
-<a name="l00030"></a>00030 <span class="keyword">namespace </span>internal {
-<a name="l00032"></a>00032
-<a name="l00033"></a>00033 size_t __TBB_EXPORTED_FUNC NFS_GetLineSize();
-<a name="l00034"></a>00034
-<a name="l00036"></a>00036
-<a name="l00037"></a>00037 <span class="keywordtype">void</span>* __TBB_EXPORTED_FUNC NFS_Allocate( size_t n_element, size_t element_size, <span class="keywordtype">void</span>* hint );
-<a name="l00038"></a>00038
-<a name="l00040"></a>00040
-<a name="l00042"></a>00042 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC NFS_Free( <span class="keywordtype">void</span>* );
-<a name="l00043"></a>00043 }
+<a name="l00030"></a>00030
+<a name="l00031"></a>00031 <span class="keyword">template</span><<span class="keyword">typename</span> PageValue, <span class="keyword">typename</span> RowValue=PageValue, <span class="keyword">typename</span> ColValue=RowValue>
+<a name="l00032"></a><a class="code" href="a00149.html">00032</a> <span class="keyword">class </span><a class="code" href="a00149.html">blocked_range3d</a> {
+<a name="l00033"></a>00033 <span class="keyword">public</span>:
+<a name="l00035"></a><a class="code" href="a00149.html#b8ebf17a552ba47825e9b3887855b719">00035</a> <span class="keyword">typedef</span> <a class="code" href="a00147.html">blocked_range<PageValue></a> <a class="code" href="a00147.html">page_range_type</a>;
+<a name="l00036"></a>00036 <span class="keyword">typedef</span> <a class="code" href="a00147.html">blocked_range<RowValue></a> <a class="code" href="a00147.html">row_range_type</a>;
+<a name="l00037"></a>00037 <span class="keyword">typedef</span> <a class="code" href="a00147.html">blocked_range<ColValue></a> <a class="code" href="a00147.html">col_range_type</a>;
+<a name="l00038"></a>00038
+<a name="l00039"></a>00039 <span class="keyword">private</span>:
+<a name="l00040"></a>00040 <a class="code" href="a00147.html">page_range_type</a> my_pages;
+<a name="l00041"></a>00041 <a class="code" href="a00147.html">row_range_type</a> my_rows;
+<a name="l00042"></a>00042 <a class="code" href="a00147.html">col_range_type</a> my_cols;
+<a name="l00043"></a>00043
+<a name="l00044"></a>00044 <span class="keyword">public</span>:
<a name="l00045"></a>00045
-<a name="l00046"></a>00046 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
-<a name="l00047"></a>00047 <span class="preprocessor"></span> <span class="comment">// Workaround for erroneous "unreferenced parameter" warning in method destroy.</span>
-<a name="l00048"></a>00048 <span class="preprocessor"> #pragma warning (push)</span>
-<a name="l00049"></a>00049 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4100)</span>
-<a name="l00050"></a>00050 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00051"></a>00051 <span class="preprocessor"></span>
-<a name="l00053"></a>00053
-<a name="l00056"></a>00056 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00057"></a><a class="code" href="a00151.html">00057</a> <span class="keyword">class </span><a class="code" href="a00151.html">cache_aligned_allocator</a> {
-<a name="l00058"></a>00058 <span class="keyword">public</span>:
-<a name="l00059"></a>00059 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::allocator_type<T>::value_type value_type;
-<a name="l00060"></a>00060 <span class="keyword">typedef</span> value_type* pointer;
-<a name="l00061"></a>00061 <span class="keyword">typedef</span> <span class="keyword">const</span> value_type* const_pointer;
-<a name="l00062"></a>00062 <span class="keyword">typedef</span> value_type& reference;
-<a name="l00063"></a>00063 <span class="keyword">typedef</span> <span class="keyword">const</span> value_type& const_reference;
-<a name="l00064"></a>00064 <span class="keyword">typedef</span> size_t size_type;
-<a name="l00065"></a>00065 <span class="keyword">typedef</span> ptrdiff_t difference_type;
-<a name="l00066"></a>00066 <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">struct </span>rebind {
-<a name="l00067"></a>00067 <span class="keyword">typedef</span> <a class="code" href="a00151.html">cache_aligned_allocator<U></a> other;
-<a name="l00068"></a>00068 };
+<a name="l00046"></a>00046 <a class="code" href="a00149.html">blocked_range3d</a>( PageValue page_begin, PageValue page_end,
+<a name="l00047"></a>00047 RowValue row_begin, RowValue row_end,
+<a name="l00048"></a>00048 ColValue col_begin, ColValue col_end ) :
+<a name="l00049"></a>00049 my_pages(page_begin,page_end),
+<a name="l00050"></a>00050 my_rows(row_begin,row_end),
+<a name="l00051"></a>00051 my_cols(col_begin,col_end)
+<a name="l00052"></a>00052 {
+<a name="l00053"></a>00053 }
+<a name="l00054"></a>00054
+<a name="l00055"></a>00055 <a class="code" href="a00149.html">blocked_range3d</a>( PageValue page_begin, PageValue page_end, <span class="keyword">typename</span> <a class="code" href="a00147.html#f5707bffea38eee5c9680f37358afb8e">page_range_type::size_type</a> page_grainsize,
+<a name="l00056"></a>00056 RowValue row_begin, RowValue row_end, <span class="keyword">typename</span> <a class="code" href="a00147.html#f5707bffea38eee5c9680f37358afb8e">row_range_type::size_type</a> row_grainsize,
+<a name="l00057"></a>00057 ColValue col_begin, ColValue col_end, <span class="keyword">typename</span> <a class="code" href="a00147.html#f5707bffea38eee5c9680f37358afb8e">col_range_type::size_type</a> col_grainsize ) :
+<a name="l00058"></a>00058 my_pages(page_begin,page_end,page_grainsize),
+<a name="l00059"></a>00059 my_rows(row_begin,row_end,row_grainsize),
+<a name="l00060"></a>00060 my_cols(col_begin,col_end,col_grainsize)
+<a name="l00061"></a>00061 {
+<a name="l00062"></a>00062 }
+<a name="l00063"></a>00063
+<a name="l00065"></a><a class="code" href="a00149.html#356860e1c977d91711e8216bd55c0b25">00065</a> <span class="keywordtype">bool</span> <a class="code" href="a00149.html#356860e1c977d91711e8216bd55c0b25">empty</a>()<span class="keyword"> const </span>{
+<a name="l00066"></a>00066 <span class="comment">// Yes, it is a logical OR here, not AND.</span>
+<a name="l00067"></a>00067 <span class="keywordflow">return</span> my_pages.<a class="code" href="a00147.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>() || my_rows.<a class="code" href="a00147.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>() || my_cols.<a class="code" href="a00147.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>();
+<a name="l00068"></a>00068 }
<a name="l00069"></a>00069
-<a name="l00070"></a>00070 <a class="code" href="a00151.html">cache_aligned_allocator</a>() <span class="keywordflow">throw</span>() {}
-<a name="l00071"></a>00071 <a class="code" href="a00151.html">cache_aligned_allocator</a>( <span class="keyword">const</span> <a class="code" href="a00151.html">cache_aligned_allocator</a>& ) <span class="keywordflow">throw</span>() {}
-<a name="l00072"></a>00072 <span class="keyword">template</span><<span class="keyword">typename</span> U> <a class="code" href="a00151.html">cache_aligned_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00151.html">cache_aligned_allocator<U></a>&) <span class="keywordflow">throw</span>() {}
-<a name="l00073"></a>00073
-<a name="l00074"></a>00074 pointer address(reference x)<span class="keyword"> const </span>{<span class="keywordflow">return</span> &x;}
-<a name="l00075"></a>00075 const_pointer address(const_reference x)<span class="keyword"> const </span>{<span class="keywordflow">return</span> &x;}
-<a name="l00076"></a>00076
-<a name="l00078"></a><a class="code" href="a00151.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">00078</a> pointer <a class="code" href="a00151.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">allocate</a>( size_type n, <span class="keyword">const</span> <span class="keywordtype">void</span>* hint=0 ) {
-<a name="l00079"></a>00079 <span class="comment">// The "hint" argument is always ignored in NFS_Allocate thus const_cast shouldn't hurt</span>
-<a name="l00080"></a>00080 <span class="keywordflow">return</span> pointer(internal::NFS_Allocate( n, <span class="keyword">sizeof</span>(value_type), const_cast<void*>(hint) ));
-<a name="l00081"></a>00081 }
-<a name="l00082"></a>00082
-<a name="l00084"></a><a class="code" href="a00151.html#3d4eadf188f7d85d3805ae534e0b8e1c">00084</a> <span class="keywordtype">void</span> <a class="code" href="a00151.html#3d4eadf188f7d85d3805ae534e0b8e1c">deallocate</a>( pointer p, size_type ) {
-<a name="l00085"></a>00085 internal::NFS_Free(p);
-<a name="l00086"></a>00086 }
-<a name="l00087"></a>00087
-<a name="l00089"></a><a class="code" href="a00151.html#fb23b687b4c0429dab4c7f8017266cf0">00089</a> size_type <a class="code" href="a00151.html#fb23b687b4c0429dab4c7f8017266cf0">max_size</a>() const throw() {
-<a name="l00090"></a>00090 <span class="keywordflow">return</span> (~size_t(0)-internal::NFS_MaxLineSize)/<span class="keyword">sizeof</span>(value_type);
-<a name="l00091"></a>00091 }
-<a name="l00092"></a>00092
-<a name="l00094"></a><a class="code" href="a00151.html#958ee8745c86c275bfc9533af565e017">00094</a> <span class="keywordtype">void</span> <a class="code" href="a00151.html#958ee8745c86c275bfc9533af565e017">construct</a>( pointer p, <span class="keyword">const</span> value_type& value ) {::new((<span class="keywordtype">void</span>*)(p)) value_type(value);}
-<a name="l00095"></a>00095
-<a name="l00097"></a><a class="code" href="a00151.html#cd298895a4f1654b5149ec84b591ecb5">00097</a> <span class="keywordtype">void</span> <a class="code" href="a00151.html#cd298895a4f1654b5149ec84b591ecb5">destroy</a>( pointer p ) {p->~value_type();}
-<a name="l00098"></a>00098 };
-<a name="l00099"></a>00099
-<a name="l00100"></a>00100 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
-<a name="l00101"></a>00101 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
-<a name="l00102"></a>00102 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4100 is back</span>
-<a name="l00103"></a>00103 <span class="preprocessor"></span>
+<a name="l00071"></a><a class="code" href="a00149.html#39d69191721c488e737ae5d9c5336b9c">00071</a> <span class="keywordtype">bool</span> <a class="code" href="a00149.html#39d69191721c488e737ae5d9c5336b9c">is_divisible</a>()<span class="keyword"> const </span>{
+<a name="l00072"></a>00072 <span class="keywordflow">return</span> my_pages.<a class="code" href="a00147.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>() || my_rows.<a class="code" href="a00147.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>() || my_cols.<a class="code" href="a00147.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>();
+<a name="l00073"></a>00073 }
+<a name="l00074"></a>00074
+<a name="l00075"></a>00075 <a class="code" href="a00149.html">blocked_range3d</a>( <a class="code" href="a00149.html">blocked_range3d</a>& r, <a class="code" href="a00198.html">split</a> ) :
+<a name="l00076"></a>00076 my_pages(r.my_pages),
+<a name="l00077"></a>00077 my_rows(r.my_rows),
+<a name="l00078"></a>00078 my_cols(r.my_cols)
+<a name="l00079"></a>00079 {
+<a name="l00080"></a>00080 <span class="keywordflow">if</span>( my_pages.<a class="code" href="a00147.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_rows.<a class="code" href="a00147.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) < my_rows.<a class="code" href="a00147.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_pages.<a class="code" href="a00147.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) ) {
+<a name="l00081"></a>00081 <span class="keywordflow">if</span> ( my_rows.<a class="code" href="a00147.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_cols.<a class="code" href="a00147.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) < my_cols.<a class="code" href="a00147.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_rows.<a class="code" href="a00147.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) ) {
+<a name="l00082"></a>00082 my_cols.<a class="code" href="a00147.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = col_range_type::do_split(r.<a class="code" href="a00149.html#ef7143ddf8f5b1265b5a6d05be00cde5">my_cols</a>);
+<a name="l00083"></a>00083 } <span class="keywordflow">else</span> {
+<a name="l00084"></a>00084 my_rows.<a class="code" href="a00147.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = row_range_type::do_split(r.<a class="code" href="a00149.html#76ead25c280ef630b88a1c8846471707">my_rows</a>);
+<a name="l00085"></a>00085 }
+<a name="l00086"></a>00086 } <span class="keywordflow">else</span> {
+<a name="l00087"></a>00087 <span class="keywordflow">if</span> ( my_pages.<a class="code" href="a00147.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_cols.<a class="code" href="a00147.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) < my_cols.<a class="code" href="a00147.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_pages.<a class="code" href="a00147.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) ) {
+<a name="l00088"></a>00088 my_cols.<a class="code" href="a00147.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = col_range_type::do_split(r.<a class="code" href="a00149.html#ef7143ddf8f5b1265b5a6d05be00cde5">my_cols</a>);
+<a name="l00089"></a>00089 } <span class="keywordflow">else</span> {
+<a name="l00090"></a>00090 my_pages.<a class="code" href="a00147.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = page_range_type::do_split(r.<a class="code" href="a00149.html#b18ae46a01d42745078d9e287ab87baa">my_pages</a>);
+<a name="l00091"></a>00091 }
+<a name="l00092"></a>00092 }
+<a name="l00093"></a>00093 }
+<a name="l00094"></a>00094
+<a name="l00096"></a><a class="code" href="a00149.html#cf971430aa12361d3ed245344b7c6764">00096</a> <span class="keyword">const</span> <a class="code" href="a00147.html">page_range_type</a>& <a class="code" href="a00149.html#cf971430aa12361d3ed245344b7c6764">pages</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_pages;}
+<a name="l00097"></a>00097
+<a name="l00099"></a><a class="code" href="a00149.html#1584623e59ff32a8aa82006827508be4">00099</a> <span class="keyword">const</span> <a class="code" href="a00147.html">row_range_type</a>& <a class="code" href="a00149.html#1584623e59ff32a8aa82006827508be4">rows</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_rows;}
+<a name="l00100"></a>00100
+<a name="l00102"></a><a class="code" href="a00149.html#3336ba9480fd6c43e158f9beb024c050">00102</a> <span class="keyword">const</span> <a class="code" href="a00147.html">col_range_type</a>& <a class="code" href="a00149.html#3336ba9480fd6c43e158f9beb024c050">cols</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_cols;}
+<a name="l00103"></a>00103
+<a name="l00104"></a>00104 };
<a name="l00105"></a>00105
-<a name="l00106"></a>00106 <span class="keyword">template</span><>
-<a name="l00107"></a><a class="code" href="a00152.html">00107</a> <span class="keyword">class </span><a class="code" href="a00151.html">cache_aligned_allocator</a><void> {
-<a name="l00108"></a>00108 <span class="keyword">public</span>:
-<a name="l00109"></a>00109 <span class="keyword">typedef</span> <span class="keywordtype">void</span>* pointer;
-<a name="l00110"></a>00110 <span class="keyword">typedef</span> <span class="keyword">const</span> <span class="keywordtype">void</span>* const_pointer;
-<a name="l00111"></a>00111 <span class="keyword">typedef</span> <span class="keywordtype">void</span> value_type;
-<a name="l00112"></a>00112 <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">struct </span>rebind {
-<a name="l00113"></a>00113 <span class="keyword">typedef</span> <a class="code" href="a00151.html">cache_aligned_allocator<U></a> other;
-<a name="l00114"></a>00114 };
-<a name="l00115"></a>00115 };
-<a name="l00116"></a>00116
-<a name="l00117"></a>00117 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00118"></a>00118 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> <a class="code" href="a00151.html">cache_aligned_allocator<T></a>&, <span class="keyword">const</span> <a class="code" href="a00151.html">cache_aligned_allocator<U></a>& ) {<span class="keywordflow">return</span> <span class="keyword">true</span>;}
-<a name="l00119"></a>00119
-<a name="l00120"></a>00120 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00121"></a>00121 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> cache_aligned_allocator<T>&, <span class="keyword">const</span> cache_aligned_allocator<U>& ) {<span class="keywordflow">return</span> <span class="keyword">false</span>;}
-<a name="l00122"></a>00122
-<a name="l00123"></a>00123 } <span class="comment">// namespace tbb</span>
-<a name="l00124"></a>00124
-<a name="l00125"></a>00125 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_cache_aligned_allocator_H */</span>
+<a name="l00106"></a>00106 } <span class="comment">// namespace tbb </span>
+<a name="l00107"></a>00107
+<a name="l00108"></a>00108 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_blocked_range3d_H */</span>
</pre></div><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00322.html b/doc/html/a00323.html
similarity index 89%
copy from doc/html/a00322.html
copy to doc/html/a00323.html
index a2e2d81..b67a71d 100644
--- a/doc/html/a00322.html
+++ b/doc/html/a00323.html
@@ -66,7 +66,7 @@
<a name="l00051"></a>00051 <span class="preprocessor"></span>
<a name="l00053"></a>00053
<a name="l00056"></a>00056 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00057"></a><a class="code" href="a00151.html">00057</a> <span class="keyword">class </span><a class="code" href="a00151.html">cache_aligned_allocator</a> {
+<a name="l00057"></a><a class="code" href="a00150.html">00057</a> <span class="keyword">class </span><a class="code" href="a00150.html">cache_aligned_allocator</a> {
<a name="l00058"></a>00058 <span class="keyword">public</span>:
<a name="l00059"></a>00059 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::allocator_type<T>::value_type value_type;
<a name="l00060"></a>00060 <span class="keyword">typedef</span> value_type* pointer;
@@ -76,32 +76,32 @@
<a name="l00064"></a>00064 <span class="keyword">typedef</span> size_t size_type;
<a name="l00065"></a>00065 <span class="keyword">typedef</span> ptrdiff_t difference_type;
<a name="l00066"></a>00066 <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">struct </span>rebind {
-<a name="l00067"></a>00067 <span class="keyword">typedef</span> <a class="code" href="a00151.html">cache_aligned_allocator<U></a> other;
+<a name="l00067"></a>00067 <span class="keyword">typedef</span> <a class="code" href="a00150.html">cache_aligned_allocator<U></a> other;
<a name="l00068"></a>00068 };
<a name="l00069"></a>00069
-<a name="l00070"></a>00070 <a class="code" href="a00151.html">cache_aligned_allocator</a>() <span class="keywordflow">throw</span>() {}
-<a name="l00071"></a>00071 <a class="code" href="a00151.html">cache_aligned_allocator</a>( <span class="keyword">const</span> <a class="code" href="a00151.html">cache_aligned_allocator</a>& ) <span class="keywordflow">throw</span>() {}
-<a name="l00072"></a>00072 <span class="keyword">template</span><<span class="keyword">typename</span> U> <a class="code" href="a00151.html">cache_aligned_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00151.html">cache_aligned_allocator<U></a>&) <span class="keywordflow">throw</span>() {}
+<a name="l00070"></a>00070 <a class="code" href="a00150.html">cache_aligned_allocator</a>() <span class="keywordflow">throw</span>() {}
+<a name="l00071"></a>00071 <a class="code" href="a00150.html">cache_aligned_allocator</a>( <span class="keyword">const</span> <a class="code" href="a00150.html">cache_aligned_allocator</a>& ) <span class="keywordflow">throw</span>() {}
+<a name="l00072"></a>00072 <span class="keyword">template</span><<span class="keyword">typename</span> U> <a class="code" href="a00150.html">cache_aligned_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00150.html">cache_aligned_allocator<U></a>&) <span class="keywordflow">throw</span>() {}
<a name="l00073"></a>00073
<a name="l00074"></a>00074 pointer address(reference x)<span class="keyword"> const </span>{<span class="keywordflow">return</span> &x;}
<a name="l00075"></a>00075 const_pointer address(const_reference x)<span class="keyword"> const </span>{<span class="keywordflow">return</span> &x;}
<a name="l00076"></a>00076
-<a name="l00078"></a><a class="code" href="a00151.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">00078</a> pointer <a class="code" href="a00151.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">allocate</a>( size_type n, <span class="keyword">const</span> <span class="keywordtype">void</span>* hint=0 ) {
+<a name="l00078"></a><a class="code" href="a00150.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">00078</a> pointer <a class="code" href="a00150.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">allocate</a>( size_type n, <span class="keyword">const</span> <span class="keywordtype">void</span>* hint=0 ) {
<a name="l00079"></a>00079 <span class="comment">// The "hint" argument is always ignored in NFS_Allocate thus const_cast shouldn't hurt</span>
<a name="l00080"></a>00080 <span class="keywordflow">return</span> pointer(internal::NFS_Allocate( n, <span class="keyword">sizeof</span>(value_type), const_cast<void*>(hint) ));
<a name="l00081"></a>00081 }
<a name="l00082"></a>00082
-<a name="l00084"></a><a class="code" href="a00151.html#3d4eadf188f7d85d3805ae534e0b8e1c">00084</a> <span class="keywordtype">void</span> <a class="code" href="a00151.html#3d4eadf188f7d85d3805ae534e0b8e1c">deallocate</a>( pointer p, size_type ) {
+<a name="l00084"></a><a class="code" href="a00150.html#3d4eadf188f7d85d3805ae534e0b8e1c">00084</a> <span class="keywordtype">void</span> <a class="code" href="a00150.html#3d4eadf188f7d85d3805ae534e0b8e1c">deallocate</a>( pointer p, size_type ) {
<a name="l00085"></a>00085 internal::NFS_Free(p);
<a name="l00086"></a>00086 }
<a name="l00087"></a>00087
-<a name="l00089"></a><a class="code" href="a00151.html#fb23b687b4c0429dab4c7f8017266cf0">00089</a> size_type <a class="code" href="a00151.html#fb23b687b4c0429dab4c7f8017266cf0">max_size</a>() const throw() {
+<a name="l00089"></a><a class="code" href="a00150.html#fb23b687b4c0429dab4c7f8017266cf0">00089</a> size_type <a class="code" href="a00150.html#fb23b687b4c0429dab4c7f8017266cf0">max_size</a>() const throw() {
<a name="l00090"></a>00090 <span class="keywordflow">return</span> (~size_t(0)-internal::NFS_MaxLineSize)/<span class="keyword">sizeof</span>(value_type);
<a name="l00091"></a>00091 }
<a name="l00092"></a>00092
-<a name="l00094"></a><a class="code" href="a00151.html#958ee8745c86c275bfc9533af565e017">00094</a> <span class="keywordtype">void</span> <a class="code" href="a00151.html#958ee8745c86c275bfc9533af565e017">construct</a>( pointer p, <span class="keyword">const</span> value_type& value ) {::new((<span class="keywordtype">void</span>*)(p)) value_type(value);}
+<a name="l00094"></a><a class="code" href="a00150.html#958ee8745c86c275bfc9533af565e017">00094</a> <span class="keywordtype">void</span> <a class="code" href="a00150.html#958ee8745c86c275bfc9533af565e017">construct</a>( pointer p, <span class="keyword">const</span> value_type& value ) {::new((<span class="keywordtype">void</span>*)(p)) value_type(value);}
<a name="l00095"></a>00095
-<a name="l00097"></a><a class="code" href="a00151.html#cd298895a4f1654b5149ec84b591ecb5">00097</a> <span class="keywordtype">void</span> <a class="code" href="a00151.html#cd298895a4f1654b5149ec84b591ecb5">destroy</a>( pointer p ) {p->~value_type();}
+<a name="l00097"></a><a class="code" href="a00150.html#cd298895a4f1654b5149ec84b591ecb5">00097</a> <span class="keywordtype">void</span> <a class="code" href="a00150.html#cd298895a4f1654b5149ec84b591ecb5">destroy</a>( pointer p ) {p->~value_type();}
<a name="l00098"></a>00098 };
<a name="l00099"></a>00099
<a name="l00100"></a>00100 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
@@ -110,18 +110,18 @@
<a name="l00103"></a>00103 <span class="preprocessor"></span>
<a name="l00105"></a>00105
<a name="l00106"></a>00106 <span class="keyword">template</span><>
-<a name="l00107"></a><a class="code" href="a00152.html">00107</a> <span class="keyword">class </span><a class="code" href="a00151.html">cache_aligned_allocator</a><void> {
+<a name="l00107"></a><a class="code" href="a00151.html">00107</a> <span class="keyword">class </span><a class="code" href="a00150.html">cache_aligned_allocator</a><void> {
<a name="l00108"></a>00108 <span class="keyword">public</span>:
<a name="l00109"></a>00109 <span class="keyword">typedef</span> <span class="keywordtype">void</span>* pointer;
<a name="l00110"></a>00110 <span class="keyword">typedef</span> <span class="keyword">const</span> <span class="keywordtype">void</span>* const_pointer;
<a name="l00111"></a>00111 <span class="keyword">typedef</span> <span class="keywordtype">void</span> value_type;
<a name="l00112"></a>00112 <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">struct </span>rebind {
-<a name="l00113"></a>00113 <span class="keyword">typedef</span> <a class="code" href="a00151.html">cache_aligned_allocator<U></a> other;
+<a name="l00113"></a>00113 <span class="keyword">typedef</span> <a class="code" href="a00150.html">cache_aligned_allocator<U></a> other;
<a name="l00114"></a>00114 };
<a name="l00115"></a>00115 };
<a name="l00116"></a>00116
<a name="l00117"></a>00117 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00118"></a>00118 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> <a class="code" href="a00151.html">cache_aligned_allocator<T></a>&, <span class="keyword">const</span> <a class="code" href="a00151.html">cache_aligned_allocator<U></a>& ) {<span class="keywordflow">return</span> <span class="keyword">true</span>;}
+<a name="l00118"></a>00118 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> <a class="code" href="a00150.html">cache_aligned_allocator<T></a>&, <span class="keyword">const</span> <a class="code" href="a00150.html">cache_aligned_allocator<U></a>& ) {<span class="keywordflow">return</span> <span class="keyword">true</span>;}
<a name="l00119"></a>00119
<a name="l00120"></a>00120 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
<a name="l00121"></a>00121 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> cache_aligned_allocator<T>&, <span class="keyword">const</span> cache_aligned_allocator<U>& ) {<span class="keywordflow">return</span> <span class="keyword">false</span>;}
diff --git a/doc/html/a00324.html b/doc/html/a00324.html
deleted file mode 100644
index 55ca02b..0000000
--- a/doc/html/a00324.html
+++ /dev/null
@@ -1,98 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>combinable.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>combinable.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_combinable_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_combinable_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "enumerable_thread_specific.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "cache_aligned_allocator.h"</span>
-<a name="l00026"></a>00026
-<a name="l00027"></a>00027 <span class="keyword">namespace </span>tbb {
-<a name="l00031"></a>00031
-<a name="l00032"></a>00032
-<a name="l00033"></a>00033 <span class="keyword">template</span> <<span class="keyword">typename</span> T>
-<a name="l00034"></a><a class="code" href="a00154.html">00034</a> <span class="keyword">class </span><a class="code" href="a00154.html">combinable</a> {
-<a name="l00035"></a>00035 <span class="keyword">private</span>:
-<a name="l00036"></a>00036 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00151.html">tbb::cache_aligned_allocator<T></a> <a class="code" href="a00151.html">my_alloc</a>;
-<a name="l00037"></a>00037
-<a name="l00038"></a>00038 <span class="keyword">typedef</span> <span class="keyword">typename</span> tbb::enumerable_thread_specific<T, my_alloc, ets_no_key> my_ets_type;
-<a name="l00039"></a>00039 my_ets_type my_ets;
-<a name="l00040"></a>00040
-<a name="l00041"></a>00041 <span class="keyword">public</span>:
-<a name="l00042"></a>00042
-<a name="l00043"></a>00043 <a class="code" href="a00154.html">combinable</a>() { }
-<a name="l00044"></a>00044
-<a name="l00045"></a>00045 <span class="keyword">template</span> <<span class="keyword">typename</span> finit>
-<a name="l00046"></a>00046 <a class="code" href="a00154.html">combinable</a>( finit _finit) : my_ets(_finit) { }
-<a name="l00047"></a>00047
-<a name="l00049"></a><a class="code" href="a00154.html#2c87e79ae98588a5780f708773388843">00049</a> <a class="code" href="a00154.html#2c87e79ae98588a5780f708773388843">~combinable</a>() {
-<a name="l00050"></a>00050 }
-<a name="l00051"></a>00051
-<a name="l00052"></a>00052 <a class="code" href="a00154.html">combinable</a>(<span class="keyword">const</span> <a class="code" href="a00154.html">combinable</a>& other) : my_ets(other.my_ets) { }
-<a name="l00053"></a>00053
-<a name="l00054"></a>00054 combinable & operator=( <span class="keyword">const</span> combinable & other) { my_ets = other.my_ets; <span class="keywordflow">return</span> *<span class="keyword">this</span>; }
-<a name="l00055"></a>00055
-<a name="l00056"></a>00056 <span class="keywordtype">void</span> clear() { my_ets.clear(); }
-<a name="l00057"></a>00057
-<a name="l00058"></a>00058 T& local() { <span class="keywordflow">return</span> my_ets.local(); }
-<a name="l00059"></a>00059
-<a name="l00060"></a>00060 T& local(<span class="keywordtype">bool</span> & exists) { <span class="keywordflow">return</span> my_ets.local(exists); }
-<a name="l00061"></a>00061
-<a name="l00062"></a>00062 <span class="comment">// combine_func_t has signature T(T,T) or T(const T&, const T&)</span>
-<a name="l00063"></a>00063 <span class="keyword">template</span> <<span class="keyword">typename</span> combine_func_t>
-<a name="l00064"></a>00064 T combine(combine_func_t f_combine) { <span class="keywordflow">return</span> my_ets.combine(f_combine); }
-<a name="l00065"></a>00065
-<a name="l00066"></a>00066 <span class="comment">// combine_func_t has signature void(T) or void(const T&)</span>
-<a name="l00067"></a>00067 <span class="keyword">template</span> <<span class="keyword">typename</span> combine_func_t>
-<a name="l00068"></a>00068 <span class="keywordtype">void</span> combine_each(combine_func_t f_combine) { my_ets.combine_each(f_combine); }
-<a name="l00069"></a>00069
-<a name="l00070"></a>00070 };
-<a name="l00071"></a>00071 } <span class="comment">// namespace tbb</span>
-<a name="l00072"></a>00072 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_combinable_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00325.html b/doc/html/a00325.html
index 54a4fed..2020e5f 100644
--- a/doc/html/a00325.html
+++ b/doc/html/a00325.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>concurrent_hash_map.h Source File</title>
+<title>combinable.h Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -19,7 +19,7 @@
<li><a href="files.html"><span>File List</span></a></li>
<li><a href="globals.html"><span>File Members</span></a></li>
</ul></div>
-<h1>concurrent_hash_map.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<h1>combinable.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
<a name="l00003"></a>00003 <span class="comment"></span>
<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
@@ -39,1209 +39,54 @@
<a name="l00018"></a>00018 <span class="comment"> writing.</span>
<a name="l00019"></a>00019 <span class="comment">*/</span>
<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_concurrent_hash_map_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_concurrent_hash_map_H</span>
+<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_combinable_H</span>
+<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_combinable_H</span>
<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00025"></a>00025
-<a name="l00026"></a>00026 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
-<a name="l00027"></a>00027 <span class="preprocessor"></span> <span class="comment">// Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers</span>
-<a name="l00028"></a>00028 <span class="preprocessor"> #pragma warning (push)</span>
-<a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4530)</span>
-<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00031"></a>00031 <span class="preprocessor"></span>
-<a name="l00032"></a>00032 <span class="preprocessor">#include <iterator></span>
-<a name="l00033"></a>00033 <span class="preprocessor">#include <utility></span> <span class="comment">// Need std::pair</span>
-<a name="l00034"></a>00034 <span class="preprocessor">#include <cstring></span> <span class="comment">// Need std::memset</span>
-<a name="l00035"></a>00035
-<a name="l00036"></a>00036 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
-<a name="l00037"></a>00037 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
-<a name="l00038"></a>00038 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00039"></a>00039 <span class="preprocessor"></span>
-<a name="l00040"></a>00040 <span class="preprocessor">#include "cache_aligned_allocator.h"</span>
-<a name="l00041"></a>00041 <span class="preprocessor">#include "tbb_allocator.h"</span>
-<a name="l00042"></a>00042 <span class="preprocessor">#include "spin_rw_mutex.h"</span>
-<a name="l00043"></a>00043 <span class="preprocessor">#include "atomic.h"</span>
-<a name="l00044"></a>00044 <span class="preprocessor">#include "aligned_space.h"</span>
-<a name="l00045"></a>00045 <span class="preprocessor">#include "tbb_exception.h"</span>
-<a name="l00046"></a>00046 <span class="preprocessor">#include "_concurrent_unordered_internal.h"</span> <span class="comment">// Need tbb_hasher</span>
-<a name="l00047"></a>00047 <span class="preprocessor">#if TBB_USE_PERFORMANCE_WARNINGS</span>
-<a name="l00048"></a>00048 <span class="preprocessor"></span><span class="preprocessor">#include <typeinfo></span>
-<a name="l00049"></a>00049 <span class="preprocessor">#endif</span>
-<a name="l00050"></a>00050 <span class="preprocessor"></span>
-<a name="l00051"></a>00051 <span class="keyword">namespace </span>tbb {
-<a name="l00052"></a>00052
-<a name="l00054"></a>00054 <span class="keyword">namespace </span>internal {
-<a name="l00056"></a>00056 <span class="keywordtype">void</span>* __TBB_EXPORTED_FUNC itt_load_pointer_with_acquire_v3( <span class="keyword">const</span> <span class="keywordtype">void</span>* src );
-<a name="l00058"></a>00058 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC itt_store_pointer_with_release_v3( <span class="keywordtype">void</span>* dst, <span class="keywordtype">void</span>* src );
-<a name="l00060"></a>00060 <span class="keywordtype">void</span>* __TBB_EXPORTED_FUNC itt_load_pointer_v3( <span class="keyword">const</span> <span class="keywordtype">void</span>* src );
-<a name="l00061"></a>00061 }
-<a name="l00063"></a>00063
-<a name="l00065"></a>00065 <span class="keyword">template</span><<span class="keyword">typename</span> Key>
-<a name="l00066"></a><a class="code" href="a00208.html">00066</a> <span class="keyword">struct </span><a class="code" href="a00208.html">tbb_hash_compare</a> {
-<a name="l00067"></a>00067 <span class="keyword">static</span> size_t hash( <span class="keyword">const</span> Key& a ) { <span class="keywordflow">return</span> tbb_hasher(a); }
-<a name="l00068"></a>00068 <span class="keyword">static</span> <span class="keywordtype">bool</span> equal( <span class="keyword">const</span> Key& a, <span class="keyword">const</span> Key& b ) { <span class="keywordflow">return</span> a == b; }
-<a name="l00069"></a>00069 };
-<a name="l00070"></a>00070
-<a name="l00071"></a>00071 <span class="keyword">namespace </span>interface4 {
-<a name="l00072"></a>00072
-<a name="l00073"></a>00073 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare = tbb_hash_compare<Key>, <span class="keyword">typename</span> A = tbb_allocator<std::pair<Key, T> > >
-<a name="l00074"></a>00074 <span class="keyword">class </span><a class="code" href="a00156.html">concurrent_hash_map</a>;
-<a name="l00075"></a>00075
-<a name="l00077"></a>00077 <span class="keyword">namespace </span>internal {
-<a name="l00078"></a>00078
-<a name="l00079"></a>00079
-<a name="l00081"></a>00081 <span class="keyword">typedef</span> size_t hashcode_t;
-<a name="l00083"></a>00083 <span class="keyword">struct </span>hash_map_node_base : tbb::internal::no_copy {
-<a name="l00085"></a>00085 <span class="keyword">typedef</span> <a class="code" href="a00196.html">spin_rw_mutex</a> mutex_t;
-<a name="l00087"></a>00087 <span class="keyword">typedef</span> mutex_t::scoped_lock scoped_t;
-<a name="l00089"></a>00089 hash_map_node_base *next;
-<a name="l00090"></a>00090 mutex_t <a class="code" href="a00172.html">mutex</a>;
-<a name="l00091"></a>00091 };
-<a name="l00093"></a>00093 <span class="keyword">static</span> hash_map_node_base *<span class="keyword">const</span> rehash_req = reinterpret_cast<hash_map_node_base*>(size_t(3));
-<a name="l00095"></a>00095 <span class="keyword">static</span> hash_map_node_base *<span class="keyword">const</span> empty_rehashed = reinterpret_cast<hash_map_node_base*>(size_t(0));
-<a name="l00097"></a>00097 <span class="keyword">class </span>hash_map_base {
-<a name="l00098"></a>00098 <span class="keyword">public</span>:
-<a name="l00100"></a>00100 <span class="keyword">typedef</span> size_t size_type;
-<a name="l00102"></a>00102 <span class="keyword">typedef</span> size_t hashcode_t;
-<a name="l00104"></a>00104 <span class="keyword">typedef</span> size_t segment_index_t;
-<a name="l00106"></a>00106 <span class="keyword">typedef</span> hash_map_node_base node_base;
-<a name="l00108"></a>00108 <span class="keyword">struct </span>bucket : tbb::internal::no_copy {
-<a name="l00110"></a>00110 <span class="keyword">typedef</span> spin_rw_mutex mutex_t;
-<a name="l00112"></a>00112 <span class="keyword">typedef</span> mutex_t::scoped_lock scoped_t;
-<a name="l00113"></a>00113 mutex_t mutex;
-<a name="l00114"></a>00114 node_base *node_list;
-<a name="l00115"></a>00115 };
-<a name="l00117"></a>00117 <span class="keyword">static</span> size_type <span class="keyword">const</span> embedded_block = 1;
-<a name="l00119"></a>00119 <span class="keyword">static</span> size_type <span class="keyword">const</span> embedded_buckets = 1<<embedded_block;
-<a name="l00121"></a>00121 <span class="keyword">static</span> size_type <span class="keyword">const</span> first_block = 8; <span class="comment">//including embedded_block. perfect with bucket size 16, so the allocations are power of 4096</span>
-<a name="l00123"></a>00123 <span class="comment"></span> <span class="keyword">static</span> size_type <span class="keyword">const</span> pointers_per_table = <span class="keyword">sizeof</span>(segment_index_t) * 8; <span class="comment">// one segment per bit</span>
-<a name="l00125"></a>00125 <span class="comment"></span> <span class="keyword">typedef</span> bucket *segment_ptr_t;
-<a name="l00127"></a>00127 <span class="keyword">typedef</span> segment_ptr_t segments_table_t[pointers_per_table];
-<a name="l00129"></a>00129 atomic<hashcode_t> my_mask;
-<a name="l00131"></a>00131 segments_table_t my_table;
-<a name="l00133"></a>00133 atomic<size_type> my_size; <span class="comment">// It must be in separate cache line from my_mask due to performance effects</span>
-<a name="l00135"></a>00135 <span class="comment"></span> bucket my_embedded_segment[embedded_buckets];
-<a name="l00136"></a>00136
-<a name="l00138"></a>00138 hash_map_base() {
-<a name="l00139"></a>00139 std::memset( <span class="keyword">this</span>, 0, pointers_per_table*<span class="keyword">sizeof</span>(segment_ptr_t) <span class="comment">// 32*4=128 or 64*8=512</span>
-<a name="l00140"></a>00140 + <span class="keyword">sizeof</span>(my_size) + <span class="keyword">sizeof</span>(my_mask) <span class="comment">// 4+4 or 8+8</span>
-<a name="l00141"></a>00141 + embedded_buckets*<span class="keyword">sizeof</span>(bucket) ); <span class="comment">// n*8 or n*16</span>
-<a name="l00142"></a>00142 <span class="keywordflow">for</span>( size_type i = 0; i < embedded_block; i++ ) <span class="comment">// fill the table</span>
-<a name="l00143"></a>00143 my_table[i] = my_embedded_segment + segment_base(i);
-<a name="l00144"></a>00144 my_mask = embedded_buckets - 1;
-<a name="l00145"></a>00145 __TBB_ASSERT( embedded_block <= first_block, <span class="stringliteral">"The first block number must include embedded blocks"</span>);
-<a name="l00146"></a>00146 }
-<a name="l00147"></a>00147
-<a name="l00149"></a>00149 <span class="keyword">static</span> segment_index_t segment_index_of( size_type index ) {
-<a name="l00150"></a>00150 <span class="keywordflow">return</span> segment_index_t( __TBB_Log2( index|1 ) );
-<a name="l00151"></a>00151 }
-<a name="l00152"></a>00152
-<a name="l00154"></a>00154 <span class="keyword">static</span> segment_index_t segment_base( segment_index_t k ) {
-<a name="l00155"></a>00155 <span class="keywordflow">return</span> (segment_index_t(1)<<k & ~segment_index_t(1));
-<a name="l00156"></a>00156 }
-<a name="l00157"></a>00157
-<a name="l00159"></a>00159 <span class="keyword">static</span> size_type segment_size( segment_index_t k ) {
-<a name="l00160"></a>00160 <span class="keywordflow">return</span> size_type(1)<<k; <span class="comment">// fake value for k==0</span>
-<a name="l00161"></a>00161 }
-<a name="l00162"></a>00162
-<a name="l00164"></a>00164 <span class="keyword">static</span> <span class="keywordtype">bool</span> is_valid( <span class="keywordtype">void</span> *ptr ) {
-<a name="l00165"></a>00165 <span class="keywordflow">return</span> reinterpret_cast<size_t>(ptr) > size_t(63);
-<a name="l00166"></a>00166 }
-<a name="l00167"></a>00167
-<a name="l00169"></a>00169 <span class="keyword">static</span> <span class="keywordtype">void</span> init_buckets( segment_ptr_t ptr, size_type sz, <span class="keywordtype">bool</span> is_initial ) {
-<a name="l00170"></a>00170 <span class="keywordflow">if</span>( is_initial ) std::memset(ptr, 0, sz*<span class="keyword">sizeof</span>(bucket) );
-<a name="l00171"></a>00171 <span class="keywordflow">else</span> <span class="keywordflow">for</span>(size_type i = 0; i < sz; i++, ptr++) {
-<a name="l00172"></a>00172 *reinterpret_cast<intptr_t*>(&ptr->mutex) = 0;
-<a name="l00173"></a>00173 ptr->node_list = rehash_req;
-<a name="l00174"></a>00174 }
-<a name="l00175"></a>00175 }
-<a name="l00176"></a>00176
-<a name="l00178"></a>00178 <span class="keyword">static</span> <span class="keywordtype">void</span> add_to_bucket( bucket *b, node_base *n ) {
-<a name="l00179"></a>00179 __TBB_ASSERT(b->node_list != rehash_req, NULL);
-<a name="l00180"></a>00180 n->next = b->node_list;
-<a name="l00181"></a>00181 b->node_list = n; <span class="comment">// its under lock and flag is set</span>
-<a name="l00182"></a>00182 }
-<a name="l00183"></a>00183
-<a name="l00185"></a>00185 <span class="keyword">struct </span>enable_segment_failsafe {
-<a name="l00186"></a>00186 segment_ptr_t *my_segment_ptr;
-<a name="l00187"></a>00187 enable_segment_failsafe(segments_table_t &table, segment_index_t k) : my_segment_ptr(&table[k]) {}
-<a name="l00188"></a>00188 ~enable_segment_failsafe() {
-<a name="l00189"></a>00189 <span class="keywordflow">if</span>( my_segment_ptr ) *my_segment_ptr = 0; <span class="comment">// indicate no allocation in progress</span>
-<a name="l00190"></a>00190 }
-<a name="l00191"></a>00191 };
-<a name="l00192"></a>00192
-<a name="l00194"></a>00194 <span class="keywordtype">void</span> enable_segment( segment_index_t k, <span class="keywordtype">bool</span> is_initial = <span class="keyword">false</span> ) {
-<a name="l00195"></a>00195 __TBB_ASSERT( k, <span class="stringliteral">"Zero segment must be embedded"</span> );
-<a name="l00196"></a>00196 enable_segment_failsafe watchdog( my_table, k );
-<a name="l00197"></a>00197 cache_aligned_allocator<bucket> alloc;
-<a name="l00198"></a>00198 size_type sz;
-<a name="l00199"></a>00199 __TBB_ASSERT( !is_valid(my_table[k]), <span class="stringliteral">"Wrong concurrent assignment"</span>);
-<a name="l00200"></a>00200 <span class="keywordflow">if</span>( k >= first_block ) {
-<a name="l00201"></a>00201 sz = segment_size( k );
-<a name="l00202"></a>00202 segment_ptr_t ptr = alloc.allocate( sz );
-<a name="l00203"></a>00203 init_buckets( ptr, sz, is_initial );
-<a name="l00204"></a>00204 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00205"></a>00205 <span class="preprocessor"></span> <span class="comment">// TODO: actually, fence and notification are unnecessary here and below</span>
-<a name="l00206"></a>00206 itt_store_pointer_with_release_v3( my_table + k, ptr );
-<a name="l00207"></a>00207 <span class="preprocessor">#else</span>
-<a name="l00208"></a>00208 <span class="preprocessor"></span> my_table[k] = ptr;<span class="comment">// my_mask has release fence</span>
-<a name="l00209"></a>00209 <span class="preprocessor">#endif</span>
-<a name="l00210"></a>00210 <span class="preprocessor"></span> sz <<= 1;<span class="comment">// double it to get entire capacity of the container</span>
-<a name="l00211"></a>00211 } <span class="keywordflow">else</span> { <span class="comment">// the first block</span>
-<a name="l00212"></a>00212 __TBB_ASSERT( k == embedded_block, <span class="stringliteral">"Wrong segment index"</span> );
-<a name="l00213"></a>00213 sz = segment_size( first_block );
-<a name="l00214"></a>00214 segment_ptr_t ptr = alloc.allocate( sz - embedded_buckets );
-<a name="l00215"></a>00215 init_buckets( ptr, sz - embedded_buckets, is_initial );
-<a name="l00216"></a>00216 ptr -= segment_base(embedded_block);
-<a name="l00217"></a>00217 <span class="keywordflow">for</span>(segment_index_t i = embedded_block; i < first_block; i++) <span class="comment">// calc the offsets</span>
-<a name="l00218"></a>00218 #<span class="keywordflow">if</span> TBB_USE_THREADING_TOOLS
-<a name="l00219"></a>00219 itt_store_pointer_with_release_v3( my_table + i, ptr + segment_base(i) );
-<a name="l00220"></a>00220 <span class="preprocessor">#else</span>
-<a name="l00221"></a>00221 <span class="preprocessor"></span> my_table[i] = ptr + segment_base(i);
-<a name="l00222"></a>00222 <span class="preprocessor">#endif</span>
-<a name="l00223"></a>00223 <span class="preprocessor"></span> }
-<a name="l00224"></a>00224 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00225"></a>00225 <span class="preprocessor"></span> itt_store_pointer_with_release_v3( &my_mask, (<span class="keywordtype">void</span>*)(sz-1) );
-<a name="l00226"></a>00226 <span class="preprocessor">#else</span>
-<a name="l00227"></a>00227 <span class="preprocessor"></span> my_mask = sz - 1;
-<a name="l00228"></a>00228 <span class="preprocessor">#endif</span>
-<a name="l00229"></a>00229 <span class="preprocessor"></span> watchdog.my_segment_ptr = 0;
-<a name="l00230"></a>00230 }
-<a name="l00231"></a>00231
-<a name="l00233"></a>00233 bucket *get_bucket( hashcode_t h ) <span class="keyword">const</span> <span class="keywordflow">throw</span>() { <span class="comment">// TODO: add throw() everywhere?</span>
-<a name="l00234"></a>00234 segment_index_t s = segment_index_of( h );
-<a name="l00235"></a>00235 h -= segment_base(s);
-<a name="l00236"></a>00236 segment_ptr_t seg = my_table[s];
-<a name="l00237"></a>00237 __TBB_ASSERT( is_valid(seg), <span class="stringliteral">"hashcode must be cut by valid mask for allocated segments"</span> );
-<a name="l00238"></a>00238 <span class="keywordflow">return</span> &seg[h];
-<a name="l00239"></a>00239 }
-<a name="l00240"></a>00240
-<a name="l00241"></a>00241 <span class="comment">// internal serial rehashing helper</span>
-<a name="l00242"></a>00242 <span class="keywordtype">void</span> mark_rehashed_levels( hashcode_t h ) <span class="keywordflow">throw</span> () {
-<a name="l00243"></a>00243 segment_index_t s = segment_index_of( h );
-<a name="l00244"></a>00244 <span class="keywordflow">while</span>( segment_ptr_t seg = my_table[++s] )
-<a name="l00245"></a>00245 <span class="keywordflow">if</span>( seg[h].node_list == rehash_req ) {
-<a name="l00246"></a>00246 seg[h].node_list = empty_rehashed;
-<a name="l00247"></a>00247 mark_rehashed_levels( h + segment_base(s) );
-<a name="l00248"></a>00248 }
-<a name="l00249"></a>00249 }
-<a name="l00250"></a>00250
-<a name="l00252"></a>00252 <span class="comment">// Splitting into two functions should help inlining</span>
-<a name="l00253"></a>00253 <span class="keyword">inline</span> <span class="keywordtype">bool</span> check_mask_race( <span class="keyword">const</span> hashcode_t h, hashcode_t &m )<span class="keyword"> const </span>{
-<a name="l00254"></a>00254 hashcode_t m_now, m_old = m;
-<a name="l00255"></a>00255 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00256"></a>00256 <span class="preprocessor"></span> m_now = (hashcode_t) itt_load_pointer_with_acquire_v3( &my_mask );
-<a name="l00257"></a>00257 <span class="preprocessor">#else</span>
-<a name="l00258"></a>00258 <span class="preprocessor"></span> m_now = my_mask;
-<a name="l00259"></a>00259 <span class="preprocessor">#endif</span>
-<a name="l00260"></a>00260 <span class="preprocessor"></span> <span class="keywordflow">if</span>( m_old != m_now )
-<a name="l00261"></a>00261 <span class="keywordflow">return</span> check_rehashing_collision( h, m_old, m = m_now );
-<a name="l00262"></a>00262 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00263"></a>00263 }
-<a name="l00264"></a>00264
-<a name="l00266"></a>00266 <span class="keywordtype">bool</span> check_rehashing_collision( <span class="keyword">const</span> hashcode_t h, hashcode_t m_old, hashcode_t m )<span class="keyword"> const </span>{
-<a name="l00267"></a>00267 __TBB_ASSERT(m_old != m, NULL); <span class="comment">// TODO?: m arg could be optimized out by passing h = h&m</span>
-<a name="l00268"></a>00268 <span class="keywordflow">if</span>( (h & m_old) != (h & m) ) { <span class="comment">// mask changed for this hashcode, rare event</span>
-<a name="l00269"></a>00269 <span class="comment">// condition above proves that 'h' has some other bits set beside 'm_old'</span>
-<a name="l00270"></a>00270 <span class="comment">// find next applicable mask after m_old //TODO: look at bsl instruction</span>
-<a name="l00271"></a>00271 <span class="keywordflow">for</span>( ++m_old; !(h & m_old); m_old <<= 1 ) <span class="comment">// at maximum few rounds depending on the first block size</span>
-<a name="l00272"></a>00272 ;
-<a name="l00273"></a>00273 m_old = (m_old<<1) - 1; <span class="comment">// get full mask from a bit</span>
-<a name="l00274"></a>00274 __TBB_ASSERT((m_old&(m_old+1))==0 && m_old <= m, NULL);
-<a name="l00275"></a>00275 <span class="comment">// check whether it is rehashing/ed</span>
-<a name="l00276"></a>00276 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00277"></a>00277 <span class="preprocessor"></span> <span class="keywordflow">if</span>( itt_load_pointer_with_acquire_v3(&( get_bucket(h & m_old)->node_list )) != rehash_req )
-<a name="l00278"></a>00278 <span class="preprocessor">#else</span>
-<a name="l00279"></a>00279 <span class="preprocessor"></span> <span class="keywordflow">if</span>( __TBB_load_with_acquire(get_bucket( h & m_old )->node_list) != rehash_req )
-<a name="l00280"></a>00280 <span class="preprocessor">#endif</span>
-<a name="l00281"></a>00281 <span class="preprocessor"></span> <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00282"></a>00282 }
-<a name="l00283"></a>00283 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00284"></a>00284 }
-<a name="l00285"></a>00285
-<a name="l00287"></a>00287 segment_index_t insert_new_node( bucket *b, node_base *n, hashcode_t mask ) {
-<a name="l00288"></a>00288 size_type sz = ++my_size; <span class="comment">// prefix form is to enforce allocation after the first item inserted</span>
-<a name="l00289"></a>00289 add_to_bucket( b, n );
-<a name="l00290"></a>00290 <span class="comment">// check load factor</span>
-<a name="l00291"></a>00291 <span class="keywordflow">if</span>( sz >= mask ) { <span class="comment">// TODO: add custom load_factor </span>
-<a name="l00292"></a>00292 segment_index_t new_seg = segment_index_of( mask+1 );
-<a name="l00293"></a>00293 __TBB_ASSERT( is_valid(my_table[new_seg-1]), <span class="stringliteral">"new allocations must not publish new mask until segment has allocated"</span>);
-<a name="l00294"></a>00294 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00295"></a>00295 <span class="preprocessor"></span> <span class="keywordflow">if</span>( !itt_load_pointer_v3(my_table+new_seg)
-<a name="l00296"></a>00296 #<span class="keywordflow">else</span>
-<a name="l00297"></a>00297 <span class="keywordflow">if</span>( !my_table[new_seg]
-<a name="l00298"></a>00298 #endif
-<a name="l00299"></a>00299 && __TBB_CompareAndSwapW(&my_table[new_seg], 2, 0) == 0 )
-<a name="l00300"></a>00300 <span class="keywordflow">return</span> new_seg; <span class="comment">// The value must be processed</span>
-<a name="l00301"></a>00301 }
-<a name="l00302"></a>00302 <span class="keywordflow">return</span> 0;
-<a name="l00303"></a>00303 }
-<a name="l00304"></a>00304
-<a name="l00306"></a>00306 <span class="keywordtype">void</span> reserve(size_type buckets) {
-<a name="l00307"></a>00307 <span class="keywordflow">if</span>( !buckets-- ) <span class="keywordflow">return</span>;
-<a name="l00308"></a>00308 <span class="keywordtype">bool</span> is_initial = !my_size;
-<a name="l00309"></a>00309 <span class="keywordflow">for</span>( size_type m = my_mask; buckets > m; m = my_mask )
-<a name="l00310"></a>00310 enable_segment( segment_index_of( m+1 ), is_initial );
-<a name="l00311"></a>00311 }
-<a name="l00313"></a>00313 <span class="keywordtype">void</span> internal_swap(hash_map_base &table) {
-<a name="l00314"></a>00314 std::swap(this->my_mask, table.my_mask);
-<a name="l00315"></a>00315 std::swap(this->my_size, table.my_size);
-<a name="l00316"></a>00316 <span class="keywordflow">for</span>(size_type i = 0; i < embedded_buckets; i++)
-<a name="l00317"></a>00317 std::swap(this->my_embedded_segment[i].node_list, table.my_embedded_segment[i].node_list);
-<a name="l00318"></a>00318 <span class="keywordflow">for</span>(size_type i = embedded_block; i < pointers_per_table; i++)
-<a name="l00319"></a>00319 std::swap(this->my_table[i], table.my_table[i]);
-<a name="l00320"></a>00320 }
-<a name="l00321"></a>00321 };
-<a name="l00322"></a>00322
-<a name="l00323"></a>00323 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator>
-<a name="l00324"></a>00324 <span class="keyword">class </span>hash_map_range;
-<a name="l00325"></a>00325
-<a name="l00327"></a>00327
-<a name="l00329"></a>00329 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value>
-<a name="l00330"></a>00330 <span class="keyword">class </span>hash_map_iterator
-<a name="l00331"></a>00331 : <span class="keyword">public</span> std::iterator<std::forward_iterator_tag,Value>
-<a name="l00332"></a>00332 {
-<a name="l00333"></a>00333 <span class="keyword">typedef</span> Container map_type;
-<a name="l00334"></a>00334 <span class="keyword">typedef</span> <span class="keyword">typename</span> Container::node node;
-<a name="l00335"></a>00335 <span class="keyword">typedef</span> hash_map_base::node_base node_base;
-<a name="l00336"></a>00336 <span class="keyword">typedef</span> hash_map_base::bucket bucket;
-<a name="l00337"></a>00337
-<a name="l00338"></a>00338 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00339"></a>00339 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> hash_map_iterator<C,T>& i, <span class="keyword">const</span> hash_map_iterator<C,U>& j );
-<a name="l00340"></a>00340
-<a name="l00341"></a>00341 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00342"></a>00342 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> hash_map_iterator<C,T>& i, <span class="keyword">const</span> hash_map_iterator<C,U>& j );
-<a name="l00343"></a>00343
-<a name="l00344"></a>00344 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00345"></a>00345 <span class="keyword">friend</span> ptrdiff_t operator-( <span class="keyword">const</span> hash_map_iterator<C,T>& i, <span class="keyword">const</span> hash_map_iterator<C,U>& j );
-<a name="l00346"></a>00346
-<a name="l00347"></a>00347 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> U>
-<a name="l00348"></a>00348 <span class="keyword">friend</span> <span class="keyword">class </span>hash_map_iterator;
-<a name="l00349"></a>00349
-<a name="l00350"></a>00350 <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l00351"></a>00351 <span class="keyword">friend</span> <span class="keyword">class </span>hash_map_range;
-<a name="l00352"></a>00352
-<a name="l00353"></a>00353 <span class="keywordtype">void</span> advance_to_next_bucket() { <span class="comment">// TODO?: refactor to iterator_base class</span>
-<a name="l00354"></a>00354 size_t k = my_index+1;
-<a name="l00355"></a>00355 <span class="keywordflow">while</span>( my_bucket && k <= my_map->my_mask ) {
-<a name="l00356"></a>00356 <span class="comment">// Following test uses 2's-complement wizardry</span>
-<a name="l00357"></a>00357 <span class="keywordflow">if</span>( k& (k-2) ) <span class="comment">// not the beginning of a segment</span>
-<a name="l00358"></a>00358 ++my_bucket;
-<a name="l00359"></a>00359 <span class="keywordflow">else</span> my_bucket = my_map->get_bucket( k );
-<a name="l00360"></a>00360 my_node = static_cast<node*>( my_bucket->node_list );
-<a name="l00361"></a>00361 <span class="keywordflow">if</span>( hash_map_base::is_valid(my_node) ) {
-<a name="l00362"></a>00362 my_index = k; <span class="keywordflow">return</span>;
-<a name="l00363"></a>00363 }
-<a name="l00364"></a>00364 ++k;
-<a name="l00365"></a>00365 }
-<a name="l00366"></a>00366 my_bucket = 0; my_node = 0; my_index = k; <span class="comment">// the end</span>
-<a name="l00367"></a>00367 }
-<a name="l00368"></a>00368 <span class="preprocessor">#if !defined(_MSC_VER) || defined(__INTEL_COMPILER)</span>
-<a name="l00369"></a>00369 <span class="preprocessor"></span> <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
-<a name="l00370"></a>00370 <span class="keyword">friend</span> <span class="keyword">class </span>interface4::concurrent_hash_map;
-<a name="l00371"></a>00371 <span class="preprocessor">#else</span>
-<a name="l00372"></a>00372 <span class="preprocessor"></span> <span class="keyword">public</span>: <span class="comment">// workaround</span>
-<a name="l00373"></a>00373 <span class="preprocessor">#endif</span>
-<a name="l00375"></a>00375 <span class="preprocessor"> const Container *my_map;</span>
-<a name="l00376"></a>00376 <span class="preprocessor"></span>
-<a name="l00378"></a>00378 size_t my_index;
-<a name="l00379"></a>00379
-<a name="l00381"></a>00381 <span class="keyword">const</span> bucket *my_bucket;
-<a name="l00382"></a>00382
-<a name="l00384"></a>00384 node *my_node;
-<a name="l00385"></a>00385
-<a name="l00386"></a>00386 hash_map_iterator( <span class="keyword">const</span> Container &map, size_t index, <span class="keyword">const</span> bucket *b, node_base *n );
-<a name="l00387"></a>00387
-<a name="l00388"></a>00388 <span class="keyword">public</span>:
-<a name="l00390"></a>00390 hash_map_iterator() {}
-<a name="l00391"></a>00391 hash_map_iterator( <span class="keyword">const</span> hash_map_iterator<Container,typename Container::value_type> &other ) :
-<a name="l00392"></a>00392 my_map(other.my_map),
-<a name="l00393"></a>00393 my_index(other.my_index),
-<a name="l00394"></a>00394 my_bucket(other.my_bucket),
-<a name="l00395"></a>00395 my_node(other.my_node)
-<a name="l00396"></a>00396 {}
-<a name="l00397"></a>00397 Value& operator*()<span class="keyword"> const </span>{
-<a name="l00398"></a>00398 __TBB_ASSERT( hash_map_base::is_valid(my_node), <span class="stringliteral">"iterator uninitialized or at end of container?"</span> );
-<a name="l00399"></a>00399 <span class="keywordflow">return</span> my_node->item;
-<a name="l00400"></a>00400 }
-<a name="l00401"></a>00401 Value* operator->()<span class="keyword"> const </span>{<span class="keywordflow">return</span> &operator*();}
-<a name="l00402"></a>00402 hash_map_iterator& operator++();
-<a name="l00403"></a>00403
-<a name="l00405"></a>00405 Value* operator++(<span class="keywordtype">int</span>) {
-<a name="l00406"></a>00406 Value* result = &operator*();
-<a name="l00407"></a>00407 operator++();
-<a name="l00408"></a>00408 <span class="keywordflow">return</span> result;
-<a name="l00409"></a>00409 }
-<a name="l00410"></a>00410 };
-<a name="l00411"></a>00411
-<a name="l00412"></a>00412 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value>
-<a name="l00413"></a>00413 hash_map_iterator<Container,Value>::hash_map_iterator( <span class="keyword">const</span> Container &map, size_t index, <span class="keyword">const</span> bucket *b, node_base *n ) :
-<a name="l00414"></a>00414 my_map(&map),
-<a name="l00415"></a>00415 my_index(index),
-<a name="l00416"></a>00416 my_bucket(b),
-<a name="l00417"></a>00417 my_node( static_cast<node*>(n) )
-<a name="l00418"></a>00418 {
-<a name="l00419"></a>00419 <span class="keywordflow">if</span>( b && !hash_map_base::is_valid(n) )
-<a name="l00420"></a>00420 advance_to_next_bucket();
-<a name="l00421"></a>00421 }
-<a name="l00422"></a>00422
-<a name="l00423"></a>00423 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value>
-<a name="l00424"></a>00424 hash_map_iterator<Container,Value>& hash_map_iterator<Container,Value>::operator++() {
-<a name="l00425"></a>00425 my_node = static_cast<node*>( my_node->next );
-<a name="l00426"></a>00426 <span class="keywordflow">if</span>( !my_node ) advance_to_next_bucket();
-<a name="l00427"></a>00427 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00428"></a>00428 }
-<a name="l00429"></a>00429
-<a name="l00430"></a>00430 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00431"></a>00431 <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> hash_map_iterator<Container,T>& i, <span class="keyword">const</span> hash_map_iterator<Container,U>& j ) {
-<a name="l00432"></a>00432 <span class="keywordflow">return</span> i.my_node == j.my_node && i.my_map == j.my_map;
-<a name="l00433"></a>00433 }
-<a name="l00434"></a>00434
-<a name="l00435"></a>00435 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00436"></a>00436 <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> hash_map_iterator<Container,T>& i, <span class="keyword">const</span> hash_map_iterator<Container,U>& j ) {
-<a name="l00437"></a>00437 <span class="keywordflow">return</span> i.my_node != j.my_node || i.my_map != j.my_map;
-<a name="l00438"></a>00438 }
-<a name="l00439"></a>00439
-<a name="l00441"></a>00441
-<a name="l00442"></a>00442 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator>
-<a name="l00443"></a>00443 <span class="keyword">class </span>hash_map_range {
-<a name="l00444"></a>00444 <span class="keyword">typedef</span> <span class="keyword">typename</span> Iterator::map_type map_type;
-<a name="l00445"></a>00445 Iterator my_begin;
-<a name="l00446"></a>00446 Iterator my_end;
-<a name="l00447"></a>00447 <span class="keyword">mutable</span> Iterator my_midpoint;
-<a name="l00448"></a>00448 size_t my_grainsize;
-<a name="l00450"></a>00450 <span class="keywordtype">void</span> set_midpoint() <span class="keyword">const</span>;
-<a name="l00451"></a>00451 <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">friend</span> <span class="keyword">class </span>hash_map_range;
-<a name="l00452"></a>00452 <span class="keyword">public</span>:
-<a name="l00454"></a>00454 <span class="keyword">typedef</span> std::size_t size_type;
-<a name="l00455"></a>00455 <span class="keyword">typedef</span> <span class="keyword">typename</span> Iterator::value_type value_type;
-<a name="l00456"></a>00456 <span class="keyword">typedef</span> <span class="keyword">typename</span> Iterator::reference reference;
-<a name="l00457"></a>00457 <span class="keyword">typedef</span> <span class="keyword">typename</span> Iterator::difference_type difference_type;
-<a name="l00458"></a>00458 <span class="keyword">typedef</span> Iterator iterator;
-<a name="l00459"></a>00459
-<a name="l00461"></a>00461 <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_begin==my_end;}
-<a name="l00462"></a>00462
-<a name="l00464"></a>00464 <span class="keywordtype">bool</span> is_divisible()<span class="keyword"> const </span>{
-<a name="l00465"></a>00465 <span class="keywordflow">return</span> my_midpoint!=my_end;
-<a name="l00466"></a>00466 }
-<a name="l00468"></a>00468 hash_map_range( hash_map_range& r, split ) :
-<a name="l00469"></a>00469 my_end(r.my_end),
-<a name="l00470"></a>00470 my_grainsize(r.my_grainsize)
-<a name="l00471"></a>00471 {
-<a name="l00472"></a>00472 r.my_end = my_begin = r.my_midpoint;
-<a name="l00473"></a>00473 __TBB_ASSERT( !empty(), <span class="stringliteral">"Splitting despite the range is not divisible"</span> );
-<a name="l00474"></a>00474 __TBB_ASSERT( !r.empty(), <span class="stringliteral">"Splitting despite the range is not divisible"</span> );
-<a name="l00475"></a>00475 set_midpoint();
-<a name="l00476"></a>00476 r.set_midpoint();
-<a name="l00477"></a>00477 }
-<a name="l00479"></a>00479 <span class="keyword">template</span><<span class="keyword">typename</span> U>
-<a name="l00480"></a>00480 hash_map_range( hash_map_range<U>& r) :
-<a name="l00481"></a>00481 my_begin(r.my_begin),
-<a name="l00482"></a>00482 my_end(r.my_end),
-<a name="l00483"></a>00483 my_midpoint(r.my_midpoint),
-<a name="l00484"></a>00484 my_grainsize(r.my_grainsize)
-<a name="l00485"></a>00485 {}
-<a name="l00486"></a>00486 <span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00488"></a>00488 <span class="preprocessor"> hash_map_range( const Iterator& begin_, const Iterator& end_, size_type grainsize_ = 1 ) : </span>
-<a name="l00489"></a>00489 <span class="preprocessor"></span> my_begin(begin_),
-<a name="l00490"></a>00490 my_end(end_),
-<a name="l00491"></a>00491 my_grainsize(grainsize_)
-<a name="l00492"></a>00492 {
-<a name="l00493"></a>00493 <span class="keywordflow">if</span>(!my_end.my_index && !my_end.my_bucket) <span class="comment">// end</span>
-<a name="l00494"></a>00494 my_end.my_index = my_end.my_map->my_mask + 1;
-<a name="l00495"></a>00495 set_midpoint();
-<a name="l00496"></a>00496 __TBB_ASSERT( grainsize_>0, <span class="stringliteral">"grainsize must be positive"</span> );
-<a name="l00497"></a>00497 }
-<a name="l00498"></a>00498 <span class="preprocessor">#endif</span>
-<a name="l00500"></a>00500 <span class="preprocessor"> hash_map_range( const map_type &map, size_type grainsize_ = 1 ) : </span>
-<a name="l00501"></a>00501 <span class="preprocessor"></span> my_begin( Iterator( map, 0, map.my_embedded_segment, map.my_embedded_segment->node_list ) ),
-<a name="l00502"></a>00502 my_end( Iterator( map, map.my_mask + 1, 0, 0 ) ),
-<a name="l00503"></a>00503 my_grainsize( grainsize_ )
-<a name="l00504"></a>00504 {
-<a name="l00505"></a>00505 __TBB_ASSERT( grainsize_>0, <span class="stringliteral">"grainsize must be positive"</span> );
-<a name="l00506"></a>00506 set_midpoint();
-<a name="l00507"></a>00507 }
-<a name="l00508"></a>00508 <span class="keyword">const</span> Iterator& begin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_begin;}
-<a name="l00509"></a>00509 <span class="keyword">const</span> Iterator& end()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_end;}
-<a name="l00511"></a>00511 size_type grainsize()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_grainsize;}
-<a name="l00512"></a>00512 };
-<a name="l00513"></a>00513
-<a name="l00514"></a>00514 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator>
-<a name="l00515"></a>00515 <span class="keywordtype">void</span> hash_map_range<Iterator>::set_midpoint()<span class="keyword"> const </span>{
-<a name="l00516"></a>00516 <span class="comment">// Split by groups of nodes</span>
-<a name="l00517"></a>00517 size_t m = my_end.my_index-my_begin.my_index;
-<a name="l00518"></a>00518 <span class="keywordflow">if</span>( m > my_grainsize ) {
-<a name="l00519"></a>00519 m = my_begin.my_index + m/2u;
-<a name="l00520"></a>00520 hash_map_base::bucket *b = my_begin.my_map->get_bucket(m);
-<a name="l00521"></a>00521 my_midpoint = Iterator(*my_begin.my_map,m,b,b->node_list);
-<a name="l00522"></a>00522 } <span class="keywordflow">else</span> {
-<a name="l00523"></a>00523 my_midpoint = my_end;
-<a name="l00524"></a>00524 }
-<a name="l00525"></a>00525 __TBB_ASSERT( my_begin.my_index <= my_midpoint.my_index,
-<a name="l00526"></a>00526 <span class="stringliteral">"my_begin is after my_midpoint"</span> );
-<a name="l00527"></a>00527 __TBB_ASSERT( my_midpoint.my_index <= my_end.my_index,
-<a name="l00528"></a>00528 <span class="stringliteral">"my_midpoint is after my_end"</span> );
-<a name="l00529"></a>00529 __TBB_ASSERT( my_begin != my_midpoint || my_begin == my_end,
-<a name="l00530"></a>00530 <span class="stringliteral">"[my_begin, my_midpoint) range should not be empty"</span> );
-<a name="l00531"></a>00531 }
-<a name="l00532"></a>00532
-<a name="l00533"></a>00533 } <span class="comment">// internal</span>
-<a name="l00535"></a>00535 <span class="comment"></span>
-<a name="l00537"></a>00537
-<a name="l00566"></a>00566 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> Allocator>
-<a name="l00567"></a><a class="code" href="a00156.html">00567</a> <span class="keyword">class </span><a class="code" href="a00156.html">concurrent_hash_map</a> : <span class="keyword">protected</span> internal::hash_map_base {
-<a name="l00568"></a>00568 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value>
-<a name="l00569"></a>00569 <span class="keyword">friend</span> <span class="keyword">class </span>internal::hash_map_iterator;
-<a name="l00570"></a>00570
-<a name="l00571"></a>00571 <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l00572"></a>00572 <span class="keyword">friend</span> <span class="keyword">class </span>internal::hash_map_range;
-<a name="l00573"></a>00573
-<a name="l00574"></a>00574 <span class="keyword">public</span>:
-<a name="l00575"></a>00575 <span class="keyword">typedef</span> Key key_type;
-<a name="l00576"></a>00576 <span class="keyword">typedef</span> T mapped_type;
-<a name="l00577"></a>00577 <span class="keyword">typedef</span> std::pair<const Key,T> value_type;
-<a name="l00578"></a>00578 <span class="keyword">typedef</span> hash_map_base::size_type size_type;
-<a name="l00579"></a>00579 <span class="keyword">typedef</span> ptrdiff_t difference_type;
-<a name="l00580"></a>00580 <span class="keyword">typedef</span> value_type *pointer;
-<a name="l00581"></a>00581 <span class="keyword">typedef</span> <span class="keyword">const</span> value_type *const_pointer;
-<a name="l00582"></a>00582 <span class="keyword">typedef</span> value_type &reference;
-<a name="l00583"></a>00583 <span class="keyword">typedef</span> <span class="keyword">const</span> value_type &const_reference;
-<a name="l00584"></a>00584 <span class="keyword">typedef</span> internal::hash_map_iterator<concurrent_hash_map,value_type> iterator;
-<a name="l00585"></a>00585 <span class="keyword">typedef</span> internal::hash_map_iterator<concurrent_hash_map,const value_type> const_iterator;
-<a name="l00586"></a>00586 <span class="keyword">typedef</span> internal::hash_map_range<iterator> range_type;
-<a name="l00587"></a>00587 <span class="keyword">typedef</span> internal::hash_map_range<const_iterator> const_range_type;
-<a name="l00588"></a>00588 <span class="keyword">typedef</span> Allocator allocator_type;
-<a name="l00589"></a>00589
-<a name="l00590"></a>00590 <span class="keyword">protected</span>:
-<a name="l00591"></a>00591 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00159.html">const_accessor</a>;
-<a name="l00592"></a>00592 <span class="keyword">struct </span>node;
-<a name="l00593"></a>00593 <span class="keyword">typedef</span> <span class="keyword">typename</span> Allocator::template rebind<node>::other node_allocator_type;
-<a name="l00594"></a>00594 node_allocator_type my_allocator;
-<a name="l00595"></a>00595 HashCompare my_hash_compare;
-<a name="l00596"></a>00596
-<a name="l00597"></a>00597 <span class="keyword">struct </span>node : <span class="keyword">public</span> node_base {
-<a name="l00598"></a>00598 value_type item;
-<a name="l00599"></a>00599 node( <span class="keyword">const</span> Key &key ) : item(key, T()) {}
-<a name="l00600"></a>00600 node( <span class="keyword">const</span> Key &key, <span class="keyword">const</span> T &t ) : item(key, t) {}
-<a name="l00601"></a>00601 <span class="comment">// exception-safe allocation, see C++ Standard 2003, clause 5.3.4p17</span>
-<a name="l00602"></a>00602 <span class="keywordtype">void</span> *operator new( size_t <span class="comment">/*size*/</span>, node_allocator_type &a ) {
-<a name="l00603"></a>00603 <span class="keywordtype">void</span> *ptr = a.allocate(1);
-<a name="l00604"></a>00604 <span class="keywordflow">if</span>(!ptr)
-<a name="l00605"></a>00605 tbb::internal::throw_exception(tbb::internal::eid_bad_alloc);
-<a name="l00606"></a>00606 <span class="keywordflow">return</span> ptr;
-<a name="l00607"></a>00607 }
-<a name="l00608"></a>00608 <span class="comment">// match placement-new form above to be called if exception thrown in constructor</span>
-<a name="l00609"></a>00609 <span class="keywordtype">void</span> operator delete( <span class="keywordtype">void</span> *ptr, node_allocator_type &a ) {<span class="keywordflow">return</span> a.deallocate(static_cast<node*>(ptr),1); }
-<a name="l00610"></a>00610 };
-<a name="l00611"></a>00611
-<a name="l00612"></a>00612 <span class="keywordtype">void</span> delete_node( node_base *n ) {
-<a name="l00613"></a>00613 my_allocator.destroy( static_cast<node*>(n) );
-<a name="l00614"></a>00614 my_allocator.deallocate( static_cast<node*>(n), 1);
-<a name="l00615"></a>00615 }
-<a name="l00616"></a>00616
-<a name="l00617"></a>00617 node *search_bucket( <span class="keyword">const</span> key_type &key, bucket *b )<span class="keyword"> const </span>{
-<a name="l00618"></a>00618 node *n = static_cast<node*>( b->node_list );
-<a name="l00619"></a>00619 <span class="keywordflow">while</span>( is_valid(n) && !my_hash_compare.equal(key, n->item.first) )
-<a name="l00620"></a>00620 n = static_cast<node*>( n->next );
-<a name="l00621"></a>00621 __TBB_ASSERT(n != internal::rehash_req, <span class="stringliteral">"Search can be executed only for rehashed bucket"</span>);
-<a name="l00622"></a>00622 <span class="keywordflow">return</span> n;
-<a name="l00623"></a>00623 }
-<a name="l00624"></a>00624
-<a name="l00626"></a><a class="code" href="a00158.html">00626</a> <span class="keyword">class </span><a class="code" href="a00158.html">bucket_accessor</a> : <span class="keyword">public</span> bucket::scoped_t {
-<a name="l00627"></a>00627 <span class="keywordtype">bool</span> my_is_writer; <span class="comment">// TODO: use it from base type</span>
-<a name="l00628"></a>00628 bucket *my_b;
-<a name="l00629"></a>00629 <span class="keyword">public</span>:
-<a name="l00630"></a>00630 <a class="code" href="a00158.html">bucket_accessor</a>( <a class="code" href="a00156.html">concurrent_hash_map</a> *base, <span class="keyword">const</span> hashcode_t h, <span class="keywordtype">bool</span> writer = <span class="keyword">false</span> ) { <a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>( base, h, writer ); }
-<a name="l00632"></a><a class="code" href="a00158.html#26b4fe0ca87a7ad4852cb787db880119">00632</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>( <a class="code" href="a00156.html">concurrent_hash_map</a> *base, <span class="keyword">const</span> hashcode_t h, <span class="keywordtype">bool</span> writer = <span class="keyword">false</span> ) {
-<a name="l00633"></a>00633 my_b = base->get_bucket( h );
-<a name="l00634"></a>00634 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00635"></a>00635 <span class="preprocessor"></span> <span class="comment">// TODO: actually, notification is unnecessary here, just hiding double-check</span>
-<a name="l00636"></a>00636 <span class="keywordflow">if</span>( itt_load_pointer_with_acquire_v3(&my_b->node_list) == internal::rehash_req
-<a name="l00637"></a>00637 #<span class="keywordflow">else</span>
-<a name="l00638"></a>00638 <span class="keywordflow">if</span>( __TBB_load_with_acquire(my_b->node_list) == internal::rehash_req
-<a name="l00639"></a>00639 #endif
-<a name="l00640"></a>00640 && try_acquire( my_b->mutex, <span class="comment">/*write=*/</span><span class="keyword">true</span> ) )
-<a name="l00641"></a>00641 {
-<a name="l00642"></a>00642 <span class="keywordflow">if</span>( my_b->node_list == internal::rehash_req ) base-><a class="code" href="a00156.html#571d635fd206d9985cf20a1a659ea476">rehash_bucket</a>( my_b, h ); <span class="comment">//recursive rehashing</span>
-<a name="l00643"></a>00643 my_is_writer = <span class="keyword">true</span>;
-<a name="l00644"></a>00644 }
-<a name="l00645"></a>00645 <span class="keywordflow">else</span> bucket::scoped_t::acquire( my_b->mutex, <span class="comment">/*write=*/</span>my_is_writer = writer );
-<a name="l00646"></a>00646 __TBB_ASSERT( my_b->node_list != internal::rehash_req, NULL);
-<a name="l00647"></a>00647 }
-<a name="l00649"></a><a class="code" href="a00158.html#fc194e3a186dc935a5fb513cc9f8e898">00649</a> <span class="keywordtype">bool</span> is_writer() { <span class="keywordflow">return</span> my_is_writer; }
-<a name="l00651"></a><a class="code" href="a00158.html#57c6110bd20e95c06de5a199de988941">00651</a> bucket *operator() () { <span class="keywordflow">return</span> my_b; }
-<a name="l00652"></a>00652 <span class="comment">// TODO: optimize out</span>
-<a name="l00653"></a>00653 <span class="keywordtype">bool</span> upgrade_to_writer() { my_is_writer = <span class="keyword">true</span>; <span class="keywordflow">return</span> bucket::scoped_t::upgrade_to_writer(); }
-<a name="l00654"></a>00654 };
-<a name="l00655"></a>00655
-<a name="l00656"></a>00656 <span class="comment">// TODO refactor to hash_base</span>
-<a name="l00657"></a>00657 <span class="keywordtype">void</span> rehash_bucket( bucket *b_new, <span class="keyword">const</span> hashcode_t h ) {
-<a name="l00658"></a>00658 __TBB_ASSERT( *(intptr_t*)(&b_new->mutex), <span class="stringliteral">"b_new must be locked (for write)"</span>);
-<a name="l00659"></a>00659 __TBB_ASSERT( h > 1, <span class="stringliteral">"The lowermost buckets can't be rehashed"</span> );
-<a name="l00660"></a>00660 __TBB_store_with_release(b_new->node_list, internal::empty_rehashed); <span class="comment">// mark rehashed</span>
-<a name="l00661"></a>00661 hashcode_t mask = ( 1u<<__TBB_Log2( h ) ) - 1; <span class="comment">// get parent mask from the topmost bit</span>
-<a name="l00662"></a>00662
-<a name="l00663"></a>00663 bucket_accessor b_old( <span class="keyword">this</span>, h & mask );
-<a name="l00664"></a>00664
-<a name="l00665"></a>00665 mask = (mask<<1) | 1; <span class="comment">// get full mask for new bucket</span>
-<a name="l00666"></a>00666 __TBB_ASSERT( (mask&(mask+1))==0 && (h & mask) == h, NULL );
-<a name="l00667"></a>00667 restart:
-<a name="l00668"></a>00668 <span class="keywordflow">for</span>( node_base **p = &b_old()->node_list, *n = __TBB_load_with_acquire(*p); is_valid(n); n = *p ) {
-<a name="l00669"></a>00669 hashcode_t c = my_hash_compare.hash( static_cast<node*>(n)->item.first );
-<a name="l00670"></a>00670 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00671"></a>00671 <span class="preprocessor"></span> hashcode_t bmask = h & (mask>>1);
-<a name="l00672"></a>00672 bmask = bmask==0? 1 : ( 1u<<(__TBB_Log2( bmask )+1 ) ) - 1; <span class="comment">// minimal mask of parent bucket</span>
-<a name="l00673"></a>00673 __TBB_ASSERT( (c & bmask) == (h & bmask), <span class="stringliteral">"hash() function changed for key in table"</span> );
-<a name="l00674"></a>00674 <span class="preprocessor">#endif</span>
-<a name="l00675"></a>00675 <span class="preprocessor"></span> <span class="keywordflow">if</span>( (c & mask) == h ) {
-<a name="l00676"></a>00676 <span class="keywordflow">if</span>( !b_old.is_writer() )
-<a name="l00677"></a>00677 <span class="keywordflow">if</span>( !b_old.upgrade_to_writer() ) {
-<a name="l00678"></a>00678 <span class="keywordflow">goto</span> restart; <span class="comment">// node ptr can be invalid due to concurrent erase</span>
-<a name="l00679"></a>00679 }
-<a name="l00680"></a>00680 *p = n->next; <span class="comment">// exclude from b_old</span>
-<a name="l00681"></a>00681 add_to_bucket( b_new, n );
-<a name="l00682"></a>00682 } <span class="keywordflow">else</span> p = &n->next; <span class="comment">// iterate to next item</span>
-<a name="l00683"></a>00683 }
-<a name="l00684"></a>00684 }
-<a name="l00685"></a>00685
-<a name="l00686"></a>00686 <span class="keyword">public</span>:
-<a name="l00687"></a>00687
-<a name="l00688"></a>00688 <span class="keyword">class </span>accessor;
-<a name="l00690"></a><a class="code" href="a00159.html">00690</a> <span class="keyword">class </span><a class="code" href="a00159.html">const_accessor</a> {
-<a name="l00691"></a>00691 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00156.html">concurrent_hash_map</a><Key,T,HashCompare,Allocator>;
-<a name="l00692"></a>00692 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00157.html">accessor</a>;
-<a name="l00693"></a>00693 <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> <a class="code" href="a00157.html">accessor</a> & ) <span class="keyword">const</span>; <span class="comment">// Deny access</span>
-<a name="l00694"></a>00694 <a class="code" href="a00159.html">const_accessor</a>( <span class="keyword">const</span> <a class="code" href="a00157.html">accessor</a> & ); <span class="comment">// Deny access</span>
-<a name="l00695"></a>00695 <span class="keyword">public</span>:
-<a name="l00697"></a><a class="code" href="a00159.html#48647ca0d79c1233b997f5768403c926">00697</a> <span class="keyword">typedef</span> <span class="keyword">const</span> <span class="keyword">typename</span> concurrent_hash_map::value_type value_type;
-<a name="l00698"></a>00698
-<a name="l00700"></a><a class="code" href="a00159.html#5cce3104cb0a52e08d2131370871c614">00700</a> <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{<span class="keywordflow">return</span> !my_node;}
-<a name="l00701"></a>00701
-<a name="l00703"></a><a class="code" href="a00159.html#d5ce4f88d8870290238a8ad621e6f270">00703</a> <span class="keywordtype">void</span> <a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>() {
-<a name="l00704"></a>00704 <span class="keywordflow">if</span>( my_node ) {
-<a name="l00705"></a>00705 my_lock.release();
-<a name="l00706"></a>00706 my_node = 0;
-<a name="l00707"></a>00707 }
-<a name="l00708"></a>00708 }
-<a name="l00709"></a>00709
-<a name="l00711"></a><a class="code" href="a00159.html#30f31106840700a4c3664b9cb1c31ca7">00711</a> const_reference operator*()<span class="keyword"> const </span>{
-<a name="l00712"></a>00712 __TBB_ASSERT( my_node, <span class="stringliteral">"attempt to dereference empty accessor"</span> );
-<a name="l00713"></a>00713 <span class="keywordflow">return</span> my_node->item;
-<a name="l00714"></a>00714 }
-<a name="l00715"></a>00715
-<a name="l00717"></a><a class="code" href="a00159.html#3d03a48ecb8cd9549bd8be64b09c9b0d">00717</a> const_pointer operator->()<span class="keyword"> const </span>{
-<a name="l00718"></a>00718 <span class="keywordflow">return</span> &operator*();
-<a name="l00719"></a>00719 }
-<a name="l00720"></a>00720
-<a name="l00722"></a><a class="code" href="a00159.html#a9ead65cca68d4c49c7ef64d7899a4c8">00722</a> <a class="code" href="a00159.html">const_accessor</a>() : my_node(NULL) {}
-<a name="l00723"></a>00723
-<a name="l00725"></a><a class="code" href="a00159.html#752b0c1ec74b94786403a75e42917d01">00725</a> ~<a class="code" href="a00159.html">const_accessor</a>() {
-<a name="l00726"></a>00726 my_node = NULL; <span class="comment">// my_lock.release() is called in scoped_lock destructor</span>
-<a name="l00727"></a>00727 }
-<a name="l00728"></a>00728 <span class="keyword">private</span>:
-<a name="l00729"></a>00729 node *my_node;
-<a name="l00730"></a>00730 <span class="keyword">typename</span> node::scoped_t my_lock;
-<a name="l00731"></a>00731 hashcode_t my_hash;
-<a name="l00732"></a>00732 };
-<a name="l00733"></a>00733
-<a name="l00735"></a><a class="code" href="a00157.html">00735</a> <span class="keyword">class </span><a class="code" href="a00157.html">accessor</a>: <span class="keyword">public</span> <a class="code" href="a00159.html">const_accessor</a> {
-<a name="l00736"></a>00736 <span class="keyword">public</span>:
-<a name="l00738"></a><a class="code" href="a00157.html#49eec74f272bab187d176c0d9d16a7fe">00738</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_hash_map::value_type value_type;
-<a name="l00739"></a>00739
-<a name="l00741"></a><a class="code" href="a00157.html#e8938f0cd1211e88a1d73527ed3636c4">00741</a> reference operator*()<span class="keyword"> const </span>{
-<a name="l00742"></a>00742 __TBB_ASSERT( this->my_node, <span class="stringliteral">"attempt to dereference empty accessor"</span> );
-<a name="l00743"></a>00743 <span class="keywordflow">return</span> this->my_node->item;
-<a name="l00744"></a>00744 }
-<a name="l00745"></a>00745
-<a name="l00747"></a><a class="code" href="a00157.html#fcebc32c020202cc37e60eadef157569">00747</a> pointer operator->()<span class="keyword"> const </span>{
-<a name="l00748"></a>00748 <span class="keywordflow">return</span> &operator*();
-<a name="l00749"></a>00749 }
-<a name="l00750"></a>00750 };
-<a name="l00751"></a>00751
-<a name="l00753"></a><a class="code" href="a00156.html#d827bb5e4f61de1916ab67d51c7c6e60">00753</a> <a class="code" href="a00156.html">concurrent_hash_map</a>(<span class="keyword">const</span> allocator_type &a = allocator_type())
-<a name="l00754"></a>00754 : internal::hash_map_base(), my_allocator(a)
-<a name="l00755"></a>00755 {}
-<a name="l00756"></a>00756
-<a name="l00758"></a><a class="code" href="a00156.html#a4612d5c7233712d455496641e9b31ff">00758</a> <a class="code" href="a00156.html">concurrent_hash_map</a>(size_type n, <span class="keyword">const</span> allocator_type &a = allocator_type())
-<a name="l00759"></a>00759 : my_allocator(a)
-<a name="l00760"></a>00760 {
-<a name="l00761"></a>00761 reserve( n );
-<a name="l00762"></a>00762 }
-<a name="l00763"></a>00763
-<a name="l00765"></a><a class="code" href="a00156.html#df0cd14eaddb17f10929c91519e65be9">00765</a> <a class="code" href="a00156.html">concurrent_hash_map</a>( <span class="keyword">const</span> <a class="code" href="a00156.html">concurrent_hash_map</a>& table, <span class="keyword">const</span> allocator_type &a = allocator_type())
-<a name="l00766"></a>00766 : internal::hash_map_base(), my_allocator(a)
-<a name="l00767"></a>00767 {
-<a name="l00768"></a>00768 internal_copy(table);
-<a name="l00769"></a>00769 }
-<a name="l00770"></a>00770
-<a name="l00772"></a>00772 <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l00773"></a><a class="code" href="a00156.html#3bfe75fcb350ce39cf610c164f233edc">00773</a> <a class="code" href="a00156.html">concurrent_hash_map</a>(I first, I last, <span class="keyword">const</span> allocator_type &a = allocator_type())
-<a name="l00774"></a>00774 : my_allocator(a)
-<a name="l00775"></a>00775 {
-<a name="l00776"></a>00776 reserve( std::distance(first, last) ); <span class="comment">// TODO: load_factor?</span>
-<a name="l00777"></a>00777 internal_copy(first, last);
-<a name="l00778"></a>00778 }
-<a name="l00779"></a>00779
-<a name="l00781"></a><a class="code" href="a00156.html#2c0c42a2e1b5282b6739157df9ce2304">00781</a> <a class="code" href="a00156.html">concurrent_hash_map</a>& operator=( <span class="keyword">const</span> <a class="code" href="a00156.html">concurrent_hash_map</a>& table ) {
-<a name="l00782"></a>00782 <span class="keywordflow">if</span>( <span class="keyword">this</span>!=&table ) {
-<a name="l00783"></a>00783 clear();
-<a name="l00784"></a>00784 internal_copy(table);
-<a name="l00785"></a>00785 }
-<a name="l00786"></a>00786 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00787"></a>00787 }
-<a name="l00788"></a>00788
-<a name="l00789"></a>00789
-<a name="l00791"></a>00791
-<a name="l00793"></a>00793 <span class="keywordtype">void</span> rehash(size_type n = 0);
-<a name="l00794"></a>00794
-<a name="l00796"></a>00796 <span class="keywordtype">void</span> clear();
-<a name="l00797"></a>00797
-<a name="l00799"></a><a class="code" href="a00156.html#a1ac58997d8fbf242b266e3691573481">00799</a> ~<a class="code" href="a00156.html">concurrent_hash_map</a>() { clear(); }
-<a name="l00800"></a>00800
-<a name="l00801"></a>00801 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00802"></a>00802 <span class="comment">// Parallel algorithm support</span>
-<a name="l00803"></a>00803 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00804"></a>00804 range_type range( size_type grainsize=1 ) {
-<a name="l00805"></a>00805 <span class="keywordflow">return</span> range_type( *<span class="keyword">this</span>, grainsize );
-<a name="l00806"></a>00806 }
-<a name="l00807"></a>00807 const_range_type range( size_type grainsize=1 )<span class="keyword"> const </span>{
-<a name="l00808"></a>00808 <span class="keywordflow">return</span> const_range_type( *<span class="keyword">this</span>, grainsize );
-<a name="l00809"></a>00809 }
-<a name="l00810"></a>00810
-<a name="l00811"></a>00811 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00812"></a>00812 <span class="comment">// STL support - not thread-safe methods</span>
-<a name="l00813"></a>00813 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00814"></a>00814 iterator begin() {<span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>,0,my_embedded_segment,my_embedded_segment->node_list);}
-<a name="l00815"></a>00815 iterator end() {<span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>,0,0,0);}
-<a name="l00816"></a>00816 const_iterator begin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>,0,my_embedded_segment,my_embedded_segment->node_list);}
-<a name="l00817"></a>00817 const_iterator end()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>,0,0,0);}
-<a name="l00818"></a>00818 std::pair<iterator, iterator> equal_range( <span class="keyword">const</span> Key& key ) { <span class="keywordflow">return</span> internal_equal_range(key, end()); }
-<a name="l00819"></a>00819 std::pair<const_iterator, const_iterator> equal_range( <span class="keyword">const</span> Key& key )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> internal_equal_range(key, end()); }
-<a name="l00820"></a>00820
-<a name="l00822"></a><a class="code" href="a00156.html#17fd8c5fe8c6a86075f34aa4e8412ba3">00822</a> size_type size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_size; }
-<a name="l00823"></a>00823
-<a name="l00825"></a><a class="code" href="a00156.html#6cab7d029a3e73a653ef0faeac4d1586">00825</a> <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_size == 0; }
-<a name="l00826"></a>00826
-<a name="l00828"></a><a class="code" href="a00156.html#1e45d3cbd1e2ae06f365f1b48e0df0b5">00828</a> size_type max_size()<span class="keyword"> const </span>{<span class="keywordflow">return</span> (~size_type(0))/<span class="keyword">sizeof</span>(node);}
-<a name="l00829"></a>00829
-<a name="l00831"></a><a class="code" href="a00156.html#414d15033d36c63aa3a40666dc4d6f5e">00831</a> size_type bucket_count()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_mask+1; }
-<a name="l00832"></a>00832
-<a name="l00834"></a><a class="code" href="a00156.html#199208eed6f09e200cda364f906be0fe">00834</a> allocator_type get_allocator()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> this->my_allocator; }
-<a name="l00835"></a>00835
-<a name="l00837"></a>00837 <span class="keywordtype">void</span> swap(<a class="code" href="a00156.html">concurrent_hash_map</a> &table);
-<a name="l00838"></a>00838
-<a name="l00839"></a>00839 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00840"></a>00840 <span class="comment">// concurrent map operations</span>
-<a name="l00841"></a>00841 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00842"></a>00842
-<a name="l00844"></a><a class="code" href="a00156.html#74f5ef06a06c5e619f156a1c76c04969">00844</a> size_type count( <span class="keyword">const</span> Key &key )<span class="keyword"> const </span>{
-<a name="l00845"></a>00845 <span class="keywordflow">return</span> const_cast<concurrent_hash_map*>(<span class="keyword">this</span>)->lookup(<span class="comment">/*insert*/</span><span class="keyword">false</span>, key, NULL, NULL, <span class="comment">/*write=*/</span><span class="keyword">false</span> );
-<a name="l00846"></a>00846 }
-<a name="l00847"></a>00847
-<a name="l00849"></a>00849
-<a name="l00850"></a><a class="code" href="a00156.html#64338d7f2e35df586af4cb0145cd910f">00850</a> <span class="keywordtype">bool</span> find( <a class="code" href="a00159.html">const_accessor</a> &result, <span class="keyword">const</span> Key &key )<span class="keyword"> const </span>{
-<a name="l00851"></a>00851 result.<a class="code" href="a00159.html#d5ce4f88d8870290238a8ad621e6f270">release</a>();
-<a name="l00852"></a>00852 <span class="keywordflow">return</span> const_cast<concurrent_hash_map*>(<span class="keyword">this</span>)->lookup(<span class="comment">/*insert*/</span><span class="keyword">false</span>, key, NULL, &result, <span class="comment">/*write=*/</span><span class="keyword">false</span> );
-<a name="l00853"></a>00853 }
-<a name="l00854"></a>00854
-<a name="l00856"></a>00856
-<a name="l00857"></a><a class="code" href="a00156.html#bce7bdf46435115a95cca2aa73c5da83">00857</a> <span class="keywordtype">bool</span> find( <a class="code" href="a00157.html">accessor</a> &result, <span class="keyword">const</span> Key &key ) {
-<a name="l00858"></a>00858 result.<a class="code" href="a00159.html#d5ce4f88d8870290238a8ad621e6f270">release</a>();
-<a name="l00859"></a>00859 <span class="keywordflow">return</span> lookup(<span class="comment">/*insert*/</span><span class="keyword">false</span>, key, NULL, &result, <span class="comment">/*write=*/</span><span class="keyword">true</span> );
-<a name="l00860"></a>00860 }
-<a name="l00861"></a>00861
-<a name="l00863"></a>00863
-<a name="l00864"></a><a class="code" href="a00156.html#58c38b27273de6c670568633c0931854">00864</a> <span class="keywordtype">bool</span> insert( <a class="code" href="a00159.html">const_accessor</a> &result, <span class="keyword">const</span> Key &key ) {
-<a name="l00865"></a>00865 result.<a class="code" href="a00159.html#d5ce4f88d8870290238a8ad621e6f270">release</a>();
-<a name="l00866"></a>00866 <span class="keywordflow">return</span> lookup(<span class="comment">/*insert*/</span><span class="keyword">true</span>, key, NULL, &result, <span class="comment">/*write=*/</span><span class="keyword">false</span> );
-<a name="l00867"></a>00867 }
-<a name="l00868"></a>00868
-<a name="l00870"></a>00870
-<a name="l00871"></a><a class="code" href="a00156.html#ccfecaa3e71d92be61fb3d811dd264eb">00871</a> <span class="keywordtype">bool</span> insert( <a class="code" href="a00157.html">accessor</a> &result, <span class="keyword">const</span> Key &key ) {
-<a name="l00872"></a>00872 result.<a class="code" href="a00159.html#d5ce4f88d8870290238a8ad621e6f270">release</a>();
-<a name="l00873"></a>00873 <span class="keywordflow">return</span> lookup(<span class="comment">/*insert*/</span><span class="keyword">true</span>, key, NULL, &result, <span class="comment">/*write=*/</span><span class="keyword">true</span> );
-<a name="l00874"></a>00874 }
-<a name="l00875"></a>00875
-<a name="l00877"></a>00877
-<a name="l00878"></a><a class="code" href="a00156.html#d4a2816129e38c53128c6d0c7b6b7370">00878</a> <span class="keywordtype">bool</span> insert( <a class="code" href="a00159.html">const_accessor</a> &result, <span class="keyword">const</span> value_type &value ) {
-<a name="l00879"></a>00879 result.<a class="code" href="a00159.html#d5ce4f88d8870290238a8ad621e6f270">release</a>();
-<a name="l00880"></a>00880 <span class="keywordflow">return</span> lookup(<span class="comment">/*insert*/</span><span class="keyword">true</span>, value.first, &value.second, &result, <span class="comment">/*write=*/</span><span class="keyword">false</span> );
-<a name="l00881"></a>00881 }
-<a name="l00882"></a>00882
-<a name="l00884"></a>00884
-<a name="l00885"></a><a class="code" href="a00156.html#a657e61cd2b13164764ca2708875784a">00885</a> <span class="keywordtype">bool</span> insert( <a class="code" href="a00157.html">accessor</a> &result, <span class="keyword">const</span> value_type &value ) {
-<a name="l00886"></a>00886 result.<a class="code" href="a00159.html#d5ce4f88d8870290238a8ad621e6f270">release</a>();
-<a name="l00887"></a>00887 <span class="keywordflow">return</span> lookup(<span class="comment">/*insert*/</span><span class="keyword">true</span>, value.first, &value.second, &result, <span class="comment">/*write=*/</span><span class="keyword">true</span> );
-<a name="l00888"></a>00888 }
-<a name="l00889"></a>00889
-<a name="l00891"></a>00891
-<a name="l00892"></a><a class="code" href="a00156.html#52bffd1066b3d7b793945bc6fa1a71a1">00892</a> <span class="keywordtype">bool</span> insert( <span class="keyword">const</span> value_type &value ) {
-<a name="l00893"></a>00893 <span class="keywordflow">return</span> lookup(<span class="comment">/*insert*/</span><span class="keyword">true</span>, value.first, &value.second, NULL, <span class="comment">/*write=*/</span><span class="keyword">false</span> );
-<a name="l00894"></a>00894 }
-<a name="l00895"></a>00895
-<a name="l00897"></a>00897 <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l00898"></a><a class="code" href="a00156.html#cfe172677e5987004ef4a03e22fa338a">00898</a> <span class="keywordtype">void</span> insert(I first, I last) {
-<a name="l00899"></a>00899 <span class="keywordflow">for</span>(; first != last; ++first)
-<a name="l00900"></a>00900 insert( *first );
-<a name="l00901"></a>00901 }
-<a name="l00902"></a>00902
-<a name="l00904"></a>00904
-<a name="l00905"></a>00905 <span class="keywordtype">bool</span> erase( <span class="keyword">const</span> Key& key );
-<a name="l00906"></a>00906
-<a name="l00908"></a>00908
-<a name="l00909"></a><a class="code" href="a00156.html#da7e4a50f6bb06191817425ec85fe760">00909</a> <span class="keywordtype">bool</span> erase( <a class="code" href="a00159.html">const_accessor</a>& item_accessor ) {
-<a name="l00910"></a>00910 <span class="keywordflow">return</span> exclude( item_accessor, <span class="comment">/*readonly=*/</span> <span class="keyword">true</span> );
-<a name="l00911"></a>00911 }
-<a name="l00912"></a>00912
-<a name="l00914"></a>00914
-<a name="l00915"></a><a class="code" href="a00156.html#0f500842d0cf791f8fa61662edb1b311">00915</a> <span class="keywordtype">bool</span> erase( <a class="code" href="a00157.html">accessor</a>& item_accessor ) {
-<a name="l00916"></a>00916 <span class="keywordflow">return</span> exclude( item_accessor, <span class="comment">/*readonly=*/</span> <span class="keyword">false</span> );
-<a name="l00917"></a>00917 }
-<a name="l00918"></a>00918
-<a name="l00919"></a>00919 <span class="keyword">protected</span>:
-<a name="l00921"></a>00921 <span class="keywordtype">bool</span> lookup( <span class="keywordtype">bool</span> op_insert, <span class="keyword">const</span> Key &key, <span class="keyword">const</span> T *t, const_accessor *result, <span class="keywordtype">bool</span> write );
-<a name="l00922"></a>00922
-<a name="l00924"></a>00924 <span class="keywordtype">bool</span> exclude( const_accessor &item_accessor, <span class="keywordtype">bool</span> readonly );
-<a name="l00925"></a>00925
-<a name="l00927"></a>00927 <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l00928"></a>00928 std::pair<I, I> internal_equal_range( <span class="keyword">const</span> Key& key, I end ) <span class="keyword">const</span>;
-<a name="l00929"></a>00929
-<a name="l00931"></a>00931 <span class="keywordtype">void</span> internal_copy( <span class="keyword">const</span> <a class="code" href="a00156.html">concurrent_hash_map</a>& source );
-<a name="l00932"></a>00932
-<a name="l00933"></a>00933 <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l00934"></a>00934 <span class="keywordtype">void</span> internal_copy(I first, I last);
-<a name="l00935"></a>00935
-<a name="l00937"></a>00937
-<a name="l00939"></a><a class="code" href="a00156.html#2f76ed101a0ccc8875b846c2f747897e">00939</a> const_pointer internal_fast_find( <span class="keyword">const</span> Key& key )<span class="keyword"> const </span>{
-<a name="l00940"></a>00940 hashcode_t h = my_hash_compare.hash( key );
-<a name="l00941"></a>00941 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00942"></a>00942 <span class="preprocessor"></span> hashcode_t m = (hashcode_t) itt_load_pointer_with_acquire_v3( &my_mask );
-<a name="l00943"></a>00943 <span class="preprocessor">#else</span>
-<a name="l00944"></a>00944 <span class="preprocessor"></span> hashcode_t m = my_mask;
-<a name="l00945"></a>00945 <span class="preprocessor">#endif</span>
-<a name="l00946"></a>00946 <span class="preprocessor"></span> node *n;
-<a name="l00947"></a>00947 restart:
-<a name="l00948"></a>00948 __TBB_ASSERT((m&(m+1))==0, NULL);
-<a name="l00949"></a>00949 bucket *b = get_bucket( h & m );
-<a name="l00950"></a>00950 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00951"></a>00951 <span class="preprocessor"></span> <span class="comment">// TODO: actually, notification is unnecessary here, just hiding double-check</span>
-<a name="l00952"></a>00952 <span class="keywordflow">if</span>( itt_load_pointer_with_acquire_v3(&b->node_list) == internal::rehash_req )
-<a name="l00953"></a>00953 <span class="preprocessor">#else</span>
-<a name="l00954"></a>00954 <span class="preprocessor"></span> <span class="keywordflow">if</span>( __TBB_load_with_acquire(b->node_list) == internal::rehash_req )
-<a name="l00955"></a>00955 <span class="preprocessor">#endif</span>
-<a name="l00956"></a>00956 <span class="preprocessor"></span> {
-<a name="l00957"></a>00957 bucket::scoped_t lock;
-<a name="l00958"></a>00958 <span class="keywordflow">if</span>( lock.try_acquire( b->mutex, <span class="comment">/*write=*/</span><span class="keyword">true</span> ) ) {
-<a name="l00959"></a>00959 <span class="keywordflow">if</span>( b->node_list == internal::rehash_req)
-<a name="l00960"></a>00960 const_cast<concurrent_hash_map*>(<span class="keyword">this</span>)->rehash_bucket( b, h & m ); <span class="comment">//recursive rehashing</span>
-<a name="l00961"></a>00961 }
-<a name="l00962"></a>00962 <span class="keywordflow">else</span> lock.acquire( b->mutex, <span class="comment">/*write=*/</span><span class="keyword">false</span> );
-<a name="l00963"></a>00963 __TBB_ASSERT(b->node_list!=internal::rehash_req,NULL);
-<a name="l00964"></a>00964 }
-<a name="l00965"></a>00965 n = search_bucket( key, b );
-<a name="l00966"></a>00966 <span class="keywordflow">if</span>( n )
-<a name="l00967"></a>00967 <span class="keywordflow">return</span> &n->item;
-<a name="l00968"></a>00968 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( check_mask_race( h, m ) )
-<a name="l00969"></a>00969 <span class="keywordflow">goto</span> restart;
-<a name="l00970"></a>00970 <span class="keywordflow">return</span> 0;
-<a name="l00971"></a>00971 }
-<a name="l00972"></a>00972 };
-<a name="l00973"></a>00973
-<a name="l00974"></a>00974 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
-<a name="l00975"></a>00975 <span class="preprocessor"></span> <span class="comment">// Suppress "conditional expression is constant" warning.</span>
-<a name="l00976"></a>00976 <span class="preprocessor"> #pragma warning( push )</span>
-<a name="l00977"></a>00977 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning( disable: 4127 )</span>
-<a name="l00978"></a>00978 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00979"></a>00979 <span class="preprocessor"></span>
-<a name="l00980"></a>00980 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
-<a name="l00981"></a><a class="code" href="a00156.html#1f22480a290ddc6c145888d8f985531a">00981</a> <span class="keywordtype">bool</span> <a class="code" href="a00156.html">concurrent_hash_map<Key,T,HashCompare,A>::lookup</a>( <span class="keywordtype">bool</span> op_insert, <span class="keyword">const</span> Key &key, <span class="keyword">const</span> T *t, <a class="code" href="a00159.html">const_accessor</a> *result, <span class="keywordtype">bool</span> write ) {
-<a name="l00982"></a>00982 __TBB_ASSERT( !result || !result-><a class="code" href="a00159.html#74e5fd476c306e90361f3377f0fec6d8">my_node</a>, NULL );
-<a name="l00983"></a>00983 segment_index_t grow_segment;
-<a name="l00984"></a>00984 <span class="keywordtype">bool</span> return_value;
-<a name="l00985"></a>00985 node *n, *tmp_n = 0;
-<a name="l00986"></a>00986 hashcode_t <span class="keyword">const</span> h = my_hash_compare.hash( key );
-<a name="l00987"></a>00987 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00988"></a>00988 <span class="preprocessor"></span> hashcode_t m = (hashcode_t) itt_load_pointer_with_acquire_v3( &my_mask );
-<a name="l00989"></a>00989 <span class="preprocessor">#else</span>
-<a name="l00990"></a>00990 <span class="preprocessor"></span> hashcode_t m = my_mask;
-<a name="l00991"></a>00991 <span class="preprocessor">#endif</span>
-<a name="l00992"></a>00992 <span class="preprocessor"></span> restart:
-<a name="l00993"></a>00993 {<span class="comment">//lock scope</span>
-<a name="l00994"></a>00994 __TBB_ASSERT((m&(m+1))==0, NULL);
-<a name="l00995"></a>00995 return_value = <span class="keyword">false</span>;
-<a name="l00996"></a>00996 <span class="comment">// get bucket</span>
-<a name="l00997"></a>00997 <a class="code" href="a00158.html">bucket_accessor</a> b( <span class="keyword">this</span>, h & m );
-<a name="l00998"></a>00998
-<a name="l00999"></a>00999 <span class="comment">// find a node</span>
-<a name="l01000"></a>01000 n = search_bucket( key, b() );
-<a name="l01001"></a>01001 <span class="keywordflow">if</span>( op_insert ) {
-<a name="l01002"></a>01002 <span class="comment">// [opt] insert a key</span>
-<a name="l01003"></a>01003 <span class="keywordflow">if</span>( !n ) {
-<a name="l01004"></a>01004 <span class="keywordflow">if</span>( !tmp_n ) {
-<a name="l01005"></a>01005 <span class="keywordflow">if</span>(t) tmp_n = <span class="keyword">new</span>( my_allocator ) node(key, *t);
-<a name="l01006"></a>01006 <span class="keywordflow">else</span> tmp_n = <span class="keyword">new</span>( my_allocator ) node(key);
-<a name="l01007"></a>01007 }
-<a name="l01008"></a>01008 <span class="keywordflow">if</span>( !b.<a class="code" href="a00158.html#fc194e3a186dc935a5fb513cc9f8e898">is_writer</a>() && !b.<a class="code" href="a00158.html#8f7f0dc61f528de29d06e6054b4a9835">upgrade_to_writer</a>() ) { <span class="comment">// TODO: improved insertion</span>
-<a name="l01009"></a>01009 <span class="comment">// Rerun search_list, in case another thread inserted the item during the upgrade.</span>
-<a name="l01010"></a>01010 n = search_bucket( key, b() );
-<a name="l01011"></a>01011 <span class="keywordflow">if</span>( is_valid(n) ) { <span class="comment">// unfortunately, it did</span>
-<a name="l01012"></a>01012 b.downgrade_to_reader();
-<a name="l01013"></a>01013 <span class="keywordflow">goto</span> exists;
-<a name="l01014"></a>01014 }
-<a name="l01015"></a>01015 }
-<a name="l01016"></a>01016 <span class="keywordflow">if</span>( check_mask_race(h, m) )
-<a name="l01017"></a>01017 <span class="keywordflow">goto</span> restart; <span class="comment">// b.release() is done in ~b().</span>
-<a name="l01018"></a>01018 <span class="comment">// insert and set flag to grow the container</span>
-<a name="l01019"></a>01019 grow_segment = insert_new_node( b(), n = tmp_n, m );
-<a name="l01020"></a>01020 tmp_n = 0;
-<a name="l01021"></a>01021 return_value = <span class="keyword">true</span>;
-<a name="l01022"></a>01022 } <span class="keywordflow">else</span> {
-<a name="l01023"></a>01023 exists: grow_segment = 0;
-<a name="l01024"></a>01024 }
-<a name="l01025"></a>01025 } <span class="keywordflow">else</span> { <span class="comment">// find or count</span>
-<a name="l01026"></a>01026 <span class="keywordflow">if</span>( !n ) {
-<a name="l01027"></a>01027 <span class="keywordflow">if</span>( check_mask_race( h, m ) )
-<a name="l01028"></a>01028 <span class="keywordflow">goto</span> restart; <span class="comment">// b.release() is done in ~b(). TODO: replace by continue</span>
-<a name="l01029"></a>01029 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l01030"></a>01030 }
-<a name="l01031"></a>01031 return_value = <span class="keyword">true</span>;
-<a name="l01032"></a>01032 grow_segment = 0;
-<a name="l01033"></a>01033 }
-<a name="l01034"></a>01034 <span class="keywordflow">if</span>( !result ) <span class="keywordflow">goto</span> check_growth;
-<a name="l01035"></a>01035 <span class="comment">// TODO: the following seems as generic/regular operation</span>
-<a name="l01036"></a>01036 <span class="comment">// acquire the item</span>
-<a name="l01037"></a>01037 <span class="keywordflow">if</span>( !result-><a class="code" href="a00159.html#b57d7e72014cd2ae5a915606410615ce">my_lock</a>.try_acquire( n->mutex, write ) ) {
-<a name="l01038"></a>01038 <span class="comment">// we are unlucky, prepare for longer wait</span>
-<a name="l01039"></a>01039 <a class="code" href="a00145.html">tbb::internal::atomic_backoff</a> trials;
-<a name="l01040"></a>01040 <span class="keywordflow">do</span> {
-<a name="l01041"></a>01041 <span class="keywordflow">if</span>( !trials.bounded_pause() ) {
-<a name="l01042"></a>01042 <span class="comment">// the wait takes really long, restart the operation</span>
-<a name="l01043"></a>01043 b.release();
-<a name="l01044"></a>01044 __TBB_ASSERT( !op_insert || !return_value, <span class="stringliteral">"Can't acquire new item in locked bucket?"</span> );
-<a name="l01045"></a>01045 __TBB_Yield();
-<a name="l01046"></a>01046 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l01047"></a>01047 <span class="preprocessor"></span> m = (hashcode_t) itt_load_pointer_with_acquire_v3( &my_mask );
-<a name="l01048"></a>01048 <span class="preprocessor">#else</span>
-<a name="l01049"></a>01049 <span class="preprocessor"></span> m = my_mask;
-<a name="l01050"></a>01050 <span class="preprocessor">#endif</span>
-<a name="l01051"></a>01051 <span class="preprocessor"></span> <span class="keywordflow">goto</span> restart;
-<a name="l01052"></a>01052 }
-<a name="l01053"></a>01053 } <span class="keywordflow">while</span>( !result-><a class="code" href="a00159.html#b57d7e72014cd2ae5a915606410615ce">my_lock</a>.try_acquire( n->mutex, write ) );
-<a name="l01054"></a>01054 }
-<a name="l01055"></a>01055 }<span class="comment">//lock scope</span>
-<a name="l01056"></a>01056 result-><a class="code" href="a00159.html#74e5fd476c306e90361f3377f0fec6d8">my_node</a> = n;
-<a name="l01057"></a>01057 result-><a class="code" href="a00159.html#88e677d4e26a67d65d81af524ddd483a">my_hash</a> = h;
-<a name="l01058"></a>01058 check_growth:
-<a name="l01059"></a>01059 <span class="comment">// [opt] grow the container</span>
-<a name="l01060"></a>01060 <span class="keywordflow">if</span>( grow_segment )
-<a name="l01061"></a>01061 enable_segment( grow_segment );
-<a name="l01062"></a>01062 <span class="keywordflow">if</span>( tmp_n ) <span class="comment">// if op_insert only</span>
-<a name="l01063"></a>01063 delete_node( tmp_n );
-<a name="l01064"></a>01064 <span class="keywordflow">return</span> return_value;
-<a name="l01065"></a>01065 }
-<a name="l01066"></a>01066
-<a name="l01067"></a>01067 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
-<a name="l01068"></a>01068 <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l01069"></a><a class="code" href="a00156.html#976c57edfb7f22b9f91a2e11f141eb4a">01069</a> std::pair<I, I> <a class="code" href="a00156.html">concurrent_hash_map<Key,T,HashCompare,A>::internal_equal_range</a>( <span class="keyword">const</span> Key& key, I end_ )<span class="keyword"> const </span>{
-<a name="l01070"></a>01070 hashcode_t h = my_hash_compare.hash( key );
-<a name="l01071"></a>01071 hashcode_t m = my_mask;
-<a name="l01072"></a>01072 __TBB_ASSERT((m&(m+1))==0, NULL);
-<a name="l01073"></a>01073 h &= m;
-<a name="l01074"></a>01074 bucket *b = get_bucket( h );
-<a name="l01075"></a>01075 <span class="keywordflow">while</span>( b->node_list == internal::rehash_req ) {
-<a name="l01076"></a>01076 m = ( 1u<<__TBB_Log2( h ) ) - 1; <span class="comment">// get parent mask from the topmost bit</span>
-<a name="l01077"></a>01077 b = get_bucket( h &= m );
-<a name="l01078"></a>01078 }
-<a name="l01079"></a>01079 node *n = search_bucket( key, b );
-<a name="l01080"></a>01080 <span class="keywordflow">if</span>( !n )
-<a name="l01081"></a>01081 <span class="keywordflow">return</span> std::make_pair(end_, end_);
-<a name="l01082"></a>01082 iterator lower(*<span class="keyword">this</span>, h, b, n), upper(lower);
-<a name="l01083"></a>01083 <span class="keywordflow">return</span> std::make_pair(lower, ++upper);
-<a name="l01084"></a>01084 }
-<a name="l01085"></a>01085
-<a name="l01086"></a>01086 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
-<a name="l01087"></a><a class="code" href="a00156.html#faad2108bd2be75e52293486af59f11e">01087</a> <span class="keywordtype">bool</span> <a class="code" href="a00156.html">concurrent_hash_map<Key,T,HashCompare,A>::exclude</a>( <a class="code" href="a00159.html">const_accessor</a> &item_accessor, <span class="keywordtype">bool</span> readonly ) {
-<a name="l01088"></a>01088 __TBB_ASSERT( item_accessor.<a class="code" href="a00159.html#74e5fd476c306e90361f3377f0fec6d8">my_node</a>, NULL );
-<a name="l01089"></a>01089 node_base *<span class="keyword">const</span> n = item_accessor.<a class="code" href="a00159.html#74e5fd476c306e90361f3377f0fec6d8">my_node</a>;
-<a name="l01090"></a>01090 item_accessor.<a class="code" href="a00159.html#74e5fd476c306e90361f3377f0fec6d8">my_node</a> = NULL; <span class="comment">// we ought release accessor anyway</span>
-<a name="l01091"></a>01091 hashcode_t <span class="keyword">const</span> h = item_accessor.<a class="code" href="a00159.html#88e677d4e26a67d65d81af524ddd483a">my_hash</a>;
-<a name="l01092"></a>01092 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l01093"></a>01093 <span class="preprocessor"></span> hashcode_t m = (hashcode_t) itt_load_pointer_with_acquire_v3( &my_mask );
-<a name="l01094"></a>01094 <span class="preprocessor">#else</span>
-<a name="l01095"></a>01095 <span class="preprocessor"></span> hashcode_t m = my_mask;
-<a name="l01096"></a>01096 <span class="preprocessor">#endif</span>
-<a name="l01097"></a>01097 <span class="preprocessor"></span> <span class="keywordflow">do</span> {
-<a name="l01098"></a>01098 <span class="comment">// get bucket</span>
-<a name="l01099"></a>01099 <a class="code" href="a00158.html">bucket_accessor</a> b( <span class="keyword">this</span>, h & m, <span class="comment">/*writer=*/</span><span class="keyword">true</span> );
-<a name="l01100"></a>01100 node_base **p = &b()->node_list;
-<a name="l01101"></a>01101 <span class="keywordflow">while</span>( *p && *p != n )
-<a name="l01102"></a>01102 p = &(*p)->next;
-<a name="l01103"></a>01103 <span class="keywordflow">if</span>( !*p ) { <span class="comment">// someone else was the first</span>
-<a name="l01104"></a>01104 <span class="keywordflow">if</span>( check_mask_race( h, m ) )
-<a name="l01105"></a>01105 <span class="keywordflow">continue</span>;
-<a name="l01106"></a>01106 item_accessor.<a class="code" href="a00159.html#b57d7e72014cd2ae5a915606410615ce">my_lock</a>.release();
-<a name="l01107"></a>01107 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l01108"></a>01108 }
-<a name="l01109"></a>01109 __TBB_ASSERT( *p == n, NULL );
-<a name="l01110"></a>01110 *p = n->next; <span class="comment">// remove from container</span>
-<a name="l01111"></a>01111 my_size--;
-<a name="l01112"></a>01112 <span class="keywordflow">break</span>;
-<a name="l01113"></a>01113 } <span class="keywordflow">while</span>(<span class="keyword">true</span>);
-<a name="l01114"></a>01114 <span class="keywordflow">if</span>( readonly ) <span class="comment">// need to get exclusive lock</span>
-<a name="l01115"></a>01115 item_accessor.<a class="code" href="a00159.html#b57d7e72014cd2ae5a915606410615ce">my_lock</a>.upgrade_to_writer(); <span class="comment">// return value means nothing here</span>
-<a name="l01116"></a>01116 item_accessor.<a class="code" href="a00159.html#b57d7e72014cd2ae5a915606410615ce">my_lock</a>.release();
-<a name="l01117"></a>01117 delete_node( n ); <span class="comment">// Only one thread can delete it due to write lock on the chain_mutex</span>
-<a name="l01118"></a>01118 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01119"></a>01119 }
-<a name="l01120"></a>01120
-<a name="l01121"></a>01121 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
-<a name="l01122"></a><a class="code" href="a00156.html#034c3b3ee419edee78e0f2f2b1f0d7ca">01122</a> <span class="keywordtype">bool</span> <a class="code" href="a00156.html">concurrent_hash_map<Key,T,HashCompare,A>::erase</a>( <span class="keyword">const</span> Key &key ) {
-<a name="l01123"></a>01123 node_base *n;
-<a name="l01124"></a>01124 hashcode_t <span class="keyword">const</span> h = my_hash_compare.hash( key );
-<a name="l01125"></a>01125 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l01126"></a>01126 <span class="preprocessor"></span> hashcode_t m = (hashcode_t) itt_load_pointer_with_acquire_v3( &my_mask );
-<a name="l01127"></a>01127 <span class="preprocessor">#else</span>
-<a name="l01128"></a>01128 <span class="preprocessor"></span> hashcode_t m = my_mask;
-<a name="l01129"></a>01129 <span class="preprocessor">#endif</span>
-<a name="l01130"></a>01130 <span class="preprocessor"></span>restart:
-<a name="l01131"></a>01131 {<span class="comment">//lock scope</span>
-<a name="l01132"></a>01132 <span class="comment">// get bucket</span>
-<a name="l01133"></a>01133 <a class="code" href="a00158.html">bucket_accessor</a> b( <span class="keyword">this</span>, h & m );
-<a name="l01134"></a>01134 search:
-<a name="l01135"></a>01135 node_base **p = &b()->node_list;
-<a name="l01136"></a>01136 n = *p;
-<a name="l01137"></a>01137 <span class="keywordflow">while</span>( is_valid(n) && !my_hash_compare.equal(key, static_cast<node*>(n)->item.first ) ) {
-<a name="l01138"></a>01138 p = &n->next;
-<a name="l01139"></a>01139 n = *p;
-<a name="l01140"></a>01140 }
-<a name="l01141"></a>01141 <span class="keywordflow">if</span>( !n ) { <span class="comment">// not found, but mask could be changed</span>
-<a name="l01142"></a>01142 <span class="keywordflow">if</span>( check_mask_race( h, m ) )
-<a name="l01143"></a>01143 <span class="keywordflow">goto</span> restart;
-<a name="l01144"></a>01144 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l01145"></a>01145 }
-<a name="l01146"></a>01146 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( !b.<a class="code" href="a00158.html#fc194e3a186dc935a5fb513cc9f8e898">is_writer</a>() && !b.<a class="code" href="a00158.html#8f7f0dc61f528de29d06e6054b4a9835">upgrade_to_writer</a>() ) {
-<a name="l01147"></a>01147 <span class="keywordflow">if</span>( check_mask_race( h, m ) ) <span class="comment">// contended upgrade, check mask</span>
-<a name="l01148"></a>01148 <span class="keywordflow">goto</span> restart;
-<a name="l01149"></a>01149 <span class="keywordflow">goto</span> search;
-<a name="l01150"></a>01150 }
-<a name="l01151"></a>01151 *p = n->next;
-<a name="l01152"></a>01152 my_size--;
-<a name="l01153"></a>01153 }
-<a name="l01154"></a>01154 {
-<a name="l01155"></a>01155 <span class="keyword">typename</span> node::scoped_t item_locker( n->mutex, <span class="comment">/*write=*/</span><span class="keyword">true</span> );
-<a name="l01156"></a>01156 }
-<a name="l01157"></a>01157 <span class="comment">// note: there should be no threads pretending to acquire this mutex again, do not try to upgrade const_accessor!</span>
-<a name="l01158"></a>01158 delete_node( n ); <span class="comment">// Only one thread can delete it due to write lock on the bucket</span>
-<a name="l01159"></a>01159 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01160"></a>01160 }
-<a name="l01161"></a>01161
-<a name="l01162"></a>01162 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
-<a name="l01163"></a>01163 <span class="keywordtype">void</span> <a class="code" href="a00156.html">concurrent_hash_map<Key,T,HashCompare,A>::swap</a>(<a class="code" href="a00156.html">concurrent_hash_map<Key,T,HashCompare,A></a> &table) {
-<a name="l01164"></a>01164 std::swap(this->my_allocator, table.<a class="code" href="a00156.html#252e91d8029f6308db7179557e3b1436">my_allocator</a>);
-<a name="l01165"></a>01165 std::swap(this->my_hash_compare, table.<a class="code" href="a00156.html#f738f241c8500ce3dbf0f9028ca8b602">my_hash_compare</a>);
-<a name="l01166"></a>01166 internal_swap(table);
-<a name="l01167"></a>01167 }
-<a name="l01168"></a>01168
-<a name="l01169"></a>01169 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
-<a name="l01170"></a><a class="code" href="a00156.html#13f3f2e8de7564be03882c31559493c9">01170</a> <span class="keywordtype">void</span> <a class="code" href="a00156.html">concurrent_hash_map<Key,T,HashCompare,A>::rehash</a>(size_type sz) {
-<a name="l01171"></a>01171 reserve( sz ); <span class="comment">// TODO: add reduction of number of buckets as well</span>
-<a name="l01172"></a>01172 hashcode_t mask = my_mask;
-<a name="l01173"></a>01173 hashcode_t b = (mask+1)>>1; <span class="comment">// size or first index of the last segment</span>
-<a name="l01174"></a>01174 __TBB_ASSERT((b&(b-1))==0, NULL);
-<a name="l01175"></a>01175 bucket *bp = get_bucket( b ); <span class="comment">// only the last segment should be scanned for rehashing</span>
-<a name="l01176"></a>01176 <span class="keywordflow">for</span>(; b <= mask; b++, bp++ ) {
-<a name="l01177"></a>01177 node_base *n = bp->node_list;
-<a name="l01178"></a>01178 __TBB_ASSERT( is_valid(n) || n == internal::empty_rehashed || n == internal::rehash_req, <span class="stringliteral">"Broken internal structure"</span> );
-<a name="l01179"></a>01179 __TBB_ASSERT( *reinterpret_cast<intptr_t*>(&bp->mutex) == 0, <span class="stringliteral">"concurrent or unexpectedly terminated operation during rehash() execution"</span> );
-<a name="l01180"></a>01180 <span class="keywordflow">if</span>( n == internal::rehash_req ) { <span class="comment">// rehash bucket, conditional because rehashing of a previous bucket may affect this one</span>
-<a name="l01181"></a>01181 hashcode_t h = b; bucket *b_old = bp;
-<a name="l01182"></a>01182 <span class="keywordflow">do</span> {
-<a name="l01183"></a>01183 __TBB_ASSERT( h > 1, <span class="stringliteral">"The lowermost buckets can't be rehashed"</span> );
-<a name="l01184"></a>01184 hashcode_t m = ( 1u<<__TBB_Log2( h ) ) - 1; <span class="comment">// get parent mask from the topmost bit</span>
-<a name="l01185"></a>01185 b_old = get_bucket( h &= m );
-<a name="l01186"></a>01186 } <span class="keywordflow">while</span>( b_old->node_list == internal::rehash_req );
-<a name="l01187"></a>01187 <span class="comment">// now h - is index of the root rehashed bucket b_old</span>
-<a name="l01188"></a>01188 mark_rehashed_levels( h ); <span class="comment">// mark all non-rehashed children recursively across all segments</span>
-<a name="l01189"></a>01189 <span class="keywordflow">for</span>( node_base **p = &b_old->node_list, *q = *p; is_valid(q); q = *p ) {
-<a name="l01190"></a>01190 hashcode_t c = my_hash_compare.hash( static_cast<node*>(q)->item.first );
-<a name="l01191"></a>01191 <span class="keywordflow">if</span>( (c & mask) != h ) { <span class="comment">// should be rehashed</span>
-<a name="l01192"></a>01192 *p = q->next; <span class="comment">// exclude from b_old</span>
-<a name="l01193"></a>01193 bucket *b_new = get_bucket( c & mask );
-<a name="l01194"></a>01194 __TBB_ASSERT( b_new->node_list != internal::rehash_req, <span class="stringliteral">"hash() function changed for key in table or internal error"</span> );
-<a name="l01195"></a>01195 add_to_bucket( b_new, q );
-<a name="l01196"></a>01196 } <span class="keywordflow">else</span> p = &q->next; <span class="comment">// iterate to next item</span>
-<a name="l01197"></a>01197 }
-<a name="l01198"></a>01198 }
-<a name="l01199"></a>01199 }
-<a name="l01200"></a>01200 <span class="preprocessor">#if TBB_USE_PERFORMANCE_WARNINGS</span>
-<a name="l01201"></a>01201 <span class="preprocessor"></span> <span class="keywordtype">int</span> current_size = int(my_size), buckets = int(mask)+1, empty_buckets = 0, overpopulated_buckets = 0; <span class="comment">// usage statistics</span>
-<a name="l01202"></a>01202 <span class="keyword">static</span> <span class="keywordtype">bool</span> reported = <span class="keyword">false</span>;
-<a name="l01203"></a>01203 <span class="preprocessor">#endif</span>
-<a name="l01204"></a>01204 <span class="preprocessor"></span><span class="preprocessor">#if TBB_USE_ASSERT || TBB_USE_PERFORMANCE_WARNINGS</span>
-<a name="l01205"></a>01205 <span class="preprocessor"></span> <span class="keywordflow">for</span>( b = 0; b <= mask; b++ ) {<span class="comment">// only last segment should be scanned for rehashing</span>
-<a name="l01206"></a>01206 <span class="keywordflow">if</span>( b & (b-2) ) ++bp; <span class="comment">// not the beginning of a segment</span>
-<a name="l01207"></a>01207 <span class="keywordflow">else</span> bp = get_bucket( b );
-<a name="l01208"></a>01208 node_base *n = bp->node_list;
-<a name="l01209"></a>01209 __TBB_ASSERT( *reinterpret_cast<intptr_t*>(&bp->mutex) == 0, <span class="stringliteral">"concurrent or unexpectedly terminated operation during rehash() execution"</span> );
-<a name="l01210"></a>01210 __TBB_ASSERT( is_valid(n) || n == internal::empty_rehashed, <span class="stringliteral">"Broken internal structure"</span> );
-<a name="l01211"></a>01211 <span class="preprocessor">#if TBB_USE_PERFORMANCE_WARNINGS</span>
-<a name="l01212"></a>01212 <span class="preprocessor"></span> <span class="keywordflow">if</span>( n == internal::empty_rehashed ) empty_buckets++;
-<a name="l01213"></a>01213 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( n->next ) overpopulated_buckets++;
-<a name="l01214"></a>01214 <span class="preprocessor">#endif</span>
-<a name="l01215"></a>01215 <span class="preprocessor"></span><span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l01216"></a>01216 <span class="preprocessor"></span> <span class="keywordflow">for</span>( ; is_valid(n); n = n->next ) {
-<a name="l01217"></a>01217 hashcode_t h = my_hash_compare.hash( static_cast<node*>(n)->item.first ) & mask;
-<a name="l01218"></a>01218 __TBB_ASSERT( h == b, <span class="stringliteral">"hash() function changed for key in table or internal error"</span> );
-<a name="l01219"></a>01219 }
-<a name="l01220"></a>01220 <span class="preprocessor">#endif</span>
-<a name="l01221"></a>01221 <span class="preprocessor"></span> }
-<a name="l01222"></a>01222 <span class="preprocessor">#endif // TBB_USE_ASSERT || TBB_USE_PERFORMANCE_WARNINGS</span>
-<a name="l01223"></a>01223 <span class="preprocessor"></span><span class="preprocessor">#if TBB_USE_PERFORMANCE_WARNINGS</span>
-<a name="l01224"></a>01224 <span class="preprocessor"></span> <span class="keywordflow">if</span>( buckets > current_size) empty_buckets -= buckets - current_size;
-<a name="l01225"></a>01225 <span class="keywordflow">else</span> overpopulated_buckets -= current_size - buckets; <span class="comment">// TODO: load_factor?</span>
-<a name="l01226"></a>01226 <span class="keywordflow">if</span>( !reported && buckets >= 512 && ( 2*empty_buckets > current_size || 2*overpopulated_buckets > current_size ) ) {
-<a name="l01227"></a>01227 tbb::internal::runtime_warning(
-<a name="l01228"></a>01228 <span class="stringliteral">"Performance is not optimal because the hash function produces bad randomness in lower bits in %s.\nSize: %d Empties: %d Overlaps: %d"</span>,
-<a name="l01229"></a>01229 <span class="keyword">typeid</span>(*this).name(), current_size, empty_buckets, overpopulated_buckets );
-<a name="l01230"></a>01230 reported = <span class="keyword">true</span>;
-<a name="l01231"></a>01231 }
-<a name="l01232"></a>01232 <span class="preprocessor">#endif</span>
-<a name="l01233"></a>01233 <span class="preprocessor"></span>}
-<a name="l01234"></a>01234
-<a name="l01235"></a>01235 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
-<a name="l01236"></a><a class="code" href="a00156.html#a9f89be8fe28835749529d91081a2511">01236</a> <span class="keywordtype">void</span> <a class="code" href="a00156.html">concurrent_hash_map<Key,T,HashCompare,A>::clear</a>() {
-<a name="l01237"></a>01237 hashcode_t m = my_mask;
-<a name="l01238"></a>01238 __TBB_ASSERT((m&(m+1))==0, NULL);
-<a name="l01239"></a>01239 <span class="preprocessor">#if TBB_USE_ASSERT || TBB_USE_PERFORMANCE_WARNINGS</span>
-<a name="l01240"></a>01240 <span class="preprocessor"></span><span class="preprocessor">#if TBB_USE_PERFORMANCE_WARNINGS</span>
-<a name="l01241"></a>01241 <span class="preprocessor"></span> <span class="keywordtype">int</span> current_size = int(my_size), buckets = int(m)+1, empty_buckets = 0, overpopulated_buckets = 0; <span class="comment">// usage statistics</span>
-<a name="l01242"></a>01242 <span class="keyword">static</span> <span class="keywordtype">bool</span> reported = <span class="keyword">false</span>;
-<a name="l01243"></a>01243 <span class="preprocessor">#endif</span>
-<a name="l01244"></a>01244 <span class="preprocessor"></span> bucket *bp = 0;
-<a name="l01245"></a>01245 <span class="comment">// check consistency</span>
-<a name="l01246"></a>01246 <span class="keywordflow">for</span>( segment_index_t b = 0; b <= m; b++ ) {
-<a name="l01247"></a>01247 <span class="keywordflow">if</span>( b & (b-2) ) ++bp; <span class="comment">// not the beginning of a segment</span>
-<a name="l01248"></a>01248 <span class="keywordflow">else</span> bp = get_bucket( b );
-<a name="l01249"></a>01249 node_base *n = bp->node_list;
-<a name="l01250"></a>01250 __TBB_ASSERT( is_valid(n) || n == internal::empty_rehashed || n == internal::rehash_req, <span class="stringliteral">"Broken internal structure"</span> );
-<a name="l01251"></a>01251 __TBB_ASSERT( *reinterpret_cast<intptr_t*>(&bp->mutex) == 0, <span class="stringliteral">"concurrent or unexpectedly terminated operation during clear() execution"</span> );
-<a name="l01252"></a>01252 <span class="preprocessor">#if TBB_USE_PERFORMANCE_WARNINGS</span>
-<a name="l01253"></a>01253 <span class="preprocessor"></span> <span class="keywordflow">if</span>( n == internal::empty_rehashed ) empty_buckets++;
-<a name="l01254"></a>01254 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( n == internal::rehash_req ) buckets--;
-<a name="l01255"></a>01255 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( n->next ) overpopulated_buckets++;
-<a name="l01256"></a>01256 <span class="preprocessor">#endif</span>
-<a name="l01257"></a>01257 <span class="preprocessor"></span><span class="preprocessor">#if __TBB_EXTRA_DEBUG</span>
-<a name="l01258"></a>01258 <span class="preprocessor"></span> <span class="keywordflow">for</span>(; is_valid(n); n = n->next ) {
-<a name="l01259"></a>01259 hashcode_t h = my_hash_compare.hash( static_cast<node*>(n)->item.first );
-<a name="l01260"></a>01260 h &= m;
-<a name="l01261"></a>01261 __TBB_ASSERT( h == b || get_bucket(h)->node_list == internal::rehash_req, <span class="stringliteral">"hash() function changed for key in table or internal error"</span> );
-<a name="l01262"></a>01262 }
-<a name="l01263"></a>01263 <span class="preprocessor">#endif</span>
-<a name="l01264"></a>01264 <span class="preprocessor"></span> }
-<a name="l01265"></a>01265 <span class="preprocessor">#if TBB_USE_PERFORMANCE_WARNINGS</span>
-<a name="l01266"></a>01266 <span class="preprocessor"></span> <span class="keywordflow">if</span>( buckets > current_size) empty_buckets -= buckets - current_size;
-<a name="l01267"></a>01267 <span class="keywordflow">else</span> overpopulated_buckets -= current_size - buckets; <span class="comment">// TODO: load_factor?</span>
-<a name="l01268"></a>01268 <span class="keywordflow">if</span>( !reported && buckets >= 512 && ( 2*empty_buckets > current_size || 2*overpopulated_buckets > current_size ) ) {
-<a name="l01269"></a>01269 tbb::internal::runtime_warning(
-<a name="l01270"></a>01270 <span class="stringliteral">"Performance is not optimal because the hash function produces bad randomness in lower bits in %s.\nSize: %d Empties: %d Overlaps: %d"</span>,
-<a name="l01271"></a>01271 <span class="keyword">typeid</span>(*this).name(), current_size, empty_buckets, overpopulated_buckets );
-<a name="l01272"></a>01272 reported = <span class="keyword">true</span>;
-<a name="l01273"></a>01273 }
-<a name="l01274"></a>01274 <span class="preprocessor">#endif</span>
-<a name="l01275"></a>01275 <span class="preprocessor"></span><span class="preprocessor">#endif//TBB_USE_ASSERT || TBB_USE_PERFORMANCE_WARNINGS</span>
-<a name="l01276"></a>01276 <span class="preprocessor"></span> my_size = 0;
-<a name="l01277"></a>01277 segment_index_t s = segment_index_of( m );
-<a name="l01278"></a>01278 __TBB_ASSERT( s+1 == pointers_per_table || !my_table[s+1], <span class="stringliteral">"wrong mask or concurrent grow"</span> );
-<a name="l01279"></a>01279 <a class="code" href="a00151.html">cache_aligned_allocator<bucket></a> alloc;
-<a name="l01280"></a>01280 <span class="keywordflow">do</span> {
-<a name="l01281"></a>01281 __TBB_ASSERT( is_valid( my_table[s] ), <span class="stringliteral">"wrong mask or concurrent grow"</span> );
-<a name="l01282"></a>01282 segment_ptr_t buckets_ptr = my_table[s];
-<a name="l01283"></a>01283 size_type sz = segment_size( s ? s : 1 );
-<a name="l01284"></a>01284 <span class="keywordflow">for</span>( segment_index_t i = 0; i < sz; i++ )
-<a name="l01285"></a>01285 <span class="keywordflow">for</span>( node_base *n = buckets_ptr[i].node_list; is_valid(n); n = buckets_ptr[i].node_list ) {
-<a name="l01286"></a>01286 buckets_ptr[i].node_list = n->next;
-<a name="l01287"></a>01287 delete_node( n );
-<a name="l01288"></a>01288 }
-<a name="l01289"></a>01289 <span class="keywordflow">if</span>( s >= first_block) <span class="comment">// the first segment or the next</span>
-<a name="l01290"></a>01290 alloc.<a class="code" href="a00151.html#3d4eadf188f7d85d3805ae534e0b8e1c">deallocate</a>( buckets_ptr, sz );
-<a name="l01291"></a>01291 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( s == embedded_block && embedded_block != first_block )
-<a name="l01292"></a>01292 alloc.<a class="code" href="a00151.html#3d4eadf188f7d85d3805ae534e0b8e1c">deallocate</a>( buckets_ptr, segment_size(first_block)-embedded_buckets );
-<a name="l01293"></a>01293 <span class="keywordflow">if</span>( s >= embedded_block ) my_table[s] = 0;
-<a name="l01294"></a>01294 } <span class="keywordflow">while</span>(s-- > 0);
-<a name="l01295"></a>01295 my_mask = embedded_buckets - 1;
-<a name="l01296"></a>01296 }
-<a name="l01297"></a>01297
-<a name="l01298"></a>01298 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
-<a name="l01299"></a><a class="code" href="a00156.html#3c27779fe66b79505390d084310d997e">01299</a> <span class="keywordtype">void</span> <a class="code" href="a00156.html">concurrent_hash_map<Key,T,HashCompare,A>::internal_copy</a>( <span class="keyword">const</span> <a class="code" href="a00156.html">concurrent_hash_map</a>& source ) {
-<a name="l01300"></a>01300 reserve( source.my_size ); <span class="comment">// TODO: load_factor?</span>
-<a name="l01301"></a>01301 hashcode_t mask = source.my_mask;
-<a name="l01302"></a>01302 <span class="keywordflow">if</span>( my_mask == mask ) { <span class="comment">// optimized version</span>
-<a name="l01303"></a>01303 bucket *dst = 0, *src = 0;
-<a name="l01304"></a>01304 <span class="keywordtype">bool</span> rehash_required = <span class="keyword">false</span>;
-<a name="l01305"></a>01305 <span class="keywordflow">for</span>( hashcode_t k = 0; k <= mask; k++ ) {
-<a name="l01306"></a>01306 <span class="keywordflow">if</span>( k & (k-2) ) ++dst,src++; <span class="comment">// not the beginning of a segment</span>
-<a name="l01307"></a>01307 <span class="keywordflow">else</span> { dst = get_bucket( k ); src = source.get_bucket( k ); }
-<a name="l01308"></a>01308 __TBB_ASSERT( dst->node_list != internal::rehash_req, <span class="stringliteral">"Invalid bucket in destination table"</span>);
-<a name="l01309"></a>01309 node *n = static_cast<node*>( src->node_list );
-<a name="l01310"></a>01310 <span class="keywordflow">if</span>( n == internal::rehash_req ) { <span class="comment">// source is not rehashed, items are in previous buckets</span>
-<a name="l01311"></a>01311 rehash_required = <span class="keyword">true</span>;
-<a name="l01312"></a>01312 dst->node_list = internal::rehash_req;
-<a name="l01313"></a>01313 } <span class="keywordflow">else</span> <span class="keywordflow">for</span>(; n; n = static_cast<node*>( n->next ) ) {
-<a name="l01314"></a>01314 add_to_bucket( dst, <span class="keyword">new</span>( my_allocator ) node(n->item.first, n->item.second) );
-<a name="l01315"></a>01315 ++my_size; <span class="comment">// TODO: replace by non-atomic op</span>
-<a name="l01316"></a>01316 }
-<a name="l01317"></a>01317 }
-<a name="l01318"></a>01318 <span class="keywordflow">if</span>( rehash_required ) <a class="code" href="a00156.html#13f3f2e8de7564be03882c31559493c9">rehash</a>();
-<a name="l01319"></a>01319 } <span class="keywordflow">else</span> <a class="code" href="a00156.html#3c27779fe66b79505390d084310d997e">internal_copy</a>( source.<a class="code" href="a00156.html#4a3c58cf1234b74ca796dcf555d32f53">begin</a>(), source.<a class="code" href="a00156.html#28c690486d8db5783475f5b1a59d21bc">end</a>() );
-<a name="l01320"></a>01320 }
-<a name="l01321"></a>01321
-<a name="l01322"></a>01322 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
-<a name="l01323"></a>01323 <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l01324"></a>01324 <span class="keywordtype">void</span> <a class="code" href="a00156.html">concurrent_hash_map<Key,T,HashCompare,A>::internal_copy</a>(I first, I last) {
-<a name="l01325"></a>01325 hashcode_t m = my_mask;
-<a name="l01326"></a>01326 <span class="keywordflow">for</span>(; first != last; ++first) {
-<a name="l01327"></a>01327 hashcode_t h = my_hash_compare.hash( first->first );
-<a name="l01328"></a>01328 bucket *b = get_bucket( h & m );
-<a name="l01329"></a>01329 __TBB_ASSERT( b->node_list != internal::rehash_req, <span class="stringliteral">"Invalid bucket in destination table"</span>);
-<a name="l01330"></a>01330 node *n = <span class="keyword">new</span>( my_allocator ) node(first->first, first->second);
-<a name="l01331"></a>01331 add_to_bucket( b, n );
-<a name="l01332"></a>01332 ++my_size; <span class="comment">// TODO: replace by non-atomic op</span>
-<a name="l01333"></a>01333 }
-<a name="l01334"></a>01334 }
-<a name="l01335"></a>01335
-<a name="l01336"></a>01336 } <span class="comment">// namespace interface4</span>
-<a name="l01337"></a>01337
-<a name="l01338"></a>01338 <span class="keyword">using</span> interface4::concurrent_hash_map;
-<a name="l01339"></a>01339
-<a name="l01340"></a>01340
-<a name="l01341"></a>01341 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A1, <span class="keyword">typename</span> A2>
-<a name="l01342"></a>01342 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> concurrent_hash_map<Key, T, HashCompare, A1> &a, <span class="keyword">const</span> concurrent_hash_map<Key, T, HashCompare, A2> &b) {
-<a name="l01343"></a>01343 <span class="keywordflow">if</span>(a.size() != b.size()) <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l01344"></a>01344 <span class="keyword">typename</span> concurrent_hash_map<Key, T, HashCompare, A1>::const_iterator i(a.begin()), i_end(a.end());
-<a name="l01345"></a>01345 <span class="keyword">typename</span> concurrent_hash_map<Key, T, HashCompare, A2>::const_iterator j, j_end(b.end());
-<a name="l01346"></a>01346 <span class="keywordflow">for</span>(; i != i_end; ++i) {
-<a name="l01347"></a>01347 j = b.equal_range(i->first).first;
-<a name="l01348"></a>01348 <span class="keywordflow">if</span>( j == j_end || !(i->second == j->second) ) <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l01349"></a>01349 }
-<a name="l01350"></a>01350 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01351"></a>01351 }
-<a name="l01352"></a>01352
-<a name="l01353"></a>01353 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A1, <span class="keyword">typename</span> A2>
-<a name="l01354"></a>01354 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> concurrent_hash_map<Key, T, HashCompare, A1> &a, <span class="keyword">const</span> concurrent_hash_map<Key, T, HashCompare, A2> &b)
-<a name="l01355"></a>01355 { <span class="keywordflow">return</span> !(a == b); }
-<a name="l01356"></a>01356
-<a name="l01357"></a>01357 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
-<a name="l01358"></a>01358 <span class="keyword">inline</span> <span class="keywordtype">void</span> swap(concurrent_hash_map<Key, T, HashCompare, A> &a, concurrent_hash_map<Key, T, HashCompare, A> &b)
-<a name="l01359"></a>01359 { a.swap( b ); }
-<a name="l01360"></a>01360
-<a name="l01361"></a>01361 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
-<a name="l01362"></a>01362 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning( pop )</span>
-<a name="l01363"></a>01363 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4127 is back</span>
-<a name="l01364"></a>01364 <span class="preprocessor"></span>
-<a name="l01365"></a>01365 } <span class="comment">// namespace tbb</span>
-<a name="l01366"></a>01366
-<a name="l01367"></a>01367 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_concurrent_hash_map_H */</span>
+<a name="l00024"></a>00024 <span class="preprocessor">#include "enumerable_thread_specific.h"</span>
+<a name="l00025"></a>00025 <span class="preprocessor">#include "cache_aligned_allocator.h"</span>
+<a name="l00026"></a>00026
+<a name="l00027"></a>00027 <span class="keyword">namespace </span>tbb {
+<a name="l00031"></a>00031
+<a name="l00032"></a>00032
+<a name="l00033"></a>00033 <span class="keyword">template</span> <<span class="keyword">typename</span> T>
+<a name="l00034"></a><a class="code" href="a00153.html">00034</a> <span class="keyword">class </span><a class="code" href="a00153.html">combinable</a> {
+<a name="l00035"></a>00035 <span class="keyword">private</span>:
+<a name="l00036"></a>00036 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00150.html">tbb::cache_aligned_allocator<T></a> <a class="code" href="a00150.html">my_alloc</a>;
+<a name="l00037"></a>00037
+<a name="l00038"></a>00038 <span class="keyword">typedef</span> <span class="keyword">typename</span> tbb::enumerable_thread_specific<T, my_alloc, ets_no_key> my_ets_type;
+<a name="l00039"></a>00039 my_ets_type my_ets;
+<a name="l00040"></a>00040
+<a name="l00041"></a>00041 <span class="keyword">public</span>:
+<a name="l00042"></a>00042
+<a name="l00043"></a>00043 <a class="code" href="a00153.html">combinable</a>() { }
+<a name="l00044"></a>00044
+<a name="l00045"></a>00045 <span class="keyword">template</span> <<span class="keyword">typename</span> finit>
+<a name="l00046"></a>00046 <a class="code" href="a00153.html">combinable</a>( finit _finit) : my_ets(_finit) { }
+<a name="l00047"></a>00047
+<a name="l00049"></a><a class="code" href="a00153.html#2c87e79ae98588a5780f708773388843">00049</a> <a class="code" href="a00153.html#2c87e79ae98588a5780f708773388843">~combinable</a>() {
+<a name="l00050"></a>00050 }
+<a name="l00051"></a>00051
+<a name="l00052"></a>00052 <a class="code" href="a00153.html">combinable</a>(<span class="keyword">const</span> <a class="code" href="a00153.html">combinable</a>& other) : my_ets(other.my_ets) { }
+<a name="l00053"></a>00053
+<a name="l00054"></a>00054 combinable & operator=( <span class="keyword">const</span> combinable & other) { my_ets = other.my_ets; <span class="keywordflow">return</span> *<span class="keyword">this</span>; }
+<a name="l00055"></a>00055
+<a name="l00056"></a>00056 <span class="keywordtype">void</span> clear() { my_ets.clear(); }
+<a name="l00057"></a>00057
+<a name="l00058"></a>00058 T& local() { <span class="keywordflow">return</span> my_ets.local(); }
+<a name="l00059"></a>00059
+<a name="l00060"></a>00060 T& local(<span class="keywordtype">bool</span> & exists) { <span class="keywordflow">return</span> my_ets.local(exists); }
+<a name="l00061"></a>00061
+<a name="l00062"></a>00062 <span class="comment">// combine_func_t has signature T(T,T) or T(const T&, const T&)</span>
+<a name="l00063"></a>00063 <span class="keyword">template</span> <<span class="keyword">typename</span> combine_func_t>
+<a name="l00064"></a>00064 T combine(combine_func_t f_combine) { <span class="keywordflow">return</span> my_ets.combine(f_combine); }
+<a name="l00065"></a>00065
+<a name="l00066"></a>00066 <span class="comment">// combine_func_t has signature void(T) or void(const T&)</span>
+<a name="l00067"></a>00067 <span class="keyword">template</span> <<span class="keyword">typename</span> combine_func_t>
+<a name="l00068"></a>00068 <span class="keywordtype">void</span> combine_each(combine_func_t f_combine) { my_ets.combine_each(f_combine); }
+<a name="l00069"></a>00069
+<a name="l00070"></a>00070 };
+<a name="l00071"></a>00071 } <span class="comment">// namespace tbb</span>
+<a name="l00072"></a>00072 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_combinable_H */</span>
</pre></div><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00325.html b/doc/html/a00326.html
similarity index 93%
copy from doc/html/a00325.html
copy to doc/html/a00326.html
index 54a4fed..81d2db8 100644
--- a/doc/html/a00325.html
+++ b/doc/html/a00326.html
@@ -86,7 +86,7 @@
<a name="l00071"></a>00071 <span class="keyword">namespace </span>interface4 {
<a name="l00072"></a>00072
<a name="l00073"></a>00073 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare = tbb_hash_compare<Key>, <span class="keyword">typename</span> A = tbb_allocator<std::pair<Key, T> > >
-<a name="l00074"></a>00074 <span class="keyword">class </span><a class="code" href="a00156.html">concurrent_hash_map</a>;
+<a name="l00074"></a>00074 <span class="keyword">class </span><a class="code" href="a00155.html">concurrent_hash_map</a>;
<a name="l00075"></a>00075
<a name="l00077"></a>00077 <span class="keyword">namespace </span>internal {
<a name="l00078"></a>00078
@@ -368,10 +368,10 @@
<a name="l00401"></a>00401 Value* operator->()<span class="keyword"> const </span>{<span class="keywordflow">return</span> &operator*();}
<a name="l00402"></a>00402 hash_map_iterator& operator++();
<a name="l00403"></a>00403
-<a name="l00405"></a>00405 Value* operator++(<span class="keywordtype">int</span>) {
-<a name="l00406"></a>00406 Value* result = &operator*();
+<a name="l00405"></a>00405 hash_map_iterator operator++(<span class="keywordtype">int</span>) {
+<a name="l00406"></a>00406 hash_map_iterator old(*<span class="keyword">this</span>);
<a name="l00407"></a>00407 operator++();
-<a name="l00408"></a>00408 <span class="keywordflow">return</span> result;
+<a name="l00408"></a>00408 <span class="keywordflow">return</span> old;
<a name="l00409"></a>00409 }
<a name="l00410"></a>00410 };
<a name="l00411"></a>00411
@@ -490,7 +490,7 @@
<a name="l00535"></a>00535 <span class="comment"></span>
<a name="l00537"></a>00537
<a name="l00566"></a>00566 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> Allocator>
-<a name="l00567"></a><a class="code" href="a00156.html">00567</a> <span class="keyword">class </span><a class="code" href="a00156.html">concurrent_hash_map</a> : <span class="keyword">protected</span> internal::hash_map_base {
+<a name="l00567"></a><a class="code" href="a00155.html">00567</a> <span class="keyword">class </span><a class="code" href="a00155.html">concurrent_hash_map</a> : <span class="keyword">protected</span> internal::hash_map_base {
<a name="l00568"></a>00568 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value>
<a name="l00569"></a>00569 <span class="keyword">friend</span> <span class="keyword">class </span>internal::hash_map_iterator;
<a name="l00570"></a>00570
@@ -514,7 +514,7 @@
<a name="l00588"></a>00588 <span class="keyword">typedef</span> Allocator allocator_type;
<a name="l00589"></a>00589
<a name="l00590"></a>00590 <span class="keyword">protected</span>:
-<a name="l00591"></a>00591 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00159.html">const_accessor</a>;
+<a name="l00591"></a>00591 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00158.html">const_accessor</a>;
<a name="l00592"></a>00592 <span class="keyword">struct </span>node;
<a name="l00593"></a>00593 <span class="keyword">typedef</span> <span class="keyword">typename</span> Allocator::template rebind<node>::other node_allocator_type;
<a name="l00594"></a>00594 node_allocator_type my_allocator;
@@ -548,12 +548,12 @@
<a name="l00622"></a>00622 <span class="keywordflow">return</span> n;
<a name="l00623"></a>00623 }
<a name="l00624"></a>00624
-<a name="l00626"></a><a class="code" href="a00158.html">00626</a> <span class="keyword">class </span><a class="code" href="a00158.html">bucket_accessor</a> : <span class="keyword">public</span> bucket::scoped_t {
+<a name="l00626"></a><a class="code" href="a00157.html">00626</a> <span class="keyword">class </span><a class="code" href="a00157.html">bucket_accessor</a> : <span class="keyword">public</span> bucket::scoped_t {
<a name="l00627"></a>00627 <span class="keywordtype">bool</span> my_is_writer; <span class="comment">// TODO: use it from base type</span>
<a name="l00628"></a>00628 bucket *my_b;
<a name="l00629"></a>00629 <span class="keyword">public</span>:
-<a name="l00630"></a>00630 <a class="code" href="a00158.html">bucket_accessor</a>( <a class="code" href="a00156.html">concurrent_hash_map</a> *base, <span class="keyword">const</span> hashcode_t h, <span class="keywordtype">bool</span> writer = <span class="keyword">false</span> ) { <a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>( base, h, writer ); }
-<a name="l00632"></a><a class="code" href="a00158.html#26b4fe0ca87a7ad4852cb787db880119">00632</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>( <a class="code" href="a00156.html">concurrent_hash_map</a> *base, <span class="keyword">const</span> hashcode_t h, <span class="keywordtype">bool</span> writer = <span class="keyword">false</span> ) {
+<a name="l00630"></a>00630 <a class="code" href="a00157.html">bucket_accessor</a>( <a class="code" href="a00155.html">concurrent_hash_map</a> *base, <span class="keyword">const</span> hashcode_t h, <span class="keywordtype">bool</span> writer = <span class="keyword">false</span> ) { <a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>( base, h, writer ); }
+<a name="l00632"></a><a class="code" href="a00157.html#26b4fe0ca87a7ad4852cb787db880119">00632</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>( <a class="code" href="a00155.html">concurrent_hash_map</a> *base, <span class="keyword">const</span> hashcode_t h, <span class="keywordtype">bool</span> writer = <span class="keyword">false</span> ) {
<a name="l00633"></a>00633 my_b = base->get_bucket( h );
<a name="l00634"></a>00634 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
<a name="l00635"></a>00635 <span class="preprocessor"></span> <span class="comment">// TODO: actually, notification is unnecessary here, just hiding double-check</span>
@@ -563,14 +563,14 @@
<a name="l00639"></a>00639 #endif
<a name="l00640"></a>00640 && try_acquire( my_b->mutex, <span class="comment">/*write=*/</span><span class="keyword">true</span> ) )
<a name="l00641"></a>00641 {
-<a name="l00642"></a>00642 <span class="keywordflow">if</span>( my_b->node_list == internal::rehash_req ) base-><a class="code" href="a00156.html#571d635fd206d9985cf20a1a659ea476">rehash_bucket</a>( my_b, h ); <span class="comment">//recursive rehashing</span>
+<a name="l00642"></a>00642 <span class="keywordflow">if</span>( my_b->node_list == internal::rehash_req ) base-><a class="code" href="a00155.html#571d635fd206d9985cf20a1a659ea476">rehash_bucket</a>( my_b, h ); <span class="comment">//recursive rehashing</span>
<a name="l00643"></a>00643 my_is_writer = <span class="keyword">true</span>;
<a name="l00644"></a>00644 }
<a name="l00645"></a>00645 <span class="keywordflow">else</span> bucket::scoped_t::acquire( my_b->mutex, <span class="comment">/*write=*/</span>my_is_writer = writer );
<a name="l00646"></a>00646 __TBB_ASSERT( my_b->node_list != internal::rehash_req, NULL);
<a name="l00647"></a>00647 }
-<a name="l00649"></a><a class="code" href="a00158.html#fc194e3a186dc935a5fb513cc9f8e898">00649</a> <span class="keywordtype">bool</span> is_writer() { <span class="keywordflow">return</span> my_is_writer; }
-<a name="l00651"></a><a class="code" href="a00158.html#57c6110bd20e95c06de5a199de988941">00651</a> bucket *operator() () { <span class="keywordflow">return</span> my_b; }
+<a name="l00649"></a><a class="code" href="a00157.html#fc194e3a186dc935a5fb513cc9f8e898">00649</a> <span class="keywordtype">bool</span> is_writer() { <span class="keywordflow">return</span> my_is_writer; }
+<a name="l00651"></a><a class="code" href="a00157.html#57c6110bd20e95c06de5a199de988941">00651</a> bucket *operator() () { <span class="keywordflow">return</span> my_b; }
<a name="l00652"></a>00652 <span class="comment">// TODO: optimize out</span>
<a name="l00653"></a>00653 <span class="keywordtype">bool</span> upgrade_to_writer() { my_is_writer = <span class="keyword">true</span>; <span class="keywordflow">return</span> bucket::scoped_t::upgrade_to_writer(); }
<a name="l00654"></a>00654 };
@@ -608,35 +608,35 @@
<a name="l00686"></a>00686 <span class="keyword">public</span>:
<a name="l00687"></a>00687
<a name="l00688"></a>00688 <span class="keyword">class </span>accessor;
-<a name="l00690"></a><a class="code" href="a00159.html">00690</a> <span class="keyword">class </span><a class="code" href="a00159.html">const_accessor</a> {
-<a name="l00691"></a>00691 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00156.html">concurrent_hash_map</a><Key,T,HashCompare,Allocator>;
-<a name="l00692"></a>00692 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00157.html">accessor</a>;
-<a name="l00693"></a>00693 <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> <a class="code" href="a00157.html">accessor</a> & ) <span class="keyword">const</span>; <span class="comment">// Deny access</span>
-<a name="l00694"></a>00694 <a class="code" href="a00159.html">const_accessor</a>( <span class="keyword">const</span> <a class="code" href="a00157.html">accessor</a> & ); <span class="comment">// Deny access</span>
+<a name="l00690"></a><a class="code" href="a00158.html">00690</a> <span class="keyword">class </span><a class="code" href="a00158.html">const_accessor</a> {
+<a name="l00691"></a>00691 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00155.html">concurrent_hash_map</a><Key,T,HashCompare,Allocator>;
+<a name="l00692"></a>00692 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00156.html">accessor</a>;
+<a name="l00693"></a>00693 <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> <a class="code" href="a00156.html">accessor</a> & ) <span class="keyword">const</span>; <span class="comment">// Deny access</span>
+<a name="l00694"></a>00694 <a class="code" href="a00158.html">const_accessor</a>( <span class="keyword">const</span> <a class="code" href="a00156.html">accessor</a> & ); <span class="comment">// Deny access</span>
<a name="l00695"></a>00695 <span class="keyword">public</span>:
-<a name="l00697"></a><a class="code" href="a00159.html#48647ca0d79c1233b997f5768403c926">00697</a> <span class="keyword">typedef</span> <span class="keyword">const</span> <span class="keyword">typename</span> concurrent_hash_map::value_type value_type;
+<a name="l00697"></a><a class="code" href="a00158.html#48647ca0d79c1233b997f5768403c926">00697</a> <span class="keyword">typedef</span> <span class="keyword">const</span> <span class="keyword">typename</span> concurrent_hash_map::value_type value_type;
<a name="l00698"></a>00698
-<a name="l00700"></a><a class="code" href="a00159.html#5cce3104cb0a52e08d2131370871c614">00700</a> <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{<span class="keywordflow">return</span> !my_node;}
+<a name="l00700"></a><a class="code" href="a00158.html#5cce3104cb0a52e08d2131370871c614">00700</a> <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{<span class="keywordflow">return</span> !my_node;}
<a name="l00701"></a>00701
-<a name="l00703"></a><a class="code" href="a00159.html#d5ce4f88d8870290238a8ad621e6f270">00703</a> <span class="keywordtype">void</span> <a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>() {
+<a name="l00703"></a><a class="code" href="a00158.html#d5ce4f88d8870290238a8ad621e6f270">00703</a> <span class="keywordtype">void</span> <a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>() {
<a name="l00704"></a>00704 <span class="keywordflow">if</span>( my_node ) {
<a name="l00705"></a>00705 my_lock.release();
<a name="l00706"></a>00706 my_node = 0;
<a name="l00707"></a>00707 }
<a name="l00708"></a>00708 }
<a name="l00709"></a>00709
-<a name="l00711"></a><a class="code" href="a00159.html#30f31106840700a4c3664b9cb1c31ca7">00711</a> const_reference operator*()<span class="keyword"> const </span>{
+<a name="l00711"></a><a class="code" href="a00158.html#30f31106840700a4c3664b9cb1c31ca7">00711</a> const_reference operator*()<span class="keyword"> const </span>{
<a name="l00712"></a>00712 __TBB_ASSERT( my_node, <span class="stringliteral">"attempt to dereference empty accessor"</span> );
<a name="l00713"></a>00713 <span class="keywordflow">return</span> my_node->item;
<a name="l00714"></a>00714 }
<a name="l00715"></a>00715
-<a name="l00717"></a><a class="code" href="a00159.html#3d03a48ecb8cd9549bd8be64b09c9b0d">00717</a> const_pointer operator->()<span class="keyword"> const </span>{
+<a name="l00717"></a><a class="code" href="a00158.html#3d03a48ecb8cd9549bd8be64b09c9b0d">00717</a> const_pointer operator->()<span class="keyword"> const </span>{
<a name="l00718"></a>00718 <span class="keywordflow">return</span> &operator*();
<a name="l00719"></a>00719 }
<a name="l00720"></a>00720
-<a name="l00722"></a><a class="code" href="a00159.html#a9ead65cca68d4c49c7ef64d7899a4c8">00722</a> <a class="code" href="a00159.html">const_accessor</a>() : my_node(NULL) {}
+<a name="l00722"></a><a class="code" href="a00158.html#a9ead65cca68d4c49c7ef64d7899a4c8">00722</a> <a class="code" href="a00158.html">const_accessor</a>() : my_node(NULL) {}
<a name="l00723"></a>00723
-<a name="l00725"></a><a class="code" href="a00159.html#752b0c1ec74b94786403a75e42917d01">00725</a> ~<a class="code" href="a00159.html">const_accessor</a>() {
+<a name="l00725"></a><a class="code" href="a00158.html#752b0c1ec74b94786403a75e42917d01">00725</a> ~<a class="code" href="a00158.html">const_accessor</a>() {
<a name="l00726"></a>00726 my_node = NULL; <span class="comment">// my_lock.release() is called in scoped_lock destructor</span>
<a name="l00727"></a>00727 }
<a name="l00728"></a>00728 <span class="keyword">private</span>:
@@ -645,45 +645,45 @@
<a name="l00731"></a>00731 hashcode_t my_hash;
<a name="l00732"></a>00732 };
<a name="l00733"></a>00733
-<a name="l00735"></a><a class="code" href="a00157.html">00735</a> <span class="keyword">class </span><a class="code" href="a00157.html">accessor</a>: <span class="keyword">public</span> <a class="code" href="a00159.html">const_accessor</a> {
+<a name="l00735"></a><a class="code" href="a00156.html">00735</a> <span class="keyword">class </span><a class="code" href="a00156.html">accessor</a>: <span class="keyword">public</span> <a class="code" href="a00158.html">const_accessor</a> {
<a name="l00736"></a>00736 <span class="keyword">public</span>:
-<a name="l00738"></a><a class="code" href="a00157.html#49eec74f272bab187d176c0d9d16a7fe">00738</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_hash_map::value_type value_type;
+<a name="l00738"></a><a class="code" href="a00156.html#49eec74f272bab187d176c0d9d16a7fe">00738</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_hash_map::value_type value_type;
<a name="l00739"></a>00739
-<a name="l00741"></a><a class="code" href="a00157.html#e8938f0cd1211e88a1d73527ed3636c4">00741</a> reference operator*()<span class="keyword"> const </span>{
+<a name="l00741"></a><a class="code" href="a00156.html#e8938f0cd1211e88a1d73527ed3636c4">00741</a> reference operator*()<span class="keyword"> const </span>{
<a name="l00742"></a>00742 __TBB_ASSERT( this->my_node, <span class="stringliteral">"attempt to dereference empty accessor"</span> );
<a name="l00743"></a>00743 <span class="keywordflow">return</span> this->my_node->item;
<a name="l00744"></a>00744 }
<a name="l00745"></a>00745
-<a name="l00747"></a><a class="code" href="a00157.html#fcebc32c020202cc37e60eadef157569">00747</a> pointer operator->()<span class="keyword"> const </span>{
+<a name="l00747"></a><a class="code" href="a00156.html#fcebc32c020202cc37e60eadef157569">00747</a> pointer operator->()<span class="keyword"> const </span>{
<a name="l00748"></a>00748 <span class="keywordflow">return</span> &operator*();
<a name="l00749"></a>00749 }
<a name="l00750"></a>00750 };
<a name="l00751"></a>00751
-<a name="l00753"></a><a class="code" href="a00156.html#d827bb5e4f61de1916ab67d51c7c6e60">00753</a> <a class="code" href="a00156.html">concurrent_hash_map</a>(<span class="keyword">const</span> allocator_type &a = allocator_type())
+<a name="l00753"></a><a class="code" href="a00155.html#d827bb5e4f61de1916ab67d51c7c6e60">00753</a> <a class="code" href="a00155.html">concurrent_hash_map</a>(<span class="keyword">const</span> allocator_type &a = allocator_type())
<a name="l00754"></a>00754 : internal::hash_map_base(), my_allocator(a)
<a name="l00755"></a>00755 {}
<a name="l00756"></a>00756
-<a name="l00758"></a><a class="code" href="a00156.html#a4612d5c7233712d455496641e9b31ff">00758</a> <a class="code" href="a00156.html">concurrent_hash_map</a>(size_type n, <span class="keyword">const</span> allocator_type &a = allocator_type())
+<a name="l00758"></a><a class="code" href="a00155.html#a4612d5c7233712d455496641e9b31ff">00758</a> <a class="code" href="a00155.html">concurrent_hash_map</a>(size_type n, <span class="keyword">const</span> allocator_type &a = allocator_type())
<a name="l00759"></a>00759 : my_allocator(a)
<a name="l00760"></a>00760 {
<a name="l00761"></a>00761 reserve( n );
<a name="l00762"></a>00762 }
<a name="l00763"></a>00763
-<a name="l00765"></a><a class="code" href="a00156.html#df0cd14eaddb17f10929c91519e65be9">00765</a> <a class="code" href="a00156.html">concurrent_hash_map</a>( <span class="keyword">const</span> <a class="code" href="a00156.html">concurrent_hash_map</a>& table, <span class="keyword">const</span> allocator_type &a = allocator_type())
+<a name="l00765"></a><a class="code" href="a00155.html#df0cd14eaddb17f10929c91519e65be9">00765</a> <a class="code" href="a00155.html">concurrent_hash_map</a>( <span class="keyword">const</span> <a class="code" href="a00155.html">concurrent_hash_map</a>& table, <span class="keyword">const</span> allocator_type &a = allocator_type())
<a name="l00766"></a>00766 : internal::hash_map_base(), my_allocator(a)
<a name="l00767"></a>00767 {
<a name="l00768"></a>00768 internal_copy(table);
<a name="l00769"></a>00769 }
<a name="l00770"></a>00770
<a name="l00772"></a>00772 <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l00773"></a><a class="code" href="a00156.html#3bfe75fcb350ce39cf610c164f233edc">00773</a> <a class="code" href="a00156.html">concurrent_hash_map</a>(I first, I last, <span class="keyword">const</span> allocator_type &a = allocator_type())
+<a name="l00773"></a><a class="code" href="a00155.html#3bfe75fcb350ce39cf610c164f233edc">00773</a> <a class="code" href="a00155.html">concurrent_hash_map</a>(I first, I last, <span class="keyword">const</span> allocator_type &a = allocator_type())
<a name="l00774"></a>00774 : my_allocator(a)
<a name="l00775"></a>00775 {
<a name="l00776"></a>00776 reserve( std::distance(first, last) ); <span class="comment">// TODO: load_factor?</span>
<a name="l00777"></a>00777 internal_copy(first, last);
<a name="l00778"></a>00778 }
<a name="l00779"></a>00779
-<a name="l00781"></a><a class="code" href="a00156.html#2c0c42a2e1b5282b6739157df9ce2304">00781</a> <a class="code" href="a00156.html">concurrent_hash_map</a>& operator=( <span class="keyword">const</span> <a class="code" href="a00156.html">concurrent_hash_map</a>& table ) {
+<a name="l00781"></a><a class="code" href="a00155.html#2c0c42a2e1b5282b6739157df9ce2304">00781</a> <a class="code" href="a00155.html">concurrent_hash_map</a>& operator=( <span class="keyword">const</span> <a class="code" href="a00155.html">concurrent_hash_map</a>& table ) {
<a name="l00782"></a>00782 <span class="keywordflow">if</span>( <span class="keyword">this</span>!=&table ) {
<a name="l00783"></a>00783 clear();
<a name="l00784"></a>00784 internal_copy(table);
@@ -697,7 +697,7 @@
<a name="l00794"></a>00794
<a name="l00796"></a>00796 <span class="keywordtype">void</span> clear();
<a name="l00797"></a>00797
-<a name="l00799"></a><a class="code" href="a00156.html#a1ac58997d8fbf242b266e3691573481">00799</a> ~<a class="code" href="a00156.html">concurrent_hash_map</a>() { clear(); }
+<a name="l00799"></a><a class="code" href="a00155.html#a1ac58997d8fbf242b266e3691573481">00799</a> ~<a class="code" href="a00155.html">concurrent_hash_map</a>() { clear(); }
<a name="l00800"></a>00800
<a name="l00801"></a>00801 <span class="comment">//------------------------------------------------------------------------</span>
<a name="l00802"></a>00802 <span class="comment">// Parallel algorithm support</span>
@@ -719,69 +719,69 @@
<a name="l00818"></a>00818 std::pair<iterator, iterator> equal_range( <span class="keyword">const</span> Key& key ) { <span class="keywordflow">return</span> internal_equal_range(key, end()); }
<a name="l00819"></a>00819 std::pair<const_iterator, const_iterator> equal_range( <span class="keyword">const</span> Key& key )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> internal_equal_range(key, end()); }
<a name="l00820"></a>00820
-<a name="l00822"></a><a class="code" href="a00156.html#17fd8c5fe8c6a86075f34aa4e8412ba3">00822</a> size_type size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_size; }
+<a name="l00822"></a><a class="code" href="a00155.html#17fd8c5fe8c6a86075f34aa4e8412ba3">00822</a> size_type size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_size; }
<a name="l00823"></a>00823
-<a name="l00825"></a><a class="code" href="a00156.html#6cab7d029a3e73a653ef0faeac4d1586">00825</a> <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_size == 0; }
+<a name="l00825"></a><a class="code" href="a00155.html#6cab7d029a3e73a653ef0faeac4d1586">00825</a> <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_size == 0; }
<a name="l00826"></a>00826
-<a name="l00828"></a><a class="code" href="a00156.html#1e45d3cbd1e2ae06f365f1b48e0df0b5">00828</a> size_type max_size()<span class="keyword"> const </span>{<span class="keywordflow">return</span> (~size_type(0))/<span class="keyword">sizeof</span>(node);}
+<a name="l00828"></a><a class="code" href="a00155.html#1e45d3cbd1e2ae06f365f1b48e0df0b5">00828</a> size_type max_size()<span class="keyword"> const </span>{<span class="keywordflow">return</span> (~size_type(0))/<span class="keyword">sizeof</span>(node);}
<a name="l00829"></a>00829
-<a name="l00831"></a><a class="code" href="a00156.html#414d15033d36c63aa3a40666dc4d6f5e">00831</a> size_type bucket_count()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_mask+1; }
+<a name="l00831"></a><a class="code" href="a00155.html#414d15033d36c63aa3a40666dc4d6f5e">00831</a> size_type bucket_count()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_mask+1; }
<a name="l00832"></a>00832
-<a name="l00834"></a><a class="code" href="a00156.html#199208eed6f09e200cda364f906be0fe">00834</a> allocator_type get_allocator()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> this->my_allocator; }
+<a name="l00834"></a><a class="code" href="a00155.html#199208eed6f09e200cda364f906be0fe">00834</a> allocator_type get_allocator()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> this->my_allocator; }
<a name="l00835"></a>00835
-<a name="l00837"></a>00837 <span class="keywordtype">void</span> swap(<a class="code" href="a00156.html">concurrent_hash_map</a> &table);
+<a name="l00837"></a>00837 <span class="keywordtype">void</span> swap(<a class="code" href="a00155.html">concurrent_hash_map</a> &table);
<a name="l00838"></a>00838
<a name="l00839"></a>00839 <span class="comment">//------------------------------------------------------------------------</span>
<a name="l00840"></a>00840 <span class="comment">// concurrent map operations</span>
<a name="l00841"></a>00841 <span class="comment">//------------------------------------------------------------------------</span>
<a name="l00842"></a>00842
-<a name="l00844"></a><a class="code" href="a00156.html#74f5ef06a06c5e619f156a1c76c04969">00844</a> size_type count( <span class="keyword">const</span> Key &key )<span class="keyword"> const </span>{
+<a name="l00844"></a><a class="code" href="a00155.html#74f5ef06a06c5e619f156a1c76c04969">00844</a> size_type count( <span class="keyword">const</span> Key &key )<span class="keyword"> const </span>{
<a name="l00845"></a>00845 <span class="keywordflow">return</span> const_cast<concurrent_hash_map*>(<span class="keyword">this</span>)->lookup(<span class="comment">/*insert*/</span><span class="keyword">false</span>, key, NULL, NULL, <span class="comment">/*write=*/</span><span class="keyword">false</span> );
<a name="l00846"></a>00846 }
<a name="l00847"></a>00847
<a name="l00849"></a>00849
-<a name="l00850"></a><a class="code" href="a00156.html#64338d7f2e35df586af4cb0145cd910f">00850</a> <span class="keywordtype">bool</span> find( <a class="code" href="a00159.html">const_accessor</a> &result, <span class="keyword">const</span> Key &key )<span class="keyword"> const </span>{
-<a name="l00851"></a>00851 result.<a class="code" href="a00159.html#d5ce4f88d8870290238a8ad621e6f270">release</a>();
+<a name="l00850"></a><a class="code" href="a00155.html#64338d7f2e35df586af4cb0145cd910f">00850</a> <span class="keywordtype">bool</span> find( <a class="code" href="a00158.html">const_accessor</a> &result, <span class="keyword">const</span> Key &key )<span class="keyword"> const </span>{
+<a name="l00851"></a>00851 result.<a class="code" href="a00158.html#d5ce4f88d8870290238a8ad621e6f270">release</a>();
<a name="l00852"></a>00852 <span class="keywordflow">return</span> const_cast<concurrent_hash_map*>(<span class="keyword">this</span>)->lookup(<span class="comment">/*insert*/</span><span class="keyword">false</span>, key, NULL, &result, <span class="comment">/*write=*/</span><span class="keyword">false</span> );
<a name="l00853"></a>00853 }
<a name="l00854"></a>00854
<a name="l00856"></a>00856
-<a name="l00857"></a><a class="code" href="a00156.html#bce7bdf46435115a95cca2aa73c5da83">00857</a> <span class="keywordtype">bool</span> find( <a class="code" href="a00157.html">accessor</a> &result, <span class="keyword">const</span> Key &key ) {
-<a name="l00858"></a>00858 result.<a class="code" href="a00159.html#d5ce4f88d8870290238a8ad621e6f270">release</a>();
+<a name="l00857"></a><a class="code" href="a00155.html#bce7bdf46435115a95cca2aa73c5da83">00857</a> <span class="keywordtype">bool</span> find( <a class="code" href="a00156.html">accessor</a> &result, <span class="keyword">const</span> Key &key ) {
+<a name="l00858"></a>00858 result.<a class="code" href="a00158.html#d5ce4f88d8870290238a8ad621e6f270">release</a>();
<a name="l00859"></a>00859 <span class="keywordflow">return</span> lookup(<span class="comment">/*insert*/</span><span class="keyword">false</span>, key, NULL, &result, <span class="comment">/*write=*/</span><span class="keyword">true</span> );
<a name="l00860"></a>00860 }
<a name="l00861"></a>00861
<a name="l00863"></a>00863
-<a name="l00864"></a><a class="code" href="a00156.html#58c38b27273de6c670568633c0931854">00864</a> <span class="keywordtype">bool</span> insert( <a class="code" href="a00159.html">const_accessor</a> &result, <span class="keyword">const</span> Key &key ) {
-<a name="l00865"></a>00865 result.<a class="code" href="a00159.html#d5ce4f88d8870290238a8ad621e6f270">release</a>();
+<a name="l00864"></a><a class="code" href="a00155.html#58c38b27273de6c670568633c0931854">00864</a> <span class="keywordtype">bool</span> insert( <a class="code" href="a00158.html">const_accessor</a> &result, <span class="keyword">const</span> Key &key ) {
+<a name="l00865"></a>00865 result.<a class="code" href="a00158.html#d5ce4f88d8870290238a8ad621e6f270">release</a>();
<a name="l00866"></a>00866 <span class="keywordflow">return</span> lookup(<span class="comment">/*insert*/</span><span class="keyword">true</span>, key, NULL, &result, <span class="comment">/*write=*/</span><span class="keyword">false</span> );
<a name="l00867"></a>00867 }
<a name="l00868"></a>00868
<a name="l00870"></a>00870
-<a name="l00871"></a><a class="code" href="a00156.html#ccfecaa3e71d92be61fb3d811dd264eb">00871</a> <span class="keywordtype">bool</span> insert( <a class="code" href="a00157.html">accessor</a> &result, <span class="keyword">const</span> Key &key ) {
-<a name="l00872"></a>00872 result.<a class="code" href="a00159.html#d5ce4f88d8870290238a8ad621e6f270">release</a>();
+<a name="l00871"></a><a class="code" href="a00155.html#ccfecaa3e71d92be61fb3d811dd264eb">00871</a> <span class="keywordtype">bool</span> insert( <a class="code" href="a00156.html">accessor</a> &result, <span class="keyword">const</span> Key &key ) {
+<a name="l00872"></a>00872 result.<a class="code" href="a00158.html#d5ce4f88d8870290238a8ad621e6f270">release</a>();
<a name="l00873"></a>00873 <span class="keywordflow">return</span> lookup(<span class="comment">/*insert*/</span><span class="keyword">true</span>, key, NULL, &result, <span class="comment">/*write=*/</span><span class="keyword">true</span> );
<a name="l00874"></a>00874 }
<a name="l00875"></a>00875
<a name="l00877"></a>00877
-<a name="l00878"></a><a class="code" href="a00156.html#d4a2816129e38c53128c6d0c7b6b7370">00878</a> <span class="keywordtype">bool</span> insert( <a class="code" href="a00159.html">const_accessor</a> &result, <span class="keyword">const</span> value_type &value ) {
-<a name="l00879"></a>00879 result.<a class="code" href="a00159.html#d5ce4f88d8870290238a8ad621e6f270">release</a>();
+<a name="l00878"></a><a class="code" href="a00155.html#d4a2816129e38c53128c6d0c7b6b7370">00878</a> <span class="keywordtype">bool</span> insert( <a class="code" href="a00158.html">const_accessor</a> &result, <span class="keyword">const</span> value_type &value ) {
+<a name="l00879"></a>00879 result.<a class="code" href="a00158.html#d5ce4f88d8870290238a8ad621e6f270">release</a>();
<a name="l00880"></a>00880 <span class="keywordflow">return</span> lookup(<span class="comment">/*insert*/</span><span class="keyword">true</span>, value.first, &value.second, &result, <span class="comment">/*write=*/</span><span class="keyword">false</span> );
<a name="l00881"></a>00881 }
<a name="l00882"></a>00882
<a name="l00884"></a>00884
-<a name="l00885"></a><a class="code" href="a00156.html#a657e61cd2b13164764ca2708875784a">00885</a> <span class="keywordtype">bool</span> insert( <a class="code" href="a00157.html">accessor</a> &result, <span class="keyword">const</span> value_type &value ) {
-<a name="l00886"></a>00886 result.<a class="code" href="a00159.html#d5ce4f88d8870290238a8ad621e6f270">release</a>();
+<a name="l00885"></a><a class="code" href="a00155.html#a657e61cd2b13164764ca2708875784a">00885</a> <span class="keywordtype">bool</span> insert( <a class="code" href="a00156.html">accessor</a> &result, <span class="keyword">const</span> value_type &value ) {
+<a name="l00886"></a>00886 result.<a class="code" href="a00158.html#d5ce4f88d8870290238a8ad621e6f270">release</a>();
<a name="l00887"></a>00887 <span class="keywordflow">return</span> lookup(<span class="comment">/*insert*/</span><span class="keyword">true</span>, value.first, &value.second, &result, <span class="comment">/*write=*/</span><span class="keyword">true</span> );
<a name="l00888"></a>00888 }
<a name="l00889"></a>00889
<a name="l00891"></a>00891
-<a name="l00892"></a><a class="code" href="a00156.html#52bffd1066b3d7b793945bc6fa1a71a1">00892</a> <span class="keywordtype">bool</span> insert( <span class="keyword">const</span> value_type &value ) {
+<a name="l00892"></a><a class="code" href="a00155.html#52bffd1066b3d7b793945bc6fa1a71a1">00892</a> <span class="keywordtype">bool</span> insert( <span class="keyword">const</span> value_type &value ) {
<a name="l00893"></a>00893 <span class="keywordflow">return</span> lookup(<span class="comment">/*insert*/</span><span class="keyword">true</span>, value.first, &value.second, NULL, <span class="comment">/*write=*/</span><span class="keyword">false</span> );
<a name="l00894"></a>00894 }
<a name="l00895"></a>00895
<a name="l00897"></a>00897 <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l00898"></a><a class="code" href="a00156.html#cfe172677e5987004ef4a03e22fa338a">00898</a> <span class="keywordtype">void</span> insert(I first, I last) {
+<a name="l00898"></a><a class="code" href="a00155.html#cfe172677e5987004ef4a03e22fa338a">00898</a> <span class="keywordtype">void</span> insert(I first, I last) {
<a name="l00899"></a>00899 <span class="keywordflow">for</span>(; first != last; ++first)
<a name="l00900"></a>00900 insert( *first );
<a name="l00901"></a>00901 }
@@ -790,12 +790,12 @@
<a name="l00905"></a>00905 <span class="keywordtype">bool</span> erase( <span class="keyword">const</span> Key& key );
<a name="l00906"></a>00906
<a name="l00908"></a>00908
-<a name="l00909"></a><a class="code" href="a00156.html#da7e4a50f6bb06191817425ec85fe760">00909</a> <span class="keywordtype">bool</span> erase( <a class="code" href="a00159.html">const_accessor</a>& item_accessor ) {
+<a name="l00909"></a><a class="code" href="a00155.html#da7e4a50f6bb06191817425ec85fe760">00909</a> <span class="keywordtype">bool</span> erase( <a class="code" href="a00158.html">const_accessor</a>& item_accessor ) {
<a name="l00910"></a>00910 <span class="keywordflow">return</span> exclude( item_accessor, <span class="comment">/*readonly=*/</span> <span class="keyword">true</span> );
<a name="l00911"></a>00911 }
<a name="l00912"></a>00912
<a name="l00914"></a>00914
-<a name="l00915"></a><a class="code" href="a00156.html#0f500842d0cf791f8fa61662edb1b311">00915</a> <span class="keywordtype">bool</span> erase( <a class="code" href="a00157.html">accessor</a>& item_accessor ) {
+<a name="l00915"></a><a class="code" href="a00155.html#0f500842d0cf791f8fa61662edb1b311">00915</a> <span class="keywordtype">bool</span> erase( <a class="code" href="a00156.html">accessor</a>& item_accessor ) {
<a name="l00916"></a>00916 <span class="keywordflow">return</span> exclude( item_accessor, <span class="comment">/*readonly=*/</span> <span class="keyword">false</span> );
<a name="l00917"></a>00917 }
<a name="l00918"></a>00918
@@ -807,13 +807,13 @@
<a name="l00927"></a>00927 <span class="keyword">template</span><<span class="keyword">typename</span> I>
<a name="l00928"></a>00928 std::pair<I, I> internal_equal_range( <span class="keyword">const</span> Key& key, I end ) <span class="keyword">const</span>;
<a name="l00929"></a>00929
-<a name="l00931"></a>00931 <span class="keywordtype">void</span> internal_copy( <span class="keyword">const</span> <a class="code" href="a00156.html">concurrent_hash_map</a>& source );
+<a name="l00931"></a>00931 <span class="keywordtype">void</span> internal_copy( <span class="keyword">const</span> <a class="code" href="a00155.html">concurrent_hash_map</a>& source );
<a name="l00932"></a>00932
<a name="l00933"></a>00933 <span class="keyword">template</span><<span class="keyword">typename</span> I>
<a name="l00934"></a>00934 <span class="keywordtype">void</span> internal_copy(I first, I last);
<a name="l00935"></a>00935
<a name="l00937"></a>00937
-<a name="l00939"></a><a class="code" href="a00156.html#2f76ed101a0ccc8875b846c2f747897e">00939</a> const_pointer internal_fast_find( <span class="keyword">const</span> Key& key )<span class="keyword"> const </span>{
+<a name="l00939"></a><a class="code" href="a00155.html#2f76ed101a0ccc8875b846c2f747897e">00939</a> const_pointer internal_fast_find( <span class="keyword">const</span> Key& key )<span class="keyword"> const </span>{
<a name="l00940"></a>00940 hashcode_t h = my_hash_compare.hash( key );
<a name="l00941"></a>00941 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
<a name="l00942"></a>00942 <span class="preprocessor"></span> hashcode_t m = (hashcode_t) itt_load_pointer_with_acquire_v3( &my_mask );
@@ -855,8 +855,8 @@
<a name="l00978"></a>00978 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00979"></a>00979 <span class="preprocessor"></span>
<a name="l00980"></a>00980 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
-<a name="l00981"></a><a class="code" href="a00156.html#1f22480a290ddc6c145888d8f985531a">00981</a> <span class="keywordtype">bool</span> <a class="code" href="a00156.html">concurrent_hash_map<Key,T,HashCompare,A>::lookup</a>( <span class="keywordtype">bool</span> op_insert, <span class="keyword">const</span> Key &key, <span class="keyword">const</span> T *t, <a class="code" href="a00159.html">const_accessor</a> *result, <span class="keywordtype">bool</span> write ) {
-<a name="l00982"></a>00982 __TBB_ASSERT( !result || !result-><a class="code" href="a00159.html#74e5fd476c306e90361f3377f0fec6d8">my_node</a>, NULL );
+<a name="l00981"></a><a class="code" href="a00155.html#1f22480a290ddc6c145888d8f985531a">00981</a> <span class="keywordtype">bool</span> <a class="code" href="a00155.html">concurrent_hash_map<Key,T,HashCompare,A>::lookup</a>( <span class="keywordtype">bool</span> op_insert, <span class="keyword">const</span> Key &key, <span class="keyword">const</span> T *t, <a class="code" href="a00158.html">const_accessor</a> *result, <span class="keywordtype">bool</span> write ) {
+<a name="l00982"></a>00982 __TBB_ASSERT( !result || !result-><a class="code" href="a00158.html#74e5fd476c306e90361f3377f0fec6d8">my_node</a>, NULL );
<a name="l00983"></a>00983 segment_index_t grow_segment;
<a name="l00984"></a>00984 <span class="keywordtype">bool</span> return_value;
<a name="l00985"></a>00985 node *n, *tmp_n = 0;
@@ -871,7 +871,7 @@
<a name="l00994"></a>00994 __TBB_ASSERT((m&(m+1))==0, NULL);
<a name="l00995"></a>00995 return_value = <span class="keyword">false</span>;
<a name="l00996"></a>00996 <span class="comment">// get bucket</span>
-<a name="l00997"></a>00997 <a class="code" href="a00158.html">bucket_accessor</a> b( <span class="keyword">this</span>, h & m );
+<a name="l00997"></a>00997 <a class="code" href="a00157.html">bucket_accessor</a> b( <span class="keyword">this</span>, h & m );
<a name="l00998"></a>00998
<a name="l00999"></a>00999 <span class="comment">// find a node</span>
<a name="l01000"></a>01000 n = search_bucket( key, b() );
@@ -882,7 +882,7 @@
<a name="l01005"></a>01005 <span class="keywordflow">if</span>(t) tmp_n = <span class="keyword">new</span>( my_allocator ) node(key, *t);
<a name="l01006"></a>01006 <span class="keywordflow">else</span> tmp_n = <span class="keyword">new</span>( my_allocator ) node(key);
<a name="l01007"></a>01007 }
-<a name="l01008"></a>01008 <span class="keywordflow">if</span>( !b.<a class="code" href="a00158.html#fc194e3a186dc935a5fb513cc9f8e898">is_writer</a>() && !b.<a class="code" href="a00158.html#8f7f0dc61f528de29d06e6054b4a9835">upgrade_to_writer</a>() ) { <span class="comment">// TODO: improved insertion</span>
+<a name="l01008"></a>01008 <span class="keywordflow">if</span>( !b.<a class="code" href="a00157.html#fc194e3a186dc935a5fb513cc9f8e898">is_writer</a>() && !b.<a class="code" href="a00157.html#8f7f0dc61f528de29d06e6054b4a9835">upgrade_to_writer</a>() ) { <span class="comment">// TODO: improved insertion</span>
<a name="l01009"></a>01009 <span class="comment">// Rerun search_list, in case another thread inserted the item during the upgrade.</span>
<a name="l01010"></a>01010 n = search_bucket( key, b() );
<a name="l01011"></a>01011 <span class="keywordflow">if</span>( is_valid(n) ) { <span class="comment">// unfortunately, it did</span>
@@ -911,9 +911,9 @@
<a name="l01034"></a>01034 <span class="keywordflow">if</span>( !result ) <span class="keywordflow">goto</span> check_growth;
<a name="l01035"></a>01035 <span class="comment">// TODO: the following seems as generic/regular operation</span>
<a name="l01036"></a>01036 <span class="comment">// acquire the item</span>
-<a name="l01037"></a>01037 <span class="keywordflow">if</span>( !result-><a class="code" href="a00159.html#b57d7e72014cd2ae5a915606410615ce">my_lock</a>.try_acquire( n->mutex, write ) ) {
+<a name="l01037"></a>01037 <span class="keywordflow">if</span>( !result-><a class="code" href="a00158.html#b57d7e72014cd2ae5a915606410615ce">my_lock</a>.try_acquire( n->mutex, write ) ) {
<a name="l01038"></a>01038 <span class="comment">// we are unlucky, prepare for longer wait</span>
-<a name="l01039"></a>01039 <a class="code" href="a00145.html">tbb::internal::atomic_backoff</a> trials;
+<a name="l01039"></a>01039 <a class="code" href="a00144.html">tbb::internal::atomic_backoff</a> trials;
<a name="l01040"></a>01040 <span class="keywordflow">do</span> {
<a name="l01041"></a>01041 <span class="keywordflow">if</span>( !trials.bounded_pause() ) {
<a name="l01042"></a>01042 <span class="comment">// the wait takes really long, restart the operation</span>
@@ -927,11 +927,11 @@
<a name="l01050"></a>01050 <span class="preprocessor">#endif</span>
<a name="l01051"></a>01051 <span class="preprocessor"></span> <span class="keywordflow">goto</span> restart;
<a name="l01052"></a>01052 }
-<a name="l01053"></a>01053 } <span class="keywordflow">while</span>( !result-><a class="code" href="a00159.html#b57d7e72014cd2ae5a915606410615ce">my_lock</a>.try_acquire( n->mutex, write ) );
+<a name="l01053"></a>01053 } <span class="keywordflow">while</span>( !result-><a class="code" href="a00158.html#b57d7e72014cd2ae5a915606410615ce">my_lock</a>.try_acquire( n->mutex, write ) );
<a name="l01054"></a>01054 }
<a name="l01055"></a>01055 }<span class="comment">//lock scope</span>
-<a name="l01056"></a>01056 result-><a class="code" href="a00159.html#74e5fd476c306e90361f3377f0fec6d8">my_node</a> = n;
-<a name="l01057"></a>01057 result-><a class="code" href="a00159.html#88e677d4e26a67d65d81af524ddd483a">my_hash</a> = h;
+<a name="l01056"></a>01056 result-><a class="code" href="a00158.html#74e5fd476c306e90361f3377f0fec6d8">my_node</a> = n;
+<a name="l01057"></a>01057 result-><a class="code" href="a00158.html#88e677d4e26a67d65d81af524ddd483a">my_hash</a> = h;
<a name="l01058"></a>01058 check_growth:
<a name="l01059"></a>01059 <span class="comment">// [opt] grow the container</span>
<a name="l01060"></a>01060 <span class="keywordflow">if</span>( grow_segment )
@@ -943,7 +943,7 @@
<a name="l01066"></a>01066
<a name="l01067"></a>01067 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
<a name="l01068"></a>01068 <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l01069"></a><a class="code" href="a00156.html#976c57edfb7f22b9f91a2e11f141eb4a">01069</a> std::pair<I, I> <a class="code" href="a00156.html">concurrent_hash_map<Key,T,HashCompare,A>::internal_equal_range</a>( <span class="keyword">const</span> Key& key, I end_ )<span class="keyword"> const </span>{
+<a name="l01069"></a><a class="code" href="a00155.html#976c57edfb7f22b9f91a2e11f141eb4a">01069</a> std::pair<I, I> <a class="code" href="a00155.html">concurrent_hash_map<Key,T,HashCompare,A>::internal_equal_range</a>( <span class="keyword">const</span> Key& key, I end_ )<span class="keyword"> const </span>{
<a name="l01070"></a>01070 hashcode_t h = my_hash_compare.hash( key );
<a name="l01071"></a>01071 hashcode_t m = my_mask;
<a name="l01072"></a>01072 __TBB_ASSERT((m&(m+1))==0, NULL);
@@ -961,11 +961,11 @@
<a name="l01084"></a>01084 }
<a name="l01085"></a>01085
<a name="l01086"></a>01086 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
-<a name="l01087"></a><a class="code" href="a00156.html#faad2108bd2be75e52293486af59f11e">01087</a> <span class="keywordtype">bool</span> <a class="code" href="a00156.html">concurrent_hash_map<Key,T,HashCompare,A>::exclude</a>( <a class="code" href="a00159.html">const_accessor</a> &item_accessor, <span class="keywordtype">bool</span> readonly ) {
-<a name="l01088"></a>01088 __TBB_ASSERT( item_accessor.<a class="code" href="a00159.html#74e5fd476c306e90361f3377f0fec6d8">my_node</a>, NULL );
-<a name="l01089"></a>01089 node_base *<span class="keyword">const</span> n = item_accessor.<a class="code" href="a00159.html#74e5fd476c306e90361f3377f0fec6d8">my_node</a>;
-<a name="l01090"></a>01090 item_accessor.<a class="code" href="a00159.html#74e5fd476c306e90361f3377f0fec6d8">my_node</a> = NULL; <span class="comment">// we ought release accessor anyway</span>
-<a name="l01091"></a>01091 hashcode_t <span class="keyword">const</span> h = item_accessor.<a class="code" href="a00159.html#88e677d4e26a67d65d81af524ddd483a">my_hash</a>;
+<a name="l01087"></a><a class="code" href="a00155.html#faad2108bd2be75e52293486af59f11e">01087</a> <span class="keywordtype">bool</span> <a class="code" href="a00155.html">concurrent_hash_map<Key,T,HashCompare,A>::exclude</a>( <a class="code" href="a00158.html">const_accessor</a> &item_accessor, <span class="keywordtype">bool</span> readonly ) {
+<a name="l01088"></a>01088 __TBB_ASSERT( item_accessor.<a class="code" href="a00158.html#74e5fd476c306e90361f3377f0fec6d8">my_node</a>, NULL );
+<a name="l01089"></a>01089 node_base *<span class="keyword">const</span> n = item_accessor.<a class="code" href="a00158.html#74e5fd476c306e90361f3377f0fec6d8">my_node</a>;
+<a name="l01090"></a>01090 item_accessor.<a class="code" href="a00158.html#74e5fd476c306e90361f3377f0fec6d8">my_node</a> = NULL; <span class="comment">// we ought release accessor anyway</span>
+<a name="l01091"></a>01091 hashcode_t <span class="keyword">const</span> h = item_accessor.<a class="code" href="a00158.html#88e677d4e26a67d65d81af524ddd483a">my_hash</a>;
<a name="l01092"></a>01092 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
<a name="l01093"></a>01093 <span class="preprocessor"></span> hashcode_t m = (hashcode_t) itt_load_pointer_with_acquire_v3( &my_mask );
<a name="l01094"></a>01094 <span class="preprocessor">#else</span>
@@ -973,14 +973,14 @@
<a name="l01096"></a>01096 <span class="preprocessor">#endif</span>
<a name="l01097"></a>01097 <span class="preprocessor"></span> <span class="keywordflow">do</span> {
<a name="l01098"></a>01098 <span class="comment">// get bucket</span>
-<a name="l01099"></a>01099 <a class="code" href="a00158.html">bucket_accessor</a> b( <span class="keyword">this</span>, h & m, <span class="comment">/*writer=*/</span><span class="keyword">true</span> );
+<a name="l01099"></a>01099 <a class="code" href="a00157.html">bucket_accessor</a> b( <span class="keyword">this</span>, h & m, <span class="comment">/*writer=*/</span><span class="keyword">true</span> );
<a name="l01100"></a>01100 node_base **p = &b()->node_list;
<a name="l01101"></a>01101 <span class="keywordflow">while</span>( *p && *p != n )
<a name="l01102"></a>01102 p = &(*p)->next;
<a name="l01103"></a>01103 <span class="keywordflow">if</span>( !*p ) { <span class="comment">// someone else was the first</span>
<a name="l01104"></a>01104 <span class="keywordflow">if</span>( check_mask_race( h, m ) )
<a name="l01105"></a>01105 <span class="keywordflow">continue</span>;
-<a name="l01106"></a>01106 item_accessor.<a class="code" href="a00159.html#b57d7e72014cd2ae5a915606410615ce">my_lock</a>.release();
+<a name="l01106"></a>01106 item_accessor.<a class="code" href="a00158.html#b57d7e72014cd2ae5a915606410615ce">my_lock</a>.release();
<a name="l01107"></a>01107 <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l01108"></a>01108 }
<a name="l01109"></a>01109 __TBB_ASSERT( *p == n, NULL );
@@ -989,14 +989,14 @@
<a name="l01112"></a>01112 <span class="keywordflow">break</span>;
<a name="l01113"></a>01113 } <span class="keywordflow">while</span>(<span class="keyword">true</span>);
<a name="l01114"></a>01114 <span class="keywordflow">if</span>( readonly ) <span class="comment">// need to get exclusive lock</span>
-<a name="l01115"></a>01115 item_accessor.<a class="code" href="a00159.html#b57d7e72014cd2ae5a915606410615ce">my_lock</a>.upgrade_to_writer(); <span class="comment">// return value means nothing here</span>
-<a name="l01116"></a>01116 item_accessor.<a class="code" href="a00159.html#b57d7e72014cd2ae5a915606410615ce">my_lock</a>.release();
+<a name="l01115"></a>01115 item_accessor.<a class="code" href="a00158.html#b57d7e72014cd2ae5a915606410615ce">my_lock</a>.upgrade_to_writer(); <span class="comment">// return value means nothing here</span>
+<a name="l01116"></a>01116 item_accessor.<a class="code" href="a00158.html#b57d7e72014cd2ae5a915606410615ce">my_lock</a>.release();
<a name="l01117"></a>01117 delete_node( n ); <span class="comment">// Only one thread can delete it due to write lock on the chain_mutex</span>
<a name="l01118"></a>01118 <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l01119"></a>01119 }
<a name="l01120"></a>01120
<a name="l01121"></a>01121 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
-<a name="l01122"></a><a class="code" href="a00156.html#034c3b3ee419edee78e0f2f2b1f0d7ca">01122</a> <span class="keywordtype">bool</span> <a class="code" href="a00156.html">concurrent_hash_map<Key,T,HashCompare,A>::erase</a>( <span class="keyword">const</span> Key &key ) {
+<a name="l01122"></a><a class="code" href="a00155.html#034c3b3ee419edee78e0f2f2b1f0d7ca">01122</a> <span class="keywordtype">bool</span> <a class="code" href="a00155.html">concurrent_hash_map<Key,T,HashCompare,A>::erase</a>( <span class="keyword">const</span> Key &key ) {
<a name="l01123"></a>01123 node_base *n;
<a name="l01124"></a>01124 hashcode_t <span class="keyword">const</span> h = my_hash_compare.hash( key );
<a name="l01125"></a>01125 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
@@ -1007,7 +1007,7 @@
<a name="l01130"></a>01130 <span class="preprocessor"></span>restart:
<a name="l01131"></a>01131 {<span class="comment">//lock scope</span>
<a name="l01132"></a>01132 <span class="comment">// get bucket</span>
-<a name="l01133"></a>01133 <a class="code" href="a00158.html">bucket_accessor</a> b( <span class="keyword">this</span>, h & m );
+<a name="l01133"></a>01133 <a class="code" href="a00157.html">bucket_accessor</a> b( <span class="keyword">this</span>, h & m );
<a name="l01134"></a>01134 search:
<a name="l01135"></a>01135 node_base **p = &b()->node_list;
<a name="l01136"></a>01136 n = *p;
@@ -1020,7 +1020,7 @@
<a name="l01143"></a>01143 <span class="keywordflow">goto</span> restart;
<a name="l01144"></a>01144 <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l01145"></a>01145 }
-<a name="l01146"></a>01146 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( !b.<a class="code" href="a00158.html#fc194e3a186dc935a5fb513cc9f8e898">is_writer</a>() && !b.<a class="code" href="a00158.html#8f7f0dc61f528de29d06e6054b4a9835">upgrade_to_writer</a>() ) {
+<a name="l01146"></a>01146 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( !b.<a class="code" href="a00157.html#fc194e3a186dc935a5fb513cc9f8e898">is_writer</a>() && !b.<a class="code" href="a00157.html#8f7f0dc61f528de29d06e6054b4a9835">upgrade_to_writer</a>() ) {
<a name="l01147"></a>01147 <span class="keywordflow">if</span>( check_mask_race( h, m ) ) <span class="comment">// contended upgrade, check mask</span>
<a name="l01148"></a>01148 <span class="keywordflow">goto</span> restart;
<a name="l01149"></a>01149 <span class="keywordflow">goto</span> search;
@@ -1037,14 +1037,14 @@
<a name="l01160"></a>01160 }
<a name="l01161"></a>01161
<a name="l01162"></a>01162 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
-<a name="l01163"></a>01163 <span class="keywordtype">void</span> <a class="code" href="a00156.html">concurrent_hash_map<Key,T,HashCompare,A>::swap</a>(<a class="code" href="a00156.html">concurrent_hash_map<Key,T,HashCompare,A></a> &table) {
-<a name="l01164"></a>01164 std::swap(this->my_allocator, table.<a class="code" href="a00156.html#252e91d8029f6308db7179557e3b1436">my_allocator</a>);
-<a name="l01165"></a>01165 std::swap(this->my_hash_compare, table.<a class="code" href="a00156.html#f738f241c8500ce3dbf0f9028ca8b602">my_hash_compare</a>);
+<a name="l01163"></a>01163 <span class="keywordtype">void</span> <a class="code" href="a00155.html">concurrent_hash_map<Key,T,HashCompare,A>::swap</a>(<a class="code" href="a00155.html">concurrent_hash_map<Key,T,HashCompare,A></a> &table) {
+<a name="l01164"></a>01164 std::swap(this->my_allocator, table.<a class="code" href="a00155.html#252e91d8029f6308db7179557e3b1436">my_allocator</a>);
+<a name="l01165"></a>01165 std::swap(this->my_hash_compare, table.<a class="code" href="a00155.html#f738f241c8500ce3dbf0f9028ca8b602">my_hash_compare</a>);
<a name="l01166"></a>01166 internal_swap(table);
<a name="l01167"></a>01167 }
<a name="l01168"></a>01168
<a name="l01169"></a>01169 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
-<a name="l01170"></a><a class="code" href="a00156.html#13f3f2e8de7564be03882c31559493c9">01170</a> <span class="keywordtype">void</span> <a class="code" href="a00156.html">concurrent_hash_map<Key,T,HashCompare,A>::rehash</a>(size_type sz) {
+<a name="l01170"></a><a class="code" href="a00155.html#13f3f2e8de7564be03882c31559493c9">01170</a> <span class="keywordtype">void</span> <a class="code" href="a00155.html">concurrent_hash_map<Key,T,HashCompare,A>::rehash</a>(size_type sz) {
<a name="l01171"></a>01171 reserve( sz ); <span class="comment">// TODO: add reduction of number of buckets as well</span>
<a name="l01172"></a>01172 hashcode_t mask = my_mask;
<a name="l01173"></a>01173 hashcode_t b = (mask+1)>>1; <span class="comment">// size or first index of the last segment</span>
@@ -1110,7 +1110,7 @@
<a name="l01233"></a>01233 <span class="preprocessor"></span>}
<a name="l01234"></a>01234
<a name="l01235"></a>01235 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
-<a name="l01236"></a><a class="code" href="a00156.html#a9f89be8fe28835749529d91081a2511">01236</a> <span class="keywordtype">void</span> <a class="code" href="a00156.html">concurrent_hash_map<Key,T,HashCompare,A>::clear</a>() {
+<a name="l01236"></a><a class="code" href="a00155.html#a9f89be8fe28835749529d91081a2511">01236</a> <span class="keywordtype">void</span> <a class="code" href="a00155.html">concurrent_hash_map<Key,T,HashCompare,A>::clear</a>() {
<a name="l01237"></a>01237 hashcode_t m = my_mask;
<a name="l01238"></a>01238 __TBB_ASSERT((m&(m+1))==0, NULL);
<a name="l01239"></a>01239 <span class="preprocessor">#if TBB_USE_ASSERT || TBB_USE_PERFORMANCE_WARNINGS</span>
@@ -1153,7 +1153,7 @@
<a name="l01276"></a>01276 <span class="preprocessor"></span> my_size = 0;
<a name="l01277"></a>01277 segment_index_t s = segment_index_of( m );
<a name="l01278"></a>01278 __TBB_ASSERT( s+1 == pointers_per_table || !my_table[s+1], <span class="stringliteral">"wrong mask or concurrent grow"</span> );
-<a name="l01279"></a>01279 <a class="code" href="a00151.html">cache_aligned_allocator<bucket></a> alloc;
+<a name="l01279"></a>01279 <a class="code" href="a00150.html">cache_aligned_allocator<bucket></a> alloc;
<a name="l01280"></a>01280 <span class="keywordflow">do</span> {
<a name="l01281"></a>01281 __TBB_ASSERT( is_valid( my_table[s] ), <span class="stringliteral">"wrong mask or concurrent grow"</span> );
<a name="l01282"></a>01282 segment_ptr_t buckets_ptr = my_table[s];
@@ -1164,16 +1164,16 @@
<a name="l01287"></a>01287 delete_node( n );
<a name="l01288"></a>01288 }
<a name="l01289"></a>01289 <span class="keywordflow">if</span>( s >= first_block) <span class="comment">// the first segment or the next</span>
-<a name="l01290"></a>01290 alloc.<a class="code" href="a00151.html#3d4eadf188f7d85d3805ae534e0b8e1c">deallocate</a>( buckets_ptr, sz );
+<a name="l01290"></a>01290 alloc.<a class="code" href="a00150.html#3d4eadf188f7d85d3805ae534e0b8e1c">deallocate</a>( buckets_ptr, sz );
<a name="l01291"></a>01291 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( s == embedded_block && embedded_block != first_block )
-<a name="l01292"></a>01292 alloc.<a class="code" href="a00151.html#3d4eadf188f7d85d3805ae534e0b8e1c">deallocate</a>( buckets_ptr, segment_size(first_block)-embedded_buckets );
+<a name="l01292"></a>01292 alloc.<a class="code" href="a00150.html#3d4eadf188f7d85d3805ae534e0b8e1c">deallocate</a>( buckets_ptr, segment_size(first_block)-embedded_buckets );
<a name="l01293"></a>01293 <span class="keywordflow">if</span>( s >= embedded_block ) my_table[s] = 0;
<a name="l01294"></a>01294 } <span class="keywordflow">while</span>(s-- > 0);
<a name="l01295"></a>01295 my_mask = embedded_buckets - 1;
<a name="l01296"></a>01296 }
<a name="l01297"></a>01297
<a name="l01298"></a>01298 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
-<a name="l01299"></a><a class="code" href="a00156.html#3c27779fe66b79505390d084310d997e">01299</a> <span class="keywordtype">void</span> <a class="code" href="a00156.html">concurrent_hash_map<Key,T,HashCompare,A>::internal_copy</a>( <span class="keyword">const</span> <a class="code" href="a00156.html">concurrent_hash_map</a>& source ) {
+<a name="l01299"></a><a class="code" href="a00155.html#3c27779fe66b79505390d084310d997e">01299</a> <span class="keywordtype">void</span> <a class="code" href="a00155.html">concurrent_hash_map<Key,T,HashCompare,A>::internal_copy</a>( <span class="keyword">const</span> <a class="code" href="a00155.html">concurrent_hash_map</a>& source ) {
<a name="l01300"></a>01300 reserve( source.my_size ); <span class="comment">// TODO: load_factor?</span>
<a name="l01301"></a>01301 hashcode_t mask = source.my_mask;
<a name="l01302"></a>01302 <span class="keywordflow">if</span>( my_mask == mask ) { <span class="comment">// optimized version</span>
@@ -1192,13 +1192,13 @@
<a name="l01315"></a>01315 ++my_size; <span class="comment">// TODO: replace by non-atomic op</span>
<a name="l01316"></a>01316 }
<a name="l01317"></a>01317 }
-<a name="l01318"></a>01318 <span class="keywordflow">if</span>( rehash_required ) <a class="code" href="a00156.html#13f3f2e8de7564be03882c31559493c9">rehash</a>();
-<a name="l01319"></a>01319 } <span class="keywordflow">else</span> <a class="code" href="a00156.html#3c27779fe66b79505390d084310d997e">internal_copy</a>( source.<a class="code" href="a00156.html#4a3c58cf1234b74ca796dcf555d32f53">begin</a>(), source.<a class="code" href="a00156.html#28c690486d8db5783475f5b1a59d21bc">end</a>() );
+<a name="l01318"></a>01318 <span class="keywordflow">if</span>( rehash_required ) <a class="code" href="a00155.html#13f3f2e8de7564be03882c31559493c9">rehash</a>();
+<a name="l01319"></a>01319 } <span class="keywordflow">else</span> <a class="code" href="a00155.html#3c27779fe66b79505390d084310d997e">internal_copy</a>( source.<a class="code" href="a00155.html#4a3c58cf1234b74ca796dcf555d32f53">begin</a>(), source.<a class="code" href="a00155.html#28c690486d8db5783475f5b1a59d21bc">end</a>() );
<a name="l01320"></a>01320 }
<a name="l01321"></a>01321
<a name="l01322"></a>01322 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
<a name="l01323"></a>01323 <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l01324"></a>01324 <span class="keywordtype">void</span> <a class="code" href="a00156.html">concurrent_hash_map<Key,T,HashCompare,A>::internal_copy</a>(I first, I last) {
+<a name="l01324"></a>01324 <span class="keywordtype">void</span> <a class="code" href="a00155.html">concurrent_hash_map<Key,T,HashCompare,A>::internal_copy</a>(I first, I last) {
<a name="l01325"></a>01325 hashcode_t m = my_mask;
<a name="l01326"></a>01326 <span class="keywordflow">for</span>(; first != last; ++first) {
<a name="l01327"></a>01327 hashcode_t h = my_hash_compare.hash( first->first );
diff --git a/doc/html/a00335.html b/doc/html/a00335.html
deleted file mode 100644
index 243821a..0000000
--- a/doc/html/a00335.html
+++ /dev/null
@@ -1,365 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>concurrent_queue.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>concurrent_queue.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_concurrent_queue_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_concurrent_queue_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "_concurrent_queue_internal.h"</span>
-<a name="l00025"></a>00025
-<a name="l00026"></a>00026 <span class="keyword">namespace </span>tbb {
-<a name="l00027"></a>00027
-<a name="l00028"></a>00028 <span class="keyword">namespace </span>strict_ppl {
-<a name="l00029"></a>00029
-<a name="l00031"></a>00031
-<a name="l00034"></a>00034 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> A = cache_aligned_allocator<T> >
-<a name="l00035"></a><a class="code" href="a00160.html">00035</a> <span class="keyword">class </span><a class="code" href="a00160.html">concurrent_queue</a>: <span class="keyword">public</span> internal::concurrent_queue_base_v3<T> {
-<a name="l00036"></a>00036 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value> <span class="keyword">friend</span> <span class="keyword">class </span>internal::concurrent_queue_iterator;
-<a name="l00037"></a>00037
-<a name="l00039"></a>00039 <span class="keyword">typedef</span> <span class="keyword">typename</span> A::template rebind<char>::other page_allocator_type;
-<a name="l00040"></a>00040 page_allocator_type my_allocator;
-<a name="l00041"></a>00041
-<a name="l00043"></a>00043 <span class="comment">/*overide*/</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> *allocate_block( size_t n ) {
-<a name="l00044"></a>00044 <span class="keywordtype">void</span> *b = reinterpret_cast<void*>(my_allocator.allocate( n ));
-<a name="l00045"></a>00045 <span class="keywordflow">if</span>( !b )
-<a name="l00046"></a>00046 internal::throw_exception(internal::eid_bad_alloc);
-<a name="l00047"></a>00047 <span class="keywordflow">return</span> b;
-<a name="l00048"></a>00048 }
-<a name="l00049"></a>00049
-<a name="l00051"></a>00051 <span class="comment">/*override*/</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> deallocate_block( <span class="keywordtype">void</span> *b, size_t n ) {
-<a name="l00052"></a>00052 my_allocator.deallocate( reinterpret_cast<char*>(b), n );
-<a name="l00053"></a>00053 }
-<a name="l00054"></a>00054
-<a name="l00055"></a>00055 <span class="keyword">public</span>:
-<a name="l00057"></a><a class="code" href="a00160.html#682c3978d5cb0620000994f11c44a476">00057</a> <span class="keyword">typedef</span> T <a class="code" href="a00160.html#682c3978d5cb0620000994f11c44a476">value_type</a>;
-<a name="l00058"></a>00058
-<a name="l00060"></a><a class="code" href="a00160.html#a8d725c50a9834bb7af5b67c0aff92b8">00060</a> <span class="keyword">typedef</span> T& <a class="code" href="a00160.html#a8d725c50a9834bb7af5b67c0aff92b8">reference</a>;
-<a name="l00061"></a>00061
-<a name="l00063"></a><a class="code" href="a00160.html#4d48e7ff93f81636bca2c74f7da34750">00063</a> <span class="keyword">typedef</span> <span class="keyword">const</span> T& <a class="code" href="a00160.html#4d48e7ff93f81636bca2c74f7da34750">const_reference</a>;
-<a name="l00064"></a>00064
-<a name="l00066"></a><a class="code" href="a00160.html#8fc30e93f8342a1960357f71e4fe8a2b">00066</a> <span class="keyword">typedef</span> size_t <a class="code" href="a00160.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a>;
-<a name="l00067"></a>00067
-<a name="l00069"></a><a class="code" href="a00160.html#068576d16c7e4e05d52f9db7a45b5b65">00069</a> <span class="keyword">typedef</span> ptrdiff_t <a class="code" href="a00160.html#068576d16c7e4e05d52f9db7a45b5b65">difference_type</a>;
-<a name="l00070"></a>00070
-<a name="l00072"></a><a class="code" href="a00160.html#5a3956341728eaa558d8827063718cac">00072</a> <span class="keyword">typedef</span> A <a class="code" href="a00160.html#5a3956341728eaa558d8827063718cac">allocator_type</a>;
-<a name="l00073"></a>00073
-<a name="l00075"></a><a class="code" href="a00160.html#7c48a05a94a1f4f98fdfadfbef98ecf6">00075</a> <span class="keyword">explicit</span> <a class="code" href="a00160.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>(<span class="keyword">const</span> <a class="code" href="a00160.html#5a3956341728eaa558d8827063718cac">allocator_type</a>& a = <a class="code" href="a00160.html#5a3956341728eaa558d8827063718cac">allocator_type</a>()) :
-<a name="l00076"></a>00076 my_allocator( a )
-<a name="l00077"></a>00077 {
-<a name="l00078"></a>00078 }
-<a name="l00079"></a>00079
-<a name="l00081"></a>00081 <span class="keyword">template</span><<span class="keyword">typename</span> InputIterator>
-<a name="l00082"></a><a class="code" href="a00160.html#25209656c84f2f9b030e2f9162713341">00082</a> <a class="code" href="a00160.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>( InputIterator begin, InputIterator end, <span class="keyword">const</span> <a class="code" href="a00160.html#5a3956341728eaa558d8827063718cac">allocator_type</a>& a = <a class="code" href="a00160.html#5a3956341728eaa558d8827063718cac">allocator_type</a>()) :
-<a name="l00083"></a>00083 my_allocator( a )
-<a name="l00084"></a>00084 {
-<a name="l00085"></a>00085 <span class="keywordflow">for</span>( ; begin != end; ++begin )
-<a name="l00086"></a>00086 internal_push(&*begin);
-<a name="l00087"></a>00087 }
-<a name="l00088"></a>00088
-<a name="l00090"></a><a class="code" href="a00160.html#8a6b98ea11a867db8ac868f0113ca429">00090</a> <a class="code" href="a00160.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>( <span class="keyword">const</span> <a class="code" href="a00160.html">concurrent_queue</a>& src, <span class="keyword">const</span> <a class="code" href="a00160.html#5a3956341728eaa558d8827063718cac">allocator_type</a>& a = <a class="code" href="a00160.html#5a3956341728eaa558d8827063718cac" [...]
-<a name="l00091"></a>00091 internal::concurrent_queue_base_v3<T>(), my_allocator( a )
-<a name="l00092"></a>00092 {
-<a name="l00093"></a>00093 assign( src );
-<a name="l00094"></a>00094 }
-<a name="l00095"></a>00095
-<a name="l00097"></a>00097 <a class="code" href="a00160.html#830b33753d6b149c366344e29b2edd8c">~concurrent_queue</a>();
-<a name="l00098"></a>00098
-<a name="l00100"></a><a class="code" href="a00160.html#73c47563ffcc4c2f6452f25a04ebe2e2">00100</a> <span class="keywordtype">void</span> <a class="code" href="a00160.html#73c47563ffcc4c2f6452f25a04ebe2e2">push</a>( <span class="keyword">const</span> T& source ) {
-<a name="l00101"></a>00101 internal_push( &source );
-<a name="l00102"></a>00102 }
-<a name="l00103"></a>00103
-<a name="l00105"></a>00105
-<a name="l00107"></a><a class="code" href="a00160.html#ae31ca0db34ef96ef1e74aa0d28c95f8">00107</a> <span class="keywordtype">bool</span> <a class="code" href="a00160.html#ae31ca0db34ef96ef1e74aa0d28c95f8">try_pop</a>( T& result ) {
-<a name="l00108"></a>00108 <span class="keywordflow">return</span> internal_try_pop( &result );
-<a name="l00109"></a>00109 }
-<a name="l00110"></a>00110
-<a name="l00112"></a><a class="code" href="a00160.html#eaa35a5274606779802e9a669a706260">00112</a> <a class="code" href="a00160.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a> <a class="code" href="a00160.html#eaa35a5274606779802e9a669a706260">unsafe_size</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> this->internal_size();}
-<a name="l00113"></a>00113
-<a name="l00115"></a><a class="code" href="a00160.html#f3f6fce0cfa2d581d6f3b47e0613ad64">00115</a> <span class="keywordtype">bool</span> <a class="code" href="a00160.html#f3f6fce0cfa2d581d6f3b47e0613ad64">empty</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> this->internal_empty();}
-<a name="l00116"></a>00116
-<a name="l00118"></a>00118 <span class="keywordtype">void</span> <a class="code" href="a00160.html#c32e8e84c0524155133b4aae32d2a827">clear</a>() ;
-<a name="l00119"></a>00119
-<a name="l00121"></a><a class="code" href="a00160.html#f034f70caef445fe8abc9113ec926a8d">00121</a> <a class="code" href="a00160.html#5a3956341728eaa558d8827063718cac">allocator_type</a> <a class="code" href="a00160.html#f034f70caef445fe8abc9113ec926a8d">get_allocator</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> this->my_allocator; }
-<a name="l00122"></a>00122
-<a name="l00123"></a>00123 <span class="keyword">typedef</span> internal::concurrent_queue_iterator<concurrent_queue,T> iterator;
-<a name="l00124"></a>00124 <span class="keyword">typedef</span> internal::concurrent_queue_iterator<concurrent_queue,const T> const_iterator;
-<a name="l00125"></a>00125
-<a name="l00126"></a>00126 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00127"></a>00127 <span class="comment">// The iterators are intended only for debugging. They are slow and not thread safe.</span>
-<a name="l00128"></a>00128 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00129"></a>00129 iterator unsafe_begin() {<span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>);}
-<a name="l00130"></a>00130 iterator unsafe_end() {<span class="keywordflow">return</span> iterator();}
-<a name="l00131"></a>00131 const_iterator unsafe_begin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>);}
-<a name="l00132"></a>00132 const_iterator unsafe_end()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator();}
-<a name="l00133"></a>00133 } ;
-<a name="l00134"></a>00134
-<a name="l00135"></a>00135 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00136"></a><a class="code" href="a00160.html#830b33753d6b149c366344e29b2edd8c">00136</a> <a class="code" href="a00160.html">concurrent_queue<T,A>::~concurrent_queue</a>() {
-<a name="l00137"></a>00137 <a class="code" href="a00160.html#c32e8e84c0524155133b4aae32d2a827">clear</a>();
-<a name="l00138"></a>00138 this->internal_finish_clear();
-<a name="l00139"></a>00139 }
-<a name="l00140"></a>00140
-<a name="l00141"></a>00141 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00142"></a><a class="code" href="a00160.html#c32e8e84c0524155133b4aae32d2a827">00142</a> <span class="keywordtype">void</span> <a class="code" href="a00160.html">concurrent_queue<T,A>::clear</a>() {
-<a name="l00143"></a>00143 <span class="keywordflow">while</span>( !<a class="code" href="a00160.html#f3f6fce0cfa2d581d6f3b47e0613ad64">empty</a>() ) {
-<a name="l00144"></a>00144 T value;
-<a name="l00145"></a>00145 this->internal_try_pop(&value);
-<a name="l00146"></a>00146 }
-<a name="l00147"></a>00147 }
-<a name="l00148"></a>00148
-<a name="l00149"></a>00149 } <span class="comment">// namespace strict_ppl</span>
-<a name="l00150"></a>00150
-<a name="l00152"></a>00152
-<a name="l00157"></a>00157 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A = cache_aligned_allocator<T> >
-<a name="l00158"></a><a class="code" href="a00155.html">00158</a> <span class="keyword">class </span><a class="code" href="a00155.html">concurrent_bounded_queue</a>: <span class="keyword">public</span> internal::concurrent_queue_base_v3 {
-<a name="l00159"></a>00159 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value> <span class="keyword">friend</span> <span class="keyword">class </span>internal::concurrent_queue_iterator;
-<a name="l00160"></a>00160
-<a name="l00162"></a>00162 <span class="keyword">typedef</span> <span class="keyword">typename</span> A::template rebind<char>::other page_allocator_type;
-<a name="l00163"></a>00163 page_allocator_type my_allocator;
-<a name="l00164"></a>00164
-<a name="l00165"></a>00165 <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_queue_base_v3::padded_page<T> padded_page;
-<a name="l00166"></a>00166
-<a name="l00168"></a>00168 <span class="keyword">class </span>destroyer: internal::no_copy {
-<a name="l00169"></a>00169 T& my_value;
-<a name="l00170"></a>00170 <span class="keyword">public</span>:
-<a name="l00171"></a>00171 destroyer( T& value ) : my_value(value) {}
-<a name="l00172"></a>00172 ~destroyer() {my_value.~T();}
-<a name="l00173"></a>00173 };
-<a name="l00174"></a>00174
-<a name="l00175"></a>00175 T& get_ref( page& p, size_t index ) {
-<a name="l00176"></a>00176 __TBB_ASSERT( index<items_per_page, NULL );
-<a name="l00177"></a>00177 <span class="keywordflow">return</span> (&static_cast<padded_page*>(static_cast<void*>(&p))->last)[index];
-<a name="l00178"></a>00178 }
-<a name="l00179"></a>00179
-<a name="l00180"></a>00180 <span class="comment">/*override*/</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> copy_item( page& dst, size_t index, <span class="keyword">const</span> <span class="keywordtype">void</span>* src ) {
-<a name="l00181"></a>00181 <span class="keyword">new</span>( &get_ref(dst,index) ) T(*static_cast<const T*>(src));
-<a name="l00182"></a>00182 }
-<a name="l00183"></a>00183
-<a name="l00184"></a>00184 <span class="comment">/*override*/</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> copy_page_item( page& dst, size_t dindex, <span class="keyword">const</span> page& src, size_t sindex ) {
-<a name="l00185"></a>00185 <span class="keyword">new</span>( &get_ref(dst,dindex) ) T( get_ref( const_cast<page&>(src), sindex ) );
-<a name="l00186"></a>00186 }
-<a name="l00187"></a>00187
-<a name="l00188"></a>00188 <span class="comment">/*override*/</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> assign_and_destroy_item( <span class="keywordtype">void</span>* dst, page& src, size_t index ) {
-<a name="l00189"></a>00189 T& from = get_ref(src,index);
-<a name="l00190"></a>00190 destroyer d(from);
-<a name="l00191"></a>00191 *static_cast<T*>(dst) = from;
-<a name="l00192"></a>00192 }
-<a name="l00193"></a>00193
-<a name="l00194"></a>00194 <span class="comment">/*overide*/</span> <span class="keyword">virtual</span> page *allocate_page() {
-<a name="l00195"></a>00195 size_t n = <span class="keyword">sizeof</span>(padded_page) + (items_per_page-1)*<span class="keyword">sizeof</span>(T);
-<a name="l00196"></a>00196 page *p = reinterpret_cast<page*>(my_allocator.allocate( n ));
-<a name="l00197"></a>00197 <span class="keywordflow">if</span>( !p )
-<a name="l00198"></a>00198 internal::throw_exception(internal::eid_bad_alloc);
-<a name="l00199"></a>00199 <span class="keywordflow">return</span> p;
-<a name="l00200"></a>00200 }
-<a name="l00201"></a>00201
-<a name="l00202"></a>00202 <span class="comment">/*override*/</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> deallocate_page( page *p ) {
-<a name="l00203"></a>00203 size_t n = <span class="keyword">sizeof</span>(padded_page) + items_per_page*<span class="keyword">sizeof</span>(T);
-<a name="l00204"></a>00204 my_allocator.deallocate( reinterpret_cast<char*>(p), n );
-<a name="l00205"></a>00205 }
-<a name="l00206"></a>00206
-<a name="l00207"></a>00207 <span class="keyword">public</span>:
-<a name="l00209"></a><a class="code" href="a00155.html#98245517a931e5893f6601e66c51fc75">00209</a> <span class="keyword">typedef</span> T <a class="code" href="a00155.html#98245517a931e5893f6601e66c51fc75">value_type</a>;
-<a name="l00210"></a>00210
-<a name="l00212"></a><a class="code" href="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">00212</a> <span class="keyword">typedef</span> A <a class="code" href="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>;
-<a name="l00213"></a>00213
-<a name="l00215"></a><a class="code" href="a00155.html#dcd44ca6a88c0dc7a847a47a10811f0c">00215</a> <span class="keyword">typedef</span> T& <a class="code" href="a00155.html#dcd44ca6a88c0dc7a847a47a10811f0c">reference</a>;
-<a name="l00216"></a>00216
-<a name="l00218"></a><a class="code" href="a00155.html#796713d0b9ba93a4721cbe13e4474068">00218</a> <span class="keyword">typedef</span> <span class="keyword">const</span> T& <a class="code" href="a00155.html#796713d0b9ba93a4721cbe13e4474068">const_reference</a>;
-<a name="l00219"></a>00219
-<a name="l00221"></a>00221
-<a name="l00223"></a><a class="code" href="a00155.html#a80e4c11dbb324e4b92a24a77bbcde68">00223</a> <span class="keyword">typedef</span> std::ptrdiff_t <a class="code" href="a00155.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a>;
-<a name="l00224"></a>00224
-<a name="l00226"></a><a class="code" href="a00155.html#4b45c91297e69515d83d5eef85ae1f49">00226</a> <span class="keyword">typedef</span> std::ptrdiff_t <a class="code" href="a00155.html#4b45c91297e69515d83d5eef85ae1f49">difference_type</a>;
-<a name="l00227"></a>00227
-<a name="l00229"></a><a class="code" href="a00155.html#e3525226732963ff0f13e89d8e6dab5b">00229</a> <span class="keyword">explicit</span> <a class="code" href="a00155.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>(<span class="keyword">const</span> <a class="code" href="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>& a = <a class="code" href="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>()) :
-<a name="l00230"></a>00230 concurrent_queue_base_v3( sizeof(T) ), my_allocator( a )
-<a name="l00231"></a>00231 {
-<a name="l00232"></a>00232 }
-<a name="l00233"></a>00233
-<a name="l00235"></a><a class="code" href="a00155.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">00235</a> <a class="code" href="a00155.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>( <span class="keyword">const</span> <a class="code" href="a00155.html">concurrent_bounded_queue</a>& src, <span class="keyword">const</span> <a class="code" href="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>& a = <a class="code" href="a00155.html#2e2726fccf6d975dc [...]
-<a name="l00236"></a>00236 concurrent_queue_base_v3( sizeof(T) ), my_allocator( a )
-<a name="l00237"></a>00237 {
-<a name="l00238"></a>00238 assign( src );
-<a name="l00239"></a>00239 }
-<a name="l00240"></a>00240
-<a name="l00242"></a>00242 <span class="keyword">template</span><<span class="keyword">typename</span> InputIterator>
-<a name="l00243"></a><a class="code" href="a00155.html#a5e04dcd7db9fd9b583b4e7df832246a">00243</a> <a class="code" href="a00155.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>( InputIterator begin, InputIterator end, <span class="keyword">const</span> <a class="code" href="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>& a = <a class="code" href="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>()) :
-<a name="l00244"></a>00244 concurrent_queue_base_v3( sizeof(T) ), my_allocator( a )
-<a name="l00245"></a>00245 {
-<a name="l00246"></a>00246 <span class="keywordflow">for</span>( ; begin != end; ++begin )
-<a name="l00247"></a>00247 internal_push_if_not_full(&*begin);
-<a name="l00248"></a>00248 }
-<a name="l00249"></a>00249
-<a name="l00251"></a>00251 <a class="code" href="a00155.html#acaf5b510dc0dfc7780b8c956cf773cf">~concurrent_bounded_queue</a>();
-<a name="l00252"></a>00252
-<a name="l00254"></a><a class="code" href="a00155.html#ceb08c743b11ba88c878e73fff8af20b">00254</a> <span class="keywordtype">void</span> <a class="code" href="a00155.html#ceb08c743b11ba88c878e73fff8af20b">push</a>( <span class="keyword">const</span> T& source ) {
-<a name="l00255"></a>00255 internal_push( &source );
-<a name="l00256"></a>00256 }
-<a name="l00257"></a>00257
-<a name="l00259"></a>00259
-<a name="l00260"></a><a class="code" href="a00155.html#41f4c6bd7a82ab070e840bbf81b0b123">00260</a> <span class="keywordtype">void</span> <a class="code" href="a00155.html#41f4c6bd7a82ab070e840bbf81b0b123">pop</a>( T& destination ) {
-<a name="l00261"></a>00261 internal_pop( &destination );
-<a name="l00262"></a>00262 }
-<a name="l00263"></a>00263
-<a name="l00265"></a>00265
-<a name="l00267"></a><a class="code" href="a00155.html#2bd6232531279fb3ccbd296bea23066b">00267</a> <span class="keywordtype">bool</span> <a class="code" href="a00155.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>( <span class="keyword">const</span> T& source ) {
-<a name="l00268"></a>00268 <span class="keywordflow">return</span> internal_push_if_not_full( &source );
-<a name="l00269"></a>00269 }
-<a name="l00270"></a>00270
-<a name="l00272"></a>00272
-<a name="l00274"></a><a class="code" href="a00155.html#0ca487019bbb00a196442aff78a1e4f7">00274</a> <span class="keywordtype">bool</span> <a class="code" href="a00155.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a>( T& destination ) {
-<a name="l00275"></a>00275 <span class="keywordflow">return</span> internal_pop_if_present( &destination );
-<a name="l00276"></a>00276 }
-<a name="l00277"></a>00277
-<a name="l00279"></a>00279
-<a name="l00282"></a><a class="code" href="a00155.html#7dc14d1a579a4cccda9f857585e1768d">00282</a> <a class="code" href="a00155.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> <a class="code" href="a00155.html#7dc14d1a579a4cccda9f857585e1768d">size</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> internal_size();}
-<a name="l00283"></a>00283
-<a name="l00285"></a><a class="code" href="a00155.html#f64924f2ee9225c368a270fc3c394db9">00285</a> <span class="keywordtype">bool</span> <a class="code" href="a00155.html#f64924f2ee9225c368a270fc3c394db9">empty</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> internal_empty();}
-<a name="l00286"></a>00286
-<a name="l00288"></a><a class="code" href="a00155.html#b2888b3e4e837d7e03f2c731963a402b">00288</a> <a class="code" href="a00155.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> <a class="code" href="a00155.html#b2888b3e4e837d7e03f2c731963a402b">capacity</a>()<span class="keyword"> const </span>{
-<a name="l00289"></a>00289 <span class="keywordflow">return</span> my_capacity;
-<a name="l00290"></a>00290 }
-<a name="l00291"></a>00291
-<a name="l00293"></a>00293
-<a name="l00295"></a><a class="code" href="a00155.html#f3c6c934f85fd02aedbc83a16943193b">00295</a> <span class="keywordtype">void</span> <a class="code" href="a00155.html#f3c6c934f85fd02aedbc83a16943193b">set_capacity</a>( <a class="code" href="a00155.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> new_capacity ) {
-<a name="l00296"></a>00296 internal_set_capacity( new_capacity, <span class="keyword">sizeof</span>(T) );
-<a name="l00297"></a>00297 }
-<a name="l00298"></a>00298
-<a name="l00300"></a><a class="code" href="a00155.html#415eb87e53b1c6a266de06ecbc490d16">00300</a> <a class="code" href="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> <a class="code" href="a00155.html#415eb87e53b1c6a266de06ecbc490d16">get_allocator</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> this->my_allocator; }
-<a name="l00301"></a>00301
-<a name="l00303"></a>00303 <span class="keywordtype">void</span> <a class="code" href="a00155.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a>() ;
-<a name="l00304"></a>00304
-<a name="l00305"></a>00305 <span class="keyword">typedef</span> internal::concurrent_queue_iterator<concurrent_bounded_queue,T> iterator;
-<a name="l00306"></a>00306 <span class="keyword">typedef</span> internal::concurrent_queue_iterator<concurrent_bounded_queue,const T> const_iterator;
-<a name="l00307"></a>00307
-<a name="l00308"></a>00308 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00309"></a>00309 <span class="comment">// The iterators are intended only for debugging. They are slow and not thread safe.</span>
-<a name="l00310"></a>00310 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00311"></a>00311 iterator unsafe_begin() {<span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>);}
-<a name="l00312"></a>00312 iterator unsafe_end() {<span class="keywordflow">return</span> iterator();}
-<a name="l00313"></a>00313 const_iterator unsafe_begin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>);}
-<a name="l00314"></a>00314 const_iterator unsafe_end()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator();}
-<a name="l00315"></a>00315
-<a name="l00316"></a>00316 };
-<a name="l00317"></a>00317
-<a name="l00318"></a>00318 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00319"></a><a class="code" href="a00155.html#acaf5b510dc0dfc7780b8c956cf773cf">00319</a> <a class="code" href="a00155.html">concurrent_bounded_queue<T,A>::~concurrent_bounded_queue</a>() {
-<a name="l00320"></a>00320 <a class="code" href="a00155.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a>();
-<a name="l00321"></a>00321 internal_finish_clear();
-<a name="l00322"></a>00322 }
-<a name="l00323"></a>00323
-<a name="l00324"></a>00324 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00325"></a><a class="code" href="a00155.html#90b31e2954c6e4596c7900435a5f4bc1">00325</a> <span class="keywordtype">void</span> <a class="code" href="a00155.html">concurrent_bounded_queue<T,A>::clear</a>() {
-<a name="l00326"></a>00326 <span class="keywordflow">while</span>( !<a class="code" href="a00155.html#f64924f2ee9225c368a270fc3c394db9">empty</a>() ) {
-<a name="l00327"></a>00327 T value;
-<a name="l00328"></a>00328 internal_pop_if_present(&value);
-<a name="l00329"></a>00329 }
-<a name="l00330"></a>00330 }
-<a name="l00331"></a>00331
-<a name="l00332"></a>00332 <span class="keyword">namespace </span>deprecated {
-<a name="l00333"></a>00333
-<a name="l00335"></a>00335
-<a name="l00340"></a>00340 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A = cache_aligned_allocator<T> >
-<a name="l00341"></a><a class="code" href="a00161.html">00341</a> <span class="keyword">class </span><a class="code" href="a00161.html">concurrent_queue</a>: <span class="keyword">public</span> <a class="code" href="a00155.html">concurrent_bounded_queue</a><T,A> {
-<a name="l00342"></a>00342 <span class="preprocessor">#if !__TBB_TEMPLATE_FRIENDS_BROKEN</span>
-<a name="l00343"></a>00343 <span class="preprocessor"></span> <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value> <span class="keyword">friend</span> <span class="keyword">class </span>internal::concurrent_queue_iterator;
-<a name="l00344"></a>00344 <span class="preprocessor">#endif </span>
-<a name="l00345"></a>00345 <span class="preprocessor"></span>
-<a name="l00346"></a>00346 <span class="keyword">public</span>:
-<a name="l00348"></a><a class="code" href="a00161.html#aaf19bd7337b72f3131ece60f7315ef7">00348</a> <span class="keyword">explicit</span> <a class="code" href="a00161.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a>(<span class="keyword">const</span> A& a = A()) :
-<a name="l00349"></a>00349 <a class="code" href="a00155.html">concurrent_bounded_queue</a><T,A>( a )
-<a name="l00350"></a>00350 {
-<a name="l00351"></a>00351 }
-<a name="l00352"></a>00352
-<a name="l00354"></a><a class="code" href="a00161.html#fc092b9082f233482f3513fc3bb670f7">00354</a> <a class="code" href="a00161.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a>( <span class="keyword">const</span> <a class="code" href="a00161.html">concurrent_queue</a>& src, <span class="keyword">const</span> A& a = A()) :
-<a name="l00355"></a>00355 <a class="code" href="a00155.html">concurrent_bounded_queue</a><T,A>( src, a )
-<a name="l00356"></a>00356 {
-<a name="l00357"></a>00357 }
-<a name="l00358"></a>00358
-<a name="l00360"></a>00360 <span class="keyword">template</span><<span class="keyword">typename</span> InputIterator>
-<a name="l00361"></a><a class="code" href="a00161.html#9102b897776bd2d9e908e6604ff16b5f">00361</a> <a class="code" href="a00161.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a>( InputIterator b <span class="comment">/*begin*/</span>, InputIterator e <span class="comment">/*end*/</span>, <span class="keyword">const</span> A& a = A()) :
-<a name="l00362"></a>00362 <a class="code" href="a00155.html">concurrent_bounded_queue</a><T,A>( b, e, a )
-<a name="l00363"></a>00363 {
-<a name="l00364"></a>00364 }
-<a name="l00365"></a>00365
-<a name="l00367"></a>00367
-<a name="l00369"></a><a class="code" href="a00161.html#7c45561bafe71107d09b2bc1b8f4e681">00369</a> <span class="keywordtype">bool</span> <a class="code" href="a00161.html#7c45561bafe71107d09b2bc1b8f4e681">push_if_not_full</a>( <span class="keyword">const</span> T& source ) {
-<a name="l00370"></a>00370 <span class="keywordflow">return</span> <a class="code" href="a00155.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>( source );
-<a name="l00371"></a>00371 }
-<a name="l00372"></a>00372
-<a name="l00374"></a>00374
-<a name="l00378"></a><a class="code" href="a00161.html#48da3536245318af6cb5fd58bac78039">00378</a> <span class="keywordtype">bool</span> <a class="code" href="a00161.html#48da3536245318af6cb5fd58bac78039">pop_if_present</a>( T& destination ) {
-<a name="l00379"></a>00379 <span class="keywordflow">return</span> <a class="code" href="a00155.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a>( destination );
-<a name="l00380"></a>00380 }
-<a name="l00381"></a>00381
-<a name="l00382"></a>00382 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00155.html">concurrent_bounded_queue<T,A>::iterator</a> iterator;
-<a name="l00383"></a>00383 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00155.html">concurrent_bounded_queue<T,A>::const_iterator</a> const_iterator;
-<a name="l00384"></a>00384 <span class="comment">//</span>
-<a name="l00385"></a>00385 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00386"></a>00386 <span class="comment">// The iterators are intended only for debugging. They are slow and not thread safe.</span>
-<a name="l00387"></a>00387 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00388"></a>00388 iterator begin() {<span class="keywordflow">return</span> this->unsafe_begin();}
-<a name="l00389"></a>00389 iterator end() {<span class="keywordflow">return</span> this->unsafe_end();}
-<a name="l00390"></a>00390 const_iterator begin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> this->unsafe_begin();}
-<a name="l00391"></a>00391 const_iterator end()<span class="keyword"> const </span>{<span class="keywordflow">return</span> this->unsafe_end();}
-<a name="l00392"></a>00392 };
-<a name="l00393"></a>00393
-<a name="l00394"></a>00394 }
-<a name="l00395"></a>00395
-<a name="l00396"></a>00396
-<a name="l00397"></a>00397 <span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00398"></a>00398 <span class="preprocessor"></span><span class="keyword">using</span> deprecated::concurrent_queue;
-<a name="l00399"></a>00399 <span class="preprocessor">#else</span>
-<a name="l00400"></a>00400 <span class="preprocessor"></span><span class="keyword">using</span> strict_ppl::concurrent_queue;
-<a name="l00401"></a>00401 <span class="preprocessor">#endif</span>
-<a name="l00402"></a>00402 <span class="preprocessor"></span>
-<a name="l00403"></a>00403 } <span class="comment">// namespace tbb</span>
-<a name="l00404"></a>00404
-<a name="l00405"></a>00405 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_concurrent_queue_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00336.html b/doc/html/a00336.html
index 0c97317..f0909fc 100644
--- a/doc/html/a00336.html
+++ b/doc/html/a00336.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>concurrent_unordered_map.h Source File</title>
+<title>concurrent_queue.h Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -19,7 +19,7 @@
<li><a href="files.html"><span>File List</span></a></li>
<li><a href="globals.html"><span>File Members</span></a></li>
</ul></div>
-<h1>concurrent_unordered_map.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<h1>concurrent_queue.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
<a name="l00003"></a>00003 <span class="comment"></span>
<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
@@ -39,219 +39,321 @@
<a name="l00018"></a>00018 <span class="comment"> writing.</span>
<a name="l00019"></a>00019 <span class="comment">*/</span>
<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="comment">/* Container implementations in this header are based on PPL implementations</span>
-<a name="l00022"></a>00022 <span class="comment"> provided by Microsoft. */</span>
-<a name="l00023"></a>00023
-<a name="l00024"></a>00024 <span class="preprocessor">#ifndef __TBB_concurrent_unordered_map_H</span>
-<a name="l00025"></a>00025 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_concurrent_unordered_map_H</span>
-<a name="l00026"></a>00026 <span class="preprocessor"></span>
-<a name="l00027"></a>00027 <span class="preprocessor">#include "_concurrent_unordered_internal.h"</span>
-<a name="l00028"></a>00028
-<a name="l00029"></a>00029 <span class="keyword">namespace </span>tbb
-<a name="l00030"></a>00030 {
+<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_concurrent_queue_H</span>
+<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_concurrent_queue_H</span>
+<a name="l00023"></a>00023 <span class="preprocessor"></span>
+<a name="l00024"></a>00024 <span class="preprocessor">#include "_concurrent_queue_internal.h"</span>
+<a name="l00025"></a>00025
+<a name="l00026"></a>00026 <span class="keyword">namespace </span>tbb {
+<a name="l00027"></a>00027
+<a name="l00028"></a>00028 <span class="keyword">namespace </span>strict_ppl {
+<a name="l00029"></a>00029
<a name="l00031"></a>00031
-<a name="l00032"></a>00032 <span class="comment">// Template class for hash compare</span>
-<a name="l00033"></a>00033 <span class="keyword">template</span><<span class="keyword">typename</span> Key>
-<a name="l00034"></a>00034 <span class="keyword">class </span>tbb_hash
-<a name="l00035"></a>00035 {
-<a name="l00036"></a>00036 <span class="keyword">public</span>:
-<a name="l00037"></a>00037 tbb_hash() {}
-<a name="l00038"></a>00038
-<a name="l00039"></a>00039 size_t operator()(<span class="keyword">const</span> Key& key)<span class="keyword"> const</span>
-<a name="l00040"></a>00040 <span class="keyword"> </span>{
-<a name="l00041"></a>00041 <span class="keywordflow">return</span> tbb_hasher(key);
-<a name="l00042"></a>00042 }
-<a name="l00043"></a>00043 };
-<a name="l00044"></a>00044
-<a name="l00045"></a>00045 <span class="keyword">namespace </span>interface5 {
-<a name="l00046"></a>00046
-<a name="l00047"></a>00047 <span class="comment">// Template class for hash map traits</span>
-<a name="l00048"></a>00048 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> Hash_compare, <span class="keyword">typename</span> Allocator, <span class="keywordtype">bool</span> Allow_multimapping>
-<a name="l00049"></a>00049 <span class="keyword">class </span>concurrent_unordered_map_traits
-<a name="l00050"></a>00050 {
-<a name="l00051"></a>00051 <span class="keyword">protected</span>:
-<a name="l00052"></a>00052 <span class="keyword">typedef</span> std::pair<const Key, T> value_type;
-<a name="l00053"></a>00053 <span class="keyword">typedef</span> Key key_type;
-<a name="l00054"></a>00054 <span class="keyword">typedef</span> Hash_compare hash_compare;
-<a name="l00055"></a>00055 <span class="keyword">typedef</span> <span class="keyword">typename</span> Allocator::template rebind<value_type>::other allocator_type;
-<a name="l00056"></a>00056 <span class="keyword">enum</span> { allow_multimapping = Allow_multimapping };
-<a name="l00057"></a>00057
-<a name="l00058"></a>00058 concurrent_unordered_map_traits() : my_hash_compare() {}
-<a name="l00059"></a>00059 concurrent_unordered_map_traits(<span class="keyword">const</span> hash_compare& hc) : my_hash_compare(hc) {}
-<a name="l00060"></a>00060
-<a name="l00061"></a>00061 <span class="keyword">class </span>value_compare : <span class="keyword">public</span> std::binary_function<value_type, value_type, bool>
-<a name="l00062"></a>00062 {
-<a name="l00063"></a>00063 <span class="keyword">friend</span> <span class="keyword">class </span>concurrent_unordered_map_traits<Key, T, Hash_compare, Allocator, Allow_multimapping>;
+<a name="l00034"></a>00034 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> A = cache_aligned_allocator<T> >
+<a name="l00035"></a><a class="code" href="a00159.html">00035</a> <span class="keyword">class </span><a class="code" href="a00159.html">concurrent_queue</a>: <span class="keyword">public</span> internal::concurrent_queue_base_v3<T> {
+<a name="l00036"></a>00036 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value> <span class="keyword">friend</span> <span class="keyword">class </span>internal::concurrent_queue_iterator;
+<a name="l00037"></a>00037
+<a name="l00039"></a>00039 <span class="keyword">typedef</span> <span class="keyword">typename</span> A::template rebind<char>::other page_allocator_type;
+<a name="l00040"></a>00040 page_allocator_type my_allocator;
+<a name="l00041"></a>00041
+<a name="l00043"></a>00043 <span class="comment">/*overide*/</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> *allocate_block( size_t n ) {
+<a name="l00044"></a>00044 <span class="keywordtype">void</span> *b = reinterpret_cast<void*>(my_allocator.allocate( n ));
+<a name="l00045"></a>00045 <span class="keywordflow">if</span>( !b )
+<a name="l00046"></a>00046 internal::throw_exception(internal::eid_bad_alloc);
+<a name="l00047"></a>00047 <span class="keywordflow">return</span> b;
+<a name="l00048"></a>00048 }
+<a name="l00049"></a>00049
+<a name="l00051"></a>00051 <span class="comment">/*override*/</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> deallocate_block( <span class="keywordtype">void</span> *b, size_t n ) {
+<a name="l00052"></a>00052 my_allocator.deallocate( reinterpret_cast<char*>(b), n );
+<a name="l00053"></a>00053 }
+<a name="l00054"></a>00054
+<a name="l00055"></a>00055 <span class="keyword">public</span>:
+<a name="l00057"></a><a class="code" href="a00159.html#682c3978d5cb0620000994f11c44a476">00057</a> <span class="keyword">typedef</span> T <a class="code" href="a00159.html#682c3978d5cb0620000994f11c44a476">value_type</a>;
+<a name="l00058"></a>00058
+<a name="l00060"></a><a class="code" href="a00159.html#a8d725c50a9834bb7af5b67c0aff92b8">00060</a> <span class="keyword">typedef</span> T& <a class="code" href="a00159.html#a8d725c50a9834bb7af5b67c0aff92b8">reference</a>;
+<a name="l00061"></a>00061
+<a name="l00063"></a><a class="code" href="a00159.html#4d48e7ff93f81636bca2c74f7da34750">00063</a> <span class="keyword">typedef</span> <span class="keyword">const</span> T& <a class="code" href="a00159.html#4d48e7ff93f81636bca2c74f7da34750">const_reference</a>;
<a name="l00064"></a>00064
-<a name="l00065"></a>00065 <span class="keyword">public</span>:
-<a name="l00066"></a>00066 <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> value_type& left, <span class="keyword">const</span> value_type& right)<span class="keyword"> const</span>
-<a name="l00067"></a>00067 <span class="keyword"> </span>{
-<a name="l00068"></a>00068 <span class="keywordflow">return</span> (my_hash_compare(left.first, right.first));
-<a name="l00069"></a>00069 }
+<a name="l00066"></a><a class="code" href="a00159.html#8fc30e93f8342a1960357f71e4fe8a2b">00066</a> <span class="keyword">typedef</span> size_t <a class="code" href="a00159.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a>;
+<a name="l00067"></a>00067
+<a name="l00069"></a><a class="code" href="a00159.html#068576d16c7e4e05d52f9db7a45b5b65">00069</a> <span class="keyword">typedef</span> ptrdiff_t <a class="code" href="a00159.html#068576d16c7e4e05d52f9db7a45b5b65">difference_type</a>;
<a name="l00070"></a>00070
-<a name="l00071"></a>00071 value_compare(<span class="keyword">const</span> hash_compare& comparator) : my_hash_compare(comparator) {}
-<a name="l00072"></a>00072
-<a name="l00073"></a>00073 <span class="keyword">protected</span>:
-<a name="l00074"></a>00074 hash_compare my_hash_compare; <span class="comment">// the comparator predicate for keys</span>
-<a name="l00075"></a>00075 };
-<a name="l00076"></a>00076
-<a name="l00077"></a>00077 <span class="keyword">template</span><<span class="keyword">class</span> Type1, <span class="keyword">class</span> Type2>
-<a name="l00078"></a>00078 <span class="keyword">static</span> <span class="keyword">const</span> Key& get_key(<span class="keyword">const</span> std::pair<Type1, Type2>& value) {
-<a name="l00079"></a>00079 <span class="keywordflow">return</span> (value.first);
-<a name="l00080"></a>00080 }
-<a name="l00081"></a>00081
-<a name="l00082"></a>00082 hash_compare my_hash_compare; <span class="comment">// the comparator predicate for keys</span>
-<a name="l00083"></a>00083 };
-<a name="l00084"></a>00084
-<a name="l00085"></a>00085 <span class="keyword">template</span> <<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> Hasher = tbb_hash<Key>, <span class="keyword">typename</span> Key_equality = std::equal_to<Key>, <span class="keyword">typename</span> Allocator = tbb::tbb_allocator<std::pair<const Key, T> > >
-<a name="l00086"></a>00086 <span class="keyword">class </span>concurrent_unordered_map : <span class="keyword">public</span> internal::concurrent_unordered_base< concurrent_unordered_map_traits<Key, T, internal::hash_compare<Key, Hasher, Key_equality>, Allocator, false> >
-<a name="l00087"></a>00087 {
-<a name="l00088"></a>00088 <span class="comment">// Base type definitions</span>
-<a name="l00089"></a>00089 <span class="keyword">typedef</span> internal::hash_compare<Key, Hasher, Key_equality> hash_compare;
-<a name="l00090"></a>00090 <span class="keyword">typedef</span> internal::concurrent_unordered_base< concurrent_unordered_map_traits<Key, T, hash_compare, Allocator, false> > base_type;
-<a name="l00091"></a>00091 <span class="keyword">typedef</span> concurrent_unordered_map_traits<Key, T, internal::hash_compare<Key, Hasher, Key_equality>, Allocator, <span class="keyword">false</span>> traits_type;
-<a name="l00092"></a>00092 <span class="keyword">using</span> traits_type::my_hash_compare;
-<a name="l00093"></a>00093 <span class="preprocessor">#if __TBB_EXTRA_DEBUG</span>
-<a name="l00094"></a>00094 <span class="preprocessor"></span><span class="keyword">public</span>:
-<a name="l00095"></a>00095 <span class="preprocessor">#endif</span>
-<a name="l00096"></a>00096 <span class="preprocessor"></span> <span class="keyword">using</span> traits_type::allow_multimapping;
-<a name="l00097"></a>00097 <span class="keyword">public</span>:
-<a name="l00098"></a>00098 <span class="keyword">using</span> base_type::end;
-<a name="l00099"></a>00099 <span class="keyword">using</span> base_type::find;
-<a name="l00100"></a>00100 <span class="keyword">using</span> base_type::insert;
-<a name="l00101"></a>00101
-<a name="l00102"></a>00102 <span class="comment">// Type definitions</span>
-<a name="l00103"></a>00103 <span class="keyword">typedef</span> Key key_type;
-<a name="l00104"></a>00104 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::value_type value_type;
-<a name="l00105"></a>00105 <span class="keyword">typedef</span> T mapped_type;
-<a name="l00106"></a>00106 <span class="keyword">typedef</span> Hasher hasher;
-<a name="l00107"></a>00107 <span class="keyword">typedef</span> Key_equality key_equal;
-<a name="l00108"></a>00108 <span class="keyword">typedef</span> hash_compare key_compare;
-<a name="l00109"></a>00109
-<a name="l00110"></a>00110 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::allocator_type allocator_type;
-<a name="l00111"></a>00111 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::pointer pointer;
-<a name="l00112"></a>00112 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::const_pointer const_pointer;
-<a name="l00113"></a>00113 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::reference reference;
-<a name="l00114"></a>00114 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::const_reference const_reference;
-<a name="l00115"></a>00115
-<a name="l00116"></a>00116 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::size_type size_type;
-<a name="l00117"></a>00117 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::difference_type difference_type;
-<a name="l00118"></a>00118
-<a name="l00119"></a>00119 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::iterator iterator;
-<a name="l00120"></a>00120 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::const_iterator const_iterator;
-<a name="l00121"></a>00121 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::iterator local_iterator;
-<a name="l00122"></a>00122 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::const_iterator const_local_iterator;
-<a name="l00123"></a>00123
-<a name="l00124"></a>00124 <span class="comment">// Construction/destruction/copying</span>
-<a name="l00125"></a>00125 <span class="keyword">explicit</span> concurrent_unordered_map(size_type n_of_buckets = 8, <span class="keyword">const</span> hasher& a_hasher = hasher(),
-<a name="l00126"></a>00126 <span class="keyword">const</span> key_equal& a_keyeq = key_equal(), <span class="keyword">const</span> allocator_type& a = allocator_type())
-<a name="l00127"></a>00127 : base_type(n_of_buckets, key_compare(a_hasher, a_keyeq), a)
-<a name="l00128"></a>00128 {
-<a name="l00129"></a>00129 }
-<a name="l00130"></a>00130
-<a name="l00131"></a>00131 concurrent_unordered_map(<span class="keyword">const</span> Allocator& a) : base_type(8, key_compare(), a)
-<a name="l00132"></a>00132 {
-<a name="l00133"></a>00133 }
+<a name="l00072"></a><a class="code" href="a00159.html#5a3956341728eaa558d8827063718cac">00072</a> <span class="keyword">typedef</span> A <a class="code" href="a00159.html#5a3956341728eaa558d8827063718cac">allocator_type</a>;
+<a name="l00073"></a>00073
+<a name="l00075"></a><a class="code" href="a00159.html#7c48a05a94a1f4f98fdfadfbef98ecf6">00075</a> <span class="keyword">explicit</span> <a class="code" href="a00159.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>(<span class="keyword">const</span> <a class="code" href="a00159.html#5a3956341728eaa558d8827063718cac">allocator_type</a>& a = <a class="code" href="a00159.html#5a3956341728eaa558d8827063718cac">allocator_type</a>()) :
+<a name="l00076"></a>00076 my_allocator( a )
+<a name="l00077"></a>00077 {
+<a name="l00078"></a>00078 }
+<a name="l00079"></a>00079
+<a name="l00081"></a>00081 <span class="keyword">template</span><<span class="keyword">typename</span> InputIterator>
+<a name="l00082"></a><a class="code" href="a00159.html#25209656c84f2f9b030e2f9162713341">00082</a> <a class="code" href="a00159.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>( InputIterator begin, InputIterator end, <span class="keyword">const</span> <a class="code" href="a00159.html#5a3956341728eaa558d8827063718cac">allocator_type</a>& a = <a class="code" href="a00159.html#5a3956341728eaa558d8827063718cac">allocator_type</a>()) :
+<a name="l00083"></a>00083 my_allocator( a )
+<a name="l00084"></a>00084 {
+<a name="l00085"></a>00085 <span class="keywordflow">for</span>( ; begin != end; ++begin )
+<a name="l00086"></a>00086 internal_push(&*begin);
+<a name="l00087"></a>00087 }
+<a name="l00088"></a>00088
+<a name="l00090"></a><a class="code" href="a00159.html#8a6b98ea11a867db8ac868f0113ca429">00090</a> <a class="code" href="a00159.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>( <span class="keyword">const</span> <a class="code" href="a00159.html">concurrent_queue</a>& src, <span class="keyword">const</span> <a class="code" href="a00159.html#5a3956341728eaa558d8827063718cac">allocator_type</a>& a = <a class="code" href="a00159.html#5a3956341728eaa558d8827063718cac" [...]
+<a name="l00091"></a>00091 internal::concurrent_queue_base_v3<T>(), my_allocator( a )
+<a name="l00092"></a>00092 {
+<a name="l00093"></a>00093 assign( src );
+<a name="l00094"></a>00094 }
+<a name="l00095"></a>00095
+<a name="l00097"></a>00097 <a class="code" href="a00159.html#830b33753d6b149c366344e29b2edd8c">~concurrent_queue</a>();
+<a name="l00098"></a>00098
+<a name="l00100"></a><a class="code" href="a00159.html#73c47563ffcc4c2f6452f25a04ebe2e2">00100</a> <span class="keywordtype">void</span> <a class="code" href="a00159.html#73c47563ffcc4c2f6452f25a04ebe2e2">push</a>( <span class="keyword">const</span> T& source ) {
+<a name="l00101"></a>00101 internal_push( &source );
+<a name="l00102"></a>00102 }
+<a name="l00103"></a>00103
+<a name="l00105"></a>00105
+<a name="l00107"></a><a class="code" href="a00159.html#ae31ca0db34ef96ef1e74aa0d28c95f8">00107</a> <span class="keywordtype">bool</span> <a class="code" href="a00159.html#ae31ca0db34ef96ef1e74aa0d28c95f8">try_pop</a>( T& result ) {
+<a name="l00108"></a>00108 <span class="keywordflow">return</span> internal_try_pop( &result );
+<a name="l00109"></a>00109 }
+<a name="l00110"></a>00110
+<a name="l00112"></a><a class="code" href="a00159.html#eaa35a5274606779802e9a669a706260">00112</a> <a class="code" href="a00159.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a> <a class="code" href="a00159.html#eaa35a5274606779802e9a669a706260">unsafe_size</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> this->internal_size();}
+<a name="l00113"></a>00113
+<a name="l00115"></a><a class="code" href="a00159.html#f3f6fce0cfa2d581d6f3b47e0613ad64">00115</a> <span class="keywordtype">bool</span> <a class="code" href="a00159.html#f3f6fce0cfa2d581d6f3b47e0613ad64">empty</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> this->internal_empty();}
+<a name="l00116"></a>00116
+<a name="l00118"></a>00118 <span class="keywordtype">void</span> <a class="code" href="a00159.html#c32e8e84c0524155133b4aae32d2a827">clear</a>() ;
+<a name="l00119"></a>00119
+<a name="l00121"></a><a class="code" href="a00159.html#f034f70caef445fe8abc9113ec926a8d">00121</a> <a class="code" href="a00159.html#5a3956341728eaa558d8827063718cac">allocator_type</a> <a class="code" href="a00159.html#f034f70caef445fe8abc9113ec926a8d">get_allocator</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> this->my_allocator; }
+<a name="l00122"></a>00122
+<a name="l00123"></a>00123 <span class="keyword">typedef</span> internal::concurrent_queue_iterator<concurrent_queue,T> iterator;
+<a name="l00124"></a>00124 <span class="keyword">typedef</span> internal::concurrent_queue_iterator<concurrent_queue,const T> const_iterator;
+<a name="l00125"></a>00125
+<a name="l00126"></a>00126 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00127"></a>00127 <span class="comment">// The iterators are intended only for debugging. They are slow and not thread safe.</span>
+<a name="l00128"></a>00128 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00129"></a>00129 iterator unsafe_begin() {<span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>);}
+<a name="l00130"></a>00130 iterator unsafe_end() {<span class="keywordflow">return</span> iterator();}
+<a name="l00131"></a>00131 const_iterator unsafe_begin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>);}
+<a name="l00132"></a>00132 const_iterator unsafe_end()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator();}
+<a name="l00133"></a>00133 } ;
<a name="l00134"></a>00134
-<a name="l00135"></a>00135 <span class="keyword">template</span> <<span class="keyword">typename</span> Iterator>
-<a name="l00136"></a>00136 concurrent_unordered_map(Iterator first, Iterator last, size_type n_of_buckets = 8, <span class="keyword">const</span> hasher& a_hasher = hasher(),
-<a name="l00137"></a>00137 <span class="keyword">const</span> key_equal& a_keyeq = key_equal(), <span class="keyword">const</span> allocator_type& a = allocator_type())
-<a name="l00138"></a>00138 : base_type(n_of_buckets, key_compare(a_hasher, a_keyeq), a)
-<a name="l00139"></a>00139 {
-<a name="l00140"></a>00140 <span class="keywordflow">for</span> (; first != last; ++first)
-<a name="l00141"></a>00141 base_type::insert(*first);
-<a name="l00142"></a>00142 }
-<a name="l00143"></a>00143
-<a name="l00144"></a>00144 concurrent_unordered_map(<span class="keyword">const</span> concurrent_unordered_map& table) : base_type(table)
-<a name="l00145"></a>00145 {
+<a name="l00135"></a>00135 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
+<a name="l00136"></a><a class="code" href="a00159.html#830b33753d6b149c366344e29b2edd8c">00136</a> <a class="code" href="a00159.html">concurrent_queue<T,A>::~concurrent_queue</a>() {
+<a name="l00137"></a>00137 <a class="code" href="a00159.html#c32e8e84c0524155133b4aae32d2a827">clear</a>();
+<a name="l00138"></a>00138 this->internal_finish_clear();
+<a name="l00139"></a>00139 }
+<a name="l00140"></a>00140
+<a name="l00141"></a>00141 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
+<a name="l00142"></a><a class="code" href="a00159.html#c32e8e84c0524155133b4aae32d2a827">00142</a> <span class="keywordtype">void</span> <a class="code" href="a00159.html">concurrent_queue<T,A>::clear</a>() {
+<a name="l00143"></a>00143 <span class="keywordflow">while</span>( !<a class="code" href="a00159.html#f3f6fce0cfa2d581d6f3b47e0613ad64">empty</a>() ) {
+<a name="l00144"></a>00144 T value;
+<a name="l00145"></a>00145 this->internal_try_pop(&value);
<a name="l00146"></a>00146 }
-<a name="l00147"></a>00147
-<a name="l00148"></a>00148 concurrent_unordered_map(<span class="keyword">const</span> concurrent_unordered_map& table, <span class="keyword">const</span> Allocator& a)
-<a name="l00149"></a>00149 : base_type(table, a)
-<a name="l00150"></a>00150 {
-<a name="l00151"></a>00151 }
+<a name="l00147"></a>00147 }
+<a name="l00148"></a>00148
+<a name="l00149"></a>00149 } <span class="comment">// namespace strict_ppl</span>
+<a name="l00150"></a>00150
<a name="l00152"></a>00152
-<a name="l00153"></a>00153 concurrent_unordered_map& operator=(<span class="keyword">const</span> concurrent_unordered_map& table)
-<a name="l00154"></a>00154 {
-<a name="l00155"></a>00155 base_type::operator=(table);
-<a name="l00156"></a>00156 <span class="keywordflow">return</span> (*<span class="keyword">this</span>);
-<a name="l00157"></a>00157 }
-<a name="l00158"></a>00158
-<a name="l00159"></a>00159 iterator unsafe_erase(const_iterator where)
-<a name="l00160"></a>00160 {
-<a name="l00161"></a>00161 <span class="keywordflow">return</span> base_type::unsafe_erase(where);
-<a name="l00162"></a>00162 }
-<a name="l00163"></a>00163
-<a name="l00164"></a>00164 size_type unsafe_erase(<span class="keyword">const</span> key_type& key)
-<a name="l00165"></a>00165 {
-<a name="l00166"></a>00166 <span class="keywordflow">return</span> base_type::unsafe_erase(key);
-<a name="l00167"></a>00167 }
-<a name="l00168"></a>00168
-<a name="l00169"></a>00169 iterator unsafe_erase(const_iterator first, const_iterator last)
-<a name="l00170"></a>00170 {
-<a name="l00171"></a>00171 <span class="keywordflow">return</span> base_type::unsafe_erase(first, last);
-<a name="l00172"></a>00172 }
-<a name="l00173"></a>00173
-<a name="l00174"></a>00174 <span class="keywordtype">void</span> swap(concurrent_unordered_map& table)
-<a name="l00175"></a>00175 {
-<a name="l00176"></a>00176 base_type::swap(table);
-<a name="l00177"></a>00177 }
-<a name="l00178"></a>00178
-<a name="l00179"></a>00179 <span class="comment">// Observers</span>
-<a name="l00180"></a>00180 hasher hash_function()<span class="keyword"> const</span>
-<a name="l00181"></a>00181 <span class="keyword"> </span>{
-<a name="l00182"></a>00182 <span class="keywordflow">return</span> my_hash_compare.my_hash_object;
-<a name="l00183"></a>00183 }
-<a name="l00184"></a>00184
-<a name="l00185"></a>00185 key_equal key_eq()<span class="keyword"> const</span>
-<a name="l00186"></a>00186 <span class="keyword"> </span>{
-<a name="l00187"></a>00187 <span class="keywordflow">return</span> my_hash_compare.my_key_compare_object;
-<a name="l00188"></a>00188 }
-<a name="l00189"></a>00189
-<a name="l00190"></a>00190 mapped_type& operator[](<span class="keyword">const</span> key_type& key)
-<a name="l00191"></a>00191 {
-<a name="l00192"></a>00192 iterator where = find(key);
+<a name="l00157"></a>00157 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A = cache_aligned_allocator<T> >
+<a name="l00158"></a><a class="code" href="a00154.html">00158</a> <span class="keyword">class </span><a class="code" href="a00154.html">concurrent_bounded_queue</a>: <span class="keyword">public</span> internal::concurrent_queue_base_v3 {
+<a name="l00159"></a>00159 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value> <span class="keyword">friend</span> <span class="keyword">class </span>internal::concurrent_queue_iterator;
+<a name="l00160"></a>00160
+<a name="l00162"></a>00162 <span class="keyword">typedef</span> <span class="keyword">typename</span> A::template rebind<char>::other page_allocator_type;
+<a name="l00163"></a>00163 page_allocator_type my_allocator;
+<a name="l00164"></a>00164
+<a name="l00165"></a>00165 <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_queue_base_v3::padded_page<T> padded_page;
+<a name="l00166"></a>00166
+<a name="l00168"></a>00168 <span class="keyword">class </span>destroyer: internal::no_copy {
+<a name="l00169"></a>00169 T& my_value;
+<a name="l00170"></a>00170 <span class="keyword">public</span>:
+<a name="l00171"></a>00171 destroyer( T& value ) : my_value(value) {}
+<a name="l00172"></a>00172 ~destroyer() {my_value.~T();}
+<a name="l00173"></a>00173 };
+<a name="l00174"></a>00174
+<a name="l00175"></a>00175 T& get_ref( page& p, size_t index ) {
+<a name="l00176"></a>00176 __TBB_ASSERT( index<items_per_page, NULL );
+<a name="l00177"></a>00177 <span class="keywordflow">return</span> (&static_cast<padded_page*>(static_cast<void*>(&p))->last)[index];
+<a name="l00178"></a>00178 }
+<a name="l00179"></a>00179
+<a name="l00180"></a>00180 <span class="comment">/*override*/</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> copy_item( page& dst, size_t index, <span class="keyword">const</span> <span class="keywordtype">void</span>* src ) {
+<a name="l00181"></a>00181 <span class="keyword">new</span>( &get_ref(dst,index) ) T(*static_cast<const T*>(src));
+<a name="l00182"></a>00182 }
+<a name="l00183"></a>00183
+<a name="l00184"></a>00184 <span class="comment">/*override*/</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> copy_page_item( page& dst, size_t dindex, <span class="keyword">const</span> page& src, size_t sindex ) {
+<a name="l00185"></a>00185 <span class="keyword">new</span>( &get_ref(dst,dindex) ) T( get_ref( const_cast<page&>(src), sindex ) );
+<a name="l00186"></a>00186 }
+<a name="l00187"></a>00187
+<a name="l00188"></a>00188 <span class="comment">/*override*/</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> assign_and_destroy_item( <span class="keywordtype">void</span>* dst, page& src, size_t index ) {
+<a name="l00189"></a>00189 T& from = get_ref(src,index);
+<a name="l00190"></a>00190 destroyer d(from);
+<a name="l00191"></a>00191 *static_cast<T*>(dst) = from;
+<a name="l00192"></a>00192 }
<a name="l00193"></a>00193
-<a name="l00194"></a>00194 <span class="keywordflow">if</span> (where == end())
-<a name="l00195"></a>00195 {
-<a name="l00196"></a>00196 where = insert(std::pair<key_type, mapped_type>(key, mapped_type())).first;
-<a name="l00197"></a>00197 }
-<a name="l00198"></a>00198
-<a name="l00199"></a>00199 <span class="keywordflow">return</span> ((*where).second);
+<a name="l00194"></a>00194 <span class="comment">/*overide*/</span> <span class="keyword">virtual</span> page *allocate_page() {
+<a name="l00195"></a>00195 size_t n = <span class="keyword">sizeof</span>(padded_page) + (items_per_page-1)*<span class="keyword">sizeof</span>(T);
+<a name="l00196"></a>00196 page *p = reinterpret_cast<page*>(my_allocator.allocate( n ));
+<a name="l00197"></a>00197 <span class="keywordflow">if</span>( !p )
+<a name="l00198"></a>00198 internal::throw_exception(internal::eid_bad_alloc);
+<a name="l00199"></a>00199 <span class="keywordflow">return</span> p;
<a name="l00200"></a>00200 }
<a name="l00201"></a>00201
-<a name="l00202"></a>00202 mapped_type& at(<span class="keyword">const</span> key_type& key)
-<a name="l00203"></a>00203 {
-<a name="l00204"></a>00204 iterator where = find(key);
-<a name="l00205"></a>00205
-<a name="l00206"></a>00206 <span class="keywordflow">if</span> (where == end())
-<a name="l00207"></a>00207 {
-<a name="l00208"></a>00208 tbb::internal::throw_exception(tbb::internal::eid_invalid_key);
-<a name="l00209"></a>00209 }
+<a name="l00202"></a>00202 <span class="comment">/*override*/</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> deallocate_page( page *p ) {
+<a name="l00203"></a>00203 size_t n = <span class="keyword">sizeof</span>(padded_page) + items_per_page*<span class="keyword">sizeof</span>(T);
+<a name="l00204"></a>00204 my_allocator.deallocate( reinterpret_cast<char*>(p), n );
+<a name="l00205"></a>00205 }
+<a name="l00206"></a>00206
+<a name="l00207"></a>00207 <span class="keyword">public</span>:
+<a name="l00209"></a><a class="code" href="a00154.html#98245517a931e5893f6601e66c51fc75">00209</a> <span class="keyword">typedef</span> T <a class="code" href="a00154.html#98245517a931e5893f6601e66c51fc75">value_type</a>;
<a name="l00210"></a>00210
-<a name="l00211"></a>00211 <span class="keywordflow">return</span> ((*where).second);
-<a name="l00212"></a>00212 }
+<a name="l00212"></a><a class="code" href="a00154.html#2e2726fccf6d975dc1071608cc0bbf90">00212</a> <span class="keyword">typedef</span> A <a class="code" href="a00154.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>;
<a name="l00213"></a>00213
-<a name="l00214"></a>00214 <span class="keyword">const</span> mapped_type& at(<span class="keyword">const</span> key_type& key)<span class="keyword"> const</span>
-<a name="l00215"></a>00215 <span class="keyword"> </span>{
-<a name="l00216"></a>00216 const_iterator where = find(key);
-<a name="l00217"></a>00217
-<a name="l00218"></a>00218 <span class="keywordflow">if</span> (where == end())
-<a name="l00219"></a>00219 {
-<a name="l00220"></a>00220 tbb::internal::throw_exception(tbb::internal::eid_invalid_key);
-<a name="l00221"></a>00221 }
-<a name="l00222"></a>00222
-<a name="l00223"></a>00223 <span class="keywordflow">return</span> ((*where).second);
-<a name="l00224"></a>00224 }
-<a name="l00225"></a>00225 };
-<a name="l00226"></a>00226
-<a name="l00227"></a>00227 } <span class="comment">// namespace interface5</span>
-<a name="l00228"></a>00228
-<a name="l00229"></a>00229 <span class="keyword">using</span> interface5::concurrent_unordered_map;
-<a name="l00230"></a>00230
-<a name="l00231"></a>00231 } <span class="comment">// namespace tbb</span>
-<a name="l00232"></a>00232
-<a name="l00233"></a>00233 <span class="preprocessor">#endif// __TBB_concurrent_unordered_map_H</span>
+<a name="l00215"></a><a class="code" href="a00154.html#dcd44ca6a88c0dc7a847a47a10811f0c">00215</a> <span class="keyword">typedef</span> T& <a class="code" href="a00154.html#dcd44ca6a88c0dc7a847a47a10811f0c">reference</a>;
+<a name="l00216"></a>00216
+<a name="l00218"></a><a class="code" href="a00154.html#796713d0b9ba93a4721cbe13e4474068">00218</a> <span class="keyword">typedef</span> <span class="keyword">const</span> T& <a class="code" href="a00154.html#796713d0b9ba93a4721cbe13e4474068">const_reference</a>;
+<a name="l00219"></a>00219
+<a name="l00221"></a>00221
+<a name="l00223"></a><a class="code" href="a00154.html#a80e4c11dbb324e4b92a24a77bbcde68">00223</a> <span class="keyword">typedef</span> std::ptrdiff_t <a class="code" href="a00154.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a>;
+<a name="l00224"></a>00224
+<a name="l00226"></a><a class="code" href="a00154.html#4b45c91297e69515d83d5eef85ae1f49">00226</a> <span class="keyword">typedef</span> std::ptrdiff_t <a class="code" href="a00154.html#4b45c91297e69515d83d5eef85ae1f49">difference_type</a>;
+<a name="l00227"></a>00227
+<a name="l00229"></a><a class="code" href="a00154.html#e3525226732963ff0f13e89d8e6dab5b">00229</a> <span class="keyword">explicit</span> <a class="code" href="a00154.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>(<span class="keyword">const</span> <a class="code" href="a00154.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>& a = <a class="code" href="a00154.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>()) :
+<a name="l00230"></a>00230 concurrent_queue_base_v3( sizeof(T) ), my_allocator( a )
+<a name="l00231"></a>00231 {
+<a name="l00232"></a>00232 }
+<a name="l00233"></a>00233
+<a name="l00235"></a><a class="code" href="a00154.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">00235</a> <a class="code" href="a00154.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>( <span class="keyword">const</span> <a class="code" href="a00154.html">concurrent_bounded_queue</a>& src, <span class="keyword">const</span> <a class="code" href="a00154.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>& a = <a class="code" href="a00154.html#2e2726fccf6d975dc [...]
+<a name="l00236"></a>00236 concurrent_queue_base_v3( sizeof(T) ), my_allocator( a )
+<a name="l00237"></a>00237 {
+<a name="l00238"></a>00238 assign( src );
+<a name="l00239"></a>00239 }
+<a name="l00240"></a>00240
+<a name="l00242"></a>00242 <span class="keyword">template</span><<span class="keyword">typename</span> InputIterator>
+<a name="l00243"></a><a class="code" href="a00154.html#a5e04dcd7db9fd9b583b4e7df832246a">00243</a> <a class="code" href="a00154.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>( InputIterator begin, InputIterator end, <span class="keyword">const</span> <a class="code" href="a00154.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>& a = <a class="code" href="a00154.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>()) :
+<a name="l00244"></a>00244 concurrent_queue_base_v3( sizeof(T) ), my_allocator( a )
+<a name="l00245"></a>00245 {
+<a name="l00246"></a>00246 <span class="keywordflow">for</span>( ; begin != end; ++begin )
+<a name="l00247"></a>00247 internal_push_if_not_full(&*begin);
+<a name="l00248"></a>00248 }
+<a name="l00249"></a>00249
+<a name="l00251"></a>00251 <a class="code" href="a00154.html#acaf5b510dc0dfc7780b8c956cf773cf">~concurrent_bounded_queue</a>();
+<a name="l00252"></a>00252
+<a name="l00254"></a><a class="code" href="a00154.html#ceb08c743b11ba88c878e73fff8af20b">00254</a> <span class="keywordtype">void</span> <a class="code" href="a00154.html#ceb08c743b11ba88c878e73fff8af20b">push</a>( <span class="keyword">const</span> T& source ) {
+<a name="l00255"></a>00255 internal_push( &source );
+<a name="l00256"></a>00256 }
+<a name="l00257"></a>00257
+<a name="l00259"></a>00259
+<a name="l00260"></a><a class="code" href="a00154.html#41f4c6bd7a82ab070e840bbf81b0b123">00260</a> <span class="keywordtype">void</span> <a class="code" href="a00154.html#41f4c6bd7a82ab070e840bbf81b0b123">pop</a>( T& destination ) {
+<a name="l00261"></a>00261 internal_pop( &destination );
+<a name="l00262"></a>00262 }
+<a name="l00263"></a>00263
+<a name="l00265"></a>00265
+<a name="l00267"></a><a class="code" href="a00154.html#2bd6232531279fb3ccbd296bea23066b">00267</a> <span class="keywordtype">bool</span> <a class="code" href="a00154.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>( <span class="keyword">const</span> T& source ) {
+<a name="l00268"></a>00268 <span class="keywordflow">return</span> internal_push_if_not_full( &source );
+<a name="l00269"></a>00269 }
+<a name="l00270"></a>00270
+<a name="l00272"></a>00272
+<a name="l00274"></a><a class="code" href="a00154.html#0ca487019bbb00a196442aff78a1e4f7">00274</a> <span class="keywordtype">bool</span> <a class="code" href="a00154.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a>( T& destination ) {
+<a name="l00275"></a>00275 <span class="keywordflow">return</span> internal_pop_if_present( &destination );
+<a name="l00276"></a>00276 }
+<a name="l00277"></a>00277
+<a name="l00279"></a>00279
+<a name="l00282"></a><a class="code" href="a00154.html#7dc14d1a579a4cccda9f857585e1768d">00282</a> <a class="code" href="a00154.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> <a class="code" href="a00154.html#7dc14d1a579a4cccda9f857585e1768d">size</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> internal_size();}
+<a name="l00283"></a>00283
+<a name="l00285"></a><a class="code" href="a00154.html#f64924f2ee9225c368a270fc3c394db9">00285</a> <span class="keywordtype">bool</span> <a class="code" href="a00154.html#f64924f2ee9225c368a270fc3c394db9">empty</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> internal_empty();}
+<a name="l00286"></a>00286
+<a name="l00288"></a><a class="code" href="a00154.html#b2888b3e4e837d7e03f2c731963a402b">00288</a> <a class="code" href="a00154.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> <a class="code" href="a00154.html#b2888b3e4e837d7e03f2c731963a402b">capacity</a>()<span class="keyword"> const </span>{
+<a name="l00289"></a>00289 <span class="keywordflow">return</span> my_capacity;
+<a name="l00290"></a>00290 }
+<a name="l00291"></a>00291
+<a name="l00293"></a>00293
+<a name="l00295"></a><a class="code" href="a00154.html#f3c6c934f85fd02aedbc83a16943193b">00295</a> <span class="keywordtype">void</span> <a class="code" href="a00154.html#f3c6c934f85fd02aedbc83a16943193b">set_capacity</a>( <a class="code" href="a00154.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> new_capacity ) {
+<a name="l00296"></a>00296 internal_set_capacity( new_capacity, <span class="keyword">sizeof</span>(T) );
+<a name="l00297"></a>00297 }
+<a name="l00298"></a>00298
+<a name="l00300"></a><a class="code" href="a00154.html#415eb87e53b1c6a266de06ecbc490d16">00300</a> <a class="code" href="a00154.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> <a class="code" href="a00154.html#415eb87e53b1c6a266de06ecbc490d16">get_allocator</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> this->my_allocator; }
+<a name="l00301"></a>00301
+<a name="l00303"></a>00303 <span class="keywordtype">void</span> <a class="code" href="a00154.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a>() ;
+<a name="l00304"></a>00304
+<a name="l00305"></a>00305 <span class="keyword">typedef</span> internal::concurrent_queue_iterator<concurrent_bounded_queue,T> iterator;
+<a name="l00306"></a>00306 <span class="keyword">typedef</span> internal::concurrent_queue_iterator<concurrent_bounded_queue,const T> const_iterator;
+<a name="l00307"></a>00307
+<a name="l00308"></a>00308 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00309"></a>00309 <span class="comment">// The iterators are intended only for debugging. They are slow and not thread safe.</span>
+<a name="l00310"></a>00310 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00311"></a>00311 iterator unsafe_begin() {<span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>);}
+<a name="l00312"></a>00312 iterator unsafe_end() {<span class="keywordflow">return</span> iterator();}
+<a name="l00313"></a>00313 const_iterator unsafe_begin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>);}
+<a name="l00314"></a>00314 const_iterator unsafe_end()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator();}
+<a name="l00315"></a>00315
+<a name="l00316"></a>00316 };
+<a name="l00317"></a>00317
+<a name="l00318"></a>00318 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
+<a name="l00319"></a><a class="code" href="a00154.html#acaf5b510dc0dfc7780b8c956cf773cf">00319</a> <a class="code" href="a00154.html">concurrent_bounded_queue<T,A>::~concurrent_bounded_queue</a>() {
+<a name="l00320"></a>00320 <a class="code" href="a00154.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a>();
+<a name="l00321"></a>00321 internal_finish_clear();
+<a name="l00322"></a>00322 }
+<a name="l00323"></a>00323
+<a name="l00324"></a>00324 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
+<a name="l00325"></a><a class="code" href="a00154.html#90b31e2954c6e4596c7900435a5f4bc1">00325</a> <span class="keywordtype">void</span> <a class="code" href="a00154.html">concurrent_bounded_queue<T,A>::clear</a>() {
+<a name="l00326"></a>00326 <span class="keywordflow">while</span>( !<a class="code" href="a00154.html#f64924f2ee9225c368a270fc3c394db9">empty</a>() ) {
+<a name="l00327"></a>00327 T value;
+<a name="l00328"></a>00328 internal_pop_if_present(&value);
+<a name="l00329"></a>00329 }
+<a name="l00330"></a>00330 }
+<a name="l00331"></a>00331
+<a name="l00332"></a>00332 <span class="keyword">namespace </span>deprecated {
+<a name="l00333"></a>00333
+<a name="l00335"></a>00335
+<a name="l00340"></a>00340 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A = cache_aligned_allocator<T> >
+<a name="l00341"></a><a class="code" href="a00160.html">00341</a> <span class="keyword">class </span><a class="code" href="a00160.html">concurrent_queue</a>: <span class="keyword">public</span> <a class="code" href="a00154.html">concurrent_bounded_queue</a><T,A> {
+<a name="l00342"></a>00342 <span class="preprocessor">#if !__TBB_TEMPLATE_FRIENDS_BROKEN</span>
+<a name="l00343"></a>00343 <span class="preprocessor"></span> <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value> <span class="keyword">friend</span> <span class="keyword">class </span>internal::concurrent_queue_iterator;
+<a name="l00344"></a>00344 <span class="preprocessor">#endif </span>
+<a name="l00345"></a>00345 <span class="preprocessor"></span>
+<a name="l00346"></a>00346 <span class="keyword">public</span>:
+<a name="l00348"></a><a class="code" href="a00160.html#aaf19bd7337b72f3131ece60f7315ef7">00348</a> <span class="keyword">explicit</span> <a class="code" href="a00160.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a>(<span class="keyword">const</span> A& a = A()) :
+<a name="l00349"></a>00349 <a class="code" href="a00154.html">concurrent_bounded_queue</a><T,A>( a )
+<a name="l00350"></a>00350 {
+<a name="l00351"></a>00351 }
+<a name="l00352"></a>00352
+<a name="l00354"></a><a class="code" href="a00160.html#fc092b9082f233482f3513fc3bb670f7">00354</a> <a class="code" href="a00160.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a>( <span class="keyword">const</span> <a class="code" href="a00160.html">concurrent_queue</a>& src, <span class="keyword">const</span> A& a = A()) :
+<a name="l00355"></a>00355 <a class="code" href="a00154.html">concurrent_bounded_queue</a><T,A>( src, a )
+<a name="l00356"></a>00356 {
+<a name="l00357"></a>00357 }
+<a name="l00358"></a>00358
+<a name="l00360"></a>00360 <span class="keyword">template</span><<span class="keyword">typename</span> InputIterator>
+<a name="l00361"></a><a class="code" href="a00160.html#9102b897776bd2d9e908e6604ff16b5f">00361</a> <a class="code" href="a00160.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a>( InputIterator b <span class="comment">/*begin*/</span>, InputIterator e <span class="comment">/*end*/</span>, <span class="keyword">const</span> A& a = A()) :
+<a name="l00362"></a>00362 <a class="code" href="a00154.html">concurrent_bounded_queue</a><T,A>( b, e, a )
+<a name="l00363"></a>00363 {
+<a name="l00364"></a>00364 }
+<a name="l00365"></a>00365
+<a name="l00367"></a>00367
+<a name="l00369"></a><a class="code" href="a00160.html#7c45561bafe71107d09b2bc1b8f4e681">00369</a> <span class="keywordtype">bool</span> <a class="code" href="a00160.html#7c45561bafe71107d09b2bc1b8f4e681">push_if_not_full</a>( <span class="keyword">const</span> T& source ) {
+<a name="l00370"></a>00370 <span class="keywordflow">return</span> <a class="code" href="a00154.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>( source );
+<a name="l00371"></a>00371 }
+<a name="l00372"></a>00372
+<a name="l00374"></a>00374
+<a name="l00378"></a><a class="code" href="a00160.html#48da3536245318af6cb5fd58bac78039">00378</a> <span class="keywordtype">bool</span> <a class="code" href="a00160.html#48da3536245318af6cb5fd58bac78039">pop_if_present</a>( T& destination ) {
+<a name="l00379"></a>00379 <span class="keywordflow">return</span> <a class="code" href="a00154.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a>( destination );
+<a name="l00380"></a>00380 }
+<a name="l00381"></a>00381
+<a name="l00382"></a>00382 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00154.html">concurrent_bounded_queue<T,A>::iterator</a> iterator;
+<a name="l00383"></a>00383 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00154.html">concurrent_bounded_queue<T,A>::const_iterator</a> const_iterator;
+<a name="l00384"></a>00384 <span class="comment">//</span>
+<a name="l00385"></a>00385 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00386"></a>00386 <span class="comment">// The iterators are intended only for debugging. They are slow and not thread safe.</span>
+<a name="l00387"></a>00387 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00388"></a>00388 iterator begin() {<span class="keywordflow">return</span> this->unsafe_begin();}
+<a name="l00389"></a>00389 iterator end() {<span class="keywordflow">return</span> this->unsafe_end();}
+<a name="l00390"></a>00390 const_iterator begin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> this->unsafe_begin();}
+<a name="l00391"></a>00391 const_iterator end()<span class="keyword"> const </span>{<span class="keywordflow">return</span> this->unsafe_end();}
+<a name="l00392"></a>00392 };
+<a name="l00393"></a>00393
+<a name="l00394"></a>00394 }
+<a name="l00395"></a>00395
+<a name="l00396"></a>00396
+<a name="l00397"></a>00397 <span class="preprocessor">#if TBB_DEPRECATED</span>
+<a name="l00398"></a>00398 <span class="preprocessor"></span><span class="keyword">using</span> deprecated::concurrent_queue;
+<a name="l00399"></a>00399 <span class="preprocessor">#else</span>
+<a name="l00400"></a>00400 <span class="preprocessor"></span><span class="keyword">using</span> strict_ppl::concurrent_queue;
+<a name="l00401"></a>00401 <span class="preprocessor">#endif</span>
+<a name="l00402"></a>00402 <span class="preprocessor"></span>
+<a name="l00403"></a>00403 } <span class="comment">// namespace tbb</span>
+<a name="l00404"></a>00404
+<a name="l00405"></a>00405 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_concurrent_queue_H */</span>
</pre></div><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00336.html b/doc/html/a00337.html
similarity index 100%
copy from doc/html/a00336.html
copy to doc/html/a00337.html
diff --git a/doc/html/a00341.html b/doc/html/a00342.html
similarity index 94%
rename from doc/html/a00341.html
rename to doc/html/a00342.html
index 32df0c7..58dc890 100644
--- a/doc/html/a00341.html
+++ b/doc/html/a00342.html
@@ -219,7 +219,7 @@
<a name="l00219"></a>00219
<a name="l00220"></a>00220 <span class="preprocessor">#if !defined(_MSC_VER) || defined(__INTEL_COMPILER)</span>
<a name="l00221"></a>00221 <span class="preprocessor"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00222"></a>00222 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00162.html">tbb::concurrent_vector</a>;
+<a name="l00222"></a>00222 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00161.html">tbb::concurrent_vector</a>;
<a name="l00223"></a>00223 <span class="preprocessor">#else</span>
<a name="l00224"></a>00224 <span class="preprocessor"></span><span class="keyword">public</span>: <span class="comment">// workaround for MSVC</span>
<a name="l00225"></a>00225 <span class="preprocessor">#endif </span>
@@ -263,7 +263,7 @@
<a name="l00264"></a>00264 __TBB_ASSERT( item==&my_vector->internal_subscript(my_index), <span class="stringliteral">"corrupt cache"</span> );
<a name="l00265"></a>00265 <span class="keywordflow">return</span> *item;
<a name="l00266"></a>00266 }
-<a name="l00267"></a>00267 Value& <a class="code" href="a00162.html#4c52f2950bb1832886bd4458eb09d7eb">operator[]</a>( ptrdiff_t k )<span class="keyword"> const </span>{
+<a name="l00267"></a>00267 Value& <a class="code" href="a00161.html#4c52f2950bb1832886bd4458eb09d7eb">operator[]</a>( ptrdiff_t k )<span class="keyword"> const </span>{
<a name="l00268"></a>00268 <span class="keywordflow">return</span> my_vector->internal_subscript(my_index+k);
<a name="l00269"></a>00269 }
<a name="l00270"></a>00270 Value* operator->()<span class="keyword"> const </span>{<span class="keywordflow">return</span> &operator*();}
@@ -372,21 +372,21 @@
<a name="l00378"></a>00378 <span class="comment"></span>
<a name="l00380"></a>00380
<a name="l00441"></a>00441 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00442"></a><a class="code" href="a00162.html">00442</a> <span class="keyword">class </span><a class="code" href="a00162.html">concurrent_vector</a>: <span class="keyword">protected</span> internal::allocator_base<T, A>,
+<a name="l00442"></a><a class="code" href="a00161.html">00442</a> <span class="keyword">class </span><a class="code" href="a00161.html">concurrent_vector</a>: <span class="keyword">protected</span> internal::allocator_base<T, A>,
<a name="l00443"></a>00443 <span class="keyword">private</span> internal::concurrent_vector_base {
<a name="l00444"></a>00444 <span class="keyword">private</span>:
<a name="l00445"></a>00445 <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l00446"></a>00446 <span class="keyword">class </span>generic_range_type: <span class="keyword">public</span> <a class="code" href="a00148.html">blocked_range</a><I> {
+<a name="l00446"></a>00446 <span class="keyword">class </span>generic_range_type: <span class="keyword">public</span> <a class="code" href="a00147.html">blocked_range</a><I> {
<a name="l00447"></a>00447 <span class="keyword">public</span>:
<a name="l00448"></a>00448 <span class="keyword">typedef</span> T value_type;
<a name="l00449"></a>00449 <span class="keyword">typedef</span> T& reference;
<a name="l00450"></a>00450 <span class="keyword">typedef</span> <span class="keyword">const</span> T& const_reference;
<a name="l00451"></a>00451 <span class="keyword">typedef</span> I iterator;
<a name="l00452"></a>00452 <span class="keyword">typedef</span> ptrdiff_t difference_type;
-<a name="l00453"></a>00453 generic_range_type( I begin_, I end_, size_t grainsize_ = 1) : <a class="code" href="a00148.html">blocked_range<I></a>(begin_,end_,grainsize_) {}
+<a name="l00453"></a>00453 generic_range_type( I begin_, I end_, size_t grainsize_ = 1) : <a class="code" href="a00147.html">blocked_range<I></a>(begin_,end_,grainsize_) {}
<a name="l00454"></a>00454 template<typename U>
-<a name="l00455"></a>00455 generic_range_type( <span class="keyword">const</span> generic_range_type<U>& r) : <a class="code" href="a00148.html">blocked_range<I></a>(r.begin(),r.end(),r.grainsize()) {}
-<a name="l00456"></a>00456 generic_range_type( generic_range_type& r, <a class="code" href="a00198.html">split</a> ) : <a class="code" href="a00148.html">blocked_range<I></a>(r,<a class="code" href="a00198.html">split</a>()) {}
+<a name="l00455"></a>00455 generic_range_type( <span class="keyword">const</span> generic_range_type<U>& r) : <a class="code" href="a00147.html">blocked_range<I></a>(r.begin(),r.end(),r.grainsize()) {}
+<a name="l00456"></a>00456 generic_range_type( generic_range_type& r, <a class="code" href="a00198.html">split</a> ) : <a class="code" href="a00147.html">blocked_range<I></a>(r,<a class="code" href="a00198.html">split</a>()) {}
<a name="l00457"></a>00457 };
<a name="l00458"></a>00458
<a name="l00459"></a>00459 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> U>
@@ -428,13 +428,13 @@
<a name="l00495"></a>00495 <span class="comment">// STL compatible constructors & destructors</span>
<a name="l00496"></a>00496 <span class="comment">//------------------------------------------------------------------------</span>
<a name="l00497"></a>00497
-<a name="l00499"></a><a class="code" href="a00162.html#2c8ca9cabfcd30ad5943324c853664b5">00499</a> <span class="keyword">explicit</span> <a class="code" href="a00162.html">concurrent_vector</a>(<span class="keyword">const</span> allocator_type &a = allocator_type())
+<a name="l00499"></a><a class="code" href="a00161.html#2c8ca9cabfcd30ad5943324c853664b5">00499</a> <span class="keyword">explicit</span> <a class="code" href="a00161.html">concurrent_vector</a>(<span class="keyword">const</span> allocator_type &a = allocator_type())
<a name="l00500"></a>00500 : internal::allocator_base<T, A>(a), internal::concurrent_vector_base()
<a name="l00501"></a>00501 {
<a name="l00502"></a>00502 vector_allocator_ptr = &internal_allocator;
<a name="l00503"></a>00503 }
<a name="l00504"></a>00504
-<a name="l00506"></a><a class="code" href="a00162.html#dd8a200b99a8088435a37934b58fe335">00506</a> <a class="code" href="a00162.html">concurrent_vector</a>( <span class="keyword">const</span> <a class="code" href="a00162.html">concurrent_vector</a>& vector, <span class="keyword">const</span> allocator_type& a = allocator_type() )
+<a name="l00506"></a><a class="code" href="a00161.html#dd8a200b99a8088435a37934b58fe335">00506</a> <a class="code" href="a00161.html">concurrent_vector</a>( <span class="keyword">const</span> <a class="code" href="a00161.html">concurrent_vector</a>& vector, <span class="keyword">const</span> allocator_type& a = allocator_type() )
<a name="l00507"></a>00507 : internal::allocator_base<T, A>(a), internal::concurrent_vector_base()
<a name="l00508"></a>00508 {
<a name="l00509"></a>00509 vector_allocator_ptr = &internal_allocator;
@@ -448,12 +448,12 @@
<a name="l00517"></a>00517 }
<a name="l00518"></a>00518
<a name="l00520"></a>00520 <span class="keyword">template</span><<span class="keyword">class</span> M>
-<a name="l00521"></a><a class="code" href="a00162.html#64432f13f7b29bfe4acfb5568f34f3a8">00521</a> <a class="code" href="a00162.html">concurrent_vector</a>( <span class="keyword">const</span> <a class="code" href="a00162.html">concurrent_vector<T, M></a>& vector, <span class="keyword">const</span> allocator_type& a = allocator_type() )
+<a name="l00521"></a><a class="code" href="a00161.html#64432f13f7b29bfe4acfb5568f34f3a8">00521</a> <a class="code" href="a00161.html">concurrent_vector</a>( <span class="keyword">const</span> <a class="code" href="a00161.html">concurrent_vector<T, M></a>& vector, <span class="keyword">const</span> allocator_type& a = allocator_type() )
<a name="l00522"></a>00522 : internal::allocator_base<T, A>(a), internal::concurrent_vector_base()
<a name="l00523"></a>00523 {
<a name="l00524"></a>00524 vector_allocator_ptr = &internal_allocator;
<a name="l00525"></a>00525 __TBB_TRY {
-<a name="l00526"></a>00526 internal_copy(vector.<a class="code" href="a00162.html#bb5ae659871478f1f5c68039e1273e12">internal_vector_base</a>(), <span class="keyword">sizeof</span>(T), ©_array);
+<a name="l00526"></a>00526 internal_copy(vector.<a class="code" href="a00161.html#bb5ae659871478f1f5c68039e1273e12">internal_vector_base</a>(), <span class="keyword">sizeof</span>(T), ©_array);
<a name="l00527"></a>00527 } __TBB_CATCH(...) {
<a name="l00528"></a>00528 segment_t *table = my_segment;
<a name="l00529"></a>00529 internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
@@ -461,7 +461,7 @@
<a name="l00531"></a>00531 }
<a name="l00532"></a>00532 }
<a name="l00533"></a>00533
-<a name="l00535"></a><a class="code" href="a00162.html#2a2e261dfe1cab3f73f7b1a94137cfca">00535</a> <span class="keyword">explicit</span> <a class="code" href="a00162.html">concurrent_vector</a>(size_type n)
+<a name="l00535"></a><a class="code" href="a00161.html#2a2e261dfe1cab3f73f7b1a94137cfca">00535</a> <span class="keyword">explicit</span> <a class="code" href="a00161.html">concurrent_vector</a>(size_type n)
<a name="l00536"></a>00536 {
<a name="l00537"></a>00537 vector_allocator_ptr = &internal_allocator;
<a name="l00538"></a>00538 __TBB_TRY {
@@ -473,7 +473,7 @@
<a name="l00544"></a>00544 }
<a name="l00545"></a>00545 }
<a name="l00546"></a>00546
-<a name="l00548"></a><a class="code" href="a00162.html#3883a8a908b44e249a57f454de3f55d8">00548</a> <a class="code" href="a00162.html">concurrent_vector</a>(size_type n, const_reference t, <span class="keyword">const</span> allocator_type& a = allocator_type())
+<a name="l00548"></a><a class="code" href="a00161.html#3883a8a908b44e249a57f454de3f55d8">00548</a> <a class="code" href="a00161.html">concurrent_vector</a>(size_type n, const_reference t, <span class="keyword">const</span> allocator_type& a = allocator_type())
<a name="l00549"></a>00549 : internal::allocator_base<T, A>(a)
<a name="l00550"></a>00550 {
<a name="l00551"></a>00551 vector_allocator_ptr = &internal_allocator;
@@ -487,7 +487,7 @@
<a name="l00559"></a>00559 }
<a name="l00560"></a>00560
<a name="l00562"></a>00562 <span class="keyword">template</span><<span class="keyword">class</span> I>
-<a name="l00563"></a><a class="code" href="a00162.html#4450de83c5862ea4bcd9443fd7e67419">00563</a> <a class="code" href="a00162.html">concurrent_vector</a>(I first, I last, <span class="keyword">const</span> allocator_type &a = allocator_type())
+<a name="l00563"></a><a class="code" href="a00161.html#4450de83c5862ea4bcd9443fd7e67419">00563</a> <a class="code" href="a00161.html">concurrent_vector</a>(I first, I last, <span class="keyword">const</span> allocator_type &a = allocator_type())
<a name="l00564"></a>00564 : internal::allocator_base<T, A>(a)
<a name="l00565"></a>00565 {
<a name="l00566"></a>00566 vector_allocator_ptr = &internal_allocator;
@@ -500,14 +500,14 @@
<a name="l00573"></a>00573 }
<a name="l00574"></a>00574 }
<a name="l00575"></a>00575
-<a name="l00577"></a><a class="code" href="a00162.html#691f0f3cda3e489c37a657016e375eaf">00577</a> <a class="code" href="a00162.html">concurrent_vector</a>& operator=( <span class="keyword">const</span> <a class="code" href="a00162.html">concurrent_vector</a>& vector ) {
+<a name="l00577"></a><a class="code" href="a00161.html#691f0f3cda3e489c37a657016e375eaf">00577</a> <a class="code" href="a00161.html">concurrent_vector</a>& operator=( <span class="keyword">const</span> <a class="code" href="a00161.html">concurrent_vector</a>& vector ) {
<a name="l00578"></a>00578 <span class="keywordflow">if</span>( <span class="keyword">this</span> != &vector )
<a name="l00579"></a>00579 internal_assign(vector, <span class="keyword">sizeof</span>(T), &destroy_array, &assign_array, ©_array);
<a name="l00580"></a>00580 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
<a name="l00581"></a>00581 }
<a name="l00582"></a>00582
<a name="l00584"></a>00584 <span class="keyword">template</span><<span class="keyword">class</span> M>
-<a name="l00585"></a><a class="code" href="a00162.html#19f4ab88a01b0fd056af3bba463e7bd6">00585</a> <a class="code" href="a00162.html">concurrent_vector</a>& operator=( <span class="keyword">const</span> <a class="code" href="a00162.html">concurrent_vector<T, M></a>& vector ) {
+<a name="l00585"></a><a class="code" href="a00161.html#19f4ab88a01b0fd056af3bba463e7bd6">00585</a> <a class="code" href="a00161.html">concurrent_vector</a>& operator=( <span class="keyword">const</span> <a class="code" href="a00161.html">concurrent_vector<T, M></a>& vector ) {
<a name="l00586"></a>00586 <span class="keywordflow">if</span>( static_cast<void*>( <span class="keyword">this</span> ) != static_cast<const void*>( &vector ) )
<a name="l00587"></a>00587 internal_assign(vector.internal_vector_base(),
<a name="l00588"></a>00588 <span class="keyword">sizeof</span>(T), &destroy_array, &assign_array, ©_array);
@@ -519,36 +519,36 @@
<a name="l00594"></a>00594 <span class="comment">//------------------------------------------------------------------------</span>
<a name="l00596"></a>00596 <span class="comment"></span><span class="preprocessor">#if TBB_DEPRECATED</span>
<a name="l00597"></a>00597 <span class="preprocessor"></span>
-<a name="l00598"></a><a class="code" href="a00162.html#30484e3959892fd5392fa93c873c31f0">00598</a> size_type grow_by( size_type delta ) {
+<a name="l00598"></a><a class="code" href="a00161.html#30484e3959892fd5392fa93c873c31f0">00598</a> size_type grow_by( size_type delta ) {
<a name="l00599"></a>00599 <span class="keywordflow">return</span> delta ? internal_grow_by( delta, <span class="keyword">sizeof</span>(T), &initialize_array, NULL ) : my_early_size;
<a name="l00600"></a>00600 }
<a name="l00601"></a>00601 <span class="preprocessor">#else</span>
<a name="l00602"></a>00602 <span class="preprocessor"></span>
-<a name="l00603"></a><a class="code" href="a00162.html#c8177b1865270ea68aa1ab9148e5e35e">00603</a> iterator grow_by( size_type delta ) {
+<a name="l00603"></a><a class="code" href="a00161.html#c8177b1865270ea68aa1ab9148e5e35e">00603</a> iterator grow_by( size_type delta ) {
<a name="l00604"></a>00604 <span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>, delta ? internal_grow_by( delta, <span class="keyword">sizeof</span>(T), &initialize_array, NULL ) : my_early_size);
<a name="l00605"></a>00605 }
<a name="l00606"></a>00606 <span class="preprocessor">#endif</span>
<a name="l00607"></a>00607 <span class="preprocessor"></span>
<a name="l00609"></a>00609 <span class="preprocessor">#if TBB_DEPRECATED</span>
<a name="l00610"></a>00610 <span class="preprocessor"></span>
-<a name="l00611"></a><a class="code" href="a00162.html#38274ab3f772ecba600c7daca7690102">00611</a> size_type grow_by( size_type delta, const_reference t ) {
+<a name="l00611"></a><a class="code" href="a00161.html#38274ab3f772ecba600c7daca7690102">00611</a> size_type grow_by( size_type delta, const_reference t ) {
<a name="l00612"></a>00612 <span class="keywordflow">return</span> delta ? internal_grow_by( delta, <span class="keyword">sizeof</span>(T), &initialize_array_by, static_cast<const void*>(&t) ) : my_early_size;
<a name="l00613"></a>00613 }
<a name="l00614"></a>00614 <span class="preprocessor">#else</span>
<a name="l00615"></a>00615 <span class="preprocessor"></span>
-<a name="l00616"></a><a class="code" href="a00162.html#473a59a4c9308b93411b898b3110d26c">00616</a> iterator grow_by( size_type delta, const_reference t ) {
+<a name="l00616"></a><a class="code" href="a00161.html#473a59a4c9308b93411b898b3110d26c">00616</a> iterator grow_by( size_type delta, const_reference t ) {
<a name="l00617"></a>00617 <span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>, delta ? internal_grow_by( delta, <span class="keyword">sizeof</span>(T), &initialize_array_by, static_cast<const void*>(&t) ) : my_early_size);
<a name="l00618"></a>00618 }
<a name="l00619"></a>00619 <span class="preprocessor">#endif</span>
<a name="l00620"></a>00620 <span class="preprocessor"></span>
<a name="l00622"></a>00622 <span class="preprocessor">#if TBB_DEPRECATED</span>
<a name="l00623"></a>00623 <span class="preprocessor"></span>
-<a name="l00625"></a><a class="code" href="a00162.html#47fe588214dd5fa06ab6e8ab78d83874">00625</a> <span class="keywordtype">void</span> grow_to_at_least( size_type n ) {
+<a name="l00625"></a><a class="code" href="a00161.html#47fe588214dd5fa06ab6e8ab78d83874">00625</a> <span class="keywordtype">void</span> grow_to_at_least( size_type n ) {
<a name="l00626"></a>00626 <span class="keywordflow">if</span>( n ) internal_grow_to_at_least_with_result( n, <span class="keyword">sizeof</span>(T), &initialize_array, NULL );
<a name="l00627"></a>00627 };
<a name="l00628"></a>00628 <span class="preprocessor">#else</span>
<a name="l00629"></a>00629 <span class="preprocessor"></span>
-<a name="l00633"></a><a class="code" href="a00162.html#a7e3b67c8ccab16d0aecc80899ae799d">00633</a> iterator grow_to_at_least( size_type n ) {
+<a name="l00633"></a><a class="code" href="a00161.html#a7e3b67c8ccab16d0aecc80899ae799d">00633</a> iterator grow_to_at_least( size_type n ) {
<a name="l00634"></a>00634 size_type m=0;
<a name="l00635"></a>00635 <span class="keywordflow">if</span>( n ) {
<a name="l00636"></a>00636 m = internal_grow_to_at_least_with_result( n, <span class="keyword">sizeof</span>(T), &initialize_array, NULL );
@@ -559,7 +559,7 @@
<a name="l00641"></a>00641 <span class="preprocessor">#endif</span>
<a name="l00642"></a>00642 <span class="preprocessor"></span>
<a name="l00644"></a>00644 <span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00645"></a><a class="code" href="a00162.html#e94e038f915c0268fdf2d3d7f87d81b8">00645</a> <span class="preprocessor"></span> size_type push_back( const_reference item )
+<a name="l00645"></a><a class="code" href="a00161.html#e94e038f915c0268fdf2d3d7f87d81b8">00645</a> <span class="preprocessor"></span> size_type push_back( const_reference item )
<a name="l00646"></a>00646 <span class="preprocessor">#else</span>
<a name="l00647"></a>00647 <span class="preprocessor"></span>
<a name="l00648"></a>00648 iterator push_back( const_reference item )
@@ -577,108 +577,108 @@
<a name="l00660"></a>00660 <span class="preprocessor"></span> }
<a name="l00661"></a>00661
<a name="l00663"></a>00663
-<a name="l00665"></a><a class="code" href="a00162.html#4c52f2950bb1832886bd4458eb09d7eb">00665</a> reference operator[]( size_type index ) {
+<a name="l00665"></a><a class="code" href="a00161.html#4c52f2950bb1832886bd4458eb09d7eb">00665</a> reference operator[]( size_type index ) {
<a name="l00666"></a>00666 <span class="keywordflow">return</span> internal_subscript(index);
<a name="l00667"></a>00667 }
<a name="l00668"></a>00668
-<a name="l00670"></a><a class="code" href="a00162.html#c6fade5c732cc95274d1d8277ea619d1">00670</a> const_reference operator[]( size_type index )<span class="keyword"> const </span>{
+<a name="l00670"></a><a class="code" href="a00161.html#c6fade5c732cc95274d1d8277ea619d1">00670</a> const_reference operator[]( size_type index )<span class="keyword"> const </span>{
<a name="l00671"></a>00671 <span class="keywordflow">return</span> internal_subscript(index);
<a name="l00672"></a>00672 }
<a name="l00673"></a>00673
-<a name="l00675"></a><a class="code" href="a00162.html#0c073ca43e787c7cbf7b0e26d2221748">00675</a> reference at( size_type index ) {
+<a name="l00675"></a><a class="code" href="a00161.html#0c073ca43e787c7cbf7b0e26d2221748">00675</a> reference at( size_type index ) {
<a name="l00676"></a>00676 <span class="keywordflow">return</span> internal_subscript_with_exceptions(index);
<a name="l00677"></a>00677 }
<a name="l00678"></a>00678
-<a name="l00680"></a><a class="code" href="a00162.html#23e14a38af748edff96a7adc3a0f1c58">00680</a> const_reference at( size_type index )<span class="keyword"> const </span>{
+<a name="l00680"></a><a class="code" href="a00161.html#23e14a38af748edff96a7adc3a0f1c58">00680</a> const_reference at( size_type index )<span class="keyword"> const </span>{
<a name="l00681"></a>00681 <span class="keywordflow">return</span> internal_subscript_with_exceptions(index);
<a name="l00682"></a>00682 }
<a name="l00683"></a>00683
-<a name="l00685"></a><a class="code" href="a00162.html#a4c6ffff3bf08b92939aa2fc516edfba">00685</a> range_type range( size_t grainsize = 1) {
+<a name="l00685"></a><a class="code" href="a00161.html#a4c6ffff3bf08b92939aa2fc516edfba">00685</a> range_type range( size_t grainsize = 1) {
<a name="l00686"></a>00686 <span class="keywordflow">return</span> range_type( begin(), end(), grainsize );
<a name="l00687"></a>00687 }
<a name="l00688"></a>00688
-<a name="l00690"></a><a class="code" href="a00162.html#3d09ccfb581b879ae64203741035e193">00690</a> const_range_type range( size_t grainsize = 1 )<span class="keyword"> const </span>{
+<a name="l00690"></a><a class="code" href="a00161.html#3d09ccfb581b879ae64203741035e193">00690</a> const_range_type range( size_t grainsize = 1 )<span class="keyword"> const </span>{
<a name="l00691"></a>00691 <span class="keywordflow">return</span> const_range_type( begin(), end(), grainsize );
<a name="l00692"></a>00692 }
<a name="l00693"></a>00693 <span class="comment">//------------------------------------------------------------------------</span>
<a name="l00694"></a>00694 <span class="comment">// Capacity</span>
<a name="l00695"></a>00695 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00697"></a><a class="code" href="a00162.html#715fe313c4a9c22731cc404dd80c9ec9">00697</a> <span class="comment"></span> size_type size()<span class="keyword"> const </span>{
+<a name="l00697"></a><a class="code" href="a00161.html#715fe313c4a9c22731cc404dd80c9ec9">00697</a> <span class="comment"></span> size_type size()<span class="keyword"> const </span>{
<a name="l00698"></a>00698 size_type sz = my_early_size, cp = internal_capacity();
<a name="l00699"></a>00699 <span class="keywordflow">return</span> cp < sz ? cp : sz;
<a name="l00700"></a>00700 }
<a name="l00701"></a>00701
-<a name="l00703"></a><a class="code" href="a00162.html#c6426cb93cf20d3af40f3c90f1f0481a">00703</a> <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{<span class="keywordflow">return</span> !my_early_size;}
+<a name="l00703"></a><a class="code" href="a00161.html#c6426cb93cf20d3af40f3c90f1f0481a">00703</a> <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{<span class="keywordflow">return</span> !my_early_size;}
<a name="l00704"></a>00704
-<a name="l00706"></a><a class="code" href="a00162.html#3ed6b9ae7217af5103d974045b6f5cd5">00706</a> size_type capacity()<span class="keyword"> const </span>{<span class="keywordflow">return</span> internal_capacity();}
+<a name="l00706"></a><a class="code" href="a00161.html#3ed6b9ae7217af5103d974045b6f5cd5">00706</a> size_type capacity()<span class="keyword"> const </span>{<span class="keywordflow">return</span> internal_capacity();}
<a name="l00707"></a>00707
<a name="l00709"></a>00709
-<a name="l00711"></a><a class="code" href="a00162.html#5a0ce05026994b010018f72cfdeb72c1">00711</a> <span class="keywordtype">void</span> reserve( size_type n ) {
+<a name="l00711"></a><a class="code" href="a00161.html#5a0ce05026994b010018f72cfdeb72c1">00711</a> <span class="keywordtype">void</span> reserve( size_type n ) {
<a name="l00712"></a>00712 <span class="keywordflow">if</span>( n )
<a name="l00713"></a>00713 internal_reserve(n, <span class="keyword">sizeof</span>(T), max_size());
<a name="l00714"></a>00714 }
<a name="l00715"></a>00715
-<a name="l00717"></a><a class="code" href="a00162.html#8dfb0cb0eef96d440b4dcf801807a718">00717</a> <span class="keywordtype">void</span> resize( size_type n ) {
+<a name="l00717"></a><a class="code" href="a00161.html#8dfb0cb0eef96d440b4dcf801807a718">00717</a> <span class="keywordtype">void</span> resize( size_type n ) {
<a name="l00718"></a>00718 internal_resize( n, <span class="keyword">sizeof</span>(T), max_size(), NULL, &destroy_array, &initialize_array );
<a name="l00719"></a>00719 }
<a name="l00720"></a>00720
-<a name="l00722"></a><a class="code" href="a00162.html#98ce6b2c6d2622f0c030b46dfac3880c">00722</a> <span class="keywordtype">void</span> resize( size_type n, const_reference t ) {
+<a name="l00722"></a><a class="code" href="a00161.html#98ce6b2c6d2622f0c030b46dfac3880c">00722</a> <span class="keywordtype">void</span> resize( size_type n, const_reference t ) {
<a name="l00723"></a>00723 internal_resize( n, <span class="keyword">sizeof</span>(T), max_size(), static_cast<const void*>(&t), &destroy_array, &initialize_array_by );
<a name="l00724"></a>00724 }
<a name="l00725"></a>00725
<a name="l00726"></a>00726 <span class="preprocessor">#if TBB_DEPRECATED </span>
-<a name="l00728"></a><a class="code" href="a00162.html#1693d1da41b1a8235871be9c6633be35">00728</a> <span class="preprocessor"> void compact() {shrink_to_fit();}</span>
+<a name="l00728"></a><a class="code" href="a00161.html#1693d1da41b1a8235871be9c6633be35">00728</a> <span class="preprocessor"> void compact() {shrink_to_fit();}</span>
<a name="l00729"></a>00729 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_DEPRECATED */</span>
<a name="l00730"></a>00730
<a name="l00732"></a>00732 <span class="keywordtype">void</span> shrink_to_fit();
<a name="l00733"></a>00733
-<a name="l00735"></a><a class="code" href="a00162.html#2c248a017f0576df3e7cd99627836fd6">00735</a> size_type max_size()<span class="keyword"> const </span>{<span class="keywordflow">return</span> (~size_type(0))/<span class="keyword">sizeof</span>(T);}
+<a name="l00735"></a><a class="code" href="a00161.html#2c248a017f0576df3e7cd99627836fd6">00735</a> size_type max_size()<span class="keyword"> const </span>{<span class="keywordflow">return</span> (~size_type(0))/<span class="keyword">sizeof</span>(T);}
<a name="l00736"></a>00736
<a name="l00737"></a>00737 <span class="comment">//------------------------------------------------------------------------</span>
<a name="l00738"></a>00738 <span class="comment">// STL support</span>
<a name="l00739"></a>00739 <span class="comment">//------------------------------------------------------------------------</span>
<a name="l00740"></a>00740
-<a name="l00742"></a><a class="code" href="a00162.html#730b23a251ecb6d37f692fb22f38e029">00742</a> iterator begin() {<span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>,0);}
-<a name="l00744"></a><a class="code" href="a00162.html#c0b51160e5a764982ec97a455f94f2c6">00744</a> iterator end() {<span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>,size());}
-<a name="l00746"></a><a class="code" href="a00162.html#78a06182276ff758788d4c0623ae0d71">00746</a> const_iterator begin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>,0);}
-<a name="l00748"></a><a class="code" href="a00162.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">00748</a> const_iterator end()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>,size());}
-<a name="l00750"></a><a class="code" href="a00162.html#f88fcf1c920693c39bd9709db33c199f">00750</a> const_iterator cbegin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>,0);}
-<a name="l00752"></a><a class="code" href="a00162.html#0c15a5d0f1cf75d687dabba07da1d46b">00752</a> const_iterator cend()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>,size());}
-<a name="l00754"></a><a class="code" href="a00162.html#5e220926d09236d98f04fe0721e5f9a1">00754</a> reverse_iterator rbegin() {<span class="keywordflow">return</span> reverse_iterator(end());}
-<a name="l00756"></a><a class="code" href="a00162.html#290119a4eb43cd6a9e98fa17016ba3c2">00756</a> reverse_iterator rend() {<span class="keywordflow">return</span> reverse_iterator(begin());}
-<a name="l00758"></a><a class="code" href="a00162.html#9f9c103e18d5f212703805354074ad44">00758</a> const_reverse_iterator rbegin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_reverse_iterator(end());}
-<a name="l00760"></a><a class="code" href="a00162.html#d438b9b32ea3a8ffb703015b6dce055b">00760</a> const_reverse_iterator rend()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_reverse_iterator(begin());}
-<a name="l00762"></a><a class="code" href="a00162.html#db78a1d28c9c966050e8a2926d834a33">00762</a> const_reverse_iterator crbegin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_reverse_iterator(end());}
-<a name="l00764"></a><a class="code" href="a00162.html#fff9cece89438587997ebedf93c5e962">00764</a> const_reverse_iterator crend()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_reverse_iterator(begin());}
-<a name="l00766"></a><a class="code" href="a00162.html#15181759c0bfa2ddce5d10c7550e0002">00766</a> reference front() {
+<a name="l00742"></a><a class="code" href="a00161.html#730b23a251ecb6d37f692fb22f38e029">00742</a> iterator begin() {<span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>,0);}
+<a name="l00744"></a><a class="code" href="a00161.html#c0b51160e5a764982ec97a455f94f2c6">00744</a> iterator end() {<span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>,size());}
+<a name="l00746"></a><a class="code" href="a00161.html#78a06182276ff758788d4c0623ae0d71">00746</a> const_iterator begin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>,0);}
+<a name="l00748"></a><a class="code" href="a00161.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">00748</a> const_iterator end()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>,size());}
+<a name="l00750"></a><a class="code" href="a00161.html#f88fcf1c920693c39bd9709db33c199f">00750</a> const_iterator cbegin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>,0);}
+<a name="l00752"></a><a class="code" href="a00161.html#0c15a5d0f1cf75d687dabba07da1d46b">00752</a> const_iterator cend()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>,size());}
+<a name="l00754"></a><a class="code" href="a00161.html#5e220926d09236d98f04fe0721e5f9a1">00754</a> reverse_iterator rbegin() {<span class="keywordflow">return</span> reverse_iterator(end());}
+<a name="l00756"></a><a class="code" href="a00161.html#290119a4eb43cd6a9e98fa17016ba3c2">00756</a> reverse_iterator rend() {<span class="keywordflow">return</span> reverse_iterator(begin());}
+<a name="l00758"></a><a class="code" href="a00161.html#9f9c103e18d5f212703805354074ad44">00758</a> const_reverse_iterator rbegin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_reverse_iterator(end());}
+<a name="l00760"></a><a class="code" href="a00161.html#d438b9b32ea3a8ffb703015b6dce055b">00760</a> const_reverse_iterator rend()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_reverse_iterator(begin());}
+<a name="l00762"></a><a class="code" href="a00161.html#db78a1d28c9c966050e8a2926d834a33">00762</a> const_reverse_iterator crbegin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_reverse_iterator(end());}
+<a name="l00764"></a><a class="code" href="a00161.html#fff9cece89438587997ebedf93c5e962">00764</a> const_reverse_iterator crend()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_reverse_iterator(begin());}
+<a name="l00766"></a><a class="code" href="a00161.html#15181759c0bfa2ddce5d10c7550e0002">00766</a> reference front() {
<a name="l00767"></a>00767 __TBB_ASSERT( size()>0, NULL);
<a name="l00768"></a>00768 <span class="keywordflow">return</span> static_cast<T*>(my_segment[0].array)[0];
<a name="l00769"></a>00769 }
-<a name="l00771"></a><a class="code" href="a00162.html#502615a858eb9fa0390ee59169065e90">00771</a> const_reference front()<span class="keyword"> const </span>{
+<a name="l00771"></a><a class="code" href="a00161.html#502615a858eb9fa0390ee59169065e90">00771</a> const_reference front()<span class="keyword"> const </span>{
<a name="l00772"></a>00772 __TBB_ASSERT( size()>0, NULL);
<a name="l00773"></a>00773 <span class="keywordflow">return</span> static_cast<const T*>(my_segment[0].array)[0];
<a name="l00774"></a>00774 }
-<a name="l00776"></a><a class="code" href="a00162.html#41ce48d6015a1a2812d41cf620ec3476">00776</a> reference back() {
+<a name="l00776"></a><a class="code" href="a00161.html#41ce48d6015a1a2812d41cf620ec3476">00776</a> reference back() {
<a name="l00777"></a>00777 __TBB_ASSERT( size()>0, NULL);
<a name="l00778"></a>00778 <span class="keywordflow">return</span> internal_subscript( size()-1 );
<a name="l00779"></a>00779 }
-<a name="l00781"></a><a class="code" href="a00162.html#bd518e204107d07fd08d0ec5bdfd383d">00781</a> const_reference back()<span class="keyword"> const </span>{
+<a name="l00781"></a><a class="code" href="a00161.html#bd518e204107d07fd08d0ec5bdfd383d">00781</a> const_reference back()<span class="keyword"> const </span>{
<a name="l00782"></a>00782 __TBB_ASSERT( size()>0, NULL);
<a name="l00783"></a>00783 <span class="keywordflow">return</span> internal_subscript( size()-1 );
<a name="l00784"></a>00784 }
-<a name="l00786"></a><a class="code" href="a00162.html#2fdba8e90de6a4d2300222236d46758e">00786</a> allocator_type get_allocator()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> this->my_allocator; }
+<a name="l00786"></a><a class="code" href="a00161.html#2fdba8e90de6a4d2300222236d46758e">00786</a> allocator_type get_allocator()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> this->my_allocator; }
<a name="l00787"></a>00787
-<a name="l00789"></a><a class="code" href="a00162.html#423e5aa15e0e3309ad86d026fd85f6f6">00789</a> <span class="keywordtype">void</span> assign(size_type n, const_reference t) {
+<a name="l00789"></a><a class="code" href="a00161.html#423e5aa15e0e3309ad86d026fd85f6f6">00789</a> <span class="keywordtype">void</span> assign(size_type n, const_reference t) {
<a name="l00790"></a>00790 clear();
<a name="l00791"></a>00791 internal_resize( n, <span class="keyword">sizeof</span>(T), max_size(), static_cast<const void*>(&t), &destroy_array, &initialize_array_by );
<a name="l00792"></a>00792 }
<a name="l00793"></a>00793
<a name="l00795"></a>00795 <span class="keyword">template</span><<span class="keyword">class</span> I>
-<a name="l00796"></a><a class="code" href="a00162.html#93a06b3112cb804f42f40efb5e7387b4">00796</a> <span class="keywordtype">void</span> assign(I first, I last) {
+<a name="l00796"></a><a class="code" href="a00161.html#93a06b3112cb804f42f40efb5e7387b4">00796</a> <span class="keywordtype">void</span> assign(I first, I last) {
<a name="l00797"></a>00797 clear(); internal_assign_range( first, last, <span class="keyword">static_cast</span><is_integer_tag<std::numeric_limits<I>::is_integer> *>(0) );
<a name="l00798"></a>00798 }
<a name="l00799"></a>00799
-<a name="l00801"></a><a class="code" href="a00162.html#96c9c4bd968ed3edb8dd276854d2dae0">00801</a> <span class="keywordtype">void</span> swap(<a class="code" href="a00162.html">concurrent_vector</a> &vector) {
+<a name="l00801"></a><a class="code" href="a00161.html#96c9c4bd968ed3edb8dd276854d2dae0">00801</a> <span class="keywordtype">void</span> swap(<a class="code" href="a00161.html">concurrent_vector</a> &vector) {
<a name="l00802"></a>00802 <span class="keywordflow">if</span>( <span class="keyword">this</span> != &vector ) {
<a name="l00803"></a>00803 concurrent_vector_base_v3::internal_swap(static_cast<concurrent_vector_base_v3&>(vector));
<a name="l00804"></a>00804 std::swap(this->my_allocator, vector.my_allocator);
@@ -686,11 +686,11 @@
<a name="l00806"></a>00806 }
<a name="l00807"></a>00807
<a name="l00809"></a>00809
-<a name="l00810"></a><a class="code" href="a00162.html#26f937a359a66b6aae904c3cd9a3c444">00810</a> <span class="keywordtype">void</span> clear() {
+<a name="l00810"></a><a class="code" href="a00161.html#26f937a359a66b6aae904c3cd9a3c444">00810</a> <span class="keywordtype">void</span> clear() {
<a name="l00811"></a>00811 internal_clear(&destroy_array);
<a name="l00812"></a>00812 }
<a name="l00813"></a>00813
-<a name="l00815"></a><a class="code" href="a00162.html#da2444b28bb840d38f60d0030333a5fc">00815</a> ~<a class="code" href="a00162.html">concurrent_vector</a>() {
+<a name="l00815"></a><a class="code" href="a00161.html#da2444b28bb840d38f60d0030333a5fc">00815</a> ~<a class="code" href="a00161.html">concurrent_vector</a>() {
<a name="l00816"></a>00816 segment_t *table = my_segment;
<a name="l00817"></a>00817 internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
<a name="l00818"></a>00818 <span class="comment">// base class destructor call should be then</span>
@@ -754,7 +754,7 @@
<a name="l00891"></a>00891 };
<a name="l00892"></a>00892
<a name="l00893"></a>00893 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00894"></a><a class="code" href="a00162.html#03c6f4cf66532bf4cc907ee738a9a186">00894</a> <span class="keywordtype">void</span> <a class="code" href="a00162.html">concurrent_vector<T, A>::shrink_to_fit</a>() {
+<a name="l00894"></a><a class="code" href="a00161.html#03c6f4cf66532bf4cc907ee738a9a186">00894</a> <span class="keywordtype">void</span> <a class="code" href="a00161.html">concurrent_vector<T, A>::shrink_to_fit</a>() {
<a name="l00895"></a>00895 internal_segments_table old;
<a name="l00896"></a>00896 __TBB_TRY {
<a name="l00897"></a>00897 <span class="keywordflow">if</span>( internal_compact( <span class="keyword">sizeof</span>(T), &old, &destroy_array, ©_array ) )
@@ -767,7 +767,7 @@
<a name="l00904"></a>00904 }
<a name="l00905"></a>00905
<a name="l00906"></a>00906 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00907"></a>00907 <span class="keywordtype">void</span> <a class="code" href="a00162.html">concurrent_vector<T, A>::internal_free_segments</a>(<span class="keywordtype">void</span> *table[], segment_index_t k, segment_index_t first_block) {
+<a name="l00907"></a>00907 <span class="keywordtype">void</span> <a class="code" href="a00161.html">concurrent_vector<T, A>::internal_free_segments</a>(<span class="keywordtype">void</span> *table[], segment_index_t k, segment_index_t first_block) {
<a name="l00908"></a>00908 <span class="comment">// Free the arrays</span>
<a name="l00909"></a>00909 <span class="keywordflow">while</span>( k > first_block ) {
<a name="l00910"></a>00910 --k;
@@ -820,7 +820,7 @@
<a name="l00957"></a>00957 __TBB_ASSERT(my_early_size == 0, NULL);
<a name="l00958"></a>00958 size_type n = std::distance(first, last);
<a name="l00959"></a>00959 <span class="keywordflow">if</span>( !n ) <span class="keywordflow">return</span>;
-<a name="l00960"></a>00960 internal_reserve(n, <span class="keyword">sizeof</span>(T), <a class="code" href="a00162.html#2c248a017f0576df3e7cd99627836fd6">max_size</a>());
+<a name="l00960"></a>00960 internal_reserve(n, <span class="keyword">sizeof</span>(T), <a class="code" href="a00161.html#2c248a017f0576df3e7cd99627836fd6">max_size</a>());
<a name="l00961"></a>00961 my_early_size = n;
<a name="l00962"></a>00962 segment_index_t k = 0;
<a name="l00963"></a>00963 size_type sz = segment_size( my_first_block );
diff --git a/doc/html/a00350.html b/doc/html/a00351.html
similarity index 100%
rename from doc/html/a00350.html
rename to doc/html/a00351.html
diff --git a/doc/html/a00353.html b/doc/html/a00353.html
deleted file mode 100644
index f99c54b..0000000
--- a/doc/html/a00353.html
+++ /dev/null
@@ -1,1019 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>enumerable_thread_specific.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>enumerable_thread_specific.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_enumerable_thread_specific_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_enumerable_thread_specific_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "concurrent_vector.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "tbb_thread.h"</span>
-<a name="l00026"></a>00026 <span class="preprocessor">#include "cache_aligned_allocator.h"</span>
-<a name="l00027"></a>00027 <span class="preprocessor">#if __SUNPRO_CC</span>
-<a name="l00028"></a>00028 <span class="preprocessor"></span><span class="preprocessor">#include <string.h></span> <span class="comment">// for memcpy</span>
-<a name="l00029"></a>00029 <span class="preprocessor">#endif</span>
-<a name="l00030"></a>00030 <span class="preprocessor"></span>
-<a name="l00031"></a>00031 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00032"></a>00032 <span class="preprocessor"></span><span class="preprocessor">#include <windows.h></span>
-<a name="l00033"></a>00033 <span class="preprocessor">#else</span>
-<a name="l00034"></a>00034 <span class="preprocessor"></span><span class="preprocessor">#include <pthread.h></span>
-<a name="l00035"></a>00035 <span class="preprocessor">#endif</span>
-<a name="l00036"></a>00036 <span class="preprocessor"></span>
-<a name="l00037"></a>00037 <span class="keyword">namespace </span>tbb {
-<a name="l00038"></a>00038
-<a name="l00040"></a><a class="code" href="a00267.html#a8622ae61b7e7737dac26542e181178e">00040</a> <span class="keyword">enum</span> <a class="code" href="a00267.html#a8622ae61b7e7737dac26542e181178e">ets_key_usage_type</a> { ets_key_per_instance, ets_no_key };
-<a name="l00041"></a>00041
-<a name="l00042"></a>00042 <span class="keyword">namespace </span>interface5 {
-<a name="l00043"></a>00043
-<a name="l00045"></a>00045 <span class="keyword">namespace </span>internal {
-<a name="l00046"></a>00046
-<a name="l00047"></a>00047 <span class="keyword">template</span><ets_key_usage_type ETS_key_type>
-<a name="l00048"></a>00048 <span class="keyword">class </span>ets_base: tbb::internal::no_copy {
-<a name="l00049"></a>00049 <span class="keyword">protected</span>:
-<a name="l00050"></a>00050 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00051"></a>00051 <span class="preprocessor"></span> <span class="keyword">typedef</span> DWORD key_type;
-<a name="l00052"></a>00052 <span class="preprocessor">#else</span>
-<a name="l00053"></a>00053 <span class="preprocessor"></span> <span class="keyword">typedef</span> pthread_t key_type;
-<a name="l00054"></a>00054 <span class="preprocessor">#endif</span>
-<a name="l00055"></a>00055 <span class="preprocessor"></span><span class="preprocessor">#if __TBB_GCC_3_3_PROTECTED_BROKEN</span>
-<a name="l00056"></a>00056 <span class="preprocessor"></span> <span class="keyword">public</span>:
-<a name="l00057"></a>00057 <span class="preprocessor">#endif</span>
-<a name="l00058"></a>00058 <span class="preprocessor"></span> <span class="keyword">struct </span>slot;
-<a name="l00059"></a>00059
-<a name="l00060"></a>00060 <span class="keyword">struct </span>array {
-<a name="l00061"></a>00061 array* next;
-<a name="l00062"></a>00062 size_t lg_size;
-<a name="l00063"></a>00063 slot& at( size_t k ) {
-<a name="l00064"></a>00064 <span class="keywordflow">return</span> ((slot*)(<span class="keywordtype">void</span>*)(<span class="keyword">this</span>+1))[k];
-<a name="l00065"></a>00065 }
-<a name="l00066"></a>00066 size_t size()<span class="keyword"> const </span>{<span class="keywordflow">return</span> (size_t)1<<lg_size;}
-<a name="l00067"></a>00067 size_t mask()<span class="keyword"> const </span>{<span class="keywordflow">return</span> size()-1;}
-<a name="l00068"></a>00068 size_t start( size_t h )<span class="keyword"> const </span>{
-<a name="l00069"></a>00069 <span class="keywordflow">return</span> h>>(8*<span class="keyword">sizeof</span>(size_t)-lg_size);
-<a name="l00070"></a>00070 }
-<a name="l00071"></a>00071 };
-<a name="l00072"></a>00072 <span class="keyword">struct </span>slot {
-<a name="l00073"></a>00073 key_type key;
-<a name="l00074"></a>00074 <span class="keywordtype">void</span>* ptr;
-<a name="l00075"></a>00075 <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{<span class="keywordflow">return</span> !key;}
-<a name="l00076"></a>00076 <span class="keywordtype">bool</span> match( key_type k )<span class="keyword"> const </span>{<span class="keywordflow">return</span> key==k;}
-<a name="l00077"></a>00077 <span class="keywordtype">bool</span> claim( key_type k ) {
-<a name="l00078"></a>00078 __TBB_ASSERT(<span class="keyword">sizeof</span>(<a class="code" href="a00143.html">tbb::atomic<key_type></a>)==<span class="keyword">sizeof</span>(key_type), NULL);
-<a name="l00079"></a>00079 __TBB_ASSERT(<span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*)==<span class="keyword">sizeof</span>(tbb::atomic<key_type>*), NULL);
-<a name="l00080"></a>00080 <span class="keyword">union </span>{ <span class="keywordtype">void</span>* space; tbb::atomic<key_type>* key_atomic; } helper;
-<a name="l00081"></a>00081 helper.space = &key;
-<a name="l00082"></a>00082 <span class="keywordflow">return</span> helper.key_atomic->compare_and_swap(k,0)==0;
-<a name="l00083"></a>00083 }
-<a name="l00084"></a>00084 };
-<a name="l00085"></a>00085 <span class="preprocessor">#if __TBB_GCC_3_3_PROTECTED_BROKEN</span>
-<a name="l00086"></a>00086 <span class="preprocessor"></span> <span class="keyword">protected</span>:
-<a name="l00087"></a>00087 <span class="preprocessor">#endif</span>
-<a name="l00088"></a>00088 <span class="preprocessor"></span>
-<a name="l00089"></a>00089 <span class="keyword">static</span> key_type key_of_current_thread() {
-<a name="l00090"></a>00090 tbb::tbb_thread::id <span class="keywordtype">id</span> = tbb::this_tbb_thread::get_id();
-<a name="l00091"></a>00091 key_type k;
-<a name="l00092"></a>00092 memcpy( &k, &<span class="keywordtype">id</span>, <span class="keyword">sizeof</span>(k) );
-<a name="l00093"></a>00093 <span class="keywordflow">return</span> k;
-<a name="l00094"></a>00094 }
-<a name="l00095"></a>00095
-<a name="l00097"></a>00097
-<a name="l00099"></a>00099 atomic<array*> my_root;
-<a name="l00100"></a>00100 atomic<size_t> my_count;
-<a name="l00101"></a>00101 <span class="keyword">virtual</span> <span class="keywordtype">void</span>* create_local() = 0;
-<a name="l00102"></a>00102 <span class="keyword">virtual</span> <span class="keywordtype">void</span>* create_array(size_t _size) = 0; <span class="comment">// _size in bytes</span>
-<a name="l00103"></a>00103 <span class="keyword">virtual</span> <span class="keywordtype">void</span> free_array(<span class="keywordtype">void</span>* ptr, size_t _size) = 0; <span class="comment">// _size in bytes</span>
-<a name="l00104"></a>00104 array* allocate( size_t lg_size ) {
-<a name="l00105"></a>00105 size_t n = 1<<lg_size;
-<a name="l00106"></a>00106 array* a = static_cast<array*>(create_array( <span class="keyword">sizeof</span>(array)+n*<span class="keyword">sizeof</span>(slot) ));
-<a name="l00107"></a>00107 a->lg_size = lg_size;
-<a name="l00108"></a>00108 std::memset( a+1, 0, n*<span class="keyword">sizeof</span>(slot) );
-<a name="l00109"></a>00109 <span class="keywordflow">return</span> a;
-<a name="l00110"></a>00110 }
-<a name="l00111"></a>00111 <span class="keywordtype">void</span> free(array* a) {
-<a name="l00112"></a>00112 size_t n = 1<<(a->lg_size);
-<a name="l00113"></a>00113 free_array( (<span class="keywordtype">void</span> *)a, size_t(<span class="keyword">sizeof</span>(array)+n*<span class="keyword">sizeof</span>(slot)) );
-<a name="l00114"></a>00114 }
-<a name="l00115"></a>00115 <span class="keyword">static</span> size_t hash( key_type k ) {
-<a name="l00116"></a>00116 <span class="comment">// Multiplicative hashing. Client should use *upper* bits.</span>
-<a name="l00117"></a>00117 <span class="comment">// casts required for Mac gcc4.* compiler</span>
-<a name="l00118"></a>00118 <span class="preprocessor">#if __TBB_WORDSIZE == 4</span>
-<a name="l00119"></a>00119 <span class="preprocessor"></span> <span class="keywordflow">return</span> uintptr_t(k)*0x9E3779B9;
-<a name="l00120"></a>00120 <span class="preprocessor">#else</span>
-<a name="l00121"></a>00121 <span class="preprocessor"></span> <span class="keywordflow">return</span> uintptr_t(k)*0x9E3779B97F4A7C15;
-<a name="l00122"></a>00122 <span class="preprocessor">#endif </span>
-<a name="l00123"></a>00123 <span class="preprocessor"></span> }
-<a name="l00124"></a>00124
-<a name="l00125"></a>00125 ets_base() {my_root=NULL; my_count=0;}
-<a name="l00126"></a>00126 <span class="keyword">virtual</span> ~ets_base(); <span class="comment">// g++ complains if this is not virtual...</span>
-<a name="l00127"></a>00127 <span class="keywordtype">void</span>* table_lookup( <span class="keywordtype">bool</span>& exists );
-<a name="l00128"></a>00128 <span class="keywordtype">void</span> table_clear();
-<a name="l00129"></a>00129 slot& table_find( key_type k ) {
-<a name="l00130"></a>00130 size_t h = hash(k);
-<a name="l00131"></a>00131 array* r = my_root;
-<a name="l00132"></a>00132 size_t mask = r->mask();
-<a name="l00133"></a>00133 <span class="keywordflow">for</span>(size_t i = r->start(h);;i=(i+1)&mask) {
-<a name="l00134"></a>00134 slot& s = r->at(i);
-<a name="l00135"></a>00135 <span class="keywordflow">if</span>( s.empty() || s.match(k) )
-<a name="l00136"></a>00136 <span class="keywordflow">return</span> s;
-<a name="l00137"></a>00137 }
-<a name="l00138"></a>00138 }
-<a name="l00139"></a>00139 <span class="keywordtype">void</span> table_reserve_for_copy( <span class="keyword">const</span> ets_base& other ) {
-<a name="l00140"></a>00140 __TBB_ASSERT(!my_root,NULL);
-<a name="l00141"></a>00141 __TBB_ASSERT(!my_count,NULL);
-<a name="l00142"></a>00142 <span class="keywordflow">if</span>( other.my_root ) {
-<a name="l00143"></a>00143 array* a = allocate(other.my_root->lg_size);
-<a name="l00144"></a>00144 a->next = NULL;
-<a name="l00145"></a>00145 my_root = a;
-<a name="l00146"></a>00146 my_count = other.my_count;
-<a name="l00147"></a>00147 }
-<a name="l00148"></a>00148 }
-<a name="l00149"></a>00149 };
-<a name="l00150"></a>00150
-<a name="l00151"></a>00151 <span class="keyword">template</span><ets_key_usage_type ETS_key_type>
-<a name="l00152"></a>00152 ets_base<ETS_key_type>::~ets_base() {
-<a name="l00153"></a>00153 __TBB_ASSERT(!my_root, NULL);
-<a name="l00154"></a>00154 }
-<a name="l00155"></a>00155
-<a name="l00156"></a>00156 <span class="keyword">template</span><ets_key_usage_type ETS_key_type>
-<a name="l00157"></a>00157 <span class="keywordtype">void</span> ets_base<ETS_key_type>::table_clear() {
-<a name="l00158"></a>00158 <span class="keywordflow">while</span>( array* r = my_root ) {
-<a name="l00159"></a>00159 my_root = r->next;
-<a name="l00160"></a>00160 free(r);
-<a name="l00161"></a>00161 }
-<a name="l00162"></a>00162 my_count = 0;
-<a name="l00163"></a>00163 }
-<a name="l00164"></a>00164
-<a name="l00165"></a>00165 <span class="keyword">template</span><ets_key_usage_type ETS_key_type>
-<a name="l00166"></a>00166 <span class="keywordtype">void</span>* ets_base<ETS_key_type>::table_lookup( <span class="keywordtype">bool</span>& exists ) {
-<a name="l00167"></a>00167 <span class="keyword">const</span> key_type k = key_of_current_thread();
-<a name="l00168"></a>00168
-<a name="l00169"></a>00169 __TBB_ASSERT(k!=0,NULL);
-<a name="l00170"></a>00170 <span class="keywordtype">void</span>* found;
-<a name="l00171"></a>00171 size_t h = hash(k);
-<a name="l00172"></a>00172 <span class="keywordflow">for</span>( array* r=my_root; r; r=r->next ) {
-<a name="l00173"></a>00173 size_t mask=r->mask();
-<a name="l00174"></a>00174 <span class="keywordflow">for</span>(size_t i = r->start(h); ;i=(i+1)&mask) {
-<a name="l00175"></a>00175 slot& s = r->at(i);
-<a name="l00176"></a>00176 <span class="keywordflow">if</span>( s.empty() ) <span class="keywordflow">break</span>;
-<a name="l00177"></a>00177 <span class="keywordflow">if</span>( s.match(k) ) {
-<a name="l00178"></a>00178 <span class="keywordflow">if</span>( r==my_root ) {
-<a name="l00179"></a>00179 <span class="comment">// Success at top level</span>
-<a name="l00180"></a>00180 exists = <span class="keyword">true</span>;
-<a name="l00181"></a>00181 <span class="keywordflow">return</span> s.ptr;
-<a name="l00182"></a>00182 } <span class="keywordflow">else</span> {
-<a name="l00183"></a>00183 <span class="comment">// Success at some other level. Need to insert at top level.</span>
-<a name="l00184"></a>00184 exists = <span class="keyword">true</span>;
-<a name="l00185"></a>00185 found = s.ptr;
-<a name="l00186"></a>00186 <span class="keywordflow">goto</span> insert;
-<a name="l00187"></a>00187 }
-<a name="l00188"></a>00188 }
-<a name="l00189"></a>00189 }
-<a name="l00190"></a>00190 }
-<a name="l00191"></a>00191 <span class="comment">// Key does not yet exist</span>
-<a name="l00192"></a>00192 exists = <span class="keyword">false</span>;
-<a name="l00193"></a>00193 found = create_local();
-<a name="l00194"></a>00194 {
-<a name="l00195"></a>00195 size_t c = ++my_count;
-<a name="l00196"></a>00196 array* r = my_root;
-<a name="l00197"></a>00197 <span class="keywordflow">if</span>( !r || c>r->size()/2 ) {
-<a name="l00198"></a>00198 size_t s = r ? r->lg_size : 2;
-<a name="l00199"></a>00199 <span class="keywordflow">while</span>( c>size_t(1)<<(s-1) ) ++s;
-<a name="l00200"></a>00200 array* a = allocate(s);
-<a name="l00201"></a>00201 <span class="keywordflow">for</span>(;;) {
-<a name="l00202"></a>00202 a->next = my_root;
-<a name="l00203"></a>00203 array* new_r = my_root.compare_and_swap(a,r);
-<a name="l00204"></a>00204 <span class="keywordflow">if</span>( new_r==r ) <span class="keywordflow">break</span>;
-<a name="l00205"></a>00205 <span class="keywordflow">if</span>( new_r->lg_size>=s ) {
-<a name="l00206"></a>00206 <span class="comment">// Another thread inserted an equal or bigger array, so our array is superfluous.</span>
-<a name="l00207"></a>00207 free(a);
-<a name="l00208"></a>00208 <span class="keywordflow">break</span>;
-<a name="l00209"></a>00209 }
-<a name="l00210"></a>00210 r = new_r;
-<a name="l00211"></a>00211 }
-<a name="l00212"></a>00212 }
-<a name="l00213"></a>00213 }
-<a name="l00214"></a>00214 insert:
-<a name="l00215"></a>00215 <span class="comment">// Guaranteed to be room for it, and it is not present, so search for empty slot and grab it.</span>
-<a name="l00216"></a>00216 array* ir = my_root;
-<a name="l00217"></a>00217 size_t mask = ir->mask();
-<a name="l00218"></a>00218 <span class="keywordflow">for</span>(size_t i = ir->start(h);;i=(i+1)&mask) {
-<a name="l00219"></a>00219 slot& s = ir->at(i);
-<a name="l00220"></a>00220 <span class="keywordflow">if</span>( s.empty() ) {
-<a name="l00221"></a>00221 <span class="keywordflow">if</span>( s.claim(k) ) {
-<a name="l00222"></a>00222 s.ptr = found;
-<a name="l00223"></a>00223 <span class="keywordflow">return</span> found;
-<a name="l00224"></a>00224 }
-<a name="l00225"></a>00225 }
-<a name="l00226"></a>00226 }
-<a name="l00227"></a>00227 };
-<a name="l00228"></a>00228
-<a name="l00230"></a>00230 <span class="keyword">template</span> <>
-<a name="l00231"></a>00231 <span class="keyword">class </span>ets_base<ets_key_per_instance>: <span class="keyword">protected</span> ets_base<ets_no_key> {
-<a name="l00232"></a>00232 <span class="keyword">typedef</span> ets_base<ets_no_key> super;
-<a name="l00233"></a>00233 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00234"></a>00234 <span class="preprocessor"></span> <span class="keyword">typedef</span> DWORD tls_key_t;
-<a name="l00235"></a>00235 <span class="keywordtype">void</span> create_key() { my_key = TlsAlloc(); }
-<a name="l00236"></a>00236 <span class="keywordtype">void</span> destroy_key() { TlsFree(my_key); }
-<a name="l00237"></a>00237 <span class="keywordtype">void</span> set_tls(<span class="keywordtype">void</span> * value) { TlsSetValue(my_key, (LPVOID)value); }
-<a name="l00238"></a>00238 <span class="keywordtype">void</span>* get_tls() { <span class="keywordflow">return</span> (<span class="keywordtype">void</span> *)TlsGetValue(my_key); }
-<a name="l00239"></a>00239 <span class="preprocessor">#else</span>
-<a name="l00240"></a>00240 <span class="preprocessor"></span> <span class="keyword">typedef</span> pthread_key_t tls_key_t;
-<a name="l00241"></a>00241 <span class="keywordtype">void</span> create_key() { pthread_key_create(&my_key, NULL); }
-<a name="l00242"></a>00242 <span class="keywordtype">void</span> destroy_key() { pthread_key_delete(my_key); }
-<a name="l00243"></a>00243 <span class="keywordtype">void</span> set_tls( <span class="keywordtype">void</span> * value )<span class="keyword"> const </span>{ pthread_setspecific(my_key, value); }
-<a name="l00244"></a>00244 <span class="keywordtype">void</span>* get_tls()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> pthread_getspecific(my_key); }
-<a name="l00245"></a>00245 <span class="preprocessor">#endif</span>
-<a name="l00246"></a>00246 <span class="preprocessor"></span> tls_key_t my_key;
-<a name="l00247"></a>00247 <span class="keyword">virtual</span> <span class="keywordtype">void</span>* create_local() = 0;
-<a name="l00248"></a>00248 <span class="keyword">virtual</span> <span class="keywordtype">void</span>* create_array(size_t _size) = 0; <span class="comment">// _size in bytes</span>
-<a name="l00249"></a>00249 <span class="keyword">virtual</span> <span class="keywordtype">void</span> free_array(<span class="keywordtype">void</span>* ptr, size_t _size) = 0; <span class="comment">// size in bytes</span>
-<a name="l00250"></a>00250 <span class="keyword">public</span>:
-<a name="l00251"></a>00251 ets_base() {create_key();}
-<a name="l00252"></a>00252 ~ets_base() {destroy_key();}
-<a name="l00253"></a>00253 <span class="keywordtype">void</span>* table_lookup( <span class="keywordtype">bool</span>& exists ) {
-<a name="l00254"></a>00254 <span class="keywordtype">void</span>* found = get_tls();
-<a name="l00255"></a>00255 <span class="keywordflow">if</span>( found ) {
-<a name="l00256"></a>00256 exists=<span class="keyword">true</span>;
-<a name="l00257"></a>00257 } <span class="keywordflow">else</span> {
-<a name="l00258"></a>00258 found = super::table_lookup(exists);
-<a name="l00259"></a>00259 set_tls(found);
-<a name="l00260"></a>00260 }
-<a name="l00261"></a>00261 <span class="keywordflow">return</span> found;
-<a name="l00262"></a>00262 }
-<a name="l00263"></a>00263 <span class="keywordtype">void</span> table_clear() {
-<a name="l00264"></a>00264 destroy_key();
-<a name="l00265"></a>00265 create_key();
-<a name="l00266"></a>00266 super::table_clear();
-<a name="l00267"></a>00267 }
-<a name="l00268"></a>00268 };
-<a name="l00269"></a>00269
-<a name="l00271"></a>00271 <span class="keyword">template</span>< <span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value >
-<a name="l00272"></a>00272 <span class="keyword">class </span>enumerable_thread_specific_iterator
-<a name="l00273"></a>00273 #if defined(_WIN64) && defined(_MSC_VER)
-<a name="l00274"></a>00274 <span class="comment">// Ensure that Microsoft's internal template function _Val_type works correctly.</span>
-<a name="l00275"></a>00275 : public std::iterator<std::random_access_iterator_tag,Value>
-<a name="l00276"></a>00276 #endif <span class="comment">/* defined(_WIN64) && defined(_MSC_VER) */</span>
-<a name="l00277"></a>00277 {
-<a name="l00279"></a>00279
-<a name="l00280"></a>00280 Container *my_container;
-<a name="l00281"></a>00281 <span class="keyword">typename</span> Container::size_type my_index;
-<a name="l00282"></a>00282 <span class="keyword">mutable</span> Value *my_value;
-<a name="l00283"></a>00283
-<a name="l00284"></a>00284 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T>
-<a name="l00285"></a>00285 <span class="keyword">friend</span> enumerable_thread_specific_iterator<C,T> operator+( ptrdiff_t offset,
-<a name="l00286"></a>00286 <span class="keyword">const</span> enumerable_thread_specific_iterator<C,T>& v );
-<a name="l00287"></a>00287
-<a name="l00288"></a>00288 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00289"></a>00289 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> enumerable_thread_specific_iterator<C,T>& i,
-<a name="l00290"></a>00290 <span class="keyword">const</span> enumerable_thread_specific_iterator<C,U>& j );
-<a name="l00291"></a>00291
-<a name="l00292"></a>00292 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00293"></a>00293 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator<( const enumerable_thread_specific_iterator<C,T>& i,
-<a name="l00294"></a>00294 <span class="keyword">const</span> enumerable_thread_specific_iterator<C,U>& j );
-<a name="l00295"></a>00295
-<a name="l00296"></a>00296 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00297"></a>00297 <span class="keyword">friend</span> ptrdiff_t operator-( <span class="keyword">const</span> enumerable_thread_specific_iterator<C,T>& i, <span class="keyword">const</span> enumerable_thread_specific_iterator<C,U>& j );
-<a name="l00298"></a>00298
-<a name="l00299"></a>00299 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> U>
-<a name="l00300"></a>00300 <span class="keyword">friend</span> <span class="keyword">class </span>enumerable_thread_specific_iterator;
-<a name="l00301"></a>00301
-<a name="l00302"></a>00302 <span class="keyword">public</span>:
-<a name="l00303"></a>00303
-<a name="l00304"></a>00304 enumerable_thread_specific_iterator( <span class="keyword">const</span> Container &container, <span class="keyword">typename</span> Container::size_type index ) :
-<a name="l00305"></a>00305 my_container(&const_cast<Container &>(container)), my_index(index), my_value(NULL) {}
-<a name="l00306"></a>00306
-<a name="l00308"></a>00308 enumerable_thread_specific_iterator() : my_container(NULL), my_index(0), my_value(NULL) {}
-<a name="l00309"></a>00309
-<a name="l00310"></a>00310 <span class="keyword">template</span><<span class="keyword">typename</span> U>
-<a name="l00311"></a>00311 enumerable_thread_specific_iterator( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container, U>& other ) :
-<a name="l00312"></a>00312 my_container( other.my_container ), my_index( other.my_index), my_value( const_cast<Value *>(other.my_value) ) {}
-<a name="l00313"></a>00313
-<a name="l00314"></a>00314 enumerable_thread_specific_iterator operator+( ptrdiff_t offset )<span class="keyword"> const </span>{
-<a name="l00315"></a>00315 <span class="keywordflow">return</span> enumerable_thread_specific_iterator(*my_container, my_index + offset);
-<a name="l00316"></a>00316 }
-<a name="l00317"></a>00317
-<a name="l00318"></a>00318 enumerable_thread_specific_iterator &operator+=( ptrdiff_t offset ) {
-<a name="l00319"></a>00319 my_index += offset;
-<a name="l00320"></a>00320 my_value = NULL;
-<a name="l00321"></a>00321 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00322"></a>00322 }
-<a name="l00323"></a>00323
-<a name="l00324"></a>00324 enumerable_thread_specific_iterator operator-( ptrdiff_t offset )<span class="keyword"> const </span>{
-<a name="l00325"></a>00325 <span class="keywordflow">return</span> enumerable_thread_specific_iterator( *my_container, my_index-offset );
-<a name="l00326"></a>00326 }
-<a name="l00327"></a>00327
-<a name="l00328"></a>00328 enumerable_thread_specific_iterator &operator-=( ptrdiff_t offset ) {
-<a name="l00329"></a>00329 my_index -= offset;
-<a name="l00330"></a>00330 my_value = NULL;
-<a name="l00331"></a>00331 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00332"></a>00332 }
-<a name="l00333"></a>00333
-<a name="l00334"></a>00334 Value& operator*()<span class="keyword"> const </span>{
-<a name="l00335"></a>00335 Value* value = my_value;
-<a name="l00336"></a>00336 <span class="keywordflow">if</span>( !value ) {
-<a name="l00337"></a>00337 value = my_value = reinterpret_cast<Value *>(&(*my_container)[my_index].value);
-<a name="l00338"></a>00338 }
-<a name="l00339"></a>00339 __TBB_ASSERT( value==reinterpret_cast<Value *>(&(*my_container)[my_index].value), <span class="stringliteral">"corrupt cache"</span> );
-<a name="l00340"></a>00340 <span class="keywordflow">return</span> *value;
-<a name="l00341"></a>00341 }
-<a name="l00342"></a>00342
-<a name="l00343"></a>00343 Value& operator[]( ptrdiff_t k )<span class="keyword"> const </span>{
-<a name="l00344"></a>00344 <span class="keywordflow">return</span> (*my_container)[my_index + k].value;
-<a name="l00345"></a>00345 }
-<a name="l00346"></a>00346
-<a name="l00347"></a>00347 Value* operator->()<span class="keyword"> const </span>{<span class="keywordflow">return</span> &operator*();}
-<a name="l00348"></a>00348
-<a name="l00349"></a>00349 enumerable_thread_specific_iterator& operator++() {
-<a name="l00350"></a>00350 ++my_index;
-<a name="l00351"></a>00351 my_value = NULL;
-<a name="l00352"></a>00352 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00353"></a>00353 }
-<a name="l00354"></a>00354
-<a name="l00355"></a>00355 enumerable_thread_specific_iterator& operator--() {
-<a name="l00356"></a>00356 --my_index;
-<a name="l00357"></a>00357 my_value = NULL;
-<a name="l00358"></a>00358 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00359"></a>00359 }
-<a name="l00360"></a>00360
-<a name="l00362"></a>00362 enumerable_thread_specific_iterator operator++(<span class="keywordtype">int</span>) {
-<a name="l00363"></a>00363 enumerable_thread_specific_iterator result = *<span class="keyword">this</span>;
-<a name="l00364"></a>00364 ++my_index;
-<a name="l00365"></a>00365 my_value = NULL;
-<a name="l00366"></a>00366 <span class="keywordflow">return</span> result;
-<a name="l00367"></a>00367 }
-<a name="l00368"></a>00368
-<a name="l00370"></a>00370 enumerable_thread_specific_iterator operator--(<span class="keywordtype">int</span>) {
-<a name="l00371"></a>00371 enumerable_thread_specific_iterator result = *<span class="keyword">this</span>;
-<a name="l00372"></a>00372 --my_index;
-<a name="l00373"></a>00373 my_value = NULL;
-<a name="l00374"></a>00374 <span class="keywordflow">return</span> result;
-<a name="l00375"></a>00375 }
-<a name="l00376"></a>00376
-<a name="l00377"></a>00377 <span class="comment">// STL support</span>
-<a name="l00378"></a>00378 <span class="keyword">typedef</span> ptrdiff_t difference_type;
-<a name="l00379"></a>00379 <span class="keyword">typedef</span> Value value_type;
-<a name="l00380"></a>00380 <span class="keyword">typedef</span> Value* pointer;
-<a name="l00381"></a>00381 <span class="keyword">typedef</span> Value& reference;
-<a name="l00382"></a>00382 <span class="keyword">typedef</span> std::random_access_iterator_tag iterator_category;
-<a name="l00383"></a>00383 };
-<a name="l00384"></a>00384
-<a name="l00385"></a>00385 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T>
-<a name="l00386"></a>00386 enumerable_thread_specific_iterator<Container,T> operator+( ptrdiff_t offset,
-<a name="l00387"></a>00387 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& v ) {
-<a name="l00388"></a>00388 <span class="keywordflow">return</span> enumerable_thread_specific_iterator<Container,T>( v.my_container, v.my_index + offset );
-<a name="l00389"></a>00389 }
-<a name="l00390"></a>00390
-<a name="l00391"></a>00391 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00392"></a>00392 <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& i,
-<a name="l00393"></a>00393 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
-<a name="l00394"></a>00394 <span class="keywordflow">return</span> i.my_index==j.my_index && i.my_container == j.my_container;
-<a name="l00395"></a>00395 }
-<a name="l00396"></a>00396
-<a name="l00397"></a>00397 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00398"></a>00398 <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& i,
-<a name="l00399"></a>00399 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
-<a name="l00400"></a>00400 <span class="keywordflow">return</span> !(i==j);
-<a name="l00401"></a>00401 }
-<a name="l00402"></a>00402
-<a name="l00403"></a>00403 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00404"></a>00404 <span class="keywordtype">bool</span> operator<( const enumerable_thread_specific_iterator<Container,T>& i,
-<a name="l00405"></a>00405 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
-<a name="l00406"></a>00406 <span class="keywordflow">return</span> i.my_index<j.my_index;
-<a name="l00407"></a>00407 }
-<a name="l00408"></a>00408
-<a name="l00409"></a>00409 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00410"></a>00410 <span class="keywordtype">bool</span> operator>( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& i,
-<a name="l00411"></a>00411 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
-<a name="l00412"></a>00412 <span class="keywordflow">return</span> j<i;
-<a name="l00413"></a>00413 }
-<a name="l00414"></a>00414
-<a name="l00415"></a>00415 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00416"></a>00416 <span class="keywordtype">bool</span> operator>=( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& i,
-<a name="l00417"></a>00417 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
-<a name="l00418"></a>00418 <span class="keywordflow">return</span> !(i<j);
-<a name="l00419"></a>00419 }
-<a name="l00420"></a>00420
-<a name="l00421"></a>00421 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00422"></a>00422 <span class="keywordtype">bool</span> operator<=( const enumerable_thread_specific_iterator<Container,T>& i,
-<a name="l00423"></a>00423 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
-<a name="l00424"></a>00424 <span class="keywordflow">return</span> !(j<i);
-<a name="l00425"></a>00425 }
-<a name="l00426"></a>00426
-<a name="l00427"></a>00427 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00428"></a>00428 ptrdiff_t operator-( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& i,
-<a name="l00429"></a>00429 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
-<a name="l00430"></a>00430 <span class="keywordflow">return</span> i.my_index-j.my_index;
-<a name="l00431"></a>00431 }
-<a name="l00432"></a>00432
-<a name="l00433"></a>00433 <span class="keyword">template</span><<span class="keyword">typename</span> SegmentedContainer, <span class="keyword">typename</span> Value >
-<a name="l00434"></a>00434 <span class="keyword">class </span>segmented_iterator
-<a name="l00435"></a>00435 #if defined(_WIN64) && defined(_MSC_VER)
-<a name="l00436"></a>00436 : public std::iterator<std::input_iterator_tag, Value>
-<a name="l00437"></a>00437 #endif
-<a name="l00438"></a>00438 {
-<a name="l00439"></a>00439 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00440"></a>00440 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> segmented_iterator<C,T>& i, <span class="keyword">const</span> segmented_iterator<C,U>& j);
-<a name="l00441"></a>00441
-<a name="l00442"></a>00442 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00443"></a>00443 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> segmented_iterator<C,T>& i, <span class="keyword">const</span> segmented_iterator<C,U>& j);
-<a name="l00444"></a>00444
-<a name="l00445"></a>00445 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> U>
-<a name="l00446"></a>00446 <span class="keyword">friend</span> <span class="keyword">class </span>segmented_iterator;
-<a name="l00447"></a>00447
-<a name="l00448"></a>00448 <span class="keyword">public</span>:
-<a name="l00449"></a>00449
-<a name="l00450"></a>00450 segmented_iterator() {my_segcont = NULL;}
-<a name="l00451"></a>00451
-<a name="l00452"></a>00452 segmented_iterator( <span class="keyword">const</span> SegmentedContainer& _segmented_container ) :
-<a name="l00453"></a>00453 my_segcont(const_cast<SegmentedContainer*>(&_segmented_container)),
-<a name="l00454"></a>00454 outer_iter(my_segcont->end()) { }
-<a name="l00455"></a>00455
-<a name="l00456"></a>00456 ~segmented_iterator() {}
-<a name="l00457"></a>00457
-<a name="l00458"></a>00458 <span class="keyword">typedef</span> <span class="keyword">typename</span> SegmentedContainer::iterator outer_iterator;
-<a name="l00459"></a>00459 <span class="keyword">typedef</span> <span class="keyword">typename</span> SegmentedContainer::value_type InnerContainer;
-<a name="l00460"></a>00460 <span class="keyword">typedef</span> <span class="keyword">typename</span> InnerContainer::iterator inner_iterator;
-<a name="l00461"></a>00461
-<a name="l00462"></a>00462 <span class="comment">// STL support</span>
-<a name="l00463"></a>00463 <span class="keyword">typedef</span> ptrdiff_t difference_type;
-<a name="l00464"></a>00464 <span class="keyword">typedef</span> Value value_type;
-<a name="l00465"></a>00465 <span class="keyword">typedef</span> <span class="keyword">typename</span> SegmentedContainer::size_type size_type;
-<a name="l00466"></a>00466 <span class="keyword">typedef</span> Value* pointer;
-<a name="l00467"></a>00467 <span class="keyword">typedef</span> Value& reference;
-<a name="l00468"></a>00468 <span class="keyword">typedef</span> std::input_iterator_tag iterator_category;
-<a name="l00469"></a>00469
-<a name="l00470"></a>00470 <span class="comment">// Copy Constructor</span>
-<a name="l00471"></a>00471 <span class="keyword">template</span><<span class="keyword">typename</span> U>
-<a name="l00472"></a>00472 segmented_iterator(<span class="keyword">const</span> segmented_iterator<SegmentedContainer, U>& other) :
-<a name="l00473"></a>00473 my_segcont(other.my_segcont),
-<a name="l00474"></a>00474 outer_iter(other.outer_iter),
-<a name="l00475"></a>00475 <span class="comment">// can we assign a default-constructed iterator to inner if we're at the end?</span>
-<a name="l00476"></a>00476 inner_iter(other.inner_iter)
-<a name="l00477"></a>00477 {}
-<a name="l00478"></a>00478
-<a name="l00479"></a>00479 <span class="comment">// assignment</span>
-<a name="l00480"></a>00480 <span class="keyword">template</span><<span class="keyword">typename</span> U>
-<a name="l00481"></a>00481 segmented_iterator& operator=( <span class="keyword">const</span> segmented_iterator<SegmentedContainer, U>& other) {
-<a name="l00482"></a>00482 <span class="keywordflow">if</span>(<span class="keyword">this</span> != &other) {
-<a name="l00483"></a>00483 my_segcont = other.my_segcont;
-<a name="l00484"></a>00484 outer_iter = other.outer_iter;
-<a name="l00485"></a>00485 <span class="keywordflow">if</span>(outer_iter != my_segcont->end()) inner_iter = other.inner_iter;
-<a name="l00486"></a>00486 }
-<a name="l00487"></a>00487 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00488"></a>00488 }
-<a name="l00489"></a>00489
-<a name="l00490"></a>00490 <span class="comment">// allow assignment of outer iterator to segmented iterator. Once it is</span>
-<a name="l00491"></a>00491 <span class="comment">// assigned, move forward until a non-empty inner container is found or</span>
-<a name="l00492"></a>00492 <span class="comment">// the end of the outer container is reached.</span>
-<a name="l00493"></a>00493 segmented_iterator& operator=(<span class="keyword">const</span> outer_iterator& new_outer_iter) {
-<a name="l00494"></a>00494 __TBB_ASSERT(my_segcont != NULL, NULL);
-<a name="l00495"></a>00495 <span class="comment">// check that this iterator points to something inside the segmented container</span>
-<a name="l00496"></a>00496 <span class="keywordflow">for</span>(outer_iter = new_outer_iter ;outer_iter!=my_segcont->end(); ++outer_iter) {
-<a name="l00497"></a>00497 <span class="keywordflow">if</span>( !outer_iter->empty() ) {
-<a name="l00498"></a>00498 inner_iter = outer_iter->begin();
-<a name="l00499"></a>00499 <span class="keywordflow">break</span>;
-<a name="l00500"></a>00500 }
-<a name="l00501"></a>00501 }
-<a name="l00502"></a>00502 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00503"></a>00503 }
-<a name="l00504"></a>00504
-<a name="l00505"></a>00505 <span class="comment">// pre-increment</span>
-<a name="l00506"></a>00506 segmented_iterator& operator++() {
-<a name="l00507"></a>00507 advance_me();
-<a name="l00508"></a>00508 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00509"></a>00509 }
-<a name="l00510"></a>00510
-<a name="l00511"></a>00511 <span class="comment">// post-increment</span>
-<a name="l00512"></a>00512 segmented_iterator operator++(<span class="keywordtype">int</span>) {
-<a name="l00513"></a>00513 segmented_iterator tmp = *<span class="keyword">this</span>;
-<a name="l00514"></a>00514 operator++();
-<a name="l00515"></a>00515 <span class="keywordflow">return</span> tmp;
-<a name="l00516"></a>00516 }
-<a name="l00517"></a>00517
-<a name="l00518"></a>00518 <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> outer_iterator& other_outer)<span class="keyword"> const </span>{
-<a name="l00519"></a>00519 __TBB_ASSERT(my_segcont != NULL, NULL);
-<a name="l00520"></a>00520 <span class="keywordflow">return</span> (outer_iter == other_outer &&
-<a name="l00521"></a>00521 (outer_iter == my_segcont->end() || inner_iter == outer_iter->begin()));
-<a name="l00522"></a>00522 }
-<a name="l00523"></a>00523
-<a name="l00524"></a>00524 <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> outer_iterator& other_outer)<span class="keyword"> const </span>{
-<a name="l00525"></a>00525 <span class="keywordflow">return</span> !operator==(other_outer);
-<a name="l00526"></a>00526
-<a name="l00527"></a>00527 }
-<a name="l00528"></a>00528
-<a name="l00529"></a>00529 <span class="comment">// (i)* RHS</span>
-<a name="l00530"></a>00530 reference operator*()<span class="keyword"> const </span>{
-<a name="l00531"></a>00531 __TBB_ASSERT(my_segcont != NULL, NULL);
-<a name="l00532"></a>00532 __TBB_ASSERT(outer_iter != my_segcont->end(), <span class="stringliteral">"Dereferencing a pointer at end of container"</span>);
-<a name="l00533"></a>00533 __TBB_ASSERT(inner_iter != outer_iter->end(), NULL); <span class="comment">// should never happen</span>
-<a name="l00534"></a>00534 <span class="keywordflow">return</span> *inner_iter;
-<a name="l00535"></a>00535 }
-<a name="l00536"></a>00536
-<a name="l00537"></a>00537 <span class="comment">// i-></span>
-<a name="l00538"></a>00538 pointer operator->()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> &operator*();}
-<a name="l00539"></a>00539
-<a name="l00540"></a>00540 <span class="keyword">private</span>:
-<a name="l00541"></a>00541 SegmentedContainer* my_segcont;
-<a name="l00542"></a>00542 outer_iterator outer_iter;
-<a name="l00543"></a>00543 inner_iterator inner_iter;
-<a name="l00544"></a>00544
-<a name="l00545"></a>00545 <span class="keywordtype">void</span> advance_me() {
-<a name="l00546"></a>00546 __TBB_ASSERT(my_segcont != NULL, NULL);
-<a name="l00547"></a>00547 __TBB_ASSERT(outer_iter != my_segcont->end(), NULL); <span class="comment">// not true if there are no inner containers</span>
-<a name="l00548"></a>00548 __TBB_ASSERT(inner_iter != outer_iter->end(), NULL); <span class="comment">// not true if the inner containers are all empty.</span>
-<a name="l00549"></a>00549 ++inner_iter;
-<a name="l00550"></a>00550 <span class="keywordflow">while</span>(inner_iter == outer_iter->end() && ++outer_iter != my_segcont->end()) {
-<a name="l00551"></a>00551 inner_iter = outer_iter->begin();
-<a name="l00552"></a>00552 }
-<a name="l00553"></a>00553 }
-<a name="l00554"></a>00554 }; <span class="comment">// segmented_iterator</span>
-<a name="l00555"></a>00555
-<a name="l00556"></a>00556 <span class="keyword">template</span><<span class="keyword">typename</span> SegmentedContainer, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00557"></a>00557 <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> segmented_iterator<SegmentedContainer,T>& i,
-<a name="l00558"></a>00558 <span class="keyword">const</span> segmented_iterator<SegmentedContainer,U>& j ) {
-<a name="l00559"></a>00559 <span class="keywordflow">if</span>(i.my_segcont != j.my_segcont) <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00560"></a>00560 <span class="keywordflow">if</span>(i.my_segcont == NULL) <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00561"></a>00561 <span class="keywordflow">if</span>(i.outer_iter != j.outer_iter) <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00562"></a>00562 <span class="keywordflow">if</span>(i.outer_iter == i.my_segcont->end()) <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00563"></a>00563 <span class="keywordflow">return</span> i.inner_iter == j.inner_iter;
-<a name="l00564"></a>00564 }
-<a name="l00565"></a>00565
-<a name="l00566"></a>00566 <span class="comment">// !=</span>
-<a name="l00567"></a>00567 <span class="keyword">template</span><<span class="keyword">typename</span> SegmentedContainer, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00568"></a>00568 <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> segmented_iterator<SegmentedContainer,T>& i,
-<a name="l00569"></a>00569 <span class="keyword">const</span> segmented_iterator<SegmentedContainer,U>& j ) {
-<a name="l00570"></a>00570 <span class="keywordflow">return</span> !(i==j);
-<a name="l00571"></a>00571 }
-<a name="l00572"></a>00572
-<a name="l00573"></a>00573 <span class="comment">// storage for initialization function pointer</span>
-<a name="l00574"></a>00574 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00575"></a>00575 <span class="keyword">struct </span>callback_base {
-<a name="l00576"></a>00576 <span class="keyword">virtual</span> T apply( ) = 0;
-<a name="l00577"></a>00577 <span class="keyword">virtual</span> <span class="keywordtype">void</span> destroy( ) = 0;
-<a name="l00578"></a>00578 <span class="comment">// need to be able to create copies of callback_base for copy constructor</span>
-<a name="l00579"></a>00579 <span class="keyword">virtual</span> callback_base* make_copy() = 0;
-<a name="l00580"></a>00580 <span class="comment">// need virtual destructor to satisfy GCC compiler warning</span>
-<a name="l00581"></a>00581 <span class="keyword">virtual</span> ~callback_base() { }
-<a name="l00582"></a>00582 };
-<a name="l00583"></a>00583
-<a name="l00584"></a>00584 <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> Functor>
-<a name="l00585"></a>00585 <span class="keyword">struct </span>callback_leaf : <span class="keyword">public</span> callback_base<T>, <span class="keyword">public</span> tbb::internal::no_copy {
-<a name="l00586"></a>00586 <span class="keyword">typedef</span> Functor my_callback_type;
-<a name="l00587"></a>00587 <span class="keyword">typedef</span> callback_leaf<T,Functor> my_type;
-<a name="l00588"></a>00588 <span class="keyword">typedef</span> my_type* callback_pointer;
-<a name="l00589"></a>00589 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00204.html">tbb::tbb_allocator<my_type></a> my_allocator_type;
-<a name="l00590"></a>00590 Functor f;
-<a name="l00591"></a>00591 callback_leaf( <span class="keyword">const</span> Functor& f_) : f(f_) {
-<a name="l00592"></a>00592 }
-<a name="l00593"></a>00593
-<a name="l00594"></a>00594 <span class="keyword">static</span> callback_pointer new_callback(<span class="keyword">const</span> Functor& f_ ) {
-<a name="l00595"></a>00595 <span class="keywordtype">void</span>* new_void = my_allocator_type().allocate(1);
-<a name="l00596"></a>00596 callback_pointer new_cb = <span class="keyword">new</span> (new_void) callback_leaf<T,Functor>(f_); <span class="comment">// placement new</span>
-<a name="l00597"></a>00597 <span class="keywordflow">return</span> new_cb;
-<a name="l00598"></a>00598 }
-<a name="l00599"></a>00599
-<a name="l00600"></a>00600 <span class="comment">/* override */</span> callback_pointer make_copy() {
-<a name="l00601"></a>00601 <span class="keywordflow">return</span> new_callback( f );
-<a name="l00602"></a>00602 }
-<a name="l00603"></a>00603
-<a name="l00604"></a>00604 <span class="comment">/* override */</span> <span class="keywordtype">void</span> destroy( ) {
-<a name="l00605"></a>00605 callback_pointer my_ptr = <span class="keyword">this</span>;
-<a name="l00606"></a>00606 my_allocator_type().destroy(my_ptr);
-<a name="l00607"></a>00607 my_allocator_type().deallocate(my_ptr,1);
-<a name="l00608"></a>00608 }
-<a name="l00609"></a>00609 <span class="comment">/* override */</span> T apply() { <span class="keywordflow">return</span> f(); } <span class="comment">// does copy construction of returned value.</span>
-<a name="l00610"></a>00610 };
-<a name="l00611"></a>00611
-<a name="l00612"></a>00612
-<a name="l00614"></a>00614
-<a name="l00619"></a>00619 <span class="keyword">template</span><<span class="keyword">typename</span> U, size_t ModularSize>
-<a name="l00620"></a>00620 <span class="keyword">struct </span>ets_element {
-<a name="l00621"></a>00621 <span class="keywordtype">char</span> value[<span class="keyword">sizeof</span>(U) + tbb::internal::NFS_MaxLineSize-ModularSize];
-<a name="l00622"></a>00622 <span class="keywordtype">void</span> unconstruct() {
-<a name="l00623"></a>00623 <span class="comment">// "reinterpret_cast<U*>(&value)->~U();" causes type-punning warning with gcc 4.4,</span>
-<a name="l00624"></a>00624 <span class="comment">// "U* u = reinterpret_cast<U*>(&value); u->~U();" causes unused variable warning with VS2010.</span>
-<a name="l00625"></a>00625 <span class="comment">// Thus another "casting via union" hack.</span>
-<a name="l00626"></a>00626 __TBB_ASSERT(<span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*)==<span class="keyword">sizeof</span>(U*),NULL);
-<a name="l00627"></a>00627 <span class="keyword">union </span>{ <span class="keywordtype">void</span>* space; U* val; } helper;
-<a name="l00628"></a>00628 helper.space = &value;
-<a name="l00629"></a>00629 helper.val->~U();
-<a name="l00630"></a>00630 }
-<a name="l00631"></a>00631 };
-<a name="l00632"></a>00632
-<a name="l00634"></a>00634 <span class="keyword">template</span><<span class="keyword">typename</span> U>
-<a name="l00635"></a>00635 <span class="keyword">struct </span>ets_element<U,0> {
-<a name="l00636"></a>00636 <span class="keywordtype">char</span> value[<span class="keyword">sizeof</span>(U)];
-<a name="l00637"></a>00637 <span class="keywordtype">void</span> unconstruct() { <span class="comment">// Same implementation as in general case</span>
-<a name="l00638"></a>00638 __TBB_ASSERT(<span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*)==<span class="keyword">sizeof</span>(U*),NULL);
-<a name="l00639"></a>00639 <span class="keyword">union </span>{ <span class="keywordtype">void</span>* space; U* val; } helper;
-<a name="l00640"></a>00640 helper.space = &value;
-<a name="l00641"></a>00641 helper.val->~U();
-<a name="l00642"></a>00642 }
-<a name="l00643"></a>00643 };
-<a name="l00644"></a>00644
-<a name="l00645"></a>00645 } <span class="comment">// namespace internal</span>
-<a name="l00647"></a>00647 <span class="comment"></span>
-<a name="l00649"></a>00649
-<a name="l00668"></a>00668 <span class="keyword">template</span> <<span class="keyword">typename</span> T,
-<a name="l00669"></a>00669 <span class="keyword">typename</span> Allocator=cache_aligned_allocator<T>,
-<a name="l00670"></a><a class="code" href="a00164.html">00670</a> <a class="code" href="a00267.html#a8622ae61b7e7737dac26542e181178e">ets_key_usage_type</a> ETS_key_type=ets_no_key >
-<a name="l00671"></a>00671 <span class="keyword">class </span><a class="code" href="a00164.html">enumerable_thread_specific</a>: internal::ets_base<ETS_key_type> {
-<a name="l00672"></a>00672
-<a name="l00673"></a>00673 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> A, ets_key_usage_type C> <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00164.html">enumerable_thread_specific</a>;
-<a name="l00674"></a>00674
-<a name="l00675"></a>00675 <span class="keyword">typedef</span> internal::ets_element<T,sizeof(T)%tbb::internal::NFS_MaxLineSize> padded_element;
-<a name="l00676"></a>00676
-<a name="l00678"></a>00678 <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l00679"></a>00679 <span class="keyword">class </span>generic_range_type: <span class="keyword">public</span> <a class="code" href="a00148.html">blocked_range</a><I> {
-<a name="l00680"></a>00680 <span class="keyword">public</span>:
-<a name="l00681"></a>00681 <span class="keyword">typedef</span> T value_type;
-<a name="l00682"></a>00682 <span class="keyword">typedef</span> T& reference;
-<a name="l00683"></a>00683 <span class="keyword">typedef</span> <span class="keyword">const</span> T& const_reference;
-<a name="l00684"></a>00684 <span class="keyword">typedef</span> I iterator;
-<a name="l00685"></a>00685 <span class="keyword">typedef</span> ptrdiff_t difference_type;
-<a name="l00686"></a>00686 generic_range_type( I begin_, I end_, size_t grainsize_ = 1) : <a class="code" href="a00148.html">blocked_range<I></a>(begin_,end_,grainsize_) {}
-<a name="l00687"></a>00687 template<typename U>
-<a name="l00688"></a>00688 generic_range_type( <span class="keyword">const</span> generic_range_type<U>& r) : <a class="code" href="a00148.html">blocked_range<I></a>(r.begin(),r.end(),r.grainsize()) {}
-<a name="l00689"></a>00689 generic_range_type( generic_range_type& r, <a class="code" href="a00198.html">split</a> ) : <a class="code" href="a00148.html">blocked_range<I></a>(r,<a class="code" href="a00198.html">split</a>()) {}
-<a name="l00690"></a>00690 };
-<a name="l00691"></a>00691
-<a name="l00692"></a>00692 <span class="keyword">typedef</span> <span class="keyword">typename</span> Allocator::template rebind< padded_element >::other padded_allocator_type;
-<a name="l00693"></a>00693 <span class="keyword">typedef</span> <a class="code" href="a00162.html">tbb::concurrent_vector< padded_element, padded_allocator_type ></a> <a class="code" href="a00162.html">internal_collection_type</a>;
-<a name="l00694"></a>00694
-<a name="l00695"></a>00695 internal::callback_base<T> *my_finit_callback;
-<a name="l00696"></a>00696
-<a name="l00697"></a>00697 <span class="comment">// need to use a pointed-to exemplar because T may not be assignable.</span>
-<a name="l00698"></a>00698 <span class="comment">// using tbb_allocator instead of padded_element_allocator because we may be</span>
-<a name="l00699"></a>00699 <span class="comment">// copying an exemplar from one instantiation of ETS to another with a different</span>
-<a name="l00700"></a>00700 <span class="comment">// allocator.</span>
-<a name="l00701"></a>00701 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00204.html">tbb::tbb_allocator<padded_element ></a> <a class="code" href="a00204.html">exemplar_allocator_type</a>;
-<a name="l00702"></a>00702 <span class="keyword">static</span> padded_element * create_exemplar(<span class="keyword">const</span> T& my_value) {
-<a name="l00703"></a>00703 padded_element *new_exemplar = reinterpret_cast<padded_element *>(exemplar_allocator_type().allocate(1));
-<a name="l00704"></a>00704 <span class="keyword">new</span>(new_exemplar->value) T(my_value);
-<a name="l00705"></a>00705 <span class="keywordflow">return</span> new_exemplar;
-<a name="l00706"></a>00706 }
-<a name="l00707"></a>00707
-<a name="l00708"></a>00708 <span class="keyword">static</span> padded_element *create_exemplar( ) {
-<a name="l00709"></a>00709 padded_element *new_exemplar = reinterpret_cast<padded_element *>(exemplar_allocator_type().allocate(1));
-<a name="l00710"></a>00710 <span class="keyword">new</span>(new_exemplar->value) T( );
-<a name="l00711"></a>00711 <span class="keywordflow">return</span> new_exemplar;
-<a name="l00712"></a>00712 }
-<a name="l00713"></a>00713
-<a name="l00714"></a>00714 <span class="keyword">static</span> <span class="keywordtype">void</span> free_exemplar(padded_element *my_ptr) {
-<a name="l00715"></a>00715 my_ptr->unconstruct();
-<a name="l00716"></a>00716 exemplar_allocator_type().destroy(my_ptr);
-<a name="l00717"></a>00717 exemplar_allocator_type().deallocate(my_ptr,1);
-<a name="l00718"></a>00718 }
-<a name="l00719"></a>00719
-<a name="l00720"></a>00720 padded_element* my_exemplar_ptr;
-<a name="l00721"></a>00721
-<a name="l00722"></a>00722 internal_collection_type my_locals;
-<a name="l00723"></a>00723
-<a name="l00724"></a>00724 <span class="comment">/*override*/</span> <span class="keywordtype">void</span>* create_local() {
-<a name="l00725"></a>00725 <span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00726"></a>00726 <span class="preprocessor"></span> <span class="keywordtype">void</span>* lref = &my_locals[my_locals.<a class="code" href="a00162.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(padded_element())];
-<a name="l00727"></a>00727 <span class="preprocessor">#else</span>
-<a name="l00728"></a>00728 <span class="preprocessor"></span> <span class="keywordtype">void</span>* lref = &*my_locals.<a class="code" href="a00162.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(padded_element());
-<a name="l00729"></a>00729 <span class="preprocessor">#endif</span>
-<a name="l00730"></a>00730 <span class="preprocessor"></span> <span class="keywordflow">if</span>(my_finit_callback) {
-<a name="l00731"></a>00731 <span class="keyword">new</span>(lref) T(my_finit_callback->apply());
-<a name="l00732"></a>00732 } <span class="keywordflow">else</span> <span class="keywordflow">if</span>(my_exemplar_ptr) {
-<a name="l00733"></a>00733 pointer t_exemp = reinterpret_cast<T *>(&(my_exemplar_ptr->value));
-<a name="l00734"></a>00734 <span class="keyword">new</span>(lref) T(*t_exemp);
-<a name="l00735"></a>00735 } <span class="keywordflow">else</span> {
-<a name="l00736"></a>00736 <span class="keyword">new</span>(lref) T();
-<a name="l00737"></a>00737 }
-<a name="l00738"></a>00738 <span class="keywordflow">return</span> lref;
-<a name="l00739"></a>00739 }
-<a name="l00740"></a>00740
-<a name="l00741"></a>00741 <span class="keywordtype">void</span> unconstruct_locals() {
-<a name="l00742"></a>00742 <span class="keywordflow">for</span>(<span class="keyword">typename</span> internal_collection_type::iterator cvi = my_locals.<a class="code" href="a00162.html#730b23a251ecb6d37f692fb22f38e029">begin</a>(); cvi != my_locals.<a class="code" href="a00162.html#c0b51160e5a764982ec97a455f94f2c6">end</a>(); ++cvi) {
-<a name="l00743"></a>00743 cvi->unconstruct();
-<a name="l00744"></a>00744 }
-<a name="l00745"></a>00745 }
-<a name="l00746"></a>00746
-<a name="l00747"></a>00747 <span class="keyword">typedef</span> <span class="keyword">typename</span> Allocator::template rebind< uintptr_t >::other array_allocator_type;
-<a name="l00748"></a>00748
-<a name="l00749"></a>00749 <span class="comment">// _size is in bytes</span>
-<a name="l00750"></a>00750 <span class="comment">/*override*/</span> <span class="keywordtype">void</span>* create_array(size_t _size) {
-<a name="l00751"></a>00751 size_t nelements = (_size + <span class="keyword">sizeof</span>(uintptr_t) -1) / <span class="keyword">sizeof</span>(uintptr_t);
-<a name="l00752"></a>00752 <span class="keywordflow">return</span> array_allocator_type().allocate(nelements);
-<a name="l00753"></a>00753 }
-<a name="l00754"></a>00754
-<a name="l00755"></a>00755 <span class="comment">/*override*/</span> <span class="keywordtype">void</span> free_array( <span class="keywordtype">void</span>* _ptr, size_t _size) {
-<a name="l00756"></a>00756 size_t nelements = (_size + <span class="keyword">sizeof</span>(uintptr_t) -1) / <span class="keyword">sizeof</span>(uintptr_t);
-<a name="l00757"></a>00757 array_allocator_type().deallocate( reinterpret_cast<uintptr_t *>(_ptr),nelements);
-<a name="l00758"></a>00758 }
-<a name="l00759"></a>00759
-<a name="l00760"></a>00760 <span class="keyword">public</span>:
-<a name="l00761"></a>00761
-<a name="l00763"></a>00763 <span class="keyword">typedef</span> Allocator allocator_type;
-<a name="l00764"></a>00764 <span class="keyword">typedef</span> T value_type;
-<a name="l00765"></a>00765 <span class="keyword">typedef</span> T& reference;
-<a name="l00766"></a>00766 <span class="keyword">typedef</span> <span class="keyword">const</span> T& const_reference;
-<a name="l00767"></a>00767 <span class="keyword">typedef</span> T* pointer;
-<a name="l00768"></a>00768 <span class="keyword">typedef</span> <span class="keyword">const</span> T* const_pointer;
-<a name="l00769"></a>00769 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal_collection_type::size_type size_type;
-<a name="l00770"></a>00770 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal_collection_type::difference_type difference_type;
-<a name="l00771"></a>00771
-<a name="l00772"></a>00772 <span class="comment">// Iterator types</span>
-<a name="l00773"></a>00773 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::enumerable_thread_specific_iterator< internal_collection_type, value_type > iterator;
-<a name="l00774"></a>00774 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::enumerable_thread_specific_iterator< internal_collection_type, const value_type > const_iterator;
-<a name="l00775"></a>00775
-<a name="l00776"></a>00776 <span class="comment">// Parallel range types</span>
-<a name="l00777"></a>00777 <span class="keyword">typedef</span> generic_range_type< iterator > range_type;
-<a name="l00778"></a>00778 <span class="keyword">typedef</span> generic_range_type< const_iterator > const_range_type;
-<a name="l00779"></a>00779
-<a name="l00781"></a>00781 <a class="code" href="a00164.html">enumerable_thread_specific</a>() : my_finit_callback(0) {
-<a name="l00782"></a>00782 my_exemplar_ptr = 0;
-<a name="l00783"></a>00783 }
-<a name="l00784"></a>00784
-<a name="l00786"></a>00786 <span class="comment">// Finit should be a function taking 0 parameters and returning a T</span>
-<a name="l00787"></a><a class="code" href="a00164.html#724ed4c846493da62b4efe032e16eb4a">00787</a> <span class="keyword">template</span> <<span class="keyword">typename</span> Finit>
-<a name="l00788"></a>00788 <a class="code" href="a00164.html">enumerable_thread_specific</a>( Finit _finit )
-<a name="l00789"></a>00789 {
-<a name="l00790"></a>00790 my_finit_callback = internal::callback_leaf<T,Finit>::new_callback( _finit );
-<a name="l00791"></a>00791 my_exemplar_ptr = 0; <span class="comment">// don't need exemplar if function is provided</span>
-<a name="l00792"></a>00792 }
-<a name="l00793"></a>00793
-<a name="l00795"></a>00795 <a class="code" href="a00164.html">enumerable_thread_specific</a>(<span class="keyword">const</span> T &_exemplar) : my_finit_callback(0) {
-<a name="l00796"></a>00796 my_exemplar_ptr = create_exemplar(_exemplar);
-<a name="l00797"></a>00797 }
-<a name="l00798"></a>00798
-<a name="l00800"></a>00800 ~<a class="code" href="a00164.html">enumerable_thread_specific</a>() {
-<a name="l00801"></a>00801 <span class="keywordflow">if</span>(my_finit_callback) {
-<a name="l00802"></a>00802 my_finit_callback->destroy();
-<a name="l00803"></a>00803 }
-<a name="l00804"></a>00804 <span class="keywordflow">if</span>(my_exemplar_ptr) {
-<a name="l00805"></a>00805 free_exemplar(my_exemplar_ptr);
-<a name="l00806"></a>00806 }
-<a name="l00807"></a>00807 this->clear(); <span class="comment">// deallocation before the derived class is finished destructing</span>
-<a name="l00808"></a>00808 <span class="comment">// So free(array *) is still accessible</span>
-<a name="l00809"></a>00809 }
-<a name="l00810"></a>00810
-<a name="l00812"></a>00812 reference local() {
-<a name="l00813"></a>00813 <span class="keywordtype">bool</span> exists;
-<a name="l00814"></a>00814 <span class="keywordflow">return</span> local(exists);
-<a name="l00815"></a>00815 }
-<a name="l00816"></a>00816
-<a name="l00818"></a>00818 reference local(<span class="keywordtype">bool</span>& exists) {
-<a name="l00819"></a>00819 __TBB_ASSERT(ETS_key_type==ets_no_key,<span class="stringliteral">"ets_key_per_instance not yet implemented"</span>);
-<a name="l00820"></a>00820 <span class="keywordtype">void</span>* ptr = this->table_lookup(exists);
-<a name="l00821"></a>00821 <span class="keywordflow">return</span> *(T*)ptr;
-<a name="l00822"></a>00822 }
-<a name="l00823"></a>00823
-<a name="l00825"></a>00825 size_type size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_locals.<a class="code" href="a00162.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>(); }
-<a name="l00826"></a>00826
-<a name="l00828"></a>00828 <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_locals.<a class="code" href="a00162.html#c6426cb93cf20d3af40f3c90f1f0481a">empty</a>(); }
-<a name="l00829"></a>00829
-<a name="l00831"></a>00831 iterator begin() { <span class="keywordflow">return</span> iterator( my_locals, 0 ); }
-<a name="l00833"></a>00833 iterator end() { <span class="keywordflow">return</span> iterator(my_locals, my_locals.<a class="code" href="a00162.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>() ); }
-<a name="l00834"></a>00834
-<a name="l00836"></a>00836 const_iterator begin()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(my_locals, 0); }
-<a name="l00837"></a>00837
-<a name="l00839"></a>00839 const_iterator end()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(my_locals, my_locals.<a class="code" href="a00162.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>()); }
-<a name="l00840"></a>00840
-<a name="l00842"></a>00842 range_type range( size_t grainsize=1 ) { <span class="keywordflow">return</span> range_type( begin(), end(), grainsize ); }
-<a name="l00843"></a>00843
-<a name="l00845"></a>00845 const_range_type range( size_t grainsize=1 )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_range_type( begin(), end(), grainsize ); }
-<a name="l00846"></a>00846
-<a name="l00848"></a>00848 <span class="keywordtype">void</span> clear() {
-<a name="l00849"></a>00849 unconstruct_locals();
-<a name="l00850"></a>00850 my_locals.<a class="code" href="a00162.html#26f937a359a66b6aae904c3cd9a3c444">clear</a>();
-<a name="l00851"></a>00851 this->table_clear();
-<a name="l00852"></a>00852 <span class="comment">// callback is not destroyed</span>
-<a name="l00853"></a>00853 <span class="comment">// exemplar is not destroyed</span>
-<a name="l00854"></a>00854 }
-<a name="l00855"></a>00855
-<a name="l00856"></a>00856 <span class="keyword">private</span>:
-<a name="l00857"></a>00857
-<a name="l00858"></a>00858 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> A2, ets_key_usage_type C2>
-<a name="l00859"></a>00859 <span class="keywordtype">void</span> internal_copy( <span class="keyword">const</span> enumerable_thread_specific<U, A2, C2>& other);
-<a name="l00860"></a>00860
-<a name="l00861"></a>00861 <span class="keyword">public</span>:
-<a name="l00862"></a>00862
-<a name="l00863"></a>00863 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> Alloc, ets_key_usage_type Cachetype>
-<a name="l00864"></a>00864 enumerable_thread_specific( <span class="keyword">const</span> enumerable_thread_specific<U, Alloc, Cachetype>& other ) : internal::ets_base<ETS_key_type> ()
-<a name="l00865"></a>00865 {
-<a name="l00866"></a>00866 internal_copy(other);
-<a name="l00867"></a>00867 }
-<a name="l00868"></a>00868
-<a name="l00869"></a>00869 enumerable_thread_specific( <span class="keyword">const</span> enumerable_thread_specific& other ) : internal::ets_base<ETS_key_type> ()
-<a name="l00870"></a>00870 {
-<a name="l00871"></a>00871 internal_copy(other);
-<a name="l00872"></a>00872 }
-<a name="l00873"></a>00873
-<a name="l00874"></a>00874 <span class="keyword">private</span>:
-<a name="l00875"></a>00875
-<a name="l00876"></a>00876 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> A2, ets_key_usage_type C2>
-<a name="l00877"></a>00877 enumerable_thread_specific &
-<a name="l00878"></a>00878 internal_assign(<span class="keyword">const</span> enumerable_thread_specific<U, A2, C2>& other) {
-<a name="l00879"></a>00879 <span class="keywordflow">if</span>(static_cast<void *>( <span class="keyword">this</span> ) != static_cast<const void *>( &other )) {
-<a name="l00880"></a>00880 this->clear();
-<a name="l00881"></a>00881 <span class="keywordflow">if</span>(my_finit_callback) {
-<a name="l00882"></a>00882 my_finit_callback->destroy();
-<a name="l00883"></a>00883 my_finit_callback = 0;
-<a name="l00884"></a>00884 }
-<a name="l00885"></a>00885 <span class="keywordflow">if</span>(my_exemplar_ptr) {
-<a name="l00886"></a>00886 free_exemplar(my_exemplar_ptr);
-<a name="l00887"></a>00887 my_exemplar_ptr = 0;
-<a name="l00888"></a>00888 }
-<a name="l00889"></a>00889 internal_copy( other );
-<a name="l00890"></a>00890 }
-<a name="l00891"></a>00891 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00892"></a>00892 }
-<a name="l00893"></a>00893
-<a name="l00894"></a>00894 <span class="keyword">public</span>:
-<a name="l00895"></a>00895
-<a name="l00896"></a>00896 <span class="comment">// assignment</span>
-<a name="l00897"></a>00897 enumerable_thread_specific& operator=(<span class="keyword">const</span> enumerable_thread_specific& other) {
-<a name="l00898"></a>00898 <span class="keywordflow">return</span> internal_assign(other);
-<a name="l00899"></a>00899 }
-<a name="l00900"></a>00900
-<a name="l00901"></a>00901 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> Alloc, ets_key_usage_type Cachetype>
-<a name="l00902"></a>00902 enumerable_thread_specific& operator=(<span class="keyword">const</span> enumerable_thread_specific<U, Alloc, Cachetype>& other)
-<a name="l00903"></a>00903 {
-<a name="l00904"></a>00904 <span class="keywordflow">return</span> internal_assign(other);
-<a name="l00905"></a>00905 }
-<a name="l00906"></a>00906
-<a name="l00907"></a>00907 <span class="comment">// combine_func_t has signature T(T,T) or T(const T&, const T&)</span>
-<a name="l00908"></a>00908 <span class="keyword">template</span> <<span class="keyword">typename</span> combine_func_t>
-<a name="l00909"></a>00909 T combine(combine_func_t f_combine) {
-<a name="l00910"></a>00910 <span class="keywordflow">if</span>(begin() == end()) {
-<a name="l00911"></a>00911 <span class="keywordflow">if</span>(my_finit_callback) {
-<a name="l00912"></a>00912 <span class="keywordflow">return</span> my_finit_callback->apply();
-<a name="l00913"></a>00913 }
-<a name="l00914"></a>00914 pointer local_ref = reinterpret_cast<T*>((my_exemplar_ptr->value));
-<a name="l00915"></a>00915 <span class="keywordflow">return</span> T(*local_ref);
-<a name="l00916"></a>00916 }
-<a name="l00917"></a>00917 const_iterator ci = begin();
-<a name="l00918"></a>00918 T my_result = *ci;
-<a name="l00919"></a>00919 <span class="keywordflow">while</span>(++ci != end())
-<a name="l00920"></a>00920 my_result = f_combine( my_result, *ci );
-<a name="l00921"></a>00921 <span class="keywordflow">return</span> my_result;
-<a name="l00922"></a>00922 }
-<a name="l00923"></a>00923
-<a name="l00924"></a>00924 <span class="comment">// combine_func_t has signature void(T) or void(const T&)</span>
-<a name="l00925"></a>00925 <span class="keyword">template</span> <<span class="keyword">typename</span> combine_func_t>
-<a name="l00926"></a>00926 <span class="keywordtype">void</span> combine_each(combine_func_t f_combine) {
-<a name="l00927"></a>00927 <span class="keywordflow">for</span>(const_iterator ci = begin(); ci != end(); ++ci) {
-<a name="l00928"></a>00928 f_combine( *ci );
-<a name="l00929"></a>00929 }
-<a name="l00930"></a>00930 }
-<a name="l00931"></a>00931
-<a name="l00932"></a>00932 }; <span class="comment">// enumerable_thread_specific</span>
-<a name="l00933"></a>00933
-<a name="l00934"></a>00934
-<a name="l00935"></a>00935 <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> Allocator, ets_key_usage_type ETS_key_type>
-<a name="l00936"></a>00936 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> A2, ets_key_usage_type C2>
-<a name="l00937"></a>00937 <span class="keywordtype">void</span> enumerable_thread_specific<T,Allocator,ETS_key_type>::internal_copy( <span class="keyword">const</span> enumerable_thread_specific<U, A2, C2>& other) {
-<a name="l00938"></a>00938 <span class="keyword">typedef</span> internal::ets_base<ets_no_key> base;
-<a name="l00939"></a>00939 __TBB_ASSERT(my_locals.<a class="code" href="a00162.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>()==0,NULL);
-<a name="l00940"></a>00940 this->table_reserve_for_copy( other );
-<a name="l00941"></a>00941 <span class="keywordflow">for</span>( base::array* r=other.my_root; r; r=r->next ) {
-<a name="l00942"></a>00942 <span class="keywordflow">for</span>( size_t i=0; i<r-><a class="code" href="a00148.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>(); ++i ) {
-<a name="l00943"></a>00943 base::slot& s1 = r->at(i);
-<a name="l00944"></a>00944 <span class="keywordflow">if</span>( !s1.empty() ) {
-<a name="l00945"></a>00945 base::slot& s2 = this->table_find(s1.key);
-<a name="l00946"></a>00946 <span class="keywordflow">if</span>( s2.empty() ) {
-<a name="l00947"></a>00947 #<span class="keywordflow">if</span> TBB_DEPRECATED
-<a name="l00948"></a>00948 <span class="keywordtype">void</span>* lref = &my_locals[my_locals.<a class="code" href="a00162.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(padded_element())];
-<a name="l00949"></a>00949 <span class="preprocessor">#else</span>
-<a name="l00950"></a>00950 <span class="preprocessor"></span> <span class="keywordtype">void</span>* lref = &*my_locals.<a class="code" href="a00162.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(padded_element());
-<a name="l00951"></a>00951 <span class="preprocessor">#endif</span>
-<a name="l00952"></a>00952 <span class="preprocessor"></span> s2.ptr = <span class="keyword">new</span>(lref) T(*(U*)s1.ptr);
-<a name="l00953"></a>00953 s2.key = s1.key;
-<a name="l00954"></a>00954 } <span class="keywordflow">else</span> {
-<a name="l00955"></a>00955 <span class="comment">// Skip the duplicate</span>
-<a name="l00956"></a>00956 }
-<a name="l00957"></a>00957 }
-<a name="l00958"></a>00958 }
-<a name="l00959"></a>00959 }
-<a name="l00960"></a>00960 <span class="keywordflow">if</span>(other.my_finit_callback) {
-<a name="l00961"></a>00961 my_finit_callback = other.my_finit_callback->make_copy();
-<a name="l00962"></a>00962 } <span class="keywordflow">else</span> {
-<a name="l00963"></a>00963 my_finit_callback = 0;
-<a name="l00964"></a>00964 }
-<a name="l00965"></a>00965 <span class="keywordflow">if</span>(other.my_exemplar_ptr) {
-<a name="l00966"></a>00966 pointer local_ref = reinterpret_cast<U*>(other.my_exemplar_ptr->value);
-<a name="l00967"></a>00967 my_exemplar_ptr = create_exemplar(*local_ref);
-<a name="l00968"></a>00968 } <span class="keywordflow">else</span> {
-<a name="l00969"></a>00969 my_exemplar_ptr = 0;
-<a name="l00970"></a>00970 }
-<a name="l00971"></a>00971 }
-<a name="l00972"></a>00972
-<a name="l00973"></a>00973 <span class="keyword">template</span>< <span class="keyword">typename</span> Container >
-<a name="l00974"></a>00974 <span class="keyword">class </span>flattened2d {
-<a name="l00975"></a>00975
-<a name="l00976"></a>00976 <span class="comment">// This intermediate typedef is to address issues with VC7.1 compilers</span>
-<a name="l00977"></a>00977 <span class="keyword">typedef</span> <span class="keyword">typename</span> Container::value_type conval_type;
-<a name="l00978"></a>00978
-<a name="l00979"></a>00979 <span class="keyword">public</span>:
-<a name="l00980"></a>00980
-<a name="l00982"></a>00982 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::size_type size_type;
-<a name="l00983"></a>00983 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::difference_type difference_type;
-<a name="l00984"></a>00984 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::allocator_type allocator_type;
-<a name="l00985"></a>00985 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::value_type value_type;
-<a name="l00986"></a>00986 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::reference reference;
-<a name="l00987"></a>00987 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::const_reference const_reference;
-<a name="l00988"></a>00988 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::pointer pointer;
-<a name="l00989"></a>00989 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::const_pointer const_pointer;
-<a name="l00990"></a>00990
-<a name="l00991"></a>00991 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::segmented_iterator<Container, value_type> iterator;
-<a name="l00992"></a>00992 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::segmented_iterator<Container, const value_type> const_iterator;
-<a name="l00993"></a>00993
-<a name="l00994"></a>00994 flattened2d( <span class="keyword">const</span> Container &c, <span class="keyword">typename</span> Container::const_iterator b, <span class="keyword">typename</span> Container::const_iterator e ) :
-<a name="l00995"></a>00995 my_container(const_cast<Container*>(&c)), my_begin(b), my_end(e) { }
-<a name="l00996"></a>00996
-<a name="l00997"></a>00997 flattened2d( <span class="keyword">const</span> Container &c ) :
-<a name="l00998"></a>00998 my_container(const_cast<Container*>(&c)), my_begin(c.begin()), my_end(c.end()) { }
-<a name="l00999"></a>00999
-<a name="l01000"></a>01000 iterator begin() { <span class="keywordflow">return</span> iterator(*my_container) = my_begin; }
-<a name="l01001"></a>01001 iterator end() { <span class="keywordflow">return</span> iterator(*my_container) = my_end; }
-<a name="l01002"></a>01002 const_iterator begin()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(*my_container) = my_begin; }
-<a name="l01003"></a>01003 const_iterator end()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(*my_container) = my_end; }
-<a name="l01004"></a>01004
-<a name="l01005"></a>01005 size_type size()<span class="keyword"> const </span>{
-<a name="l01006"></a>01006 size_type tot_size = 0;
-<a name="l01007"></a>01007 <span class="keywordflow">for</span>(<span class="keyword">typename</span> Container::const_iterator i = my_begin; i != my_end; ++i) {
-<a name="l01008"></a>01008 tot_size += i->size();
-<a name="l01009"></a>01009 }
-<a name="l01010"></a>01010 <span class="keywordflow">return</span> tot_size;
-<a name="l01011"></a>01011 }
-<a name="l01012"></a>01012
-<a name="l01013"></a>01013 <span class="keyword">private</span>:
-<a name="l01014"></a>01014
-<a name="l01015"></a>01015 Container *my_container;
-<a name="l01016"></a>01016 <span class="keyword">typename</span> Container::const_iterator my_begin;
-<a name="l01017"></a>01017 <span class="keyword">typename</span> Container::const_iterator my_end;
-<a name="l01018"></a>01018
-<a name="l01019"></a>01019 };
-<a name="l01020"></a>01020
-<a name="l01021"></a>01021 <span class="keyword">template</span> <<span class="keyword">typename</span> Container>
-<a name="l01022"></a>01022 flattened2d<Container> flatten2d(<span class="keyword">const</span> Container &c, <span class="keyword">const</span> <span class="keyword">typename</span> Container::const_iterator b, <span class="keyword">const</span> <span class="keyword">typename</span> Container::const_iterator e) {
-<a name="l01023"></a>01023 <span class="keywordflow">return</span> flattened2d<Container>(c, b, e);
-<a name="l01024"></a>01024 }
-<a name="l01025"></a>01025
-<a name="l01026"></a>01026 <span class="keyword">template</span> <<span class="keyword">typename</span> Container>
-<a name="l01027"></a>01027 flattened2d<Container> flatten2d(<span class="keyword">const</span> Container &c) {
-<a name="l01028"></a>01028 <span class="keywordflow">return</span> flattened2d<Container>(c);
-<a name="l01029"></a>01029 }
-<a name="l01030"></a>01030
-<a name="l01031"></a>01031 } <span class="comment">// interface5</span>
-<a name="l01032"></a>01032
-<a name="l01033"></a>01033 <span class="keyword">namespace </span>internal {
-<a name="l01034"></a>01034 <span class="keyword">using</span> interface5::internal::segmented_iterator;
-<a name="l01035"></a>01035 }
-<a name="l01036"></a>01036
-<a name="l01037"></a>01037 <span class="keyword">using</span> interface5::enumerable_thread_specific;
-<a name="l01038"></a>01038 <span class="keyword">using</span> interface5::flattened2d;
-<a name="l01039"></a>01039 <span class="keyword">using</span> interface5::flatten2d;
-<a name="l01040"></a>01040
-<a name="l01041"></a>01041 } <span class="comment">// namespace tbb</span>
-<a name="l01042"></a>01042
-<a name="l01043"></a>01043 <span class="preprocessor">#endif</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00354.html b/doc/html/a00354.html
new file mode 100644
index 0000000..7d4ccc5
--- /dev/null
+++ b/doc/html/a00354.html
@@ -0,0 +1,970 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>enumerable_thread_specific.h Source File</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.7 -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li id="current"><a href="files.html"><span>Files</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="files.html"><span>File List</span></a></li>
+ <li><a href="globals.html"><span>File Members</span></a></li>
+ </ul></div>
+<h1>enumerable_thread_specific.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
+<a name="l00003"></a>00003 <span class="comment"></span>
+<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
+<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
+<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
+<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
+<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
+<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
+<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
+<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
+<a name="l00012"></a>00012 <span class="comment"></span>
+<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
+<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
+<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
+<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
+<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
+<a name="l00018"></a>00018 <span class="comment"> writing.</span>
+<a name="l00019"></a>00019 <span class="comment">*/</span>
+<a name="l00020"></a>00020
+<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_enumerable_thread_specific_H</span>
+<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_enumerable_thread_specific_H</span>
+<a name="l00023"></a>00023 <span class="preprocessor"></span>
+<a name="l00024"></a>00024 <span class="preprocessor">#include "concurrent_vector.h"</span>
+<a name="l00025"></a>00025 <span class="preprocessor">#include "tbb_thread.h"</span>
+<a name="l00026"></a>00026 <span class="preprocessor">#include "cache_aligned_allocator.h"</span>
+<a name="l00027"></a>00027 <span class="preprocessor">#include "aligned_space.h"</span>
+<a name="l00028"></a>00028 <span class="preprocessor">#if __SUNPRO_CC</span>
+<a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor">#include <string.h></span> <span class="comment">// for memcpy</span>
+<a name="l00030"></a>00030 <span class="preprocessor">#endif</span>
+<a name="l00031"></a>00031 <span class="preprocessor"></span>
+<a name="l00032"></a>00032 <span class="preprocessor">#if _WIN32||_WIN64</span>
+<a name="l00033"></a>00033 <span class="preprocessor"></span><span class="preprocessor">#include <windows.h></span>
+<a name="l00034"></a>00034 <span class="preprocessor">#else</span>
+<a name="l00035"></a>00035 <span class="preprocessor"></span><span class="preprocessor">#include <pthread.h></span>
+<a name="l00036"></a>00036 <span class="preprocessor">#endif</span>
+<a name="l00037"></a>00037 <span class="preprocessor"></span>
+<a name="l00038"></a>00038 <span class="keyword">namespace </span>tbb {
+<a name="l00039"></a>00039
+<a name="l00041"></a><a class="code" href="a00267.html#a8622ae61b7e7737dac26542e181178e">00041</a> <span class="keyword">enum</span> <a class="code" href="a00267.html#a8622ae61b7e7737dac26542e181178e">ets_key_usage_type</a> { ets_key_per_instance, ets_no_key };
+<a name="l00042"></a>00042
+<a name="l00043"></a>00043 <span class="keyword">namespace </span>interface6 {
+<a name="l00044"></a>00044
+<a name="l00046"></a>00046 <span class="keyword">namespace </span>internal {
+<a name="l00047"></a>00047
+<a name="l00048"></a>00048 <span class="keyword">template</span><ets_key_usage_type ETS_key_type>
+<a name="l00049"></a>00049 <span class="keyword">class </span>ets_base: tbb::internal::no_copy {
+<a name="l00050"></a>00050 <span class="keyword">protected</span>:
+<a name="l00051"></a>00051 <span class="preprocessor">#if _WIN32||_WIN64</span>
+<a name="l00052"></a>00052 <span class="preprocessor"></span> <span class="keyword">typedef</span> DWORD key_type;
+<a name="l00053"></a>00053 <span class="preprocessor">#else</span>
+<a name="l00054"></a>00054 <span class="preprocessor"></span> <span class="keyword">typedef</span> pthread_t key_type;
+<a name="l00055"></a>00055 <span class="preprocessor">#endif</span>
+<a name="l00056"></a>00056 <span class="preprocessor"></span><span class="preprocessor">#if __TBB_GCC_3_3_PROTECTED_BROKEN</span>
+<a name="l00057"></a>00057 <span class="preprocessor"></span> <span class="keyword">public</span>:
+<a name="l00058"></a>00058 <span class="preprocessor">#endif</span>
+<a name="l00059"></a>00059 <span class="preprocessor"></span> <span class="keyword">struct </span>slot;
+<a name="l00060"></a>00060
+<a name="l00061"></a>00061 <span class="keyword">struct </span>array {
+<a name="l00062"></a>00062 array* next;
+<a name="l00063"></a>00063 size_t lg_size;
+<a name="l00064"></a>00064 slot& at( size_t k ) {
+<a name="l00065"></a>00065 <span class="keywordflow">return</span> ((slot*)(<span class="keywordtype">void</span>*)(<span class="keyword">this</span>+1))[k];
+<a name="l00066"></a>00066 }
+<a name="l00067"></a>00067 size_t size()<span class="keyword"> const </span>{<span class="keywordflow">return</span> (size_t)1<<lg_size;}
+<a name="l00068"></a>00068 size_t mask()<span class="keyword"> const </span>{<span class="keywordflow">return</span> size()-1;}
+<a name="l00069"></a>00069 size_t start( size_t h )<span class="keyword"> const </span>{
+<a name="l00070"></a>00070 <span class="keywordflow">return</span> h>>(8*<span class="keyword">sizeof</span>(size_t)-lg_size);
+<a name="l00071"></a>00071 }
+<a name="l00072"></a>00072 };
+<a name="l00073"></a>00073 <span class="keyword">struct </span>slot {
+<a name="l00074"></a>00074 key_type key;
+<a name="l00075"></a>00075 <span class="keywordtype">void</span>* ptr;
+<a name="l00076"></a>00076 <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{<span class="keywordflow">return</span> !key;}
+<a name="l00077"></a>00077 <span class="keywordtype">bool</span> match( key_type k )<span class="keyword"> const </span>{<span class="keywordflow">return</span> key==k;}
+<a name="l00078"></a>00078 <span class="keywordtype">bool</span> claim( key_type k ) {
+<a name="l00079"></a>00079 __TBB_ASSERT(<span class="keyword">sizeof</span>(<a class="code" href="a00142.html">tbb::atomic<key_type></a>)==<span class="keyword">sizeof</span>(key_type), NULL);
+<a name="l00080"></a>00080 <span class="keywordflow">return</span> tbb::internal::punned_cast<tbb::atomic<key_type>*>(&key)->compare_and_swap(k,0)==0;
+<a name="l00081"></a>00081 }
+<a name="l00082"></a>00082 };
+<a name="l00083"></a>00083 <span class="preprocessor">#if __TBB_GCC_3_3_PROTECTED_BROKEN</span>
+<a name="l00084"></a>00084 <span class="preprocessor"></span> <span class="keyword">protected</span>:
+<a name="l00085"></a>00085 <span class="preprocessor">#endif</span>
+<a name="l00086"></a>00086 <span class="preprocessor"></span>
+<a name="l00087"></a>00087 <span class="keyword">static</span> key_type key_of_current_thread() {
+<a name="l00088"></a>00088 tbb::tbb_thread::id <span class="keywordtype">id</span> = tbb::this_tbb_thread::get_id();
+<a name="l00089"></a>00089 key_type k;
+<a name="l00090"></a>00090 memcpy( &k, &<span class="keywordtype">id</span>, <span class="keyword">sizeof</span>(k) );
+<a name="l00091"></a>00091 <span class="keywordflow">return</span> k;
+<a name="l00092"></a>00092 }
+<a name="l00093"></a>00093
+<a name="l00095"></a>00095
+<a name="l00097"></a>00097 atomic<array*> my_root;
+<a name="l00098"></a>00098 atomic<size_t> my_count;
+<a name="l00099"></a>00099 <span class="keyword">virtual</span> <span class="keywordtype">void</span>* create_local() = 0;
+<a name="l00100"></a>00100 <span class="keyword">virtual</span> <span class="keywordtype">void</span>* create_array(size_t _size) = 0; <span class="comment">// _size in bytes</span>
+<a name="l00101"></a>00101 <span class="keyword">virtual</span> <span class="keywordtype">void</span> free_array(<span class="keywordtype">void</span>* ptr, size_t _size) = 0; <span class="comment">// _size in bytes</span>
+<a name="l00102"></a>00102 array* allocate( size_t lg_size ) {
+<a name="l00103"></a>00103 size_t n = 1<<lg_size;
+<a name="l00104"></a>00104 array* a = static_cast<array*>(create_array( <span class="keyword">sizeof</span>(array)+n*<span class="keyword">sizeof</span>(slot) ));
+<a name="l00105"></a>00105 a->lg_size = lg_size;
+<a name="l00106"></a>00106 std::memset( a+1, 0, n*<span class="keyword">sizeof</span>(slot) );
+<a name="l00107"></a>00107 <span class="keywordflow">return</span> a;
+<a name="l00108"></a>00108 }
+<a name="l00109"></a>00109 <span class="keywordtype">void</span> free(array* a) {
+<a name="l00110"></a>00110 size_t n = 1<<(a->lg_size);
+<a name="l00111"></a>00111 free_array( (<span class="keywordtype">void</span> *)a, size_t(<span class="keyword">sizeof</span>(array)+n*<span class="keyword">sizeof</span>(slot)) );
+<a name="l00112"></a>00112 }
+<a name="l00113"></a>00113 <span class="keyword">static</span> size_t hash( key_type k ) {
+<a name="l00114"></a>00114 <span class="comment">// Multiplicative hashing. Client should use *upper* bits.</span>
+<a name="l00115"></a>00115 <span class="comment">// casts required for Mac gcc4.* compiler</span>
+<a name="l00116"></a>00116 <span class="preprocessor">#if __TBB_WORDSIZE == 4</span>
+<a name="l00117"></a>00117 <span class="preprocessor"></span> <span class="keywordflow">return</span> uintptr_t(k)*0x9E3779B9;
+<a name="l00118"></a>00118 <span class="preprocessor">#else</span>
+<a name="l00119"></a>00119 <span class="preprocessor"></span> <span class="keywordflow">return</span> uintptr_t(k)*0x9E3779B97F4A7C15;
+<a name="l00120"></a>00120 <span class="preprocessor">#endif </span>
+<a name="l00121"></a>00121 <span class="preprocessor"></span> }
+<a name="l00122"></a>00122
+<a name="l00123"></a>00123 ets_base() {my_root=NULL; my_count=0;}
+<a name="l00124"></a>00124 <span class="keyword">virtual</span> ~ets_base(); <span class="comment">// g++ complains if this is not virtual...</span>
+<a name="l00125"></a>00125 <span class="keywordtype">void</span>* table_lookup( <span class="keywordtype">bool</span>& exists );
+<a name="l00126"></a>00126 <span class="keywordtype">void</span> table_clear();
+<a name="l00127"></a>00127 slot& table_find( key_type k ) {
+<a name="l00128"></a>00128 size_t h = hash(k);
+<a name="l00129"></a>00129 array* r = my_root;
+<a name="l00130"></a>00130 size_t mask = r->mask();
+<a name="l00131"></a>00131 <span class="keywordflow">for</span>(size_t i = r->start(h);;i=(i+1)&mask) {
+<a name="l00132"></a>00132 slot& s = r->at(i);
+<a name="l00133"></a>00133 <span class="keywordflow">if</span>( s.empty() || s.match(k) )
+<a name="l00134"></a>00134 <span class="keywordflow">return</span> s;
+<a name="l00135"></a>00135 }
+<a name="l00136"></a>00136 }
+<a name="l00137"></a>00137 <span class="keywordtype">void</span> table_reserve_for_copy( <span class="keyword">const</span> ets_base& other ) {
+<a name="l00138"></a>00138 __TBB_ASSERT(!my_root,NULL);
+<a name="l00139"></a>00139 __TBB_ASSERT(!my_count,NULL);
+<a name="l00140"></a>00140 <span class="keywordflow">if</span>( other.my_root ) {
+<a name="l00141"></a>00141 array* a = allocate(other.my_root->lg_size);
+<a name="l00142"></a>00142 a->next = NULL;
+<a name="l00143"></a>00143 my_root = a;
+<a name="l00144"></a>00144 my_count = other.my_count;
+<a name="l00145"></a>00145 }
+<a name="l00146"></a>00146 }
+<a name="l00147"></a>00147 };
+<a name="l00148"></a>00148
+<a name="l00149"></a>00149 <span class="keyword">template</span><ets_key_usage_type ETS_key_type>
+<a name="l00150"></a>00150 ets_base<ETS_key_type>::~ets_base() {
+<a name="l00151"></a>00151 __TBB_ASSERT(!my_root, NULL);
+<a name="l00152"></a>00152 }
+<a name="l00153"></a>00153
+<a name="l00154"></a>00154 <span class="keyword">template</span><ets_key_usage_type ETS_key_type>
+<a name="l00155"></a>00155 <span class="keywordtype">void</span> ets_base<ETS_key_type>::table_clear() {
+<a name="l00156"></a>00156 <span class="keywordflow">while</span>( array* r = my_root ) {
+<a name="l00157"></a>00157 my_root = r->next;
+<a name="l00158"></a>00158 free(r);
+<a name="l00159"></a>00159 }
+<a name="l00160"></a>00160 my_count = 0;
+<a name="l00161"></a>00161 }
+<a name="l00162"></a>00162
+<a name="l00163"></a>00163 <span class="keyword">template</span><ets_key_usage_type ETS_key_type>
+<a name="l00164"></a>00164 <span class="keywordtype">void</span>* ets_base<ETS_key_type>::table_lookup( <span class="keywordtype">bool</span>& exists ) {
+<a name="l00165"></a>00165 <span class="keyword">const</span> key_type k = key_of_current_thread();
+<a name="l00166"></a>00166
+<a name="l00167"></a>00167 __TBB_ASSERT(k!=0,NULL);
+<a name="l00168"></a>00168 <span class="keywordtype">void</span>* found;
+<a name="l00169"></a>00169 size_t h = hash(k);
+<a name="l00170"></a>00170 <span class="keywordflow">for</span>( array* r=my_root; r; r=r->next ) {
+<a name="l00171"></a>00171 size_t mask=r->mask();
+<a name="l00172"></a>00172 <span class="keywordflow">for</span>(size_t i = r->start(h); ;i=(i+1)&mask) {
+<a name="l00173"></a>00173 slot& s = r->at(i);
+<a name="l00174"></a>00174 <span class="keywordflow">if</span>( s.empty() ) <span class="keywordflow">break</span>;
+<a name="l00175"></a>00175 <span class="keywordflow">if</span>( s.match(k) ) {
+<a name="l00176"></a>00176 <span class="keywordflow">if</span>( r==my_root ) {
+<a name="l00177"></a>00177 <span class="comment">// Success at top level</span>
+<a name="l00178"></a>00178 exists = <span class="keyword">true</span>;
+<a name="l00179"></a>00179 <span class="keywordflow">return</span> s.ptr;
+<a name="l00180"></a>00180 } <span class="keywordflow">else</span> {
+<a name="l00181"></a>00181 <span class="comment">// Success at some other level. Need to insert at top level.</span>
+<a name="l00182"></a>00182 exists = <span class="keyword">true</span>;
+<a name="l00183"></a>00183 found = s.ptr;
+<a name="l00184"></a>00184 <span class="keywordflow">goto</span> insert;
+<a name="l00185"></a>00185 }
+<a name="l00186"></a>00186 }
+<a name="l00187"></a>00187 }
+<a name="l00188"></a>00188 }
+<a name="l00189"></a>00189 <span class="comment">// Key does not yet exist</span>
+<a name="l00190"></a>00190 exists = <span class="keyword">false</span>;
+<a name="l00191"></a>00191 found = create_local();
+<a name="l00192"></a>00192 {
+<a name="l00193"></a>00193 size_t c = ++my_count;
+<a name="l00194"></a>00194 array* r = my_root;
+<a name="l00195"></a>00195 <span class="keywordflow">if</span>( !r || c>r->size()/2 ) {
+<a name="l00196"></a>00196 size_t s = r ? r->lg_size : 2;
+<a name="l00197"></a>00197 <span class="keywordflow">while</span>( c>size_t(1)<<(s-1) ) ++s;
+<a name="l00198"></a>00198 array* a = allocate(s);
+<a name="l00199"></a>00199 <span class="keywordflow">for</span>(;;) {
+<a name="l00200"></a>00200 a->next = my_root;
+<a name="l00201"></a>00201 array* new_r = my_root.compare_and_swap(a,r);
+<a name="l00202"></a>00202 <span class="keywordflow">if</span>( new_r==r ) <span class="keywordflow">break</span>;
+<a name="l00203"></a>00203 <span class="keywordflow">if</span>( new_r->lg_size>=s ) {
+<a name="l00204"></a>00204 <span class="comment">// Another thread inserted an equal or bigger array, so our array is superfluous.</span>
+<a name="l00205"></a>00205 free(a);
+<a name="l00206"></a>00206 <span class="keywordflow">break</span>;
+<a name="l00207"></a>00207 }
+<a name="l00208"></a>00208 r = new_r;
+<a name="l00209"></a>00209 }
+<a name="l00210"></a>00210 }
+<a name="l00211"></a>00211 }
+<a name="l00212"></a>00212 insert:
+<a name="l00213"></a>00213 <span class="comment">// Guaranteed to be room for it, and it is not present, so search for empty slot and grab it.</span>
+<a name="l00214"></a>00214 array* ir = my_root;
+<a name="l00215"></a>00215 size_t mask = ir->mask();
+<a name="l00216"></a>00216 <span class="keywordflow">for</span>(size_t i = ir->start(h);;i=(i+1)&mask) {
+<a name="l00217"></a>00217 slot& s = ir->at(i);
+<a name="l00218"></a>00218 <span class="keywordflow">if</span>( s.empty() ) {
+<a name="l00219"></a>00219 <span class="keywordflow">if</span>( s.claim(k) ) {
+<a name="l00220"></a>00220 s.ptr = found;
+<a name="l00221"></a>00221 <span class="keywordflow">return</span> found;
+<a name="l00222"></a>00222 }
+<a name="l00223"></a>00223 }
+<a name="l00224"></a>00224 }
+<a name="l00225"></a>00225 }
+<a name="l00226"></a>00226
+<a name="l00228"></a>00228 <span class="keyword">template</span> <>
+<a name="l00229"></a>00229 <span class="keyword">class </span>ets_base<ets_key_per_instance>: <span class="keyword">protected</span> ets_base<ets_no_key> {
+<a name="l00230"></a>00230 <span class="keyword">typedef</span> ets_base<ets_no_key> super;
+<a name="l00231"></a>00231 <span class="preprocessor">#if _WIN32||_WIN64</span>
+<a name="l00232"></a>00232 <span class="preprocessor"></span> <span class="keyword">typedef</span> DWORD tls_key_t;
+<a name="l00233"></a>00233 <span class="keywordtype">void</span> create_key() { my_key = TlsAlloc(); }
+<a name="l00234"></a>00234 <span class="keywordtype">void</span> destroy_key() { TlsFree(my_key); }
+<a name="l00235"></a>00235 <span class="keywordtype">void</span> set_tls(<span class="keywordtype">void</span> * value) { TlsSetValue(my_key, (LPVOID)value); }
+<a name="l00236"></a>00236 <span class="keywordtype">void</span>* get_tls() { <span class="keywordflow">return</span> (<span class="keywordtype">void</span> *)TlsGetValue(my_key); }
+<a name="l00237"></a>00237 <span class="preprocessor">#else</span>
+<a name="l00238"></a>00238 <span class="preprocessor"></span> <span class="keyword">typedef</span> pthread_key_t tls_key_t;
+<a name="l00239"></a>00239 <span class="keywordtype">void</span> create_key() { pthread_key_create(&my_key, NULL); }
+<a name="l00240"></a>00240 <span class="keywordtype">void</span> destroy_key() { pthread_key_delete(my_key); }
+<a name="l00241"></a>00241 <span class="keywordtype">void</span> set_tls( <span class="keywordtype">void</span> * value )<span class="keyword"> const </span>{ pthread_setspecific(my_key, value); }
+<a name="l00242"></a>00242 <span class="keywordtype">void</span>* get_tls()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> pthread_getspecific(my_key); }
+<a name="l00243"></a>00243 <span class="preprocessor">#endif</span>
+<a name="l00244"></a>00244 <span class="preprocessor"></span> tls_key_t my_key;
+<a name="l00245"></a>00245 <span class="keyword">virtual</span> <span class="keywordtype">void</span>* create_local() = 0;
+<a name="l00246"></a>00246 <span class="keyword">virtual</span> <span class="keywordtype">void</span>* create_array(size_t _size) = 0; <span class="comment">// _size in bytes</span>
+<a name="l00247"></a>00247 <span class="keyword">virtual</span> <span class="keywordtype">void</span> free_array(<span class="keywordtype">void</span>* ptr, size_t _size) = 0; <span class="comment">// size in bytes</span>
+<a name="l00248"></a>00248 <span class="keyword">public</span>:
+<a name="l00249"></a>00249 ets_base() {create_key();}
+<a name="l00250"></a>00250 ~ets_base() {destroy_key();}
+<a name="l00251"></a>00251 <span class="keywordtype">void</span>* table_lookup( <span class="keywordtype">bool</span>& exists ) {
+<a name="l00252"></a>00252 <span class="keywordtype">void</span>* found = get_tls();
+<a name="l00253"></a>00253 <span class="keywordflow">if</span>( found ) {
+<a name="l00254"></a>00254 exists=<span class="keyword">true</span>;
+<a name="l00255"></a>00255 } <span class="keywordflow">else</span> {
+<a name="l00256"></a>00256 found = super::table_lookup(exists);
+<a name="l00257"></a>00257 set_tls(found);
+<a name="l00258"></a>00258 }
+<a name="l00259"></a>00259 <span class="keywordflow">return</span> found;
+<a name="l00260"></a>00260 }
+<a name="l00261"></a>00261 <span class="keywordtype">void</span> table_clear() {
+<a name="l00262"></a>00262 destroy_key();
+<a name="l00263"></a>00263 create_key();
+<a name="l00264"></a>00264 super::table_clear();
+<a name="l00265"></a>00265 }
+<a name="l00266"></a>00266 };
+<a name="l00267"></a>00267
+<a name="l00269"></a>00269 <span class="keyword">template</span>< <span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value >
+<a name="l00270"></a>00270 <span class="keyword">class </span>enumerable_thread_specific_iterator
+<a name="l00271"></a>00271 #if defined(_WIN64) && defined(_MSC_VER)
+<a name="l00272"></a>00272 <span class="comment">// Ensure that Microsoft's internal template function _Val_type works correctly.</span>
+<a name="l00273"></a>00273 : public std::iterator<std::random_access_iterator_tag,Value>
+<a name="l00274"></a>00274 #endif <span class="comment">/* defined(_WIN64) && defined(_MSC_VER) */</span>
+<a name="l00275"></a>00275 {
+<a name="l00277"></a>00277
+<a name="l00278"></a>00278 Container *my_container;
+<a name="l00279"></a>00279 <span class="keyword">typename</span> Container::size_type my_index;
+<a name="l00280"></a>00280 <span class="keyword">mutable</span> Value *my_value;
+<a name="l00281"></a>00281
+<a name="l00282"></a>00282 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T>
+<a name="l00283"></a>00283 <span class="keyword">friend</span> enumerable_thread_specific_iterator<C,T> operator+( ptrdiff_t offset,
+<a name="l00284"></a>00284 <span class="keyword">const</span> enumerable_thread_specific_iterator<C,T>& v );
+<a name="l00285"></a>00285
+<a name="l00286"></a>00286 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00287"></a>00287 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> enumerable_thread_specific_iterator<C,T>& i,
+<a name="l00288"></a>00288 <span class="keyword">const</span> enumerable_thread_specific_iterator<C,U>& j );
+<a name="l00289"></a>00289
+<a name="l00290"></a>00290 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00291"></a>00291 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator<( const enumerable_thread_specific_iterator<C,T>& i,
+<a name="l00292"></a>00292 <span class="keyword">const</span> enumerable_thread_specific_iterator<C,U>& j );
+<a name="l00293"></a>00293
+<a name="l00294"></a>00294 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00295"></a>00295 <span class="keyword">friend</span> ptrdiff_t operator-( <span class="keyword">const</span> enumerable_thread_specific_iterator<C,T>& i, <span class="keyword">const</span> enumerable_thread_specific_iterator<C,U>& j );
+<a name="l00296"></a>00296
+<a name="l00297"></a>00297 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> U>
+<a name="l00298"></a>00298 <span class="keyword">friend</span> <span class="keyword">class </span>enumerable_thread_specific_iterator;
+<a name="l00299"></a>00299
+<a name="l00300"></a>00300 <span class="keyword">public</span>:
+<a name="l00301"></a>00301
+<a name="l00302"></a>00302 enumerable_thread_specific_iterator( <span class="keyword">const</span> Container &container, <span class="keyword">typename</span> Container::size_type index ) :
+<a name="l00303"></a>00303 my_container(&const_cast<Container &>(container)), my_index(index), my_value(NULL) {}
+<a name="l00304"></a>00304
+<a name="l00306"></a>00306 enumerable_thread_specific_iterator() : my_container(NULL), my_index(0), my_value(NULL) {}
+<a name="l00307"></a>00307
+<a name="l00308"></a>00308 <span class="keyword">template</span><<span class="keyword">typename</span> U>
+<a name="l00309"></a>00309 enumerable_thread_specific_iterator( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container, U>& other ) :
+<a name="l00310"></a>00310 my_container( other.my_container ), my_index( other.my_index), my_value( const_cast<Value *>(other.my_value) ) {}
+<a name="l00311"></a>00311
+<a name="l00312"></a>00312 enumerable_thread_specific_iterator operator+( ptrdiff_t offset )<span class="keyword"> const </span>{
+<a name="l00313"></a>00313 <span class="keywordflow">return</span> enumerable_thread_specific_iterator(*my_container, my_index + offset);
+<a name="l00314"></a>00314 }
+<a name="l00315"></a>00315
+<a name="l00316"></a>00316 enumerable_thread_specific_iterator &operator+=( ptrdiff_t offset ) {
+<a name="l00317"></a>00317 my_index += offset;
+<a name="l00318"></a>00318 my_value = NULL;
+<a name="l00319"></a>00319 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00320"></a>00320 }
+<a name="l00321"></a>00321
+<a name="l00322"></a>00322 enumerable_thread_specific_iterator operator-( ptrdiff_t offset )<span class="keyword"> const </span>{
+<a name="l00323"></a>00323 <span class="keywordflow">return</span> enumerable_thread_specific_iterator( *my_container, my_index-offset );
+<a name="l00324"></a>00324 }
+<a name="l00325"></a>00325
+<a name="l00326"></a>00326 enumerable_thread_specific_iterator &operator-=( ptrdiff_t offset ) {
+<a name="l00327"></a>00327 my_index -= offset;
+<a name="l00328"></a>00328 my_value = NULL;
+<a name="l00329"></a>00329 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00330"></a>00330 }
+<a name="l00331"></a>00331
+<a name="l00332"></a>00332 Value& operator*()<span class="keyword"> const </span>{
+<a name="l00333"></a>00333 Value* value = my_value;
+<a name="l00334"></a>00334 <span class="keywordflow">if</span>( !value ) {
+<a name="l00335"></a>00335 value = my_value = reinterpret_cast<Value *>(&(*my_container)[my_index].value);
+<a name="l00336"></a>00336 }
+<a name="l00337"></a>00337 __TBB_ASSERT( value==reinterpret_cast<Value *>(&(*my_container)[my_index].value), <span class="stringliteral">"corrupt cache"</span> );
+<a name="l00338"></a>00338 <span class="keywordflow">return</span> *value;
+<a name="l00339"></a>00339 }
+<a name="l00340"></a>00340
+<a name="l00341"></a>00341 Value& operator[]( ptrdiff_t k )<span class="keyword"> const </span>{
+<a name="l00342"></a>00342 <span class="keywordflow">return</span> (*my_container)[my_index + k].value;
+<a name="l00343"></a>00343 }
+<a name="l00344"></a>00344
+<a name="l00345"></a>00345 Value* operator->()<span class="keyword"> const </span>{<span class="keywordflow">return</span> &operator*();}
+<a name="l00346"></a>00346
+<a name="l00347"></a>00347 enumerable_thread_specific_iterator& operator++() {
+<a name="l00348"></a>00348 ++my_index;
+<a name="l00349"></a>00349 my_value = NULL;
+<a name="l00350"></a>00350 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00351"></a>00351 }
+<a name="l00352"></a>00352
+<a name="l00353"></a>00353 enumerable_thread_specific_iterator& operator--() {
+<a name="l00354"></a>00354 --my_index;
+<a name="l00355"></a>00355 my_value = NULL;
+<a name="l00356"></a>00356 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00357"></a>00357 }
+<a name="l00358"></a>00358
+<a name="l00360"></a>00360 enumerable_thread_specific_iterator operator++(<span class="keywordtype">int</span>) {
+<a name="l00361"></a>00361 enumerable_thread_specific_iterator result = *<span class="keyword">this</span>;
+<a name="l00362"></a>00362 ++my_index;
+<a name="l00363"></a>00363 my_value = NULL;
+<a name="l00364"></a>00364 <span class="keywordflow">return</span> result;
+<a name="l00365"></a>00365 }
+<a name="l00366"></a>00366
+<a name="l00368"></a>00368 enumerable_thread_specific_iterator operator--(<span class="keywordtype">int</span>) {
+<a name="l00369"></a>00369 enumerable_thread_specific_iterator result = *<span class="keyword">this</span>;
+<a name="l00370"></a>00370 --my_index;
+<a name="l00371"></a>00371 my_value = NULL;
+<a name="l00372"></a>00372 <span class="keywordflow">return</span> result;
+<a name="l00373"></a>00373 }
+<a name="l00374"></a>00374
+<a name="l00375"></a>00375 <span class="comment">// STL support</span>
+<a name="l00376"></a>00376 <span class="keyword">typedef</span> ptrdiff_t difference_type;
+<a name="l00377"></a>00377 <span class="keyword">typedef</span> Value value_type;
+<a name="l00378"></a>00378 <span class="keyword">typedef</span> Value* pointer;
+<a name="l00379"></a>00379 <span class="keyword">typedef</span> Value& reference;
+<a name="l00380"></a>00380 <span class="keyword">typedef</span> std::random_access_iterator_tag iterator_category;
+<a name="l00381"></a>00381 };
+<a name="l00382"></a>00382
+<a name="l00383"></a>00383 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T>
+<a name="l00384"></a>00384 enumerable_thread_specific_iterator<Container,T> operator+( ptrdiff_t offset,
+<a name="l00385"></a>00385 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& v ) {
+<a name="l00386"></a>00386 <span class="keywordflow">return</span> enumerable_thread_specific_iterator<Container,T>( v.my_container, v.my_index + offset );
+<a name="l00387"></a>00387 }
+<a name="l00388"></a>00388
+<a name="l00389"></a>00389 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00390"></a>00390 <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& i,
+<a name="l00391"></a>00391 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
+<a name="l00392"></a>00392 <span class="keywordflow">return</span> i.my_index==j.my_index && i.my_container == j.my_container;
+<a name="l00393"></a>00393 }
+<a name="l00394"></a>00394
+<a name="l00395"></a>00395 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00396"></a>00396 <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& i,
+<a name="l00397"></a>00397 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
+<a name="l00398"></a>00398 <span class="keywordflow">return</span> !(i==j);
+<a name="l00399"></a>00399 }
+<a name="l00400"></a>00400
+<a name="l00401"></a>00401 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00402"></a>00402 <span class="keywordtype">bool</span> operator<( const enumerable_thread_specific_iterator<Container,T>& i,
+<a name="l00403"></a>00403 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
+<a name="l00404"></a>00404 <span class="keywordflow">return</span> i.my_index<j.my_index;
+<a name="l00405"></a>00405 }
+<a name="l00406"></a>00406
+<a name="l00407"></a>00407 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00408"></a>00408 <span class="keywordtype">bool</span> operator>( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& i,
+<a name="l00409"></a>00409 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
+<a name="l00410"></a>00410 <span class="keywordflow">return</span> j<i;
+<a name="l00411"></a>00411 }
+<a name="l00412"></a>00412
+<a name="l00413"></a>00413 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00414"></a>00414 <span class="keywordtype">bool</span> operator>=( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& i,
+<a name="l00415"></a>00415 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
+<a name="l00416"></a>00416 <span class="keywordflow">return</span> !(i<j);
+<a name="l00417"></a>00417 }
+<a name="l00418"></a>00418
+<a name="l00419"></a>00419 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00420"></a>00420 <span class="keywordtype">bool</span> operator<=( const enumerable_thread_specific_iterator<Container,T>& i,
+<a name="l00421"></a>00421 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
+<a name="l00422"></a>00422 <span class="keywordflow">return</span> !(j<i);
+<a name="l00423"></a>00423 }
+<a name="l00424"></a>00424
+<a name="l00425"></a>00425 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00426"></a>00426 ptrdiff_t operator-( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& i,
+<a name="l00427"></a>00427 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
+<a name="l00428"></a>00428 <span class="keywordflow">return</span> i.my_index-j.my_index;
+<a name="l00429"></a>00429 }
+<a name="l00430"></a>00430
+<a name="l00431"></a>00431 <span class="keyword">template</span><<span class="keyword">typename</span> SegmentedContainer, <span class="keyword">typename</span> Value >
+<a name="l00432"></a>00432 <span class="keyword">class </span>segmented_iterator
+<a name="l00433"></a>00433 #if defined(_WIN64) && defined(_MSC_VER)
+<a name="l00434"></a>00434 : public std::iterator<std::input_iterator_tag, Value>
+<a name="l00435"></a>00435 #endif
+<a name="l00436"></a>00436 {
+<a name="l00437"></a>00437 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00438"></a>00438 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> segmented_iterator<C,T>& i, <span class="keyword">const</span> segmented_iterator<C,U>& j);
+<a name="l00439"></a>00439
+<a name="l00440"></a>00440 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00441"></a>00441 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> segmented_iterator<C,T>& i, <span class="keyword">const</span> segmented_iterator<C,U>& j);
+<a name="l00442"></a>00442
+<a name="l00443"></a>00443 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> U>
+<a name="l00444"></a>00444 <span class="keyword">friend</span> <span class="keyword">class </span>segmented_iterator;
+<a name="l00445"></a>00445
+<a name="l00446"></a>00446 <span class="keyword">public</span>:
+<a name="l00447"></a>00447
+<a name="l00448"></a>00448 segmented_iterator() {my_segcont = NULL;}
+<a name="l00449"></a>00449
+<a name="l00450"></a>00450 segmented_iterator( <span class="keyword">const</span> SegmentedContainer& _segmented_container ) :
+<a name="l00451"></a>00451 my_segcont(const_cast<SegmentedContainer*>(&_segmented_container)),
+<a name="l00452"></a>00452 outer_iter(my_segcont->end()) { }
+<a name="l00453"></a>00453
+<a name="l00454"></a>00454 ~segmented_iterator() {}
+<a name="l00455"></a>00455
+<a name="l00456"></a>00456 <span class="keyword">typedef</span> <span class="keyword">typename</span> SegmentedContainer::iterator outer_iterator;
+<a name="l00457"></a>00457 <span class="keyword">typedef</span> <span class="keyword">typename</span> SegmentedContainer::value_type InnerContainer;
+<a name="l00458"></a>00458 <span class="keyword">typedef</span> <span class="keyword">typename</span> InnerContainer::iterator inner_iterator;
+<a name="l00459"></a>00459
+<a name="l00460"></a>00460 <span class="comment">// STL support</span>
+<a name="l00461"></a>00461 <span class="keyword">typedef</span> ptrdiff_t difference_type;
+<a name="l00462"></a>00462 <span class="keyword">typedef</span> Value value_type;
+<a name="l00463"></a>00463 <span class="keyword">typedef</span> <span class="keyword">typename</span> SegmentedContainer::size_type size_type;
+<a name="l00464"></a>00464 <span class="keyword">typedef</span> Value* pointer;
+<a name="l00465"></a>00465 <span class="keyword">typedef</span> Value& reference;
+<a name="l00466"></a>00466 <span class="keyword">typedef</span> std::input_iterator_tag iterator_category;
+<a name="l00467"></a>00467
+<a name="l00468"></a>00468 <span class="comment">// Copy Constructor</span>
+<a name="l00469"></a>00469 <span class="keyword">template</span><<span class="keyword">typename</span> U>
+<a name="l00470"></a>00470 segmented_iterator(<span class="keyword">const</span> segmented_iterator<SegmentedContainer, U>& other) :
+<a name="l00471"></a>00471 my_segcont(other.my_segcont),
+<a name="l00472"></a>00472 outer_iter(other.outer_iter),
+<a name="l00473"></a>00473 <span class="comment">// can we assign a default-constructed iterator to inner if we're at the end?</span>
+<a name="l00474"></a>00474 inner_iter(other.inner_iter)
+<a name="l00475"></a>00475 {}
+<a name="l00476"></a>00476
+<a name="l00477"></a>00477 <span class="comment">// assignment</span>
+<a name="l00478"></a>00478 <span class="keyword">template</span><<span class="keyword">typename</span> U>
+<a name="l00479"></a>00479 segmented_iterator& operator=( <span class="keyword">const</span> segmented_iterator<SegmentedContainer, U>& other) {
+<a name="l00480"></a>00480 <span class="keywordflow">if</span>(<span class="keyword">this</span> != &other) {
+<a name="l00481"></a>00481 my_segcont = other.my_segcont;
+<a name="l00482"></a>00482 outer_iter = other.outer_iter;
+<a name="l00483"></a>00483 <span class="keywordflow">if</span>(outer_iter != my_segcont->end()) inner_iter = other.inner_iter;
+<a name="l00484"></a>00484 }
+<a name="l00485"></a>00485 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00486"></a>00486 }
+<a name="l00487"></a>00487
+<a name="l00488"></a>00488 <span class="comment">// allow assignment of outer iterator to segmented iterator. Once it is</span>
+<a name="l00489"></a>00489 <span class="comment">// assigned, move forward until a non-empty inner container is found or</span>
+<a name="l00490"></a>00490 <span class="comment">// the end of the outer container is reached.</span>
+<a name="l00491"></a>00491 segmented_iterator& operator=(<span class="keyword">const</span> outer_iterator& new_outer_iter) {
+<a name="l00492"></a>00492 __TBB_ASSERT(my_segcont != NULL, NULL);
+<a name="l00493"></a>00493 <span class="comment">// check that this iterator points to something inside the segmented container</span>
+<a name="l00494"></a>00494 <span class="keywordflow">for</span>(outer_iter = new_outer_iter ;outer_iter!=my_segcont->end(); ++outer_iter) {
+<a name="l00495"></a>00495 <span class="keywordflow">if</span>( !outer_iter->empty() ) {
+<a name="l00496"></a>00496 inner_iter = outer_iter->begin();
+<a name="l00497"></a>00497 <span class="keywordflow">break</span>;
+<a name="l00498"></a>00498 }
+<a name="l00499"></a>00499 }
+<a name="l00500"></a>00500 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00501"></a>00501 }
+<a name="l00502"></a>00502
+<a name="l00503"></a>00503 <span class="comment">// pre-increment</span>
+<a name="l00504"></a>00504 segmented_iterator& operator++() {
+<a name="l00505"></a>00505 advance_me();
+<a name="l00506"></a>00506 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00507"></a>00507 }
+<a name="l00508"></a>00508
+<a name="l00509"></a>00509 <span class="comment">// post-increment</span>
+<a name="l00510"></a>00510 segmented_iterator operator++(<span class="keywordtype">int</span>) {
+<a name="l00511"></a>00511 segmented_iterator tmp = *<span class="keyword">this</span>;
+<a name="l00512"></a>00512 operator++();
+<a name="l00513"></a>00513 <span class="keywordflow">return</span> tmp;
+<a name="l00514"></a>00514 }
+<a name="l00515"></a>00515
+<a name="l00516"></a>00516 <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> outer_iterator& other_outer)<span class="keyword"> const </span>{
+<a name="l00517"></a>00517 __TBB_ASSERT(my_segcont != NULL, NULL);
+<a name="l00518"></a>00518 <span class="keywordflow">return</span> (outer_iter == other_outer &&
+<a name="l00519"></a>00519 (outer_iter == my_segcont->end() || inner_iter == outer_iter->begin()));
+<a name="l00520"></a>00520 }
+<a name="l00521"></a>00521
+<a name="l00522"></a>00522 <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> outer_iterator& other_outer)<span class="keyword"> const </span>{
+<a name="l00523"></a>00523 <span class="keywordflow">return</span> !operator==(other_outer);
+<a name="l00524"></a>00524
+<a name="l00525"></a>00525 }
+<a name="l00526"></a>00526
+<a name="l00527"></a>00527 <span class="comment">// (i)* RHS</span>
+<a name="l00528"></a>00528 reference operator*()<span class="keyword"> const </span>{
+<a name="l00529"></a>00529 __TBB_ASSERT(my_segcont != NULL, NULL);
+<a name="l00530"></a>00530 __TBB_ASSERT(outer_iter != my_segcont->end(), <span class="stringliteral">"Dereferencing a pointer at end of container"</span>);
+<a name="l00531"></a>00531 __TBB_ASSERT(inner_iter != outer_iter->end(), NULL); <span class="comment">// should never happen</span>
+<a name="l00532"></a>00532 <span class="keywordflow">return</span> *inner_iter;
+<a name="l00533"></a>00533 }
+<a name="l00534"></a>00534
+<a name="l00535"></a>00535 <span class="comment">// i-></span>
+<a name="l00536"></a>00536 pointer operator->()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> &operator*();}
+<a name="l00537"></a>00537
+<a name="l00538"></a>00538 <span class="keyword">private</span>:
+<a name="l00539"></a>00539 SegmentedContainer* my_segcont;
+<a name="l00540"></a>00540 outer_iterator outer_iter;
+<a name="l00541"></a>00541 inner_iterator inner_iter;
+<a name="l00542"></a>00542
+<a name="l00543"></a>00543 <span class="keywordtype">void</span> advance_me() {
+<a name="l00544"></a>00544 __TBB_ASSERT(my_segcont != NULL, NULL);
+<a name="l00545"></a>00545 __TBB_ASSERT(outer_iter != my_segcont->end(), NULL); <span class="comment">// not true if there are no inner containers</span>
+<a name="l00546"></a>00546 __TBB_ASSERT(inner_iter != outer_iter->end(), NULL); <span class="comment">// not true if the inner containers are all empty.</span>
+<a name="l00547"></a>00547 ++inner_iter;
+<a name="l00548"></a>00548 <span class="keywordflow">while</span>(inner_iter == outer_iter->end() && ++outer_iter != my_segcont->end()) {
+<a name="l00549"></a>00549 inner_iter = outer_iter->begin();
+<a name="l00550"></a>00550 }
+<a name="l00551"></a>00551 }
+<a name="l00552"></a>00552 }; <span class="comment">// segmented_iterator</span>
+<a name="l00553"></a>00553
+<a name="l00554"></a>00554 <span class="keyword">template</span><<span class="keyword">typename</span> SegmentedContainer, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00555"></a>00555 <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> segmented_iterator<SegmentedContainer,T>& i,
+<a name="l00556"></a>00556 <span class="keyword">const</span> segmented_iterator<SegmentedContainer,U>& j ) {
+<a name="l00557"></a>00557 <span class="keywordflow">if</span>(i.my_segcont != j.my_segcont) <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00558"></a>00558 <span class="keywordflow">if</span>(i.my_segcont == NULL) <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00559"></a>00559 <span class="keywordflow">if</span>(i.outer_iter != j.outer_iter) <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00560"></a>00560 <span class="keywordflow">if</span>(i.outer_iter == i.my_segcont->end()) <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00561"></a>00561 <span class="keywordflow">return</span> i.inner_iter == j.inner_iter;
+<a name="l00562"></a>00562 }
+<a name="l00563"></a>00563
+<a name="l00564"></a>00564 <span class="comment">// !=</span>
+<a name="l00565"></a>00565 <span class="keyword">template</span><<span class="keyword">typename</span> SegmentedContainer, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00566"></a>00566 <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> segmented_iterator<SegmentedContainer,T>& i,
+<a name="l00567"></a>00567 <span class="keyword">const</span> segmented_iterator<SegmentedContainer,U>& j ) {
+<a name="l00568"></a>00568 <span class="keywordflow">return</span> !(i==j);
+<a name="l00569"></a>00569 }
+<a name="l00570"></a>00570
+<a name="l00571"></a>00571 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00572"></a>00572 <span class="keyword">struct </span>destruct_only: tbb::internal::no_copy {
+<a name="l00573"></a>00573 <a class="code" href="a00141.html">tbb::aligned_space<T,1></a> value;
+<a name="l00574"></a>00574 ~destruct_only() {value.begin()[0].~T();}
+<a name="l00575"></a>00575 };
+<a name="l00576"></a>00576
+<a name="l00577"></a>00577 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00578"></a>00578 <span class="keyword">struct </span>construct_by_default: tbb::internal::no_assign {
+<a name="l00579"></a>00579 <span class="keywordtype">void</span> construct(<span class="keywordtype">void</span>*where) {<span class="keyword">new</span>(where) T();} <span class="comment">// C++ note: the () in T() ensure zero initialization.</span>
+<a name="l00580"></a>00580 construct_by_default( <span class="keywordtype">int</span> ) {}
+<a name="l00581"></a>00581 };
+<a name="l00582"></a>00582
+<a name="l00583"></a>00583 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00584"></a>00584 <span class="keyword">struct </span>construct_by_exemplar: tbb::internal::no_assign {
+<a name="l00585"></a>00585 <span class="keyword">const</span> T exemplar;
+<a name="l00586"></a>00586 <span class="keywordtype">void</span> construct(<span class="keywordtype">void</span>*where) {<span class="keyword">new</span>(where) T(exemplar);}
+<a name="l00587"></a>00587 construct_by_exemplar( <span class="keyword">const</span> T& t ) : exemplar(t) {}
+<a name="l00588"></a>00588 };
+<a name="l00589"></a>00589
+<a name="l00590"></a>00590 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> Finit>
+<a name="l00591"></a>00591 <span class="keyword">struct </span>construct_by_finit: tbb::internal::no_assign {
+<a name="l00592"></a>00592 Finit f;
+<a name="l00593"></a>00593 <span class="keywordtype">void</span> construct(<span class="keywordtype">void</span>* where) {<span class="keyword">new</span>(where) T(f());}
+<a name="l00594"></a>00594 construct_by_finit( <span class="keyword">const</span> Finit& f_ ) : f(f_) {}
+<a name="l00595"></a>00595 };
+<a name="l00596"></a>00596
+<a name="l00597"></a>00597 <span class="comment">// storage for initialization function pointer</span>
+<a name="l00598"></a>00598 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00599"></a>00599 <span class="keyword">class </span>callback_base {
+<a name="l00600"></a>00600 <span class="keyword">public</span>:
+<a name="l00601"></a>00601 <span class="comment">// Clone *this</span>
+<a name="l00602"></a>00602 <span class="keyword">virtual</span> callback_base* clone() = 0;
+<a name="l00603"></a>00603 <span class="comment">// Destruct and free *this</span>
+<a name="l00604"></a>00604 <span class="keyword">virtual</span> <span class="keywordtype">void</span> destroy() = 0;
+<a name="l00605"></a>00605 <span class="comment">// Need virtual destructor to satisfy GCC compiler warning</span>
+<a name="l00606"></a>00606 <span class="keyword">virtual</span> ~callback_base() { }
+<a name="l00607"></a>00607 <span class="comment">// Construct T at where</span>
+<a name="l00608"></a>00608 <span class="keyword">virtual</span> <span class="keywordtype">void</span> construct(<span class="keywordtype">void</span>* where) = 0;
+<a name="l00609"></a>00609 };
+<a name="l00610"></a>00610
+<a name="l00611"></a>00611 <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> Constructor>
+<a name="l00612"></a>00612 <span class="keyword">class </span>callback_leaf: <span class="keyword">public</span> callback_base<T>, Constructor {
+<a name="l00613"></a>00613 <span class="keyword">template</span><<span class="keyword">typename</span> X> callback_leaf( <span class="keyword">const</span> X& x ) : Constructor(x) {}
+<a name="l00614"></a>00614
+<a name="l00615"></a>00615 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00204.html">tbb::tbb_allocator<callback_leaf></a> my_allocator_type;
+<a name="l00616"></a>00616
+<a name="l00617"></a>00617 <span class="comment">/*override*/</span> callback_base<T>* clone() {
+<a name="l00618"></a>00618 <span class="keywordtype">void</span>* where = my_allocator_type().allocate(1);
+<a name="l00619"></a>00619 <span class="keywordflow">return</span> <span class="keyword">new</span>(where) callback_leaf(*<span class="keyword">this</span>);
+<a name="l00620"></a>00620 }
+<a name="l00621"></a>00621
+<a name="l00622"></a>00622 <span class="comment">/*override*/</span> <span class="keywordtype">void</span> destroy() {
+<a name="l00623"></a>00623 my_allocator_type().destroy(<span class="keyword">this</span>);
+<a name="l00624"></a>00624 my_allocator_type().deallocate(<span class="keyword">this</span>,1);
+<a name="l00625"></a>00625 }
+<a name="l00626"></a>00626
+<a name="l00627"></a>00627 <span class="comment">/*override*/</span> <span class="keywordtype">void</span> construct(<span class="keywordtype">void</span>* where) {
+<a name="l00628"></a>00628 Constructor::construct(where);
+<a name="l00629"></a>00629 }
+<a name="l00630"></a>00630 <span class="keyword">public</span>:
+<a name="l00631"></a>00631 <span class="keyword">template</span><<span class="keyword">typename</span> X>
+<a name="l00632"></a>00632 <span class="keyword">static</span> callback_base<T>* make( <span class="keyword">const</span> X& x ) {
+<a name="l00633"></a>00633 <span class="keywordtype">void</span>* where = my_allocator_type().allocate(1);
+<a name="l00634"></a>00634 <span class="keywordflow">return</span> <span class="keyword">new</span>(where) callback_leaf(x);
+<a name="l00635"></a>00635 }
+<a name="l00636"></a>00636 };
+<a name="l00637"></a>00637
+<a name="l00639"></a>00639
+<a name="l00644"></a>00644 <span class="keyword">template</span><<span class="keyword">typename</span> U, size_t ModularSize>
+<a name="l00645"></a>00645 <span class="keyword">struct </span>ets_element {
+<a name="l00646"></a>00646 <span class="keywordtype">char</span> value[ModularSize==0 ? <span class="keyword">sizeof</span>(U) : <span class="keyword">sizeof</span>(U)+(tbb::internal::NFS_MaxLineSize-ModularSize)];
+<a name="l00647"></a>00647 <span class="keywordtype">void</span> unconstruct() {
+<a name="l00648"></a>00648 tbb::internal::punned_cast<U*>(&value)->~U();
+<a name="l00649"></a>00649 }
+<a name="l00650"></a>00650 };
+<a name="l00651"></a>00651
+<a name="l00652"></a>00652 } <span class="comment">// namespace internal</span>
+<a name="l00654"></a>00654 <span class="comment"></span>
+<a name="l00656"></a>00656
+<a name="l00675"></a>00675 <span class="keyword">template</span> <<span class="keyword">typename</span> T,
+<a name="l00676"></a>00676 <span class="keyword">typename</span> Allocator=cache_aligned_allocator<T>,
+<a name="l00677"></a><a class="code" href="a00163.html">00677</a> <a class="code" href="a00267.html#a8622ae61b7e7737dac26542e181178e">ets_key_usage_type</a> ETS_key_type=ets_no_key >
+<a name="l00678"></a>00678 <span class="keyword">class </span><a class="code" href="a00163.html">enumerable_thread_specific</a>: internal::ets_base<ETS_key_type> {
+<a name="l00679"></a>00679
+<a name="l00680"></a>00680 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> A, ets_key_usage_type C> <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00163.html">enumerable_thread_specific</a>;
+<a name="l00681"></a>00681
+<a name="l00682"></a>00682 <span class="keyword">typedef</span> internal::ets_element<T,sizeof(T)%tbb::internal::NFS_MaxLineSize> padded_element;
+<a name="l00683"></a>00683
+<a name="l00685"></a>00685 <span class="keyword">template</span><<span class="keyword">typename</span> I>
+<a name="l00686"></a>00686 <span class="keyword">class </span>generic_range_type: <span class="keyword">public</span> <a class="code" href="a00147.html">blocked_range</a><I> {
+<a name="l00687"></a>00687 <span class="keyword">public</span>:
+<a name="l00688"></a>00688 <span class="keyword">typedef</span> T value_type;
+<a name="l00689"></a>00689 <span class="keyword">typedef</span> T& reference;
+<a name="l00690"></a>00690 <span class="keyword">typedef</span> <span class="keyword">const</span> T& const_reference;
+<a name="l00691"></a>00691 <span class="keyword">typedef</span> I iterator;
+<a name="l00692"></a>00692 <span class="keyword">typedef</span> ptrdiff_t difference_type;
+<a name="l00693"></a>00693 generic_range_type( I begin_, I end_, size_t grainsize_ = 1) : <a class="code" href="a00147.html">blocked_range<I></a>(begin_,end_,grainsize_) {}
+<a name="l00694"></a>00694 template<typename U>
+<a name="l00695"></a>00695 generic_range_type( <span class="keyword">const</span> generic_range_type<U>& r) : <a class="code" href="a00147.html">blocked_range<I></a>(r.begin(),r.end(),r.grainsize()) {}
+<a name="l00696"></a>00696 generic_range_type( generic_range_type& r, <a class="code" href="a00198.html">split</a> ) : <a class="code" href="a00147.html">blocked_range<I></a>(r,<a class="code" href="a00198.html">split</a>()) {}
+<a name="l00697"></a>00697 };
+<a name="l00698"></a>00698
+<a name="l00699"></a>00699 <span class="keyword">typedef</span> <span class="keyword">typename</span> Allocator::template rebind< padded_element >::other padded_allocator_type;
+<a name="l00700"></a>00700 <span class="keyword">typedef</span> <a class="code" href="a00161.html">tbb::concurrent_vector< padded_element, padded_allocator_type ></a> <a class="code" href="a00161.html">internal_collection_type</a>;
+<a name="l00701"></a>00701
+<a name="l00702"></a>00702 internal::callback_base<T> *my_construct_callback;
+<a name="l00703"></a>00703
+<a name="l00704"></a>00704 internal_collection_type my_locals;
+<a name="l00705"></a>00705
+<a name="l00706"></a>00706 <span class="comment">/*override*/</span> <span class="keywordtype">void</span>* create_local() {
+<a name="l00707"></a>00707 <span class="preprocessor">#if TBB_DEPRECATED</span>
+<a name="l00708"></a>00708 <span class="preprocessor"></span> <span class="keywordtype">void</span>* lref = &my_locals[my_locals.<a class="code" href="a00161.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(padded_element())];
+<a name="l00709"></a>00709 <span class="preprocessor">#else</span>
+<a name="l00710"></a>00710 <span class="preprocessor"></span> <span class="keywordtype">void</span>* lref = &*my_locals.<a class="code" href="a00161.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(padded_element());
+<a name="l00711"></a>00711 <span class="preprocessor">#endif</span>
+<a name="l00712"></a>00712 <span class="preprocessor"></span> my_construct_callback->construct(lref);
+<a name="l00713"></a>00713 <span class="keywordflow">return</span> lref;
+<a name="l00714"></a>00714 }
+<a name="l00715"></a>00715
+<a name="l00716"></a>00716 <span class="keywordtype">void</span> unconstruct_locals() {
+<a name="l00717"></a>00717 <span class="keywordflow">for</span>(<span class="keyword">typename</span> internal_collection_type::iterator cvi = my_locals.<a class="code" href="a00161.html#730b23a251ecb6d37f692fb22f38e029">begin</a>(); cvi != my_locals.<a class="code" href="a00161.html#c0b51160e5a764982ec97a455f94f2c6">end</a>(); ++cvi) {
+<a name="l00718"></a>00718 cvi->unconstruct();
+<a name="l00719"></a>00719 }
+<a name="l00720"></a>00720 }
+<a name="l00721"></a>00721
+<a name="l00722"></a>00722 <span class="keyword">typedef</span> <span class="keyword">typename</span> Allocator::template rebind< uintptr_t >::other array_allocator_type;
+<a name="l00723"></a>00723
+<a name="l00724"></a>00724 <span class="comment">// _size is in bytes</span>
+<a name="l00725"></a>00725 <span class="comment">/*override*/</span> <span class="keywordtype">void</span>* create_array(size_t _size) {
+<a name="l00726"></a>00726 size_t nelements = (_size + <span class="keyword">sizeof</span>(uintptr_t) -1) / <span class="keyword">sizeof</span>(uintptr_t);
+<a name="l00727"></a>00727 <span class="keywordflow">return</span> array_allocator_type().allocate(nelements);
+<a name="l00728"></a>00728 }
+<a name="l00729"></a>00729
+<a name="l00730"></a>00730 <span class="comment">/*override*/</span> <span class="keywordtype">void</span> free_array( <span class="keywordtype">void</span>* _ptr, size_t _size) {
+<a name="l00731"></a>00731 size_t nelements = (_size + <span class="keyword">sizeof</span>(uintptr_t) -1) / <span class="keyword">sizeof</span>(uintptr_t);
+<a name="l00732"></a>00732 array_allocator_type().deallocate( reinterpret_cast<uintptr_t *>(_ptr),nelements);
+<a name="l00733"></a>00733 }
+<a name="l00734"></a>00734
+<a name="l00735"></a>00735 <span class="keyword">public</span>:
+<a name="l00736"></a>00736
+<a name="l00738"></a>00738 <span class="keyword">typedef</span> Allocator allocator_type;
+<a name="l00739"></a>00739 <span class="keyword">typedef</span> T value_type;
+<a name="l00740"></a>00740 <span class="keyword">typedef</span> T& reference;
+<a name="l00741"></a>00741 <span class="keyword">typedef</span> <span class="keyword">const</span> T& const_reference;
+<a name="l00742"></a>00742 <span class="keyword">typedef</span> T* pointer;
+<a name="l00743"></a>00743 <span class="keyword">typedef</span> <span class="keyword">const</span> T* const_pointer;
+<a name="l00744"></a>00744 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal_collection_type::size_type size_type;
+<a name="l00745"></a>00745 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal_collection_type::difference_type difference_type;
+<a name="l00746"></a>00746
+<a name="l00747"></a>00747 <span class="comment">// Iterator types</span>
+<a name="l00748"></a>00748 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::enumerable_thread_specific_iterator< internal_collection_type, value_type > iterator;
+<a name="l00749"></a>00749 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::enumerable_thread_specific_iterator< internal_collection_type, const value_type > const_iterator;
+<a name="l00750"></a>00750
+<a name="l00751"></a>00751 <span class="comment">// Parallel range types</span>
+<a name="l00752"></a>00752 <span class="keyword">typedef</span> generic_range_type< iterator > range_type;
+<a name="l00753"></a>00753 <span class="keyword">typedef</span> generic_range_type< const_iterator > const_range_type;
+<a name="l00754"></a>00754
+<a name="l00756"></a>00756 <a class="code" href="a00163.html">enumerable_thread_specific</a>() :
+<a name="l00757"></a>00757 my_construct_callback( internal::callback_leaf<T,internal::construct_by_default<T> >::make(<span class="comment">/*dummy argument*/</span>0) )
+<a name="l00758"></a>00758 {}
+<a name="l00759"></a>00759
+<a name="l00761"></a><a class="code" href="a00163.html#8d4b456ff9d7b289c73254eccc11db45">00761</a> <span class="keyword">template</span> <<span class="keyword">typename</span> Finit>
+<a name="l00762"></a>00762 <a class="code" href="a00163.html">enumerable_thread_specific</a>( Finit finit ) :
+<a name="l00763"></a>00763 my_construct_callback( internal::callback_leaf<T,internal::construct_by_finit<T,Finit> >::make( finit ) )
+<a name="l00764"></a>00764 {}
+<a name="l00765"></a>00765
+<a name="l00767"></a>00767 <a class="code" href="a00163.html">enumerable_thread_specific</a>(<span class="keyword">const</span> T& exemplar) :
+<a name="l00768"></a>00768 my_construct_callback( internal::callback_leaf<T,internal::construct_by_exemplar<T> >::make( exemplar ) )
+<a name="l00769"></a>00769 {}
+<a name="l00770"></a>00770
+<a name="l00772"></a>00772 ~<a class="code" href="a00163.html">enumerable_thread_specific</a>() {
+<a name="l00773"></a>00773 my_construct_callback->destroy();
+<a name="l00774"></a>00774 this->clear(); <span class="comment">// deallocation before the derived class is finished destructing</span>
+<a name="l00775"></a>00775 <span class="comment">// So free(array *) is still accessible</span>
+<a name="l00776"></a>00776 }
+<a name="l00777"></a>00777
+<a name="l00779"></a>00779 reference local() {
+<a name="l00780"></a>00780 <span class="keywordtype">bool</span> exists;
+<a name="l00781"></a>00781 <span class="keywordflow">return</span> local(exists);
+<a name="l00782"></a>00782 }
+<a name="l00783"></a>00783
+<a name="l00785"></a>00785 reference local(<span class="keywordtype">bool</span>& exists) {
+<a name="l00786"></a>00786 __TBB_ASSERT(ETS_key_type==ets_no_key,<span class="stringliteral">"ets_key_per_instance not yet implemented"</span>);
+<a name="l00787"></a>00787 <span class="keywordtype">void</span>* ptr = this->table_lookup(exists);
+<a name="l00788"></a>00788 <span class="keywordflow">return</span> *(T*)ptr;
+<a name="l00789"></a>00789 }
+<a name="l00790"></a>00790
+<a name="l00792"></a>00792 size_type size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_locals.<a class="code" href="a00161.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>(); }
+<a name="l00793"></a>00793
+<a name="l00795"></a>00795 <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_locals.<a class="code" href="a00161.html#c6426cb93cf20d3af40f3c90f1f0481a">empty</a>(); }
+<a name="l00796"></a>00796
+<a name="l00798"></a>00798 iterator begin() { <span class="keywordflow">return</span> iterator( my_locals, 0 ); }
+<a name="l00800"></a>00800 iterator end() { <span class="keywordflow">return</span> iterator(my_locals, my_locals.<a class="code" href="a00161.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>() ); }
+<a name="l00801"></a>00801
+<a name="l00803"></a>00803 const_iterator begin()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(my_locals, 0); }
+<a name="l00804"></a>00804
+<a name="l00806"></a>00806 const_iterator end()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(my_locals, my_locals.<a class="code" href="a00161.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>()); }
+<a name="l00807"></a>00807
+<a name="l00809"></a>00809 range_type range( size_t grainsize=1 ) { <span class="keywordflow">return</span> range_type( begin(), end(), grainsize ); }
+<a name="l00810"></a>00810
+<a name="l00812"></a>00812 const_range_type range( size_t grainsize=1 )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_range_type( begin(), end(), grainsize ); }
+<a name="l00813"></a>00813
+<a name="l00815"></a>00815 <span class="keywordtype">void</span> clear() {
+<a name="l00816"></a>00816 unconstruct_locals();
+<a name="l00817"></a>00817 my_locals.<a class="code" href="a00161.html#26f937a359a66b6aae904c3cd9a3c444">clear</a>();
+<a name="l00818"></a>00818 this->table_clear();
+<a name="l00819"></a>00819 <span class="comment">// callback is not destroyed</span>
+<a name="l00820"></a>00820 <span class="comment">// exemplar is not destroyed</span>
+<a name="l00821"></a>00821 }
+<a name="l00822"></a>00822
+<a name="l00823"></a>00823 <span class="keyword">private</span>:
+<a name="l00824"></a>00824
+<a name="l00825"></a>00825 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> A2, ets_key_usage_type C2>
+<a name="l00826"></a>00826 <span class="keywordtype">void</span> internal_copy( <span class="keyword">const</span> enumerable_thread_specific<U, A2, C2>& other);
+<a name="l00827"></a>00827
+<a name="l00828"></a>00828 <span class="keyword">public</span>:
+<a name="l00829"></a>00829
+<a name="l00830"></a>00830 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> Alloc, ets_key_usage_type Cachetype>
+<a name="l00831"></a>00831 enumerable_thread_specific( <span class="keyword">const</span> enumerable_thread_specific<U, Alloc, Cachetype>& other ) : internal::ets_base<ETS_key_type> ()
+<a name="l00832"></a>00832 {
+<a name="l00833"></a>00833 internal_copy(other);
+<a name="l00834"></a>00834 }
+<a name="l00835"></a>00835
+<a name="l00836"></a>00836 enumerable_thread_specific( <span class="keyword">const</span> enumerable_thread_specific& other ) : internal::ets_base<ETS_key_type> ()
+<a name="l00837"></a>00837 {
+<a name="l00838"></a>00838 internal_copy(other);
+<a name="l00839"></a>00839 }
+<a name="l00840"></a>00840
+<a name="l00841"></a>00841 <span class="keyword">private</span>:
+<a name="l00842"></a>00842
+<a name="l00843"></a>00843 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> A2, ets_key_usage_type C2>
+<a name="l00844"></a>00844 enumerable_thread_specific &
+<a name="l00845"></a>00845 internal_assign(<span class="keyword">const</span> enumerable_thread_specific<U, A2, C2>& other) {
+<a name="l00846"></a>00846 <span class="keywordflow">if</span>(static_cast<void *>( <span class="keyword">this</span> ) != static_cast<const void *>( &other )) {
+<a name="l00847"></a>00847 this->clear();
+<a name="l00848"></a>00848 my_construct_callback->destroy();
+<a name="l00849"></a>00849 my_construct_callback = 0;
+<a name="l00850"></a>00850 internal_copy( other );
+<a name="l00851"></a>00851 }
+<a name="l00852"></a>00852 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00853"></a>00853 }
+<a name="l00854"></a>00854
+<a name="l00855"></a>00855 <span class="keyword">public</span>:
+<a name="l00856"></a>00856
+<a name="l00857"></a>00857 <span class="comment">// assignment</span>
+<a name="l00858"></a>00858 enumerable_thread_specific& operator=(<span class="keyword">const</span> enumerable_thread_specific& other) {
+<a name="l00859"></a>00859 <span class="keywordflow">return</span> internal_assign(other);
+<a name="l00860"></a>00860 }
+<a name="l00861"></a>00861
+<a name="l00862"></a>00862 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> Alloc, ets_key_usage_type Cachetype>
+<a name="l00863"></a>00863 enumerable_thread_specific& operator=(<span class="keyword">const</span> enumerable_thread_specific<U, Alloc, Cachetype>& other)
+<a name="l00864"></a>00864 {
+<a name="l00865"></a>00865 <span class="keywordflow">return</span> internal_assign(other);
+<a name="l00866"></a>00866 }
+<a name="l00867"></a>00867
+<a name="l00868"></a>00868 <span class="comment">// combine_func_t has signature T(T,T) or T(const T&, const T&)</span>
+<a name="l00869"></a>00869 <span class="keyword">template</span> <<span class="keyword">typename</span> combine_func_t>
+<a name="l00870"></a>00870 T combine(combine_func_t f_combine) {
+<a name="l00871"></a>00871 <span class="keywordflow">if</span>(begin() == end()) {
+<a name="l00872"></a>00872 internal::destruct_only<T> location;
+<a name="l00873"></a>00873 my_construct_callback->construct(location.value.begin());
+<a name="l00874"></a>00874 <span class="keywordflow">return</span> *location.value.begin();
+<a name="l00875"></a>00875 }
+<a name="l00876"></a>00876 const_iterator ci = begin();
+<a name="l00877"></a>00877 T my_result = *ci;
+<a name="l00878"></a>00878 <span class="keywordflow">while</span>(++ci != end())
+<a name="l00879"></a>00879 my_result = f_combine( my_result, *ci );
+<a name="l00880"></a>00880 <span class="keywordflow">return</span> my_result;
+<a name="l00881"></a>00881 }
+<a name="l00882"></a>00882
+<a name="l00883"></a>00883 <span class="comment">// combine_func_t has signature void(T) or void(const T&)</span>
+<a name="l00884"></a>00884 <span class="keyword">template</span> <<span class="keyword">typename</span> combine_func_t>
+<a name="l00885"></a>00885 <span class="keywordtype">void</span> combine_each(combine_func_t f_combine) {
+<a name="l00886"></a>00886 <span class="keywordflow">for</span>(const_iterator ci = begin(); ci != end(); ++ci) {
+<a name="l00887"></a>00887 f_combine( *ci );
+<a name="l00888"></a>00888 }
+<a name="l00889"></a>00889 }
+<a name="l00890"></a>00890
+<a name="l00891"></a>00891 }; <span class="comment">// enumerable_thread_specific</span>
+<a name="l00892"></a>00892
+<a name="l00893"></a>00893 <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> Allocator, ets_key_usage_type ETS_key_type>
+<a name="l00894"></a>00894 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> A2, ets_key_usage_type C2>
+<a name="l00895"></a>00895 <span class="keywordtype">void</span> enumerable_thread_specific<T,Allocator,ETS_key_type>::internal_copy( <span class="keyword">const</span> enumerable_thread_specific<U, A2, C2>& other) {
+<a name="l00896"></a>00896 <span class="comment">// Initialize my_construct_callback first, so that it is valid even if rest of this routine throws an exception.</span>
+<a name="l00897"></a>00897 my_construct_callback = other.my_construct_callback->clone();
+<a name="l00898"></a>00898
+<a name="l00899"></a>00899 <span class="keyword">typedef</span> internal::ets_base<ets_no_key> base;
+<a name="l00900"></a>00900 __TBB_ASSERT(my_locals.<a class="code" href="a00161.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>()==0,NULL);
+<a name="l00901"></a>00901 this->table_reserve_for_copy( other );
+<a name="l00902"></a>00902 <span class="keywordflow">for</span>( base::array* r=other.my_root; r; r=r->next ) {
+<a name="l00903"></a>00903 <span class="keywordflow">for</span>( size_t i=0; i<r-><a class="code" href="a00147.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>(); ++i ) {
+<a name="l00904"></a>00904 base::slot& s1 = r->at(i);
+<a name="l00905"></a>00905 <span class="keywordflow">if</span>( !s1.empty() ) {
+<a name="l00906"></a>00906 base::slot& s2 = this->table_find(s1.key);
+<a name="l00907"></a>00907 <span class="keywordflow">if</span>( s2.empty() ) {
+<a name="l00908"></a>00908 #<span class="keywordflow">if</span> TBB_DEPRECATED
+<a name="l00909"></a>00909 <span class="keywordtype">void</span>* lref = &my_locals[my_locals.<a class="code" href="a00161.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(padded_element())];
+<a name="l00910"></a>00910 <span class="preprocessor">#else</span>
+<a name="l00911"></a>00911 <span class="preprocessor"></span> <span class="keywordtype">void</span>* lref = &*my_locals.<a class="code" href="a00161.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(padded_element());
+<a name="l00912"></a>00912 <span class="preprocessor">#endif</span>
+<a name="l00913"></a>00913 <span class="preprocessor"></span> s2.ptr = <span class="keyword">new</span>(lref) T(*(U*)s1.ptr);
+<a name="l00914"></a>00914 s2.key = s1.key;
+<a name="l00915"></a>00915 } <span class="keywordflow">else</span> {
+<a name="l00916"></a>00916 <span class="comment">// Skip the duplicate</span>
+<a name="l00917"></a>00917 }
+<a name="l00918"></a>00918 }
+<a name="l00919"></a>00919 }
+<a name="l00920"></a>00920 }
+<a name="l00921"></a>00921 }
+<a name="l00922"></a>00922
+<a name="l00923"></a>00923 <span class="keyword">template</span>< <span class="keyword">typename</span> Container >
+<a name="l00924"></a>00924 <span class="keyword">class </span>flattened2d {
+<a name="l00925"></a>00925
+<a name="l00926"></a>00926 <span class="comment">// This intermediate typedef is to address issues with VC7.1 compilers</span>
+<a name="l00927"></a>00927 <span class="keyword">typedef</span> <span class="keyword">typename</span> Container::value_type conval_type;
+<a name="l00928"></a>00928
+<a name="l00929"></a>00929 <span class="keyword">public</span>:
+<a name="l00930"></a>00930
+<a name="l00932"></a>00932 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::size_type size_type;
+<a name="l00933"></a>00933 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::difference_type difference_type;
+<a name="l00934"></a>00934 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::allocator_type allocator_type;
+<a name="l00935"></a>00935 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::value_type value_type;
+<a name="l00936"></a>00936 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::reference reference;
+<a name="l00937"></a>00937 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::const_reference const_reference;
+<a name="l00938"></a>00938 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::pointer pointer;
+<a name="l00939"></a>00939 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::const_pointer const_pointer;
+<a name="l00940"></a>00940
+<a name="l00941"></a>00941 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::segmented_iterator<Container, value_type> iterator;
+<a name="l00942"></a>00942 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::segmented_iterator<Container, const value_type> const_iterator;
+<a name="l00943"></a>00943
+<a name="l00944"></a>00944 flattened2d( <span class="keyword">const</span> Container &c, <span class="keyword">typename</span> Container::const_iterator b, <span class="keyword">typename</span> Container::const_iterator e ) :
+<a name="l00945"></a>00945 my_container(const_cast<Container*>(&c)), my_begin(b), my_end(e) { }
+<a name="l00946"></a>00946
+<a name="l00947"></a>00947 flattened2d( <span class="keyword">const</span> Container &c ) :
+<a name="l00948"></a>00948 my_container(const_cast<Container*>(&c)), my_begin(c.begin()), my_end(c.end()) { }
+<a name="l00949"></a>00949
+<a name="l00950"></a>00950 iterator begin() { <span class="keywordflow">return</span> iterator(*my_container) = my_begin; }
+<a name="l00951"></a>00951 iterator end() { <span class="keywordflow">return</span> iterator(*my_container) = my_end; }
+<a name="l00952"></a>00952 const_iterator begin()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(*my_container) = my_begin; }
+<a name="l00953"></a>00953 const_iterator end()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(*my_container) = my_end; }
+<a name="l00954"></a>00954
+<a name="l00955"></a>00955 size_type size()<span class="keyword"> const </span>{
+<a name="l00956"></a>00956 size_type tot_size = 0;
+<a name="l00957"></a>00957 <span class="keywordflow">for</span>(<span class="keyword">typename</span> Container::const_iterator i = my_begin; i != my_end; ++i) {
+<a name="l00958"></a>00958 tot_size += i->size();
+<a name="l00959"></a>00959 }
+<a name="l00960"></a>00960 <span class="keywordflow">return</span> tot_size;
+<a name="l00961"></a>00961 }
+<a name="l00962"></a>00962
+<a name="l00963"></a>00963 <span class="keyword">private</span>:
+<a name="l00964"></a>00964
+<a name="l00965"></a>00965 Container *my_container;
+<a name="l00966"></a>00966 <span class="keyword">typename</span> Container::const_iterator my_begin;
+<a name="l00967"></a>00967 <span class="keyword">typename</span> Container::const_iterator my_end;
+<a name="l00968"></a>00968
+<a name="l00969"></a>00969 };
+<a name="l00970"></a>00970
+<a name="l00971"></a>00971 <span class="keyword">template</span> <<span class="keyword">typename</span> Container>
+<a name="l00972"></a>00972 flattened2d<Container> flatten2d(<span class="keyword">const</span> Container &c, <span class="keyword">const</span> <span class="keyword">typename</span> Container::const_iterator b, <span class="keyword">const</span> <span class="keyword">typename</span> Container::const_iterator e) {
+<a name="l00973"></a>00973 <span class="keywordflow">return</span> flattened2d<Container>(c, b, e);
+<a name="l00974"></a>00974 }
+<a name="l00975"></a>00975
+<a name="l00976"></a>00976 <span class="keyword">template</span> <<span class="keyword">typename</span> Container>
+<a name="l00977"></a>00977 flattened2d<Container> flatten2d(<span class="keyword">const</span> Container &c) {
+<a name="l00978"></a>00978 <span class="keywordflow">return</span> flattened2d<Container>(c);
+<a name="l00979"></a>00979 }
+<a name="l00980"></a>00980
+<a name="l00981"></a>00981 } <span class="comment">// interface6</span>
+<a name="l00982"></a>00982
+<a name="l00983"></a>00983 <span class="keyword">namespace </span>internal {
+<a name="l00984"></a>00984 <span class="keyword">using</span> interface6::internal::segmented_iterator;
+<a name="l00985"></a>00985 }
+<a name="l00986"></a>00986
+<a name="l00987"></a>00987 <span class="keyword">using</span> interface6::enumerable_thread_specific;
+<a name="l00988"></a>00988 <span class="keyword">using</span> interface6::flattened2d;
+<a name="l00989"></a>00989 <span class="keyword">using</span> interface6::flatten2d;
+<a name="l00990"></a>00990
+<a name="l00991"></a>00991 } <span class="comment">// namespace tbb</span>
+<a name="l00992"></a>00992
+<a name="l00993"></a>00993 <span class="preprocessor">#endif</span>
+</pre></div><hr>
+<p></p>
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
+<p></p>
+Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
+registered trademarks or trademarks of Intel Corporation or its
+subsidiaries in the United States and other countries.
+<p></p>
+* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00362.html b/doc/html/a00367.html
similarity index 98%
rename from doc/html/a00362.html
rename to doc/html/a00367.html
index b13baca..66a3ff4 100644
--- a/doc/html/a00362.html
+++ b/doc/html/a00367.html
@@ -157,8 +157,8 @@
<a name="l00151"></a>00151
<a name="l00153"></a><a class="code" href="a00172.html#4470e61c24c129a0299ca6c17240adbb">00153</a> <span class="keywordtype">void</span> <a class="code" href="a00172.html#4470e61c24c129a0299ca6c17240adbb">lock</a>() {
<a name="l00154"></a>00154 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00155"></a>00155 <span class="preprocessor"></span> <a class="code" href="a00142.html">aligned_space<scoped_lock,1></a> tmp;
-<a name="l00156"></a>00156 <span class="keyword">new</span>(tmp.<a class="code" href="a00142.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00173.html">scoped_lock</a>(*<span class="keyword">this</span>);
+<a name="l00155"></a>00155 <span class="preprocessor"></span> <a class="code" href="a00141.html">aligned_space<scoped_lock,1></a> tmp;
+<a name="l00156"></a>00156 <span class="keyword">new</span>(tmp.<a class="code" href="a00141.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00173.html">scoped_lock</a>(*<span class="keyword">this</span>);
<a name="l00157"></a>00157 <span class="preprocessor">#else</span>
<a name="l00158"></a>00158 <span class="preprocessor"></span><span class="preprocessor"> #if _WIN32||_WIN64</span>
<a name="l00159"></a>00159 <span class="preprocessor"></span> EnterCriticalSection(&impl);
@@ -171,8 +171,8 @@
<a name="l00167"></a>00167
<a name="l00168"></a><a class="code" href="a00172.html#4331652c79dea1c1131bd59ab161b234">00168</a> <span class="keywordtype">bool</span> <a class="code" href="a00172.html#4331652c79dea1c1131bd59ab161b234">try_lock</a>() {
<a name="l00169"></a>00169 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00170"></a>00170 <span class="preprocessor"></span> <a class="code" href="a00142.html">aligned_space<scoped_lock,1></a> tmp;
-<a name="l00171"></a>00171 <a class="code" href="a00173.html">scoped_lock</a>& s = *tmp.<a class="code" href="a00142.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>();
+<a name="l00170"></a>00170 <span class="preprocessor"></span> <a class="code" href="a00141.html">aligned_space<scoped_lock,1></a> tmp;
+<a name="l00171"></a>00171 <a class="code" href="a00173.html">scoped_lock</a>& s = *tmp.<a class="code" href="a00141.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>();
<a name="l00172"></a>00172 s.<a class="code" href="a00173.html#be42c8fe11cce1af4fe1e9eaab717567">my_mutex</a> = NULL;
<a name="l00173"></a>00173 <span class="keywordflow">return</span> s.<a class="code" href="a00173.html#e86ffb41a026694b16637f78aa337874">internal_try_acquire</a>(*<span class="keyword">this</span>);
<a name="l00174"></a>00174 <span class="preprocessor">#else</span>
@@ -186,8 +186,8 @@
<a name="l00182"></a>00182
<a name="l00184"></a><a class="code" href="a00172.html#5fc9ef443ae75d966695546be399cc6b">00184</a> <span class="keywordtype">void</span> <a class="code" href="a00172.html#5fc9ef443ae75d966695546be399cc6b">unlock</a>() {
<a name="l00185"></a>00185 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00186"></a>00186 <span class="preprocessor"></span> <a class="code" href="a00142.html">aligned_space<scoped_lock,1></a> tmp;
-<a name="l00187"></a>00187 <a class="code" href="a00173.html">scoped_lock</a>& s = *tmp.<a class="code" href="a00142.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>();
+<a name="l00186"></a>00186 <span class="preprocessor"></span> <a class="code" href="a00141.html">aligned_space<scoped_lock,1></a> tmp;
+<a name="l00187"></a>00187 <a class="code" href="a00173.html">scoped_lock</a>& s = *tmp.<a class="code" href="a00141.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>();
<a name="l00188"></a>00188 s.<a class="code" href="a00173.html#be42c8fe11cce1af4fe1e9eaab717567">my_mutex</a> = <span class="keyword">this</span>;
<a name="l00189"></a>00189 s.<a class="code" href="a00173.html#448b7e9042afcdc455ea3f929ac4c594">internal_release</a>();
<a name="l00190"></a>00190 <span class="preprocessor">#else</span>
diff --git a/doc/html/a00364.html b/doc/html/a00369.html
similarity index 100%
rename from doc/html/a00364.html
rename to doc/html/a00369.html
diff --git a/doc/html/a00365.html b/doc/html/a00370.html
similarity index 100%
rename from doc/html/a00365.html
rename to doc/html/a00370.html
diff --git a/doc/html/a00366.html b/doc/html/a00371.html
similarity index 99%
rename from doc/html/a00366.html
rename to doc/html/a00371.html
index d809dc8..e5833ed 100644
--- a/doc/html/a00366.html
+++ b/doc/html/a00371.html
@@ -440,7 +440,7 @@
<a name="l00467"></a>00467
<a name="l00468"></a>00468
<a name="l00469"></a>00469 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator, <span class="keyword">typename</span> Body>
-<a name="l00470"></a><a class="code" href="a00274.html#g3383e2703977012b6f384d673410f1f7">00470</a> <span class="keywordtype">void</span> <a class="code" href="a00274.html#g3383e2703977012b6f384d673410f1f7">parallel_do</a>( Iterator first, Iterator last, <span class="keyword">const</span> Body& body )
+<a name="l00470"></a><a class="code" href="a00275.html#g3383e2703977012b6f384d673410f1f7">00470</a> <span class="keywordtype">void</span> <a class="code" href="a00275.html#g3383e2703977012b6f384d673410f1f7">parallel_do</a>( Iterator first, Iterator last, <span class="keyword">const</span> Body& body )
<a name="l00471"></a>00471 {
<a name="l00472"></a>00472 <span class="keywordflow">if</span> ( first == last )
<a name="l00473"></a>00473 <span class="keywordflow">return</span>;
@@ -457,7 +457,7 @@
<a name="l00484"></a>00484 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
<a name="l00486"></a>00486 <span class="preprocessor"></span>
<a name="l00487"></a>00487 <span class="preprocessor">template<typename Iterator, typename Body> </span>
-<a name="l00488"></a><a class="code" href="a00274.html#g2617dc9b88b3285a7212599d49f74228">00488</a> <span class="preprocessor"></span><span class="keywordtype">void</span> <a class="code" href="a00274.html#g3383e2703977012b6f384d673410f1f7">parallel_do</a>( Iterator first, Iterator last, <span class="keyword">const</span> Body& body, <a class="code" href="a00201.html">task_group_context</a>& context )
+<a name="l00488"></a><a class="code" href="a00275.html#g2617dc9b88b3285a7212599d49f74228">00488</a> <span class="preprocessor"></span><span class="keywordtype">void</span> <a class="code" href="a00275.html#g3383e2703977012b6f384d673410f1f7">parallel_do</a>( Iterator first, Iterator last, <span class="keyword">const</span> Body& body, <a class="code" href="a00201.html">task_group_context</a>& context )
<a name="l00489"></a>00489 {
<a name="l00490"></a>00490 <span class="keywordflow">if</span> ( first == last )
<a name="l00491"></a>00491 <span class="keywordflow">return</span>;
diff --git a/doc/html/a00375.html b/doc/html/a00380.html
similarity index 90%
rename from doc/html/a00375.html
rename to doc/html/a00380.html
index bde914e..c9b8394 100644
--- a/doc/html/a00375.html
+++ b/doc/html/a00380.html
@@ -124,44 +124,44 @@
<a name="l00119"></a>00119
<a name="l00121"></a>00121
<a name="l00122"></a>00122 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00123"></a><a class="code" href="a00274.html#g68cc046ef72c42ce205fccbc435a0d81">00123</a> <span class="keywordtype">void</span> <a class="code" href="a00274.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body ) {
+<a name="l00123"></a><a class="code" href="a00275.html#g68cc046ef72c42ce205fccbc435a0d81">00123</a> <span class="keywordtype">void</span> <a class="code" href="a00275.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body ) {
<a name="l00124"></a>00124 internal::start_for<Range,Body,__TBB_DEFAULT_PARTITIONER>::run(range,body,__TBB_DEFAULT_PARTITIONER());
<a name="l00125"></a>00125 }
<a name="l00126"></a>00126
<a name="l00128"></a>00128
<a name="l00129"></a>00129 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00130"></a><a class="code" href="a00274.html#g13cac5dd55c7533bccea43a51c33d0e5">00130</a> <span class="keywordtype">void</span> <a class="code" href="a00274.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, <span class="keyword">const</span> <a class="code" href="a00193.html">simple_partitioner</a>& partitioner ) {
+<a name="l00130"></a><a class="code" href="a00275.html#g13cac5dd55c7533bccea43a51c33d0e5">00130</a> <span class="keywordtype">void</span> <a class="code" href="a00275.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, <span class="keyword">const</span> <a class="code" href="a00193.html">simple_partitioner</a>& partitioner ) {
<a name="l00131"></a>00131 internal::start_for<Range,Body,simple_partitioner>::run(range,body,partitioner);
<a name="l00132"></a>00132 }
<a name="l00133"></a>00133
<a name="l00135"></a>00135
<a name="l00136"></a>00136 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00137"></a><a class="code" href="a00274.html#ga7ac75d532389b55b9247f3fdb0b00d1">00137</a> <span class="keywordtype">void</span> <a class="code" href="a00274.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, <span class="keyword">const</span> <a class="code" href="a00146.html">auto_partitioner</a>& partitioner ) {
+<a name="l00137"></a><a class="code" href="a00275.html#ga7ac75d532389b55b9247f3fdb0b00d1">00137</a> <span class="keywordtype">void</span> <a class="code" href="a00275.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, <span class="keyword">const</span> <a class="code" href="a00145.html">auto_partitioner</a>& partitioner ) {
<a name="l00138"></a>00138 internal::start_for<Range,Body,auto_partitioner>::run(range,body,partitioner);
<a name="l00139"></a>00139 }
<a name="l00140"></a>00140
<a name="l00142"></a>00142
<a name="l00143"></a>00143 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00144"></a><a class="code" href="a00274.html#g9cd1b210ceb1c040f30e390b4a21bde8">00144</a> <span class="keywordtype">void</span> <a class="code" href="a00274.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, <a class="code" href="a00141.html">affinity_partitioner</a>& partitioner ) {
+<a name="l00144"></a><a class="code" href="a00275.html#g9cd1b210ceb1c040f30e390b4a21bde8">00144</a> <span class="keywordtype">void</span> <a class="code" href="a00275.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, <a class="code" href="a00140.html">affinity_partitioner</a>& partitioner ) {
<a name="l00145"></a>00145 internal::start_for<Range,Body,affinity_partitioner>::run(range,body,partitioner);
<a name="l00146"></a>00146 }
<a name="l00147"></a>00147
<a name="l00148"></a>00148 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
<a name="l00150"></a>00150 <span class="preprocessor"></span>
<a name="l00151"></a>00151 <span class="preprocessor">template<typename Range, typename Body></span>
-<a name="l00152"></a><a class="code" href="a00274.html#g2d317a5e0078cd193125439fed60dfdc">00152</a> <span class="preprocessor"></span><span class="keywordtype">void</span> <a class="code" href="a00274.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, <span class="keyword">const</span> <a class="code" href="a00193.html">simple_partitioner</a>& partitioner, <a class="code" hr [...]
+<a name="l00152"></a><a class="code" href="a00275.html#g2d317a5e0078cd193125439fed60dfdc">00152</a> <span class="preprocessor"></span><span class="keywordtype">void</span> <a class="code" href="a00275.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, <span class="keyword">const</span> <a class="code" href="a00193.html">simple_partitioner</a>& partitioner, <a class="code" hr [...]
<a name="l00153"></a>00153 internal::start_for<Range,Body,simple_partitioner>::run(range, body, partitioner, context);
<a name="l00154"></a>00154 }
<a name="l00155"></a>00155
<a name="l00157"></a>00157
<a name="l00158"></a>00158 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00159"></a><a class="code" href="a00274.html#g1c0700e3f85e83a788ff3ede88ebb7e9">00159</a> <span class="keywordtype">void</span> <a class="code" href="a00274.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, <span class="keyword">const</span> <a class="code" href="a00146.html">auto_partitioner</a>& partitioner, <a class="code" href="a00201.html">task_group_context< [...]
+<a name="l00159"></a><a class="code" href="a00275.html#g1c0700e3f85e83a788ff3ede88ebb7e9">00159</a> <span class="keywordtype">void</span> <a class="code" href="a00275.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, <span class="keyword">const</span> <a class="code" href="a00145.html">auto_partitioner</a>& partitioner, <a class="code" href="a00201.html">task_group_context< [...]
<a name="l00160"></a>00160 internal::start_for<Range,Body,auto_partitioner>::run(range, body, partitioner, context);
<a name="l00161"></a>00161 }
<a name="l00162"></a>00162
<a name="l00164"></a>00164
<a name="l00165"></a>00165 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00166"></a><a class="code" href="a00274.html#g04b4696b67370c01353ff5974c8f1196">00166</a> <span class="keywordtype">void</span> <a class="code" href="a00274.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, <a class="code" href="a00141.html">affinity_partitioner</a>& partitioner, <a class="code" href="a00201.html">task_group_context</a>& context ) {
+<a name="l00166"></a><a class="code" href="a00275.html#g04b4696b67370c01353ff5974c8f1196">00166</a> <span class="keywordtype">void</span> <a class="code" href="a00275.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, <a class="code" href="a00140.html">affinity_partitioner</a>& partitioner, <a class="code" href="a00201.html">task_group_context</a>& context ) {
<a name="l00167"></a>00167 internal::start_for<Range,Body,affinity_partitioner>::run(range,body,partitioner, context);
<a name="l00168"></a>00168 }
<a name="l00169"></a>00169 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
@@ -177,8 +177,8 @@
<a name="l00181"></a>00181 parallel_for_body( <span class="keyword">const</span> Function& _func, Index& _begin, Index& _step)
<a name="l00182"></a>00182 : my_func(_func), my_begin(_begin), my_step(_step) {}
<a name="l00183"></a>00183
-<a name="l00184"></a>00184 <span class="keywordtype">void</span> operator()( <a class="code" href="a00148.html">tbb::blocked_range<Index></a>& r )<span class="keyword"> const </span>{
-<a name="l00185"></a>00185 <span class="keywordflow">for</span>( Index i = r.<a class="code" href="a00148.html#18d2258400756ac1446dac7676b18df3">begin</a>(), k = my_begin + i * my_step; i < r.<a class="code" href="a00148.html#8b929d93ddc13f148b11bceef3a3bdf8">end</a>(); i++, k = k + my_step)
+<a name="l00184"></a>00184 <span class="keywordtype">void</span> operator()( <a class="code" href="a00147.html">tbb::blocked_range<Index></a>& r )<span class="keyword"> const </span>{
+<a name="l00185"></a>00185 <span class="keywordflow">for</span>( Index i = r.<a class="code" href="a00147.html#18d2258400756ac1446dac7676b18df3">begin</a>(), k = my_begin + i * my_step; i < r.<a class="code" href="a00147.html#8b929d93ddc13f148b11bceef3a3bdf8">end</a>(); i++, k = k + my_step)
<a name="l00186"></a>00186 my_func( k );
<a name="l00187"></a>00187 }
<a name="l00188"></a>00188 };
@@ -188,37 +188,37 @@
<a name="l00193"></a>00193
<a name="l00195"></a>00195
<a name="l00196"></a>00196 <span class="keyword">template</span> <<span class="keyword">typename</span> Index, <span class="keyword">typename</span> Function>
-<a name="l00197"></a><a class="code" href="a00273.html#15c764c70c8a32e7a4b8c291d0cc8dde">00197</a> <span class="keywordtype">void</span> <a class="code" href="a00274.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(Index first, Index last, Index step, <span class="keyword">const</span> Function& f) {
+<a name="l00197"></a><a class="code" href="a00274.html#15c764c70c8a32e7a4b8c291d0cc8dde">00197</a> <span class="keywordtype">void</span> <a class="code" href="a00275.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(Index first, Index last, Index step, <span class="keyword">const</span> Function& f) {
<a name="l00198"></a>00198 <a class="code" href="a00201.html">tbb::task_group_context</a> context;
-<a name="l00199"></a>00199 <a class="code" href="a00274.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(first, last, step, f, context);
+<a name="l00199"></a>00199 <a class="code" href="a00275.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(first, last, step, f, context);
<a name="l00200"></a>00200 }
<a name="l00201"></a>00201 <span class="keyword">template</span> <<span class="keyword">typename</span> Index, <span class="keyword">typename</span> Function>
-<a name="l00202"></a>00202 <span class="keywordtype">void</span> <a class="code" href="a00274.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(Index first, Index last, Index step, <span class="keyword">const</span> Function& f, <a class="code" href="a00201.html">tbb::task_group_context</a> &context) {
+<a name="l00202"></a>00202 <span class="keywordtype">void</span> <a class="code" href="a00275.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(Index first, Index last, Index step, <span class="keyword">const</span> Function& f, <a class="code" href="a00201.html">tbb::task_group_context</a> &context) {
<a name="l00203"></a>00203 <span class="keywordflow">if</span> (step <= 0 )
<a name="l00204"></a>00204 internal::throw_exception(internal::eid_nonpositive_step); <span class="comment">// throws std::invalid_argument</span>
<a name="l00205"></a>00205 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (last > first) {
<a name="l00206"></a>00206 <span class="comment">// Above "else" is necessary to prevent "potential divide by zero" warning</span>
<a name="l00207"></a>00207 Index end = (last - first) / step;
<a name="l00208"></a>00208 <span class="keywordflow">if</span> (first + end * step < last) end++;
-<a name="l00209"></a>00209 <a class="code" href="a00148.html">tbb::blocked_range<Index></a> range(static_cast<Index>(0), end);
+<a name="l00209"></a>00209 <a class="code" href="a00147.html">tbb::blocked_range<Index></a> range(static_cast<Index>(0), end);
<a name="l00210"></a>00210 internal::parallel_for_body<Function, Index> body(f, first, step);
-<a name="l00211"></a>00211 <a class="code" href="a00274.html#g68cc046ef72c42ce205fccbc435a0d81">tbb::parallel_for</a>(range, body, <a class="code" href="a00146.html">tbb::auto_partitioner</a>(), context);
+<a name="l00211"></a>00211 <a class="code" href="a00275.html#g68cc046ef72c42ce205fccbc435a0d81">tbb::parallel_for</a>(range, body, <a class="code" href="a00145.html">tbb::auto_partitioner</a>(), context);
<a name="l00212"></a>00212 }
<a name="l00213"></a>00213 }
<a name="l00215"></a>00215 <span class="keyword">template</span> <<span class="keyword">typename</span> Index, <span class="keyword">typename</span> Function>
-<a name="l00216"></a><a class="code" href="a00273.html#490399525b1e690ec31d6db964c6b272">00216</a> <span class="keywordtype">void</span> <a class="code" href="a00274.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(Index first, Index last, <span class="keyword">const</span> Function& f) {
+<a name="l00216"></a><a class="code" href="a00274.html#490399525b1e690ec31d6db964c6b272">00216</a> <span class="keywordtype">void</span> <a class="code" href="a00275.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(Index first, Index last, <span class="keyword">const</span> Function& f) {
<a name="l00217"></a>00217 <a class="code" href="a00201.html">tbb::task_group_context</a> context;
-<a name="l00218"></a>00218 <a class="code" href="a00274.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(first, last, static_cast<Index>(1), f, context);
+<a name="l00218"></a>00218 <a class="code" href="a00275.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(first, last, static_cast<Index>(1), f, context);
<a name="l00219"></a>00219 }
<a name="l00220"></a>00220 <span class="keyword">template</span> <<span class="keyword">typename</span> Index, <span class="keyword">typename</span> Function>
-<a name="l00221"></a>00221 <span class="keywordtype">void</span> <a class="code" href="a00274.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(Index first, Index last, <span class="keyword">const</span> Function& f, <a class="code" href="a00201.html">tbb::task_group_context</a> &context) {
-<a name="l00222"></a>00222 <a class="code" href="a00274.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(first, last, static_cast<Index>(1), f, context);
+<a name="l00221"></a>00221 <span class="keywordtype">void</span> <a class="code" href="a00275.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(Index first, Index last, <span class="keyword">const</span> Function& f, <a class="code" href="a00201.html">tbb::task_group_context</a> &context) {
+<a name="l00222"></a>00222 <a class="code" href="a00275.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(first, last, static_cast<Index>(1), f, context);
<a name="l00223"></a>00223 }
<a name="l00224"></a>00224
<a name="l00226"></a>00226
<a name="l00227"></a>00227 } <span class="comment">// namespace strict_ppl</span>
<a name="l00228"></a>00228
-<a name="l00229"></a>00229 <span class="keyword">using</span> <a class="code" href="a00274.html#g68cc046ef72c42ce205fccbc435a0d81">strict_ppl::parallel_for</a>;
+<a name="l00229"></a>00229 <span class="keyword">using</span> <a class="code" href="a00275.html#g68cc046ef72c42ce205fccbc435a0d81">strict_ppl::parallel_for</a>;
<a name="l00230"></a>00230
<a name="l00231"></a>00231 } <span class="comment">// namespace tbb</span>
<a name="l00232"></a>00232
diff --git a/doc/html/a00379.html b/doc/html/a00384.html
similarity index 94%
rename from doc/html/a00379.html
rename to doc/html/a00384.html
index 9d7e93e..5d7a145 100644
--- a/doc/html/a00379.html
+++ b/doc/html/a00384.html
@@ -64,17 +64,17 @@
<a name="l00048"></a>00048
<a name="l00049"></a>00049
<a name="l00050"></a>00050 <span class="keyword">template</span><<span class="keyword">typename</span> InputIterator, <span class="keyword">typename</span> Function>
-<a name="l00051"></a><a class="code" href="a00274.html#gcd40c32f319747e61a8f73fcfc452001">00051</a> <span class="keywordtype">void</span> <a class="code" href="a00274.html#gcd40c32f319747e61a8f73fcfc452001">parallel_for_each</a>(InputIterator first, InputIterator last, <span class="keyword">const</span> Function& f, <a class="code" href="a00201.html">task_group_context</a> &context) {
+<a name="l00051"></a><a class="code" href="a00275.html#gcd40c32f319747e61a8f73fcfc452001">00051</a> <span class="keywordtype">void</span> <a class="code" href="a00275.html#gcd40c32f319747e61a8f73fcfc452001">parallel_for_each</a>(InputIterator first, InputIterator last, <span class="keyword">const</span> Function& f, <a class="code" href="a00201.html">task_group_context</a> &context) {
<a name="l00052"></a>00052 internal::parallel_for_each_body<Function, InputIterator> body(f);
<a name="l00053"></a>00053
-<a name="l00054"></a>00054 <a class="code" href="a00274.html#g3383e2703977012b6f384d673410f1f7">tbb::parallel_do</a> (first, last, body, context);
+<a name="l00054"></a>00054 <a class="code" href="a00275.html#g3383e2703977012b6f384d673410f1f7">tbb::parallel_do</a> (first, last, body, context);
<a name="l00055"></a>00055 }
<a name="l00056"></a>00056
<a name="l00058"></a>00058 <span class="keyword">template</span><<span class="keyword">typename</span> InputIterator, <span class="keyword">typename</span> Function>
-<a name="l00059"></a><a class="code" href="a00274.html#gc2d710ca573f0a9bd94379cba3772def">00059</a> <span class="keywordtype">void</span> <a class="code" href="a00274.html#gcd40c32f319747e61a8f73fcfc452001">parallel_for_each</a>(InputIterator first, InputIterator last, <span class="keyword">const</span> Function& f) {
+<a name="l00059"></a><a class="code" href="a00275.html#gc2d710ca573f0a9bd94379cba3772def">00059</a> <span class="keywordtype">void</span> <a class="code" href="a00275.html#gcd40c32f319747e61a8f73fcfc452001">parallel_for_each</a>(InputIterator first, InputIterator last, <span class="keyword">const</span> Function& f) {
<a name="l00060"></a>00060 internal::parallel_for_each_body<Function, InputIterator> body(f);
<a name="l00061"></a>00061
-<a name="l00062"></a>00062 <a class="code" href="a00274.html#g3383e2703977012b6f384d673410f1f7">tbb::parallel_do</a> (first, last, body);
+<a name="l00062"></a>00062 <a class="code" href="a00275.html#g3383e2703977012b6f384d673410f1f7">tbb::parallel_do</a> (first, last, body);
<a name="l00063"></a>00063 }
<a name="l00064"></a>00064
<a name="l00066"></a>00066
diff --git a/doc/html/a00381.html b/doc/html/a00386.html
similarity index 96%
rename from doc/html/a00381.html
rename to doc/html/a00386.html
index 04f0a6b..0b95e43 100644
--- a/doc/html/a00381.html
+++ b/doc/html/a00386.html
@@ -163,7 +163,7 @@
<a name="l00148"></a>00148 <span class="comment">// parallel_invoke with user-defined context</span>
<a name="l00149"></a>00149 <span class="comment">// two arguments</span>
<a name="l00150"></a>00150 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1 >
-<a name="l00151"></a><a class="code" href="a00274.html#gd3e2998f171494f94c2103f4eb924084">00151</a> <span class="keywordtype">void</span> <a class="code" href="a00274.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <a class="code" href="a00201.html">tbb::task_group_context</a>& context) {
+<a name="l00151"></a><a class="code" href="a00275.html#gd3e2998f171494f94c2103f4eb924084">00151</a> <span class="keywordtype">void</span> <a class="code" href="a00275.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <a class="code" href="a00201.html">tbb::task_group_context</a>& context) {
<a name="l00152"></a>00152 internal::parallel_invoke_cleaner cleaner(2, context);
<a name="l00153"></a>00153 internal::parallel_invoke_helper& root = cleaner.root;
<a name="l00154"></a>00154
@@ -174,7 +174,7 @@
<a name="l00159"></a>00159
<a name="l00160"></a>00160 <span class="comment">// three arguments</span>
<a name="l00161"></a>00161 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2 >
-<a name="l00162"></a>00162 <span class="keywordtype">void</span> <a class="code" href="a00274.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <a class="code" href="a00201.html">tbb::task_group_context</a>& context) {
+<a name="l00162"></a>00162 <span class="keywordtype">void</span> <a class="code" href="a00275.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <a class="code" href="a00201.html">tbb::task_group_context</a>& context) {
<a name="l00163"></a>00163 internal::parallel_invoke_cleaner cleaner(3, context);
<a name="l00164"></a>00164 internal::parallel_invoke_helper& root = cleaner.root;
<a name="l00165"></a>00165
@@ -186,7 +186,7 @@
<a name="l00171"></a>00171
<a name="l00172"></a>00172 <span class="comment">// four arguments</span>
<a name="l00173"></a>00173 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3>
-<a name="l00174"></a>00174 <span class="keywordtype">void</span> <a class="code" href="a00274.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3,
+<a name="l00174"></a>00174 <span class="keywordtype">void</span> <a class="code" href="a00275.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3,
<a name="l00175"></a>00175 <a class="code" href="a00201.html">tbb::task_group_context</a>& context)
<a name="l00176"></a>00176 {
<a name="l00177"></a>00177 internal::parallel_invoke_cleaner cleaner(4, context);
@@ -201,7 +201,7 @@
<a name="l00186"></a>00186
<a name="l00187"></a>00187 <span class="comment">// five arguments</span>
<a name="l00188"></a>00188 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4 >
-<a name="l00189"></a>00189 <span class="keywordtype">void</span> <a class="code" href="a00274.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
+<a name="l00189"></a>00189 <span class="keywordtype">void</span> <a class="code" href="a00275.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
<a name="l00190"></a>00190 <a class="code" href="a00201.html">tbb::task_group_context</a>& context)
<a name="l00191"></a>00191 {
<a name="l00192"></a>00192 internal::parallel_invoke_cleaner cleaner(3, context);
@@ -215,7 +215,7 @@
<a name="l00200"></a>00200
<a name="l00201"></a>00201 <span class="comment">// six arguments</span>
<a name="l00202"></a>00202 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4, <span class="keyword">typename</span> F5>
-<a name="l00203"></a>00203 <span class="keywordtype">void</span> <a class="code" href="a00274.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4, <span class="keyword">const</span> F5& f5,
+<a name="l00203"></a>00203 <span class="keywordtype">void</span> <a class="code" href="a00275.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4, <span class="keyword">const</span> F5& f5,
<a name="l00204"></a>00204 <a class="code" href="a00201.html">tbb::task_group_context</a>& context)
<a name="l00205"></a>00205 {
<a name="l00206"></a>00206 internal::parallel_invoke_cleaner cleaner(3, context);
@@ -229,7 +229,7 @@
<a name="l00214"></a>00214
<a name="l00215"></a>00215 <span class="comment">// seven arguments</span>
<a name="l00216"></a>00216 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4, <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6>
-<a name="l00217"></a>00217 <span class="keywordtype">void</span> <a class="code" href="a00274.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
+<a name="l00217"></a>00217 <span class="keywordtype">void</span> <a class="code" href="a00275.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
<a name="l00218"></a>00218 <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6,
<a name="l00219"></a>00219 <a class="code" href="a00201.html">tbb::task_group_context</a>& context)
<a name="l00220"></a>00220 {
@@ -245,7 +245,7 @@
<a name="l00230"></a>00230 <span class="comment">// eight arguments</span>
<a name="l00231"></a>00231 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4,
<a name="l00232"></a>00232 <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6, <span class="keyword">typename</span> F7>
-<a name="l00233"></a>00233 <span class="keywordtype">void</span> <a class="code" href="a00274.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
+<a name="l00233"></a>00233 <span class="keywordtype">void</span> <a class="code" href="a00275.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
<a name="l00234"></a>00234 <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6, <span class="keyword">const</span> F7& f7,
<a name="l00235"></a>00235 <a class="code" href="a00201.html">tbb::task_group_context</a>& context)
<a name="l00236"></a>00236 {
@@ -262,7 +262,7 @@
<a name="l00247"></a>00247 <span class="comment">// nine arguments</span>
<a name="l00248"></a>00248 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4,
<a name="l00249"></a>00249 <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6, <span class="keyword">typename</span> F7, <span class="keyword">typename</span> F8>
-<a name="l00250"></a>00250 <span class="keywordtype">void</span> <a class="code" href="a00274.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
+<a name="l00250"></a>00250 <span class="keywordtype">void</span> <a class="code" href="a00275.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
<a name="l00251"></a>00251 <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6, <span class="keyword">const</span> F7& f7, <span class="keyword">const</span> F8& f8,
<a name="l00252"></a>00252 <a class="code" href="a00201.html">tbb::task_group_context</a>& context)
<a name="l00253"></a>00253 {
@@ -279,7 +279,7 @@
<a name="l00264"></a>00264 <span class="comment">// ten arguments</span>
<a name="l00265"></a>00265 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4,
<a name="l00266"></a>00266 <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6, <span class="keyword">typename</span> F7, <span class="keyword">typename</span> F8, <span class="keyword">typename</span> F9>
-<a name="l00267"></a>00267 <span class="keywordtype">void</span> <a class="code" href="a00274.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
+<a name="l00267"></a>00267 <span class="keywordtype">void</span> <a class="code" href="a00275.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
<a name="l00268"></a>00268 <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6, <span class="keyword">const</span> F7& f7, <span class="keyword">const</span> F8& f8, <span class="keyword">const</span> F9& f9,
<a name="l00269"></a>00269 <a class="code" href="a00201.html">tbb::task_group_context</a>& context)
<a name="l00270"></a>00270 {
@@ -295,37 +295,37 @@
<a name="l00280"></a>00280
<a name="l00281"></a>00281 <span class="comment">// two arguments</span>
<a name="l00282"></a>00282 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1>
-<a name="l00283"></a>00283 <span class="keywordtype">void</span> <a class="code" href="a00274.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1) {
+<a name="l00283"></a>00283 <span class="keywordtype">void</span> <a class="code" href="a00275.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1) {
<a name="l00284"></a>00284 task_group_context context;
<a name="l00285"></a>00285 parallel_invoke<F0, F1>(f0, f1, context);
<a name="l00286"></a>00286 }
<a name="l00287"></a>00287 <span class="comment">// three arguments</span>
<a name="l00288"></a>00288 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2>
-<a name="l00289"></a>00289 <span class="keywordtype">void</span> <a class="code" href="a00274.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2) {
+<a name="l00289"></a>00289 <span class="keywordtype">void</span> <a class="code" href="a00275.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2) {
<a name="l00290"></a>00290 task_group_context context;
<a name="l00291"></a>00291 parallel_invoke<F0, F1, F2>(f0, f1, f2, context);
<a name="l00292"></a>00292 }
<a name="l00293"></a>00293 <span class="comment">// four arguments</span>
<a name="l00294"></a>00294 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3 >
-<a name="l00295"></a>00295 <span class="keywordtype">void</span> <a class="code" href="a00274.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3) {
+<a name="l00295"></a>00295 <span class="keywordtype">void</span> <a class="code" href="a00275.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3) {
<a name="l00296"></a>00296 task_group_context context;
<a name="l00297"></a>00297 parallel_invoke<F0, F1, F2, F3>(f0, f1, f2, f3, context);
<a name="l00298"></a>00298 }
<a name="l00299"></a>00299 <span class="comment">// five arguments</span>
<a name="l00300"></a>00300 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4>
-<a name="l00301"></a>00301 <span class="keywordtype">void</span> <a class="code" href="a00274.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4) {
+<a name="l00301"></a>00301 <span class="keywordtype">void</span> <a class="code" href="a00275.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4) {
<a name="l00302"></a>00302 task_group_context context;
<a name="l00303"></a>00303 parallel_invoke<F0, F1, F2, F3, F4>(f0, f1, f2, f3, f4, context);
<a name="l00304"></a>00304 }
<a name="l00305"></a>00305 <span class="comment">// six arguments</span>
<a name="l00306"></a>00306 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4, <span class="keyword">typename</span> F5>
-<a name="l00307"></a>00307 <span class="keywordtype">void</span> <a class="code" href="a00274.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4, <span class="keyword">const</span> F5& f5) {
+<a name="l00307"></a>00307 <span class="keywordtype">void</span> <a class="code" href="a00275.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4, <span class="keyword">const</span> F5& f5) {
<a name="l00308"></a>00308 task_group_context context;
<a name="l00309"></a>00309 parallel_invoke<F0, F1, F2, F3, F4, F5>(f0, f1, f2, f3, f4, f5, context);
<a name="l00310"></a>00310 }
<a name="l00311"></a>00311 <span class="comment">// seven arguments</span>
<a name="l00312"></a>00312 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4, <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6>
-<a name="l00313"></a>00313 <span class="keywordtype">void</span> <a class="code" href="a00274.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
+<a name="l00313"></a>00313 <span class="keywordtype">void</span> <a class="code" href="a00275.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
<a name="l00314"></a>00314 <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6)
<a name="l00315"></a>00315 {
<a name="l00316"></a>00316 task_group_context context;
@@ -334,7 +334,7 @@
<a name="l00319"></a>00319 <span class="comment">// eigth arguments</span>
<a name="l00320"></a>00320 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4,
<a name="l00321"></a>00321 <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6, <span class="keyword">typename</span> F7>
-<a name="l00322"></a>00322 <span class="keywordtype">void</span> <a class="code" href="a00274.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
+<a name="l00322"></a>00322 <span class="keywordtype">void</span> <a class="code" href="a00275.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
<a name="l00323"></a>00323 <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6, <span class="keyword">const</span> F7& f7)
<a name="l00324"></a>00324 {
<a name="l00325"></a>00325 task_group_context context;
@@ -343,7 +343,7 @@
<a name="l00328"></a>00328 <span class="comment">// nine arguments</span>
<a name="l00329"></a>00329 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4,
<a name="l00330"></a>00330 <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6, <span class="keyword">typename</span> F7, <span class="keyword">typename</span> F8>
-<a name="l00331"></a>00331 <span class="keywordtype">void</span> <a class="code" href="a00274.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
+<a name="l00331"></a>00331 <span class="keywordtype">void</span> <a class="code" href="a00275.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
<a name="l00332"></a>00332 <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6, <span class="keyword">const</span> F7& f7, <span class="keyword">const</span> F8& f8)
<a name="l00333"></a>00333 {
<a name="l00334"></a>00334 task_group_context context;
@@ -352,7 +352,7 @@
<a name="l00337"></a>00337 <span class="comment">// ten arguments</span>
<a name="l00338"></a>00338 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4,
<a name="l00339"></a>00339 <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6, <span class="keyword">typename</span> F7, <span class="keyword">typename</span> F8, <span class="keyword">typename</span> F9>
-<a name="l00340"></a>00340 <span class="keywordtype">void</span> <a class="code" href="a00274.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
+<a name="l00340"></a>00340 <span class="keywordtype">void</span> <a class="code" href="a00275.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
<a name="l00341"></a>00341 <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6, <span class="keyword">const</span> F7& f7, <span class="keyword">const</span> F8& f8, <span class="keyword">const</span> F9& f9)
<a name="l00342"></a>00342 {
<a name="l00343"></a>00343 task_group_context context;
diff --git a/doc/html/a00391.html b/doc/html/a00391.html
deleted file mode 100644
index c3e097b..0000000
--- a/doc/html/a00391.html
+++ /dev/null
@@ -1,341 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>parallel_scan.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>parallel_scan.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_parallel_scan_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_parallel_scan_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "task.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "aligned_space.h"</span>
-<a name="l00026"></a>00026 <span class="preprocessor">#include <new></span>
-<a name="l00027"></a>00027 <span class="preprocessor">#include "partitioner.h"</span>
-<a name="l00028"></a>00028
-<a name="l00029"></a>00029 <span class="keyword">namespace </span>tbb {
-<a name="l00030"></a>00030
-<a name="l00032"></a>00032
-<a name="l00033"></a><a class="code" href="a00181.html">00033</a> <span class="keyword">struct </span><a class="code" href="a00181.html">pre_scan_tag</a> {
-<a name="l00034"></a>00034 <span class="keyword">static</span> <span class="keywordtype">bool</span> is_final_scan() {<span class="keywordflow">return</span> <span class="keyword">false</span>;}
-<a name="l00035"></a>00035 };
-<a name="l00036"></a>00036
-<a name="l00038"></a>00038
-<a name="l00039"></a><a class="code" href="a00167.html">00039</a> <span class="keyword">struct </span><a class="code" href="a00167.html">final_scan_tag</a> {
-<a name="l00040"></a>00040 <span class="keyword">static</span> <span class="keywordtype">bool</span> is_final_scan() {<span class="keywordflow">return</span> <span class="keyword">true</span>;}
-<a name="l00041"></a>00041 };
-<a name="l00042"></a>00042
-<a name="l00044"></a>00044 <span class="keyword">namespace </span>internal {
-<a name="l00045"></a>00045
-<a name="l00047"></a>00047
-<a name="l00048"></a>00048 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00049"></a>00049 <span class="keyword">class </span>final_sum: <span class="keyword">public</span> <a class="code" href="a00199.html">task</a> {
-<a name="l00050"></a>00050 <span class="keyword">public</span>:
-<a name="l00051"></a>00051 Body body;
-<a name="l00052"></a>00052 <span class="keyword">private</span>:
-<a name="l00053"></a>00053 <a class="code" href="a00142.html">aligned_space<Range,1></a> range;
-<a name="l00055"></a>00055 Body* stuff_last;
-<a name="l00056"></a>00056 <span class="keyword">public</span>:
-<a name="l00057"></a>00057 final_sum( Body& body_ ) :
-<a name="l00058"></a>00058 body(body_,<a class="code" href="a00198.html">split</a>())
-<a name="l00059"></a>00059 {
-<a name="l00060"></a>00060 poison_pointer(stuff_last);
-<a name="l00061"></a>00061 }
-<a name="l00062"></a>00062 ~final_sum() {
-<a name="l00063"></a>00063 range.begin()->~Range();
-<a name="l00064"></a>00064 }
-<a name="l00065"></a>00065 <span class="keywordtype">void</span> finish_construction( <span class="keyword">const</span> Range& range_, Body* stuff_last_ ) {
-<a name="l00066"></a>00066 <span class="keyword">new</span>( range.begin() ) Range(range_);
-<a name="l00067"></a>00067 stuff_last = stuff_last_;
-<a name="l00068"></a>00068 }
-<a name="l00069"></a>00069 <span class="keyword">private</span>:
-<a name="l00070"></a>00070 <span class="comment">/*override*/</span> task* execute() {
-<a name="l00071"></a>00071 body( *range.begin(), final_scan_tag() );
-<a name="l00072"></a>00072 <span class="keywordflow">if</span>( stuff_last )
-<a name="l00073"></a>00073 stuff_last->assign(body);
-<a name="l00074"></a>00074 <span class="keywordflow">return</span> NULL;
-<a name="l00075"></a>00075 }
-<a name="l00076"></a>00076 };
-<a name="l00077"></a>00077
-<a name="l00079"></a>00079
-<a name="l00080"></a>00080 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00081"></a>00081 <span class="keyword">class </span>sum_node: <span class="keyword">public</span> task {
-<a name="l00082"></a>00082 <span class="keyword">typedef</span> final_sum<Range,Body> final_sum_type;
-<a name="l00083"></a>00083 <span class="keyword">public</span>:
-<a name="l00084"></a>00084 final_sum_type *incoming;
-<a name="l00085"></a>00085 final_sum_type *body;
-<a name="l00086"></a>00086 Body *stuff_last;
-<a name="l00087"></a>00087 <span class="keyword">private</span>:
-<a name="l00088"></a>00088 final_sum_type *left_sum;
-<a name="l00089"></a>00089 sum_node *left;
-<a name="l00090"></a>00090 sum_node *right;
-<a name="l00091"></a>00091 <span class="keywordtype">bool</span> left_is_final;
-<a name="l00092"></a>00092 Range range;
-<a name="l00093"></a>00093 sum_node( <span class="keyword">const</span> Range range_, <span class="keywordtype">bool</span> left_is_final_ ) :
-<a name="l00094"></a>00094 left_sum(NULL),
-<a name="l00095"></a>00095 left(NULL),
-<a name="l00096"></a>00096 right(NULL),
-<a name="l00097"></a>00097 left_is_final(left_is_final_),
-<a name="l00098"></a>00098 range(range_)
-<a name="l00099"></a>00099 {
-<a name="l00100"></a>00100 <span class="comment">// Poison fields that will be set by second pass.</span>
-<a name="l00101"></a>00101 poison_pointer(body);
-<a name="l00102"></a>00102 poison_pointer(incoming);
-<a name="l00103"></a>00103 }
-<a name="l00104"></a>00104 task* create_child( <span class="keyword">const</span> Range& range_, final_sum_type& f, sum_node* n, final_sum_type* incoming_, Body* stuff_last_ ) {
-<a name="l00105"></a>00105 <span class="keywordflow">if</span>( !n ) {
-<a name="l00106"></a>00106 f.recycle_as_child_of( *<span class="keyword">this</span> );
-<a name="l00107"></a>00107 f.finish_construction( range_, stuff_last_ );
-<a name="l00108"></a>00108 <span class="keywordflow">return</span> &f;
-<a name="l00109"></a>00109 } <span class="keywordflow">else</span> {
-<a name="l00110"></a>00110 n->body = &f;
-<a name="l00111"></a>00111 n->incoming = incoming_;
-<a name="l00112"></a>00112 n->stuff_last = stuff_last_;
-<a name="l00113"></a>00113 <span class="keywordflow">return</span> n;
-<a name="l00114"></a>00114 }
-<a name="l00115"></a>00115 }
-<a name="l00116"></a>00116 <span class="comment">/*override*/</span> task* execute() {
-<a name="l00117"></a>00117 <span class="keywordflow">if</span>( body ) {
-<a name="l00118"></a>00118 <span class="keywordflow">if</span>( incoming )
-<a name="l00119"></a>00119 left_sum->body.reverse_join( incoming->body );
-<a name="l00120"></a>00120 recycle_as_continuation();
-<a name="l00121"></a>00121 sum_node& c = *<span class="keyword">this</span>;
-<a name="l00122"></a>00122 task* b = c.create_child(Range(range,split()),*left_sum,right,left_sum,stuff_last);
-<a name="l00123"></a>00123 task* a = left_is_final ? NULL : c.create_child(range,*body,left,incoming,NULL);
-<a name="l00124"></a>00124 set_ref_count( (a!=NULL)+(b!=NULL) );
-<a name="l00125"></a>00125 body = NULL;
-<a name="l00126"></a>00126 <span class="keywordflow">if</span>( a ) spawn(*b);
-<a name="l00127"></a>00127 <span class="keywordflow">else</span> a = b;
-<a name="l00128"></a>00128 <span class="keywordflow">return</span> a;
-<a name="l00129"></a>00129 } <span class="keywordflow">else</span> {
-<a name="l00130"></a>00130 <span class="keywordflow">return</span> NULL;
-<a name="l00131"></a>00131 }
-<a name="l00132"></a>00132 }
-<a name="l00133"></a>00133 <span class="keyword">template</span><<span class="keyword">typename</span> Range_,<span class="keyword">typename</span> Body_,<span class="keyword">typename</span> Partitioner_>
-<a name="l00134"></a>00134 <span class="keyword">friend</span> <span class="keyword">class </span>start_scan;
-<a name="l00135"></a>00135
-<a name="l00136"></a>00136 <span class="keyword">template</span><<span class="keyword">typename</span> Range_,<span class="keyword">typename</span> Body_>
-<a name="l00137"></a>00137 <span class="keyword">friend</span> <span class="keyword">class </span>finish_scan;
-<a name="l00138"></a>00138 };
-<a name="l00139"></a>00139
-<a name="l00141"></a>00141
-<a name="l00142"></a>00142 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00143"></a>00143 <span class="keyword">class </span>finish_scan: <span class="keyword">public</span> task {
-<a name="l00144"></a>00144 <span class="keyword">typedef</span> sum_node<Range,Body> sum_node_type;
-<a name="l00145"></a>00145 <span class="keyword">typedef</span> final_sum<Range,Body> final_sum_type;
-<a name="l00146"></a>00146 final_sum_type** <span class="keyword">const</span> sum;
-<a name="l00147"></a>00147 sum_node_type*& return_slot;
-<a name="l00148"></a>00148 <span class="keyword">public</span>:
-<a name="l00149"></a>00149 final_sum_type* right_zombie;
-<a name="l00150"></a>00150 sum_node_type& result;
-<a name="l00151"></a>00151
-<a name="l00152"></a>00152 <span class="comment">/*override*/</span> task* execute() {
-<a name="l00153"></a>00153 __TBB_ASSERT( result.ref_count()==(result.left!=NULL)+(result.right!=NULL), NULL );
-<a name="l00154"></a>00154 <span class="keywordflow">if</span>( result.left )
-<a name="l00155"></a>00155 result.left_is_final = <span class="keyword">false</span>;
-<a name="l00156"></a>00156 <span class="keywordflow">if</span>( right_zombie && sum )
-<a name="l00157"></a>00157 ((*sum)->body).reverse_join(result.left_sum->body);
-<a name="l00158"></a>00158 __TBB_ASSERT( !return_slot, NULL );
-<a name="l00159"></a>00159 <span class="keywordflow">if</span>( right_zombie || result.right ) {
-<a name="l00160"></a>00160 return_slot = &result;
-<a name="l00161"></a>00161 } <span class="keywordflow">else</span> {
-<a name="l00162"></a>00162 destroy( result );
-<a name="l00163"></a>00163 }
-<a name="l00164"></a>00164 <span class="keywordflow">if</span>( right_zombie && !sum && !result.right ) destroy(*right_zombie);
-<a name="l00165"></a>00165 <span class="keywordflow">return</span> NULL;
-<a name="l00166"></a>00166 }
-<a name="l00167"></a>00167
-<a name="l00168"></a>00168 finish_scan( sum_node_type*& return_slot_, final_sum_type** sum_, sum_node_type& result_ ) :
-<a name="l00169"></a>00169 sum(sum_),
-<a name="l00170"></a>00170 return_slot(return_slot_),
-<a name="l00171"></a>00171 right_zombie(NULL),
-<a name="l00172"></a>00172 result(result_)
-<a name="l00173"></a>00173 {
-<a name="l00174"></a>00174 __TBB_ASSERT( !return_slot, NULL );
-<a name="l00175"></a>00175 }
-<a name="l00176"></a>00176 };
-<a name="l00177"></a>00177
-<a name="l00179"></a>00179
-<a name="l00180"></a>00180 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner=simple_partitioner>
-<a name="l00181"></a>00181 <span class="keyword">class </span>start_scan: <span class="keyword">public</span> task {
-<a name="l00182"></a>00182 <span class="keyword">typedef</span> sum_node<Range,Body> sum_node_type;
-<a name="l00183"></a>00183 <span class="keyword">typedef</span> final_sum<Range,Body> final_sum_type;
-<a name="l00184"></a>00184 final_sum_type* body;
-<a name="l00186"></a>00186 final_sum_type** sum;
-<a name="l00187"></a>00187 sum_node_type** return_slot;
-<a name="l00189"></a>00189 sum_node_type* parent_sum;
-<a name="l00190"></a>00190 <span class="keywordtype">bool</span> is_final;
-<a name="l00191"></a>00191 <span class="keywordtype">bool</span> is_right_child;
-<a name="l00192"></a>00192 Range range;
-<a name="l00193"></a>00193 <span class="keyword">typename</span> Partitioner::partition_type partition;
-<a name="l00194"></a>00194 <span class="comment">/*override*/</span> task* execute();
-<a name="l00195"></a>00195 <span class="keyword">public</span>:
-<a name="l00196"></a>00196 start_scan( sum_node_type*& return_slot_, start_scan& parent_, sum_node_type* parent_sum_ ) :
-<a name="l00197"></a>00197 body(parent_.body),
-<a name="l00198"></a>00198 sum(parent_.sum),
-<a name="l00199"></a>00199 return_slot(&return_slot_),
-<a name="l00200"></a>00200 parent_sum(parent_sum_),
-<a name="l00201"></a>00201 is_final(parent_.is_final),
-<a name="l00202"></a>00202 is_right_child(false),
-<a name="l00203"></a>00203 range(parent_.range,split()),
-<a name="l00204"></a>00204 partition(parent_.partition,split())
-<a name="l00205"></a>00205 {
-<a name="l00206"></a>00206 __TBB_ASSERT( !*return_slot, NULL );
-<a name="l00207"></a>00207 }
-<a name="l00208"></a>00208
-<a name="l00209"></a>00209 start_scan( sum_node_type*& return_slot_, <span class="keyword">const</span> Range& range_, final_sum_type& body_, <span class="keyword">const</span> Partitioner& partitioner_) :
-<a name="l00210"></a>00210 body(&body_),
-<a name="l00211"></a>00211 sum(NULL),
-<a name="l00212"></a>00212 return_slot(&return_slot_),
-<a name="l00213"></a>00213 parent_sum(NULL),
-<a name="l00214"></a>00214 is_final(true),
-<a name="l00215"></a>00215 is_right_child(false),
-<a name="l00216"></a>00216 range(range_),
-<a name="l00217"></a>00217 partition(partitioner_)
-<a name="l00218"></a>00218 {
-<a name="l00219"></a>00219 __TBB_ASSERT( !*return_slot, NULL );
-<a name="l00220"></a>00220 }
-<a name="l00221"></a>00221
-<a name="l00222"></a>00222 <span class="keyword">static</span> <span class="keywordtype">void</span> run( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> Partitioner& partitioner ) {
-<a name="l00223"></a>00223 <span class="keywordflow">if</span>( !range.empty() ) {
-<a name="l00224"></a>00224 <span class="keyword">typedef</span> internal::start_scan<Range,Body,Partitioner> start_pass1_type;
-<a name="l00225"></a>00225 internal::sum_node<Range,Body>* root = NULL;
-<a name="l00226"></a>00226 <span class="keyword">typedef</span> internal::final_sum<Range,Body> final_sum_type;
-<a name="l00227"></a>00227 final_sum_type* temp_body = <span class="keyword">new</span>(<a class="code" href="a00199.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>()) final_sum_type( body );
-<a name="l00228"></a>00228 start_pass1_type& pass1 = *<span class="keyword">new</span>(<a class="code" href="a00199.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>()) start_pass1_type(
-<a name="l00229"></a>00229 <span class="comment">/*return_slot=*/</span>root,
-<a name="l00230"></a>00230 range,
-<a name="l00231"></a>00231 *temp_body,
-<a name="l00232"></a>00232 partitioner );
-<a name="l00233"></a>00233 <a class="code" href="a00199.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>( pass1 );
-<a name="l00234"></a>00234 <span class="keywordflow">if</span>( root ) {
-<a name="l00235"></a>00235 root->body = temp_body;
-<a name="l00236"></a>00236 root->incoming = NULL;
-<a name="l00237"></a>00237 root->stuff_last = &body;
-<a name="l00238"></a>00238 <a class="code" href="a00199.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>( *root );
-<a name="l00239"></a>00239 } <span class="keywordflow">else</span> {
-<a name="l00240"></a>00240 body.assign(temp_body->body);
-<a name="l00241"></a>00241 temp_body->finish_construction( range, NULL );
-<a name="l00242"></a>00242 temp_body->destroy(*temp_body);
-<a name="l00243"></a>00243 }
-<a name="l00244"></a>00244 }
-<a name="l00245"></a>00245 }
-<a name="l00246"></a>00246 };
-<a name="l00247"></a>00247
-<a name="l00248"></a>00248 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner>
-<a name="l00249"></a>00249 task* start_scan<Range,Body,Partitioner>::execute() {
-<a name="l00250"></a>00250 <span class="keyword">typedef</span> internal::finish_scan<Range,Body> finish_pass1_type;
-<a name="l00251"></a>00251 finish_pass1_type* p = parent_sum ? static_cast<finish_pass1_type*>( parent() ) : NULL;
-<a name="l00252"></a>00252 <span class="comment">// Inspecting p->result.left_sum would ordinarily be a race condition.</span>
-<a name="l00253"></a>00253 <span class="comment">// But we inspect it only if we are not a stolen task, in which case we</span>
-<a name="l00254"></a>00254 <span class="comment">// know that task assigning to p->result.left_sum has completed.</span>
-<a name="l00255"></a>00255 <span class="keywordtype">bool</span> treat_as_stolen = is_right_child && (is_stolen_task() || body!=p->result.left_sum);
-<a name="l00256"></a>00256 <span class="keywordflow">if</span>( treat_as_stolen ) {
-<a name="l00257"></a>00257 <span class="comment">// Invocation is for right child that has been really stolen or needs to be virtually stolen</span>
-<a name="l00258"></a>00258 p->right_zombie = body = <span class="keyword">new</span>( allocate_root() ) final_sum_type(body->body);
-<a name="l00259"></a>00259 is_final = <span class="keyword">false</span>;
-<a name="l00260"></a>00260 }
-<a name="l00261"></a>00261 task* next_task = NULL;
-<a name="l00262"></a>00262 <span class="keywordflow">if</span>( (is_right_child && !treat_as_stolen) || !range.is_divisible() || partition.should_execute_range(*<span class="keyword">this</span>) ) {
-<a name="l00263"></a>00263 <span class="keywordflow">if</span>( is_final )
-<a name="l00264"></a>00264 (body->body)( range, final_scan_tag() );
-<a name="l00265"></a>00265 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( sum )
-<a name="l00266"></a>00266 (body->body)( range, pre_scan_tag() );
-<a name="l00267"></a>00267 <span class="keywordflow">if</span>( sum )
-<a name="l00268"></a>00268 *sum = body;
-<a name="l00269"></a>00269 __TBB_ASSERT( !*return_slot, NULL );
-<a name="l00270"></a>00270 } <span class="keywordflow">else</span> {
-<a name="l00271"></a>00271 sum_node_type* result;
-<a name="l00272"></a>00272 <span class="keywordflow">if</span>( parent_sum )
-<a name="l00273"></a>00273 result = <span class="keyword">new</span>(allocate_additional_child_of(*parent_sum)) sum_node_type(range,<span class="comment">/*left_is_final=*/</span>is_final);
-<a name="l00274"></a>00274 <span class="keywordflow">else</span>
-<a name="l00275"></a>00275 result = <span class="keyword">new</span>(<a class="code" href="a00199.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>()) sum_node_type(range,<span class="comment">/*left_is_final=*/</span>is_final);
-<a name="l00276"></a>00276 finish_pass1_type& c = *<span class="keyword">new</span>( allocate_continuation()) finish_pass1_type(*return_slot,sum,*result);
-<a name="l00277"></a>00277 <span class="comment">// Split off right child</span>
-<a name="l00278"></a>00278 start_scan& b = *<span class="keyword">new</span>( c.allocate_child() ) start_scan( <span class="comment">/*return_slot=*/</span>result->right, *<span class="keyword">this</span>, result );
-<a name="l00279"></a>00279 b.is_right_child = <span class="keyword">true</span>;
-<a name="l00280"></a>00280 <span class="comment">// Left child is recycling of *this. Must recycle this before spawning b, </span>
-<a name="l00281"></a>00281 <span class="comment">// otherwise b might complete and decrement c.ref_count() to zero, which</span>
-<a name="l00282"></a>00282 <span class="comment">// would cause c.execute() to run prematurely.</span>
-<a name="l00283"></a>00283 recycle_as_child_of(c);
-<a name="l00284"></a>00284 c.set_ref_count(2);
-<a name="l00285"></a>00285 c.spawn(b);
-<a name="l00286"></a>00286 sum = &result->left_sum;
-<a name="l00287"></a>00287 return_slot = &result->left;
-<a name="l00288"></a>00288 is_right_child = <span class="keyword">false</span>;
-<a name="l00289"></a>00289 next_task = <span class="keyword">this</span>;
-<a name="l00290"></a>00290 parent_sum = result;
-<a name="l00291"></a>00291 __TBB_ASSERT( !*return_slot, NULL );
-<a name="l00292"></a>00292 }
-<a name="l00293"></a>00293 <span class="keywordflow">return</span> next_task;
-<a name="l00294"></a>00294 }
-<a name="l00295"></a>00295 } <span class="comment">// namespace internal</span>
-<a name="l00297"></a>00297 <span class="comment"></span>
-<a name="l00298"></a>00298 <span class="comment">// Requirements on Range concept are documented in blocked_range.h</span>
-<a name="l00299"></a>00299
-<a name="l00317"></a>00317
-<a name="l00319"></a>00319
-<a name="l00320"></a>00320 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00321"></a><a class="code" href="a00274.html#ged143f31dd3d96ded02ab3db915b91c7">00321</a> <span class="keywordtype">void</span> <a class="code" href="a00274.html#ged143f31dd3d96ded02ab3db915b91c7">parallel_scan</a>( <span class="keyword">const</span> Range& range, Body& body ) {
-<a name="l00322"></a>00322 internal::start_scan<Range,Body,__TBB_DEFAULT_PARTITIONER>::run(range,body,__TBB_DEFAULT_PARTITIONER());
-<a name="l00323"></a>00323 }
-<a name="l00324"></a>00324
-<a name="l00326"></a>00326
-<a name="l00327"></a>00327 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00328"></a><a class="code" href="a00274.html#gc9fac8870b2e6365fb337014404529df">00328</a> <span class="keywordtype">void</span> <a class="code" href="a00274.html#ged143f31dd3d96ded02ab3db915b91c7">parallel_scan</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00193.html">simple_partitioner</a>& partitioner ) {
-<a name="l00329"></a>00329 internal::start_scan<Range,Body,simple_partitioner>::run(range,body,partitioner);
-<a name="l00330"></a>00330 }
-<a name="l00331"></a>00331
-<a name="l00333"></a>00333
-<a name="l00334"></a>00334 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00335"></a><a class="code" href="a00274.html#g62fde400a37bbca1a2fddc8e3d22f556">00335</a> <span class="keywordtype">void</span> <a class="code" href="a00274.html#ged143f31dd3d96ded02ab3db915b91c7">parallel_scan</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00146.html">auto_partitioner</a>& partitioner ) {
-<a name="l00336"></a>00336 internal::start_scan<Range,Body,auto_partitioner>::run(range,body,partitioner);
-<a name="l00337"></a>00337 }
-<a name="l00339"></a>00339
-<a name="l00340"></a>00340 } <span class="comment">// namespace tbb</span>
-<a name="l00341"></a>00341
-<a name="l00342"></a>00342 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_parallel_scan_H */</span>
-<a name="l00343"></a>00343
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00387.html b/doc/html/a00392.html
similarity index 93%
rename from doc/html/a00387.html
rename to doc/html/a00392.html
index 224031e..3ba930e 100644
--- a/doc/html/a00387.html
+++ b/doc/html/a00392.html
@@ -230,44 +230,44 @@
<a name="l00242"></a>00242
<a name="l00244"></a>00244
<a name="l00245"></a>00245 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00246"></a><a class="code" href="a00274.html#g1b3d59c5eb62683c5754db6970392fa3">00246</a> <span class="keywordtype">void</span> <a class="code" href="a00274.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body ) {
+<a name="l00246"></a><a class="code" href="a00275.html#g1b3d59c5eb62683c5754db6970392fa3">00246</a> <span class="keywordtype">void</span> <a class="code" href="a00275.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body ) {
<a name="l00247"></a>00247 internal::start_reduce<Range,Body, const __TBB_DEFAULT_PARTITIONER>::run( range, body, __TBB_DEFAULT_PARTITIONER() );
<a name="l00248"></a>00248 }
<a name="l00249"></a>00249
<a name="l00251"></a>00251
<a name="l00252"></a>00252 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00253"></a><a class="code" href="a00274.html#gec1b7c03f9da909bef5db12e3d41bed3">00253</a> <span class="keywordtype">void</span> <a class="code" href="a00274.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00193.html">simple_partitioner</a>& partitioner ) {
+<a name="l00253"></a><a class="code" href="a00275.html#gec1b7c03f9da909bef5db12e3d41bed3">00253</a> <span class="keywordtype">void</span> <a class="code" href="a00275.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00193.html">simple_partitioner</a>& partitioner ) {
<a name="l00254"></a>00254 internal::start_reduce<Range,Body,const simple_partitioner>::run( range, body, partitioner );
<a name="l00255"></a>00255 }
<a name="l00256"></a>00256
<a name="l00258"></a>00258
<a name="l00259"></a>00259 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00260"></a><a class="code" href="a00274.html#g18a19157e6245992fc00ca0adeb7dd37">00260</a> <span class="keywordtype">void</span> <a class="code" href="a00274.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00146.html">auto_partitioner</a>& partitioner ) {
+<a name="l00260"></a><a class="code" href="a00275.html#g18a19157e6245992fc00ca0adeb7dd37">00260</a> <span class="keywordtype">void</span> <a class="code" href="a00275.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00145.html">auto_partitioner</a>& partitioner ) {
<a name="l00261"></a>00261 internal::start_reduce<Range,Body,const auto_partitioner>::run( range, body, partitioner );
<a name="l00262"></a>00262 }
<a name="l00263"></a>00263
<a name="l00265"></a>00265
<a name="l00266"></a>00266 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00267"></a><a class="code" href="a00274.html#gc61e73fcc36c92d79a217fc355ff4a6b">00267</a> <span class="keywordtype">void</span> <a class="code" href="a00274.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <a class="code" href="a00141.html">affinity_partitioner</a>& partitioner ) {
+<a name="l00267"></a><a class="code" href="a00275.html#gc61e73fcc36c92d79a217fc355ff4a6b">00267</a> <span class="keywordtype">void</span> <a class="code" href="a00275.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <a class="code" href="a00140.html">affinity_partitioner</a>& partitioner ) {
<a name="l00268"></a>00268 internal::start_reduce<Range,Body,affinity_partitioner>::run( range, body, partitioner );
<a name="l00269"></a>00269 }
<a name="l00270"></a>00270
<a name="l00271"></a>00271 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
<a name="l00273"></a>00273 <span class="preprocessor"></span>
<a name="l00274"></a>00274 <span class="preprocessor">template<typename Range, typename Body></span>
-<a name="l00275"></a><a class="code" href="a00274.html#g45cb00c42a18e334bbde8b7535afe460">00275</a> <span class="preprocessor"></span><span class="keywordtype">void</span> <a class="code" href="a00274.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00193.html">simple_partitioner</a>& partitioner, <a class="code" href="a00201.html">task_group_cont [...]
+<a name="l00275"></a><a class="code" href="a00275.html#g45cb00c42a18e334bbde8b7535afe460">00275</a> <span class="preprocessor"></span><span class="keywordtype">void</span> <a class="code" href="a00275.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00193.html">simple_partitioner</a>& partitioner, <a class="code" href="a00201.html">task_group_cont [...]
<a name="l00276"></a>00276 internal::start_reduce<Range,Body,const simple_partitioner>::run( range, body, partitioner, context );
<a name="l00277"></a>00277 }
<a name="l00278"></a>00278
<a name="l00280"></a>00280
<a name="l00281"></a>00281 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00282"></a><a class="code" href="a00274.html#g1c1ea1d7c61b3c225e92c70d669a53a5">00282</a> <span class="keywordtype">void</span> <a class="code" href="a00274.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00146.html">auto_partitioner</a>& partitioner, <a class="code" href="a00201.html">task_group_context</a>& context ) {
+<a name="l00282"></a><a class="code" href="a00275.html#g1c1ea1d7c61b3c225e92c70d669a53a5">00282</a> <span class="keywordtype">void</span> <a class="code" href="a00275.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00145.html">auto_partitioner</a>& partitioner, <a class="code" href="a00201.html">task_group_context</a>& context ) {
<a name="l00283"></a>00283 internal::start_reduce<Range,Body,const auto_partitioner>::run( range, body, partitioner, context );
<a name="l00284"></a>00284 }
<a name="l00285"></a>00285
<a name="l00287"></a>00287
<a name="l00288"></a>00288 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00289"></a><a class="code" href="a00274.html#gd9ac3a3811060314695f33b703c6e11b">00289</a> <span class="keywordtype">void</span> <a class="code" href="a00274.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <a class="code" href="a00141.html">affinity_partitioner</a>& partitioner, <a class="code" href="a00201.html">task_group_context</a>& context ) {
+<a name="l00289"></a><a class="code" href="a00275.html#gd9ac3a3811060314695f33b703c6e11b">00289</a> <span class="keywordtype">void</span> <a class="code" href="a00275.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <a class="code" href="a00140.html">affinity_partitioner</a>& partitioner, <a class="code" href="a00201.html">task_group_context</a>& context ) {
<a name="l00290"></a>00290 internal::start_reduce<Range,Body,affinity_partitioner>::run( range, body, partitioner, context );
<a name="l00291"></a>00291 }
<a name="l00292"></a>00292 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
@@ -275,7 +275,7 @@
<a name="l00297"></a>00297
<a name="l00298"></a>00298
<a name="l00299"></a>00299 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Value, <span class="keyword">typename</span> RealBody, <span class="keyword">typename</span> Reduction>
-<a name="l00300"></a><a class="code" href="a00274.html#gc9412e09fb01fcad8c018ea9cffb28ef">00300</a> Value <a class="code" href="a00274.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Value& identity, <span class="keyword">const</span> RealBody& real_body, <span class="keyword">const</span> Reduction& reduction ) {
+<a name="l00300"></a><a class="code" href="a00275.html#gc9412e09fb01fcad8c018ea9cffb28ef">00300</a> Value <a class="code" href="a00275.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Value& identity, <span class="keyword">const</span> RealBody& real_body, <span class="keyword">const</span> Reduction& reduction ) {
<a name="l00301"></a>00301 internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
<a name="l00302"></a>00302 internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<span class="keyword">const</span> __TBB_DEFAULT_PARTITIONER>
<a name="l00303"></a>00303 ::run(range, body, __TBB_DEFAULT_PARTITIONER() );
@@ -284,7 +284,7 @@
<a name="l00306"></a>00306
<a name="l00308"></a>00308
<a name="l00309"></a>00309 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Value, <span class="keyword">typename</span> RealBody, <span class="keyword">typename</span> Reduction>
-<a name="l00310"></a><a class="code" href="a00274.html#gaddffeec0e892ac3d6fc7fc2053e1eca">00310</a> Value <a class="code" href="a00274.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Value& identity, <span class="keyword">const</span> RealBody& real_body, <span class="keyword">const</span> Reduction& reduction,
+<a name="l00310"></a><a class="code" href="a00275.html#gaddffeec0e892ac3d6fc7fc2053e1eca">00310</a> Value <a class="code" href="a00275.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Value& identity, <span class="keyword">const</span> RealBody& real_body, <span class="keyword">const</span> Reduction& reduction,
<a name="l00311"></a>00311 <span class="keyword">const</span> <a class="code" href="a00193.html">simple_partitioner</a>& partitioner ) {
<a name="l00312"></a>00312 internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
<a name="l00313"></a>00313 internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<span class="keyword">const</span> <a class="code" href="a00193.html">simple_partitioner</a>>
@@ -294,20 +294,20 @@
<a name="l00317"></a>00317
<a name="l00319"></a>00319
<a name="l00320"></a>00320 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Value, <span class="keyword">typename</span> RealBody, <span class="keyword">typename</span> Reduction>
-<a name="l00321"></a><a class="code" href="a00274.html#gb175401f0729e40dd2c5860a17c14385">00321</a> Value <a class="code" href="a00274.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Value& identity, <span class="keyword">const</span> RealBody& real_body, <span class="keyword">const</span> Reduction& reduction,
-<a name="l00322"></a>00322 <span class="keyword">const</span> <a class="code" href="a00146.html">auto_partitioner</a>& partitioner ) {
+<a name="l00321"></a><a class="code" href="a00275.html#gb175401f0729e40dd2c5860a17c14385">00321</a> Value <a class="code" href="a00275.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Value& identity, <span class="keyword">const</span> RealBody& real_body, <span class="keyword">const</span> Reduction& reduction,
+<a name="l00322"></a>00322 <span class="keyword">const</span> <a class="code" href="a00145.html">auto_partitioner</a>& partitioner ) {
<a name="l00323"></a>00323 internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
-<a name="l00324"></a>00324 internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<span class="keyword">const</span> <a class="code" href="a00146.html">auto_partitioner</a>>
+<a name="l00324"></a>00324 internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<span class="keyword">const</span> <a class="code" href="a00145.html">auto_partitioner</a>>
<a name="l00325"></a>00325 ::run( range, body, partitioner );
<a name="l00326"></a>00326 <span class="keywordflow">return</span> body.result();
<a name="l00327"></a>00327 }
<a name="l00328"></a>00328
<a name="l00330"></a>00330
<a name="l00331"></a>00331 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Value, <span class="keyword">typename</span> RealBody, <span class="keyword">typename</span> Reduction>
-<a name="l00332"></a><a class="code" href="a00274.html#gb7f1f1828ae2b330ce05b8513a495154">00332</a> Value <a class="code" href="a00274.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Value& identity, <span class="keyword">const</span> RealBody& real_body, <span class="keyword">const</span> Reduction& reduction,
-<a name="l00333"></a>00333 <a class="code" href="a00141.html">affinity_partitioner</a>& partitioner ) {
+<a name="l00332"></a><a class="code" href="a00275.html#gb7f1f1828ae2b330ce05b8513a495154">00332</a> Value <a class="code" href="a00275.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Value& identity, <span class="keyword">const</span> RealBody& real_body, <span class="keyword">const</span> Reduction& reduction,
+<a name="l00333"></a>00333 <a class="code" href="a00140.html">affinity_partitioner</a>& partitioner ) {
<a name="l00334"></a>00334 internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
-<a name="l00335"></a>00335 internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<a class="code" href="a00141.html">affinity_partitioner</a>>
+<a name="l00335"></a>00335 internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<a class="code" href="a00140.html">affinity_partitioner</a>>
<a name="l00336"></a>00336 ::run( range, body, partitioner );
<a name="l00337"></a>00337 <span class="keywordflow">return</span> body.result();
<a name="l00338"></a>00338 }
@@ -315,7 +315,7 @@
<a name="l00340"></a>00340 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
<a name="l00342"></a>00342 <span class="preprocessor"></span>
<a name="l00343"></a>00343 <span class="preprocessor">template<typename Range, typename Value, typename RealBody, typename Reduction></span>
-<a name="l00344"></a><a class="code" href="a00274.html#gfbc0cc2026d87f11a96bcd62788f5bb5">00344</a> <span class="preprocessor"></span>Value <a class="code" href="a00274.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Value& identity, <span class="keyword">const</span> RealBody& real_body, <span class="keyword">const</span> Reduction& reduction,
+<a name="l00344"></a><a class="code" href="a00275.html#gfbc0cc2026d87f11a96bcd62788f5bb5">00344</a> <span class="preprocessor"></span>Value <a class="code" href="a00275.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Value& identity, <span class="keyword">const</span> RealBody& real_body, <span class="keyword">const</span> Reduction& reduction,
<a name="l00345"></a>00345 <span class="keyword">const</span> <a class="code" href="a00193.html">simple_partitioner</a>& partitioner, <a class="code" href="a00201.html">task_group_context</a>& context ) {
<a name="l00346"></a>00346 internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
<a name="l00347"></a>00347 internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<span class="keyword">const</span> <a class="code" href="a00193.html">simple_partitioner</a>>
@@ -325,20 +325,20 @@
<a name="l00351"></a>00351
<a name="l00353"></a>00353
<a name="l00354"></a>00354 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Value, <span class="keyword">typename</span> RealBody, <span class="keyword">typename</span> Reduction>
-<a name="l00355"></a><a class="code" href="a00274.html#g630c90a399937d9d4ae70ff883186dfd">00355</a> Value <a class="code" href="a00274.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Value& identity, <span class="keyword">const</span> RealBody& real_body, <span class="keyword">const</span> Reduction& reduction,
-<a name="l00356"></a>00356 <span class="keyword">const</span> <a class="code" href="a00146.html">auto_partitioner</a>& partitioner, <a class="code" href="a00201.html">task_group_context</a>& context ) {
+<a name="l00355"></a><a class="code" href="a00275.html#g630c90a399937d9d4ae70ff883186dfd">00355</a> Value <a class="code" href="a00275.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Value& identity, <span class="keyword">const</span> RealBody& real_body, <span class="keyword">const</span> Reduction& reduction,
+<a name="l00356"></a>00356 <span class="keyword">const</span> <a class="code" href="a00145.html">auto_partitioner</a>& partitioner, <a class="code" href="a00201.html">task_group_context</a>& context ) {
<a name="l00357"></a>00357 internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
-<a name="l00358"></a>00358 internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<span class="keyword">const</span> <a class="code" href="a00146.html">auto_partitioner</a>>
+<a name="l00358"></a>00358 internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<span class="keyword">const</span> <a class="code" href="a00145.html">auto_partitioner</a>>
<a name="l00359"></a>00359 ::run( range, body, partitioner, context );
<a name="l00360"></a>00360 <span class="keywordflow">return</span> body.result();
<a name="l00361"></a>00361 }
<a name="l00362"></a>00362
<a name="l00364"></a>00364
<a name="l00365"></a>00365 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Value, <span class="keyword">typename</span> RealBody, <span class="keyword">typename</span> Reduction>
-<a name="l00366"></a><a class="code" href="a00274.html#g496bd7eadb3b97495ccb5655ef90319e">00366</a> Value <a class="code" href="a00274.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Value& identity, <span class="keyword">const</span> RealBody& real_body, <span class="keyword">const</span> Reduction& reduction,
-<a name="l00367"></a>00367 <a class="code" href="a00141.html">affinity_partitioner</a>& partitioner, <a class="code" href="a00201.html">task_group_context</a>& context ) {
+<a name="l00366"></a><a class="code" href="a00275.html#g496bd7eadb3b97495ccb5655ef90319e">00366</a> Value <a class="code" href="a00275.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Value& identity, <span class="keyword">const</span> RealBody& real_body, <span class="keyword">const</span> Reduction& reduction,
+<a name="l00367"></a>00367 <a class="code" href="a00140.html">affinity_partitioner</a>& partitioner, <a class="code" href="a00201.html">task_group_context</a>& context ) {
<a name="l00368"></a>00368 internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
-<a name="l00369"></a>00369 internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<a class="code" href="a00141.html">affinity_partitioner</a>>
+<a name="l00369"></a>00369 internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<a class="code" href="a00140.html">affinity_partitioner</a>>
<a name="l00370"></a>00370 ::run( range, body, partitioner, context );
<a name="l00371"></a>00371 <span class="keywordflow">return</span> body.result();
<a name="l00372"></a>00372 }
diff --git a/doc/html/a00396.html b/doc/html/a00396.html
index 44a10c9..dbb49ca 100644
--- a/doc/html/a00396.html
+++ b/doc/html/a00396.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>parallel_sort.h Source File</title>
+<title>parallel_scan.h Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -19,7 +19,7 @@
<li><a href="files.html"><span>File List</span></a></li>
<li><a href="globals.html"><span>File Members</span></a></li>
</ul></div>
-<h1>parallel_sort.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<h1>parallel_scan.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
<a name="l00003"></a>00003 <span class="comment"></span>
<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
@@ -39,181 +39,297 @@
<a name="l00018"></a>00018 <span class="comment"> writing.</span>
<a name="l00019"></a>00019 <span class="comment">*/</span>
<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_parallel_sort_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_parallel_sort_H</span>
+<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_parallel_scan_H</span>
+<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_parallel_scan_H</span>
<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "parallel_for.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "blocked_range.h"</span>
-<a name="l00026"></a>00026 <span class="preprocessor">#include <algorithm></span>
-<a name="l00027"></a>00027 <span class="preprocessor">#include <iterator></span>
-<a name="l00028"></a>00028 <span class="preprocessor">#include <functional></span>
-<a name="l00029"></a>00029
-<a name="l00030"></a>00030 <span class="keyword">namespace </span>tbb {
-<a name="l00031"></a>00031
-<a name="l00033"></a>00033 <span class="keyword">namespace </span>internal {
-<a name="l00034"></a>00034
+<a name="l00024"></a>00024 <span class="preprocessor">#include "task.h"</span>
+<a name="l00025"></a>00025 <span class="preprocessor">#include "aligned_space.h"</span>
+<a name="l00026"></a>00026 <span class="preprocessor">#include <new></span>
+<a name="l00027"></a>00027 <span class="preprocessor">#include "partitioner.h"</span>
+<a name="l00028"></a>00028
+<a name="l00029"></a>00029 <span class="keyword">namespace </span>tbb {
+<a name="l00030"></a>00030
+<a name="l00032"></a>00032
+<a name="l00033"></a><a class="code" href="a00181.html">00033</a> <span class="keyword">struct </span><a class="code" href="a00181.html">pre_scan_tag</a> {
+<a name="l00034"></a>00034 <span class="keyword">static</span> <span class="keywordtype">bool</span> is_final_scan() {<span class="keywordflow">return</span> <span class="keyword">false</span>;}
+<a name="l00035"></a>00035 };
<a name="l00036"></a>00036
-<a name="l00039"></a>00039 <span class="keyword">template</span><<span class="keyword">typename</span> RandomAccessIterator, <span class="keyword">typename</span> Compare>
-<a name="l00040"></a>00040 <span class="keyword">class </span>quick_sort_range: <span class="keyword">private</span> no_assign {
-<a name="l00041"></a>00041
-<a name="l00042"></a>00042 <span class="keyword">inline</span> size_t median_of_three(<span class="keyword">const</span> RandomAccessIterator &array, size_t l, size_t m, size_t r)<span class="keyword"> const </span>{
-<a name="l00043"></a>00043 <span class="keywordflow">return</span> comp(array[l], array[m]) ? ( comp(array[m], array[r]) ? m : ( comp( array[l], array[r]) ? r : l ) )
-<a name="l00044"></a>00044 : ( comp(array[r], array[m]) ? m : ( comp( array[r], array[l] ) ? r : l ) );
-<a name="l00045"></a>00045 }
-<a name="l00046"></a>00046
-<a name="l00047"></a>00047 <span class="keyword">inline</span> size_t pseudo_median_of_nine( <span class="keyword">const</span> RandomAccessIterator &array, <span class="keyword">const</span> quick_sort_range &range )<span class="keyword"> const </span>{
-<a name="l00048"></a>00048 size_t offset = range.size/8u;
-<a name="l00049"></a>00049 <span class="keywordflow">return</span> median_of_three(array,
-<a name="l00050"></a>00050 median_of_three(array, 0, offset, offset*2),
-<a name="l00051"></a>00051 median_of_three(array, offset*3, offset*4, offset*5),
-<a name="l00052"></a>00052 median_of_three(array, offset*6, offset*7, range.size - 1) );
-<a name="l00053"></a>00053
-<a name="l00054"></a>00054 }
-<a name="l00055"></a>00055
-<a name="l00056"></a>00056 <span class="keyword">public</span>:
-<a name="l00057"></a>00057
-<a name="l00058"></a>00058 <span class="keyword">static</span> <span class="keyword">const</span> size_t grainsize = 500;
-<a name="l00059"></a>00059 <span class="keyword">const</span> Compare ∁
-<a name="l00060"></a>00060 RandomAccessIterator begin;
-<a name="l00061"></a>00061 size_t size;
-<a name="l00062"></a>00062
-<a name="l00063"></a>00063 quick_sort_range( RandomAccessIterator begin_, size_t size_, <span class="keyword">const</span> Compare &comp_ ) :
-<a name="l00064"></a>00064 comp(comp_), begin(begin_), size(size_) {}
-<a name="l00065"></a>00065
-<a name="l00066"></a>00066 <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{<span class="keywordflow">return</span> size==0;}
-<a name="l00067"></a>00067 <span class="keywordtype">bool</span> is_divisible()<span class="keyword"> const </span>{<span class="keywordflow">return</span> size>=grainsize;}
-<a name="l00068"></a>00068
-<a name="l00069"></a>00069 quick_sort_range( quick_sort_range& range, split ) : comp(range.comp) {
-<a name="l00070"></a>00070 RandomAccessIterator array = range.begin;
-<a name="l00071"></a>00071 RandomAccessIterator key0 = range.begin;
-<a name="l00072"></a>00072 size_t m = pseudo_median_of_nine(array, range);
-<a name="l00073"></a>00073 <span class="keywordflow">if</span> (m) std::swap ( array[0], array[m] );
-<a name="l00074"></a>00074
-<a name="l00075"></a>00075 size_t i=0;
-<a name="l00076"></a>00076 size_t j=range.size;
-<a name="l00077"></a>00077 <span class="comment">// Partition interval [i+1,j-1] with key *key0.</span>
-<a name="l00078"></a>00078 <span class="keywordflow">for</span>(;;) {
-<a name="l00079"></a>00079 __TBB_ASSERT( i<j, NULL );
-<a name="l00080"></a>00080 <span class="comment">// Loop must terminate since array[l]==*key0.</span>
-<a name="l00081"></a>00081 <span class="keywordflow">do</span> {
-<a name="l00082"></a>00082 --j;
-<a name="l00083"></a>00083 __TBB_ASSERT( i<=j, <span class="stringliteral">"bad ordering relation?"</span> );
-<a name="l00084"></a>00084 } <span class="keywordflow">while</span>( comp( *key0, array[j] ));
-<a name="l00085"></a>00085 <span class="keywordflow">do</span> {
-<a name="l00086"></a>00086 __TBB_ASSERT( i<=j, NULL );
-<a name="l00087"></a>00087 <span class="keywordflow">if</span>( i==j ) <span class="keywordflow">goto</span> partition;
-<a name="l00088"></a>00088 ++i;
-<a name="l00089"></a>00089 } <span class="keywordflow">while</span>( comp( array[i],*key0 ));
-<a name="l00090"></a>00090 <span class="keywordflow">if</span>( i==j ) <span class="keywordflow">goto</span> partition;
-<a name="l00091"></a>00091 std::swap( array[i], array[j] );
-<a name="l00092"></a>00092 }
-<a name="l00093"></a>00093 partition:
-<a name="l00094"></a>00094 <span class="comment">// Put the partition key were it belongs</span>
-<a name="l00095"></a>00095 std::swap( array[j], *key0 );
-<a name="l00096"></a>00096 <span class="comment">// array[l..j) is less or equal to key.</span>
-<a name="l00097"></a>00097 <span class="comment">// array(j..r) is greater or equal to key.</span>
-<a name="l00098"></a>00098 <span class="comment">// array[j] is equal to key</span>
-<a name="l00099"></a>00099 i=j+1;
-<a name="l00100"></a>00100 begin = array+i;
-<a name="l00101"></a>00101 size = range.size-i;
-<a name="l00102"></a>00102 range.size = j;
-<a name="l00103"></a>00103 }
-<a name="l00104"></a>00104 };
-<a name="l00105"></a>00105
-<a name="l00107"></a>00107
-<a name="l00108"></a>00108 <span class="keyword">template</span><<span class="keyword">typename</span> RandomAccessIterator, <span class="keyword">typename</span> Compare>
-<a name="l00109"></a>00109 <span class="keyword">class </span>quick_sort_pretest_body : internal::no_assign {
-<a name="l00110"></a>00110 <span class="keyword">const</span> Compare ∁
-<a name="l00111"></a>00111
-<a name="l00112"></a>00112 <span class="keyword">public</span>:
-<a name="l00113"></a>00113 quick_sort_pretest_body(<span class="keyword">const</span> Compare &_comp) : comp(_comp) {}
-<a name="l00114"></a>00114
-<a name="l00115"></a>00115 <span class="keywordtype">void</span> operator()( <span class="keyword">const</span> blocked_range<RandomAccessIterator>& range )<span class="keyword"> const </span>{
-<a name="l00116"></a>00116 task &my_task = <a class="code" href="a00199.html#bd43e8d6249738efafd12d6a4c72c5e3">task::self</a>();
-<a name="l00117"></a>00117 RandomAccessIterator my_end = range.end();
-<a name="l00118"></a>00118
-<a name="l00119"></a>00119 <span class="keywordtype">int</span> i = 0;
-<a name="l00120"></a>00120 <span class="keywordflow">for</span> (RandomAccessIterator k = range.begin(); k != my_end; ++k, ++i) {
-<a name="l00121"></a>00121 <span class="keywordflow">if</span> ( i%64 == 0 && my_task.is_cancelled() ) <span class="keywordflow">break</span>;
-<a name="l00122"></a>00122
-<a name="l00123"></a>00123 <span class="comment">// The k-1 is never out-of-range because the first chunk starts at begin+serial_cutoff+1</span>
-<a name="l00124"></a>00124 <span class="keywordflow">if</span> ( comp( *(k), *(k-1) ) ) {
-<a name="l00125"></a>00125 my_task.cancel_group_execution();
-<a name="l00126"></a>00126 <span class="keywordflow">break</span>;
-<a name="l00127"></a>00127 }
-<a name="l00128"></a>00128 }
-<a name="l00129"></a>00129 }
-<a name="l00130"></a>00130
-<a name="l00131"></a>00131 };
-<a name="l00132"></a>00132
-<a name="l00134"></a>00134
-<a name="l00135"></a>00135 <span class="keyword">template</span><<span class="keyword">typename</span> RandomAccessIterator, <span class="keyword">typename</span> Compare>
-<a name="l00136"></a>00136 <span class="keyword">struct </span>quick_sort_body {
-<a name="l00137"></a>00137 <span class="keywordtype">void</span> operator()( <span class="keyword">const</span> quick_sort_range<RandomAccessIterator,Compare>& range )<span class="keyword"> const </span>{
-<a name="l00138"></a>00138 <span class="comment">//SerialQuickSort( range.begin, range.size, range.comp );</span>
-<a name="l00139"></a>00139 std::sort( range.begin, range.begin + range.size, range.comp );
-<a name="l00140"></a>00140 }
-<a name="l00141"></a>00141 };
-<a name="l00142"></a>00142
-<a name="l00144"></a>00144
-<a name="l00145"></a>00145 <span class="keyword">template</span><<span class="keyword">typename</span> RandomAccessIterator, <span class="keyword">typename</span> Compare>
-<a name="l00146"></a>00146 <span class="keywordtype">void</span> parallel_quick_sort( RandomAccessIterator begin, RandomAccessIterator end, <span class="keyword">const</span> Compare& comp ) {
-<a name="l00147"></a>00147 task_group_context my_context;
-<a name="l00148"></a>00148 <span class="keyword">const</span> <span class="keywordtype">int</span> serial_cutoff = 9;
-<a name="l00149"></a>00149
-<a name="l00150"></a>00150 __TBB_ASSERT( begin + serial_cutoff < end, <span class="stringliteral">"min_parallel_size is smaller than serial cutoff?"</span> );
-<a name="l00151"></a>00151 RandomAccessIterator k;
-<a name="l00152"></a>00152 <span class="keywordflow">for</span> ( k = begin ; k != begin + serial_cutoff; ++k ) {
-<a name="l00153"></a>00153 <span class="keywordflow">if</span> ( comp( *(k+1), *k ) ) {
-<a name="l00154"></a>00154 <span class="keywordflow">goto</span> do_parallel_quick_sort;
-<a name="l00155"></a>00155 }
-<a name="l00156"></a>00156 }
-<a name="l00157"></a>00157
-<a name="l00158"></a>00158 <a class="code" href="a00274.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( blocked_range<RandomAccessIterator>(k+1, end),
-<a name="l00159"></a>00159 quick_sort_pretest_body<RandomAccessIterator,Compare>(comp),
-<a name="l00160"></a>00160 auto_partitioner(),
-<a name="l00161"></a>00161 my_context);
-<a name="l00162"></a>00162
-<a name="l00163"></a>00163 <span class="keywordflow">if</span> (my_context.is_group_execution_cancelled())
-<a name="l00164"></a>00164 do_parallel_quick_sort:
-<a name="l00165"></a>00165 <a class="code" href="a00274.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( quick_sort_range<RandomAccessIterator,Compare>(begin, end-begin, comp ),
-<a name="l00166"></a>00166 quick_sort_body<RandomAccessIterator,Compare>(),
-<a name="l00167"></a>00167 auto_partitioner() );
-<a name="l00168"></a>00168 }
-<a name="l00169"></a>00169
-<a name="l00170"></a>00170 } <span class="comment">// namespace internal</span>
-<a name="l00172"></a>00172 <span class="comment"></span>
-<a name="l00183"></a>00183
-<a name="l00185"></a>00185
-<a name="l00188"></a>00188 <span class="keyword">template</span><<span class="keyword">typename</span> RandomAccessIterator, <span class="keyword">typename</span> Compare>
-<a name="l00189"></a><a class="code" href="a00274.html#g49edcf9447cd91a9527a3f8e8512b7aa">00189</a> <span class="keywordtype">void</span> <a class="code" href="a00274.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a>( RandomAccessIterator begin, RandomAccessIterator end, <span class="keyword">const</span> Compare& comp) {
-<a name="l00190"></a>00190 <span class="keyword">const</span> <span class="keywordtype">int</span> min_parallel_size = 500;
-<a name="l00191"></a>00191 <span class="keywordflow">if</span>( end > begin ) {
-<a name="l00192"></a>00192 <span class="keywordflow">if</span> (end - begin < min_parallel_size) {
-<a name="l00193"></a>00193 std::sort(begin, end, comp);
-<a name="l00194"></a>00194 } <span class="keywordflow">else</span> {
-<a name="l00195"></a>00195 internal::parallel_quick_sort(begin, end, comp);
-<a name="l00196"></a>00196 }
-<a name="l00197"></a>00197 }
-<a name="l00198"></a>00198 }
-<a name="l00199"></a>00199
-<a name="l00201"></a>00201
-<a name="l00202"></a>00202 <span class="keyword">template</span><<span class="keyword">typename</span> RandomAccessIterator>
-<a name="l00203"></a><a class="code" href="a00274.html#g16c3eb77d0e530834c51ce3857f01012">00203</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00274.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a>( RandomAccessIterator begin, RandomAccessIterator end ) {
-<a name="l00204"></a>00204 <a class="code" href="a00274.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a>( begin, end, std::less< <span class="keyword">typename</span> std::iterator_traits<RandomAccessIterator>::value_type >() );
-<a name="l00205"></a>00205 }
-<a name="l00206"></a>00206
+<a name="l00038"></a>00038
+<a name="l00039"></a><a class="code" href="a00166.html">00039</a> <span class="keyword">struct </span><a class="code" href="a00166.html">final_scan_tag</a> {
+<a name="l00040"></a>00040 <span class="keyword">static</span> <span class="keywordtype">bool</span> is_final_scan() {<span class="keywordflow">return</span> <span class="keyword">true</span>;}
+<a name="l00041"></a>00041 };
+<a name="l00042"></a>00042
+<a name="l00044"></a>00044 <span class="keyword">namespace </span>internal {
+<a name="l00045"></a>00045
+<a name="l00047"></a>00047
+<a name="l00048"></a>00048 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
+<a name="l00049"></a>00049 <span class="keyword">class </span>final_sum: <span class="keyword">public</span> <a class="code" href="a00199.html">task</a> {
+<a name="l00050"></a>00050 <span class="keyword">public</span>:
+<a name="l00051"></a>00051 Body body;
+<a name="l00052"></a>00052 <span class="keyword">private</span>:
+<a name="l00053"></a>00053 <a class="code" href="a00141.html">aligned_space<Range,1></a> range;
+<a name="l00055"></a>00055 Body* stuff_last;
+<a name="l00056"></a>00056 <span class="keyword">public</span>:
+<a name="l00057"></a>00057 final_sum( Body& body_ ) :
+<a name="l00058"></a>00058 body(body_,<a class="code" href="a00198.html">split</a>())
+<a name="l00059"></a>00059 {
+<a name="l00060"></a>00060 poison_pointer(stuff_last);
+<a name="l00061"></a>00061 }
+<a name="l00062"></a>00062 ~final_sum() {
+<a name="l00063"></a>00063 range.begin()->~Range();
+<a name="l00064"></a>00064 }
+<a name="l00065"></a>00065 <span class="keywordtype">void</span> finish_construction( <span class="keyword">const</span> Range& range_, Body* stuff_last_ ) {
+<a name="l00066"></a>00066 <span class="keyword">new</span>( range.begin() ) Range(range_);
+<a name="l00067"></a>00067 stuff_last = stuff_last_;
+<a name="l00068"></a>00068 }
+<a name="l00069"></a>00069 <span class="keyword">private</span>:
+<a name="l00070"></a>00070 <span class="comment">/*override*/</span> task* execute() {
+<a name="l00071"></a>00071 body( *range.begin(), final_scan_tag() );
+<a name="l00072"></a>00072 <span class="keywordflow">if</span>( stuff_last )
+<a name="l00073"></a>00073 stuff_last->assign(body);
+<a name="l00074"></a>00074 <span class="keywordflow">return</span> NULL;
+<a name="l00075"></a>00075 }
+<a name="l00076"></a>00076 };
+<a name="l00077"></a>00077
+<a name="l00079"></a>00079
+<a name="l00080"></a>00080 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
+<a name="l00081"></a>00081 <span class="keyword">class </span>sum_node: <span class="keyword">public</span> task {
+<a name="l00082"></a>00082 <span class="keyword">typedef</span> final_sum<Range,Body> final_sum_type;
+<a name="l00083"></a>00083 <span class="keyword">public</span>:
+<a name="l00084"></a>00084 final_sum_type *incoming;
+<a name="l00085"></a>00085 final_sum_type *body;
+<a name="l00086"></a>00086 Body *stuff_last;
+<a name="l00087"></a>00087 <span class="keyword">private</span>:
+<a name="l00088"></a>00088 final_sum_type *left_sum;
+<a name="l00089"></a>00089 sum_node *left;
+<a name="l00090"></a>00090 sum_node *right;
+<a name="l00091"></a>00091 <span class="keywordtype">bool</span> left_is_final;
+<a name="l00092"></a>00092 Range range;
+<a name="l00093"></a>00093 sum_node( <span class="keyword">const</span> Range range_, <span class="keywordtype">bool</span> left_is_final_ ) :
+<a name="l00094"></a>00094 left_sum(NULL),
+<a name="l00095"></a>00095 left(NULL),
+<a name="l00096"></a>00096 right(NULL),
+<a name="l00097"></a>00097 left_is_final(left_is_final_),
+<a name="l00098"></a>00098 range(range_)
+<a name="l00099"></a>00099 {
+<a name="l00100"></a>00100 <span class="comment">// Poison fields that will be set by second pass.</span>
+<a name="l00101"></a>00101 poison_pointer(body);
+<a name="l00102"></a>00102 poison_pointer(incoming);
+<a name="l00103"></a>00103 }
+<a name="l00104"></a>00104 task* create_child( <span class="keyword">const</span> Range& range_, final_sum_type& f, sum_node* n, final_sum_type* incoming_, Body* stuff_last_ ) {
+<a name="l00105"></a>00105 <span class="keywordflow">if</span>( !n ) {
+<a name="l00106"></a>00106 f.recycle_as_child_of( *<span class="keyword">this</span> );
+<a name="l00107"></a>00107 f.finish_construction( range_, stuff_last_ );
+<a name="l00108"></a>00108 <span class="keywordflow">return</span> &f;
+<a name="l00109"></a>00109 } <span class="keywordflow">else</span> {
+<a name="l00110"></a>00110 n->body = &f;
+<a name="l00111"></a>00111 n->incoming = incoming_;
+<a name="l00112"></a>00112 n->stuff_last = stuff_last_;
+<a name="l00113"></a>00113 <span class="keywordflow">return</span> n;
+<a name="l00114"></a>00114 }
+<a name="l00115"></a>00115 }
+<a name="l00116"></a>00116 <span class="comment">/*override*/</span> task* execute() {
+<a name="l00117"></a>00117 <span class="keywordflow">if</span>( body ) {
+<a name="l00118"></a>00118 <span class="keywordflow">if</span>( incoming )
+<a name="l00119"></a>00119 left_sum->body.reverse_join( incoming->body );
+<a name="l00120"></a>00120 recycle_as_continuation();
+<a name="l00121"></a>00121 sum_node& c = *<span class="keyword">this</span>;
+<a name="l00122"></a>00122 task* b = c.create_child(Range(range,split()),*left_sum,right,left_sum,stuff_last);
+<a name="l00123"></a>00123 task* a = left_is_final ? NULL : c.create_child(range,*body,left,incoming,NULL);
+<a name="l00124"></a>00124 set_ref_count( (a!=NULL)+(b!=NULL) );
+<a name="l00125"></a>00125 body = NULL;
+<a name="l00126"></a>00126 <span class="keywordflow">if</span>( a ) spawn(*b);
+<a name="l00127"></a>00127 <span class="keywordflow">else</span> a = b;
+<a name="l00128"></a>00128 <span class="keywordflow">return</span> a;
+<a name="l00129"></a>00129 } <span class="keywordflow">else</span> {
+<a name="l00130"></a>00130 <span class="keywordflow">return</span> NULL;
+<a name="l00131"></a>00131 }
+<a name="l00132"></a>00132 }
+<a name="l00133"></a>00133 <span class="keyword">template</span><<span class="keyword">typename</span> Range_,<span class="keyword">typename</span> Body_,<span class="keyword">typename</span> Partitioner_>
+<a name="l00134"></a>00134 <span class="keyword">friend</span> <span class="keyword">class </span>start_scan;
+<a name="l00135"></a>00135
+<a name="l00136"></a>00136 <span class="keyword">template</span><<span class="keyword">typename</span> Range_,<span class="keyword">typename</span> Body_>
+<a name="l00137"></a>00137 <span class="keyword">friend</span> <span class="keyword">class </span>finish_scan;
+<a name="l00138"></a>00138 };
+<a name="l00139"></a>00139
+<a name="l00141"></a>00141
+<a name="l00142"></a>00142 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
+<a name="l00143"></a>00143 <span class="keyword">class </span>finish_scan: <span class="keyword">public</span> task {
+<a name="l00144"></a>00144 <span class="keyword">typedef</span> sum_node<Range,Body> sum_node_type;
+<a name="l00145"></a>00145 <span class="keyword">typedef</span> final_sum<Range,Body> final_sum_type;
+<a name="l00146"></a>00146 final_sum_type** <span class="keyword">const</span> sum;
+<a name="l00147"></a>00147 sum_node_type*& return_slot;
+<a name="l00148"></a>00148 <span class="keyword">public</span>:
+<a name="l00149"></a>00149 final_sum_type* right_zombie;
+<a name="l00150"></a>00150 sum_node_type& result;
+<a name="l00151"></a>00151
+<a name="l00152"></a>00152 <span class="comment">/*override*/</span> task* execute() {
+<a name="l00153"></a>00153 __TBB_ASSERT( result.ref_count()==(result.left!=NULL)+(result.right!=NULL), NULL );
+<a name="l00154"></a>00154 <span class="keywordflow">if</span>( result.left )
+<a name="l00155"></a>00155 result.left_is_final = <span class="keyword">false</span>;
+<a name="l00156"></a>00156 <span class="keywordflow">if</span>( right_zombie && sum )
+<a name="l00157"></a>00157 ((*sum)->body).reverse_join(result.left_sum->body);
+<a name="l00158"></a>00158 __TBB_ASSERT( !return_slot, NULL );
+<a name="l00159"></a>00159 <span class="keywordflow">if</span>( right_zombie || result.right ) {
+<a name="l00160"></a>00160 return_slot = &result;
+<a name="l00161"></a>00161 } <span class="keywordflow">else</span> {
+<a name="l00162"></a>00162 destroy( result );
+<a name="l00163"></a>00163 }
+<a name="l00164"></a>00164 <span class="keywordflow">if</span>( right_zombie && !sum && !result.right ) destroy(*right_zombie);
+<a name="l00165"></a>00165 <span class="keywordflow">return</span> NULL;
+<a name="l00166"></a>00166 }
+<a name="l00167"></a>00167
+<a name="l00168"></a>00168 finish_scan( sum_node_type*& return_slot_, final_sum_type** sum_, sum_node_type& result_ ) :
+<a name="l00169"></a>00169 sum(sum_),
+<a name="l00170"></a>00170 return_slot(return_slot_),
+<a name="l00171"></a>00171 right_zombie(NULL),
+<a name="l00172"></a>00172 result(result_)
+<a name="l00173"></a>00173 {
+<a name="l00174"></a>00174 __TBB_ASSERT( !return_slot, NULL );
+<a name="l00175"></a>00175 }
+<a name="l00176"></a>00176 };
+<a name="l00177"></a>00177
+<a name="l00179"></a>00179
+<a name="l00180"></a>00180 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner=simple_partitioner>
+<a name="l00181"></a>00181 <span class="keyword">class </span>start_scan: <span class="keyword">public</span> task {
+<a name="l00182"></a>00182 <span class="keyword">typedef</span> sum_node<Range,Body> sum_node_type;
+<a name="l00183"></a>00183 <span class="keyword">typedef</span> final_sum<Range,Body> final_sum_type;
+<a name="l00184"></a>00184 final_sum_type* body;
+<a name="l00186"></a>00186 final_sum_type** sum;
+<a name="l00187"></a>00187 sum_node_type** return_slot;
+<a name="l00189"></a>00189 sum_node_type* parent_sum;
+<a name="l00190"></a>00190 <span class="keywordtype">bool</span> is_final;
+<a name="l00191"></a>00191 <span class="keywordtype">bool</span> is_right_child;
+<a name="l00192"></a>00192 Range range;
+<a name="l00193"></a>00193 <span class="keyword">typename</span> Partitioner::partition_type partition;
+<a name="l00194"></a>00194 <span class="comment">/*override*/</span> task* execute();
+<a name="l00195"></a>00195 <span class="keyword">public</span>:
+<a name="l00196"></a>00196 start_scan( sum_node_type*& return_slot_, start_scan& parent_, sum_node_type* parent_sum_ ) :
+<a name="l00197"></a>00197 body(parent_.body),
+<a name="l00198"></a>00198 sum(parent_.sum),
+<a name="l00199"></a>00199 return_slot(&return_slot_),
+<a name="l00200"></a>00200 parent_sum(parent_sum_),
+<a name="l00201"></a>00201 is_final(parent_.is_final),
+<a name="l00202"></a>00202 is_right_child(false),
+<a name="l00203"></a>00203 range(parent_.range,split()),
+<a name="l00204"></a>00204 partition(parent_.partition,split())
+<a name="l00205"></a>00205 {
+<a name="l00206"></a>00206 __TBB_ASSERT( !*return_slot, NULL );
+<a name="l00207"></a>00207 }
<a name="l00208"></a>00208
-<a name="l00209"></a>00209 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00210"></a><a class="code" href="a00274.html#gc7576f82fdedc8a701a6c17ad9415926">00210</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00274.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a>( T * begin, T * end ) {
-<a name="l00211"></a>00211 <a class="code" href="a00274.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a>( begin, end, std::less< T >() );
-<a name="l00212"></a>00212 }
-<a name="l00214"></a>00214
-<a name="l00215"></a>00215
-<a name="l00216"></a>00216 } <span class="comment">// namespace tbb</span>
-<a name="l00217"></a>00217
-<a name="l00218"></a>00218 <span class="preprocessor">#endif</span>
-<a name="l00219"></a>00219 <span class="preprocessor"></span>
+<a name="l00209"></a>00209 start_scan( sum_node_type*& return_slot_, <span class="keyword">const</span> Range& range_, final_sum_type& body_, <span class="keyword">const</span> Partitioner& partitioner_) :
+<a name="l00210"></a>00210 body(&body_),
+<a name="l00211"></a>00211 sum(NULL),
+<a name="l00212"></a>00212 return_slot(&return_slot_),
+<a name="l00213"></a>00213 parent_sum(NULL),
+<a name="l00214"></a>00214 is_final(true),
+<a name="l00215"></a>00215 is_right_child(false),
+<a name="l00216"></a>00216 range(range_),
+<a name="l00217"></a>00217 partition(partitioner_)
+<a name="l00218"></a>00218 {
+<a name="l00219"></a>00219 __TBB_ASSERT( !*return_slot, NULL );
+<a name="l00220"></a>00220 }
+<a name="l00221"></a>00221
+<a name="l00222"></a>00222 <span class="keyword">static</span> <span class="keywordtype">void</span> run( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> Partitioner& partitioner ) {
+<a name="l00223"></a>00223 <span class="keywordflow">if</span>( !range.empty() ) {
+<a name="l00224"></a>00224 <span class="keyword">typedef</span> internal::start_scan<Range,Body,Partitioner> start_pass1_type;
+<a name="l00225"></a>00225 internal::sum_node<Range,Body>* root = NULL;
+<a name="l00226"></a>00226 <span class="keyword">typedef</span> internal::final_sum<Range,Body> final_sum_type;
+<a name="l00227"></a>00227 final_sum_type* temp_body = <span class="keyword">new</span>(<a class="code" href="a00199.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>()) final_sum_type( body );
+<a name="l00228"></a>00228 start_pass1_type& pass1 = *<span class="keyword">new</span>(<a class="code" href="a00199.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>()) start_pass1_type(
+<a name="l00229"></a>00229 <span class="comment">/*return_slot=*/</span>root,
+<a name="l00230"></a>00230 range,
+<a name="l00231"></a>00231 *temp_body,
+<a name="l00232"></a>00232 partitioner );
+<a name="l00233"></a>00233 <a class="code" href="a00199.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>( pass1 );
+<a name="l00234"></a>00234 <span class="keywordflow">if</span>( root ) {
+<a name="l00235"></a>00235 root->body = temp_body;
+<a name="l00236"></a>00236 root->incoming = NULL;
+<a name="l00237"></a>00237 root->stuff_last = &body;
+<a name="l00238"></a>00238 <a class="code" href="a00199.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>( *root );
+<a name="l00239"></a>00239 } <span class="keywordflow">else</span> {
+<a name="l00240"></a>00240 body.assign(temp_body->body);
+<a name="l00241"></a>00241 temp_body->finish_construction( range, NULL );
+<a name="l00242"></a>00242 temp_body->destroy(*temp_body);
+<a name="l00243"></a>00243 }
+<a name="l00244"></a>00244 }
+<a name="l00245"></a>00245 }
+<a name="l00246"></a>00246 };
+<a name="l00247"></a>00247
+<a name="l00248"></a>00248 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner>
+<a name="l00249"></a>00249 task* start_scan<Range,Body,Partitioner>::execute() {
+<a name="l00250"></a>00250 <span class="keyword">typedef</span> internal::finish_scan<Range,Body> finish_pass1_type;
+<a name="l00251"></a>00251 finish_pass1_type* p = parent_sum ? static_cast<finish_pass1_type*>( parent() ) : NULL;
+<a name="l00252"></a>00252 <span class="comment">// Inspecting p->result.left_sum would ordinarily be a race condition.</span>
+<a name="l00253"></a>00253 <span class="comment">// But we inspect it only if we are not a stolen task, in which case we</span>
+<a name="l00254"></a>00254 <span class="comment">// know that task assigning to p->result.left_sum has completed.</span>
+<a name="l00255"></a>00255 <span class="keywordtype">bool</span> treat_as_stolen = is_right_child && (is_stolen_task() || body!=p->result.left_sum);
+<a name="l00256"></a>00256 <span class="keywordflow">if</span>( treat_as_stolen ) {
+<a name="l00257"></a>00257 <span class="comment">// Invocation is for right child that has been really stolen or needs to be virtually stolen</span>
+<a name="l00258"></a>00258 p->right_zombie = body = <span class="keyword">new</span>( allocate_root() ) final_sum_type(body->body);
+<a name="l00259"></a>00259 is_final = <span class="keyword">false</span>;
+<a name="l00260"></a>00260 }
+<a name="l00261"></a>00261 task* next_task = NULL;
+<a name="l00262"></a>00262 <span class="keywordflow">if</span>( (is_right_child && !treat_as_stolen) || !range.is_divisible() || partition.should_execute_range(*<span class="keyword">this</span>) ) {
+<a name="l00263"></a>00263 <span class="keywordflow">if</span>( is_final )
+<a name="l00264"></a>00264 (body->body)( range, final_scan_tag() );
+<a name="l00265"></a>00265 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( sum )
+<a name="l00266"></a>00266 (body->body)( range, pre_scan_tag() );
+<a name="l00267"></a>00267 <span class="keywordflow">if</span>( sum )
+<a name="l00268"></a>00268 *sum = body;
+<a name="l00269"></a>00269 __TBB_ASSERT( !*return_slot, NULL );
+<a name="l00270"></a>00270 } <span class="keywordflow">else</span> {
+<a name="l00271"></a>00271 sum_node_type* result;
+<a name="l00272"></a>00272 <span class="keywordflow">if</span>( parent_sum )
+<a name="l00273"></a>00273 result = <span class="keyword">new</span>(allocate_additional_child_of(*parent_sum)) sum_node_type(range,<span class="comment">/*left_is_final=*/</span>is_final);
+<a name="l00274"></a>00274 <span class="keywordflow">else</span>
+<a name="l00275"></a>00275 result = <span class="keyword">new</span>(<a class="code" href="a00199.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>()) sum_node_type(range,<span class="comment">/*left_is_final=*/</span>is_final);
+<a name="l00276"></a>00276 finish_pass1_type& c = *<span class="keyword">new</span>( allocate_continuation()) finish_pass1_type(*return_slot,sum,*result);
+<a name="l00277"></a>00277 <span class="comment">// Split off right child</span>
+<a name="l00278"></a>00278 start_scan& b = *<span class="keyword">new</span>( c.allocate_child() ) start_scan( <span class="comment">/*return_slot=*/</span>result->right, *<span class="keyword">this</span>, result );
+<a name="l00279"></a>00279 b.is_right_child = <span class="keyword">true</span>;
+<a name="l00280"></a>00280 <span class="comment">// Left child is recycling of *this. Must recycle this before spawning b, </span>
+<a name="l00281"></a>00281 <span class="comment">// otherwise b might complete and decrement c.ref_count() to zero, which</span>
+<a name="l00282"></a>00282 <span class="comment">// would cause c.execute() to run prematurely.</span>
+<a name="l00283"></a>00283 recycle_as_child_of(c);
+<a name="l00284"></a>00284 c.set_ref_count(2);
+<a name="l00285"></a>00285 c.spawn(b);
+<a name="l00286"></a>00286 sum = &result->left_sum;
+<a name="l00287"></a>00287 return_slot = &result->left;
+<a name="l00288"></a>00288 is_right_child = <span class="keyword">false</span>;
+<a name="l00289"></a>00289 next_task = <span class="keyword">this</span>;
+<a name="l00290"></a>00290 parent_sum = result;
+<a name="l00291"></a>00291 __TBB_ASSERT( !*return_slot, NULL );
+<a name="l00292"></a>00292 }
+<a name="l00293"></a>00293 <span class="keywordflow">return</span> next_task;
+<a name="l00294"></a>00294 }
+<a name="l00295"></a>00295 } <span class="comment">// namespace internal</span>
+<a name="l00297"></a>00297 <span class="comment"></span>
+<a name="l00298"></a>00298 <span class="comment">// Requirements on Range concept are documented in blocked_range.h</span>
+<a name="l00299"></a>00299
+<a name="l00317"></a>00317
+<a name="l00319"></a>00319
+<a name="l00320"></a>00320 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
+<a name="l00321"></a><a class="code" href="a00275.html#ged143f31dd3d96ded02ab3db915b91c7">00321</a> <span class="keywordtype">void</span> <a class="code" href="a00275.html#ged143f31dd3d96ded02ab3db915b91c7">parallel_scan</a>( <span class="keyword">const</span> Range& range, Body& body ) {
+<a name="l00322"></a>00322 internal::start_scan<Range,Body,__TBB_DEFAULT_PARTITIONER>::run(range,body,__TBB_DEFAULT_PARTITIONER());
+<a name="l00323"></a>00323 }
+<a name="l00324"></a>00324
+<a name="l00326"></a>00326
+<a name="l00327"></a>00327 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
+<a name="l00328"></a><a class="code" href="a00275.html#gc9fac8870b2e6365fb337014404529df">00328</a> <span class="keywordtype">void</span> <a class="code" href="a00275.html#ged143f31dd3d96ded02ab3db915b91c7">parallel_scan</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00193.html">simple_partitioner</a>& partitioner ) {
+<a name="l00329"></a>00329 internal::start_scan<Range,Body,simple_partitioner>::run(range,body,partitioner);
+<a name="l00330"></a>00330 }
+<a name="l00331"></a>00331
+<a name="l00333"></a>00333
+<a name="l00334"></a>00334 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
+<a name="l00335"></a><a class="code" href="a00275.html#g62fde400a37bbca1a2fddc8e3d22f556">00335</a> <span class="keywordtype">void</span> <a class="code" href="a00275.html#ged143f31dd3d96ded02ab3db915b91c7">parallel_scan</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00145.html">auto_partitioner</a>& partitioner ) {
+<a name="l00336"></a>00336 internal::start_scan<Range,Body,auto_partitioner>::run(range,body,partitioner);
+<a name="l00337"></a>00337 }
+<a name="l00339"></a>00339
+<a name="l00340"></a>00340 } <span class="comment">// namespace tbb</span>
+<a name="l00341"></a>00341
+<a name="l00342"></a>00342 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_parallel_scan_H */</span>
+<a name="l00343"></a>00343
</pre></div><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00396.html b/doc/html/a00401.html
similarity index 96%
copy from doc/html/a00396.html
copy to doc/html/a00401.html
index 44a10c9..e3a1547 100644
--- a/doc/html/a00396.html
+++ b/doc/html/a00401.html
@@ -169,14 +169,14 @@
<a name="l00155"></a>00155 }
<a name="l00156"></a>00156 }
<a name="l00157"></a>00157
-<a name="l00158"></a>00158 <a class="code" href="a00274.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( blocked_range<RandomAccessIterator>(k+1, end),
+<a name="l00158"></a>00158 <a class="code" href="a00275.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( blocked_range<RandomAccessIterator>(k+1, end),
<a name="l00159"></a>00159 quick_sort_pretest_body<RandomAccessIterator,Compare>(comp),
<a name="l00160"></a>00160 auto_partitioner(),
<a name="l00161"></a>00161 my_context);
<a name="l00162"></a>00162
<a name="l00163"></a>00163 <span class="keywordflow">if</span> (my_context.is_group_execution_cancelled())
<a name="l00164"></a>00164 do_parallel_quick_sort:
-<a name="l00165"></a>00165 <a class="code" href="a00274.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( quick_sort_range<RandomAccessIterator,Compare>(begin, end-begin, comp ),
+<a name="l00165"></a>00165 <a class="code" href="a00275.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( quick_sort_range<RandomAccessIterator,Compare>(begin, end-begin, comp ),
<a name="l00166"></a>00166 quick_sort_body<RandomAccessIterator,Compare>(),
<a name="l00167"></a>00167 auto_partitioner() );
<a name="l00168"></a>00168 }
@@ -186,7 +186,7 @@
<a name="l00183"></a>00183
<a name="l00185"></a>00185
<a name="l00188"></a>00188 <span class="keyword">template</span><<span class="keyword">typename</span> RandomAccessIterator, <span class="keyword">typename</span> Compare>
-<a name="l00189"></a><a class="code" href="a00274.html#g49edcf9447cd91a9527a3f8e8512b7aa">00189</a> <span class="keywordtype">void</span> <a class="code" href="a00274.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a>( RandomAccessIterator begin, RandomAccessIterator end, <span class="keyword">const</span> Compare& comp) {
+<a name="l00189"></a><a class="code" href="a00275.html#g49edcf9447cd91a9527a3f8e8512b7aa">00189</a> <span class="keywordtype">void</span> <a class="code" href="a00275.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a>( RandomAccessIterator begin, RandomAccessIterator end, <span class="keyword">const</span> Compare& comp) {
<a name="l00190"></a>00190 <span class="keyword">const</span> <span class="keywordtype">int</span> min_parallel_size = 500;
<a name="l00191"></a>00191 <span class="keywordflow">if</span>( end > begin ) {
<a name="l00192"></a>00192 <span class="keywordflow">if</span> (end - begin < min_parallel_size) {
@@ -199,14 +199,14 @@
<a name="l00199"></a>00199
<a name="l00201"></a>00201
<a name="l00202"></a>00202 <span class="keyword">template</span><<span class="keyword">typename</span> RandomAccessIterator>
-<a name="l00203"></a><a class="code" href="a00274.html#g16c3eb77d0e530834c51ce3857f01012">00203</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00274.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a>( RandomAccessIterator begin, RandomAccessIterator end ) {
-<a name="l00204"></a>00204 <a class="code" href="a00274.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a>( begin, end, std::less< <span class="keyword">typename</span> std::iterator_traits<RandomAccessIterator>::value_type >() );
+<a name="l00203"></a><a class="code" href="a00275.html#g16c3eb77d0e530834c51ce3857f01012">00203</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00275.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a>( RandomAccessIterator begin, RandomAccessIterator end ) {
+<a name="l00204"></a>00204 <a class="code" href="a00275.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a>( begin, end, std::less< <span class="keyword">typename</span> std::iterator_traits<RandomAccessIterator>::value_type >() );
<a name="l00205"></a>00205 }
<a name="l00206"></a>00206
<a name="l00208"></a>00208
<a name="l00209"></a>00209 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00210"></a><a class="code" href="a00274.html#gc7576f82fdedc8a701a6c17ad9415926">00210</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00274.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a>( T * begin, T * end ) {
-<a name="l00211"></a>00211 <a class="code" href="a00274.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a>( begin, end, std::less< T >() );
+<a name="l00210"></a><a class="code" href="a00275.html#gc7576f82fdedc8a701a6c17ad9415926">00210</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00275.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a>( T * begin, T * end ) {
+<a name="l00211"></a>00211 <a class="code" href="a00275.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a>( begin, end, std::less< T >() );
<a name="l00212"></a>00212 }
<a name="l00214"></a>00214
<a name="l00215"></a>00215
diff --git a/doc/html/a00404.html b/doc/html/a00404.html
deleted file mode 100644
index 42de38c..0000000
--- a/doc/html/a00404.html
+++ /dev/null
@@ -1,232 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>partitioner.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>partitioner.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_partitioner_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_partitioner_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "task.h"</span>
-<a name="l00025"></a>00025
-<a name="l00026"></a>00026 <span class="keyword">namespace </span>tbb {
-<a name="l00027"></a>00027 <span class="keyword">class </span>affinity_partitioner;
-<a name="l00028"></a>00028
-<a name="l00030"></a>00030 <span class="keyword">namespace </span>internal {
-<a name="l00031"></a>00031 size_t __TBB_EXPORTED_FUNC get_initial_auto_partitioner_divisor();
-<a name="l00032"></a>00032
-<a name="l00034"></a>00034
-<a name="l00035"></a>00035 <span class="keyword">class </span>affinity_partitioner_base_v3: no_copy {
-<a name="l00036"></a>00036 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00141.html">tbb::affinity_partitioner</a>;
-<a name="l00038"></a>00038
-<a name="l00039"></a>00039 affinity_id* my_array;
-<a name="l00041"></a>00041 size_t my_size;
-<a name="l00043"></a>00043 affinity_partitioner_base_v3() : my_array(NULL), my_size(0) {}
-<a name="l00045"></a>00045 ~affinity_partitioner_base_v3() {resize(0);}
-<a name="l00047"></a>00047
-<a name="l00048"></a>00048 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD resize( <span class="keywordtype">unsigned</span> factor );
-<a name="l00049"></a>00049 <span class="keyword">friend</span> <span class="keyword">class </span>affinity_partition_type;
-<a name="l00050"></a>00050 };
-<a name="l00051"></a>00051
-<a name="l00053"></a>00053 <span class="keyword">class </span>partition_type_base {
-<a name="l00054"></a>00054 <span class="keyword">public</span>:
-<a name="l00055"></a>00055 <span class="keywordtype">void</span> set_affinity( task & ) {}
-<a name="l00056"></a>00056 <span class="keywordtype">void</span> note_affinity( <a class="code" href="a00199.html#d61bb32389d3857bf7511d69beaafb76">task::affinity_id</a> ) {}
-<a name="l00057"></a>00057 task* continue_after_execute_range() {<span class="keywordflow">return</span> NULL;}
-<a name="l00058"></a>00058 <span class="keywordtype">bool</span> decide_whether_to_delay() {<span class="keywordflow">return</span> <span class="keyword">false</span>;}
-<a name="l00059"></a>00059 <span class="keywordtype">void</span> spawn_or_delay( <span class="keywordtype">bool</span>, task& b ) {
-<a name="l00060"></a>00060 task::spawn(b);
-<a name="l00061"></a>00061 }
-<a name="l00062"></a>00062 };
-<a name="l00063"></a>00063
-<a name="l00064"></a>00064 <span class="keyword">class </span>affinity_partition_type;
-<a name="l00065"></a>00065
-<a name="l00066"></a>00066 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">class </span>start_for;
-<a name="l00067"></a>00067 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">class </span>start_reduce;
-<a name="l00068"></a>00068 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body> <span class="keyword">class </span>start_reduce_with_affinity;
-<a name="l00069"></a>00069 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">class </span>start_scan;
-<a name="l00070"></a>00070
-<a name="l00071"></a>00071 } <span class="comment">// namespace internal</span>
-<a name="l00073"></a>00073 <span class="comment"></span>
-<a name="l00075"></a>00075
-<a name="l00077"></a><a class="code" href="a00193.html">00077</a> <span class="keyword">class </span><a class="code" href="a00193.html">simple_partitioner</a> {
-<a name="l00078"></a>00078 <span class="keyword">public</span>:
-<a name="l00079"></a>00079 <a class="code" href="a00193.html">simple_partitioner</a>() {}
-<a name="l00080"></a>00080 <span class="keyword">private</span>:
-<a name="l00081"></a>00081 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>internal::start_for;
-<a name="l00082"></a>00082 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>internal::start_reduce;
-<a name="l00083"></a>00083 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>internal::start_scan;
-<a name="l00084"></a>00084
-<a name="l00085"></a>00085 <span class="keyword">class </span>partition_type: <span class="keyword">public</span> internal::partition_type_base {
-<a name="l00086"></a>00086 <span class="keyword">public</span>:
-<a name="l00087"></a>00087 <span class="keywordtype">bool</span> should_execute_range(<span class="keyword">const</span> <a class="code" href="a00199.html">task</a>& ) {<span class="keywordflow">return</span> <span class="keyword">false</span>;}
-<a name="l00088"></a>00088 partition_type( <span class="keyword">const</span> <a class="code" href="a00193.html">simple_partitioner</a>& ) {}
-<a name="l00089"></a>00089 partition_type( <span class="keyword">const</span> partition_type&, <a class="code" href="a00198.html">split</a> ) {}
-<a name="l00090"></a>00090 };
-<a name="l00091"></a>00091 };
-<a name="l00092"></a>00092
-<a name="l00094"></a>00094
-<a name="l00097"></a><a class="code" href="a00146.html">00097</a> <span class="keyword">class </span><a class="code" href="a00146.html">auto_partitioner</a> {
-<a name="l00098"></a>00098 <span class="keyword">public</span>:
-<a name="l00099"></a>00099 <a class="code" href="a00146.html">auto_partitioner</a>() {}
-<a name="l00100"></a>00100
-<a name="l00101"></a>00101 <span class="keyword">private</span>:
-<a name="l00102"></a>00102 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>internal::start_for;
-<a name="l00103"></a>00103 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>internal::start_reduce;
-<a name="l00104"></a>00104 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>internal::start_scan;
-<a name="l00105"></a>00105
-<a name="l00106"></a>00106 <span class="keyword">class </span>partition_type: <span class="keyword">public</span> internal::partition_type_base {
-<a name="l00107"></a>00107 size_t num_chunks;
-<a name="l00108"></a>00108 <span class="keyword">static</span> <span class="keyword">const</span> size_t VICTIM_CHUNKS = 4;
-<a name="l00109"></a>00109 <span class="keyword">public</span>:
-<a name="l00110"></a>00110 <span class="keywordtype">bool</span> should_execute_range(<span class="keyword">const</span> <a class="code" href="a00199.html">task</a> &t) {
-<a name="l00111"></a>00111 <span class="keywordflow">if</span>( num_chunks<VICTIM_CHUNKS && t.<a class="code" href="a00199.html#f9169402702f56bf519448aaf34450aa">is_stolen_task</a>() )
-<a name="l00112"></a>00112 num_chunks = VICTIM_CHUNKS;
-<a name="l00113"></a>00113 <span class="keywordflow">return</span> num_chunks==1;
-<a name="l00114"></a>00114 }
-<a name="l00115"></a>00115 partition_type( <span class="keyword">const</span> <a class="code" href="a00146.html">auto_partitioner</a>& ) : num_chunks(internal::get_initial_auto_partitioner_divisor()) {}
-<a name="l00116"></a>00116 partition_type( partition_type& pt, <a class="code" href="a00198.html">split</a> ) {
-<a name="l00117"></a>00117 num_chunks = pt.num_chunks /= 2u;
-<a name="l00118"></a>00118 }
-<a name="l00119"></a>00119 };
-<a name="l00120"></a>00120 };
-<a name="l00121"></a>00121
-<a name="l00123"></a><a class="code" href="a00141.html">00123</a> <span class="keyword">class </span><a class="code" href="a00141.html">affinity_partitioner</a>: internal::affinity_partitioner_base_v3 {
-<a name="l00124"></a>00124 <span class="keyword">public</span>:
-<a name="l00125"></a>00125 <a class="code" href="a00141.html">affinity_partitioner</a>() {}
-<a name="l00126"></a>00126
-<a name="l00127"></a>00127 <span class="keyword">private</span>:
-<a name="l00128"></a>00128 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>internal::start_for;
-<a name="l00129"></a>00129 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>internal::start_reduce;
-<a name="l00130"></a>00130 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body> <span class="keyword">friend</span> <span class="keyword">class </span>internal::start_reduce_with_affinity;
-<a name="l00131"></a>00131 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>internal::start_scan;
-<a name="l00132"></a>00132
-<a name="l00133"></a>00133 <span class="keyword">typedef</span> internal::affinity_partition_type partition_type;
-<a name="l00134"></a>00134 <span class="keyword">friend</span> <span class="keyword">class </span>internal::affinity_partition_type;
-<a name="l00135"></a>00135 };
-<a name="l00136"></a>00136
-<a name="l00138"></a>00138 <span class="keyword">namespace </span>internal {
-<a name="l00139"></a>00139
-<a name="l00140"></a>00140 <span class="keyword">class </span>affinity_partition_type: <span class="keyword">public</span> no_copy {
-<a name="l00142"></a>00142 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> factor = 16;
-<a name="l00143"></a>00143 <span class="keyword">static</span> <span class="keyword">const</span> size_t VICTIM_CHUNKS = 4;
-<a name="l00144"></a>00144
-<a name="l00145"></a>00145 internal::affinity_id* my_array;
-<a name="l00146"></a>00146 <a class="code" href="a00202.html">task_list</a> delay_list;
-<a name="l00147"></a>00147 <span class="keywordtype">unsigned</span> map_begin, map_end;
-<a name="l00148"></a>00148 size_t num_chunks;
-<a name="l00149"></a>00149 <span class="keyword">public</span>:
-<a name="l00150"></a>00150 affinity_partition_type( <a class="code" href="a00141.html">affinity_partitioner</a>& ap ) {
-<a name="l00151"></a>00151 __TBB_ASSERT( (factor&(factor-1))==0, <span class="stringliteral">"factor must be power of two"</span> );
-<a name="l00152"></a>00152 ap.resize(factor);
-<a name="l00153"></a>00153 my_array = ap.my_array;
-<a name="l00154"></a>00154 map_begin = 0;
-<a name="l00155"></a>00155 map_end = unsigned(ap.my_size);
-<a name="l00156"></a>00156 num_chunks = internal::get_initial_auto_partitioner_divisor();
-<a name="l00157"></a>00157 }
-<a name="l00158"></a>00158 affinity_partition_type(affinity_partition_type& p, split) : my_array(p.my_array) {
-<a name="l00159"></a>00159 __TBB_ASSERT( p.map_end-p.map_begin<factor || (p.map_end-p.map_begin)%factor==0, NULL );
-<a name="l00160"></a>00160 num_chunks = p.num_chunks /= 2;
-<a name="l00161"></a>00161 <span class="keywordtype">unsigned</span> e = p.map_end;
-<a name="l00162"></a>00162 <span class="keywordtype">unsigned</span> d = (e - p.map_begin)/2;
-<a name="l00163"></a>00163 <span class="keywordflow">if</span>( d>factor )
-<a name="l00164"></a>00164 d &= 0u-factor;
-<a name="l00165"></a>00165 map_end = e;
-<a name="l00166"></a>00166 map_begin = p.map_end = e-d;
-<a name="l00167"></a>00167 }
-<a name="l00168"></a>00168
-<a name="l00169"></a>00169 <span class="keywordtype">bool</span> should_execute_range(<span class="keyword">const</span> task &t) {
-<a name="l00170"></a>00170 <span class="keywordflow">if</span>( num_chunks < VICTIM_CHUNKS && t.is_stolen_task() )
-<a name="l00171"></a>00171 num_chunks = VICTIM_CHUNKS;
-<a name="l00172"></a>00172 <span class="keywordflow">return</span> num_chunks == 1;
-<a name="l00173"></a>00173 }
-<a name="l00174"></a>00174
-<a name="l00175"></a>00175 <span class="keywordtype">void</span> set_affinity( task &t ) {
-<a name="l00176"></a>00176 <span class="keywordflow">if</span>( map_begin<map_end )
-<a name="l00177"></a>00177 t.set_affinity( my_array[map_begin] );
-<a name="l00178"></a>00178 }
-<a name="l00179"></a>00179 <span class="keywordtype">void</span> note_affinity( <a class="code" href="a00199.html#d61bb32389d3857bf7511d69beaafb76">task::affinity_id</a> <span class="keywordtype">id</span> ) {
-<a name="l00180"></a>00180 <span class="keywordflow">if</span>( map_begin<map_end )
-<a name="l00181"></a>00181 my_array[map_begin] = id;
-<a name="l00182"></a>00182 }
-<a name="l00183"></a>00183 task* continue_after_execute_range() {
-<a name="l00184"></a>00184 task* first = NULL;
-<a name="l00185"></a>00185 <span class="keywordflow">if</span>( !delay_list.empty() ) {
-<a name="l00186"></a>00186 first = &delay_list.pop_front();
-<a name="l00187"></a>00187 <span class="keywordflow">while</span>( !delay_list.empty() ) {
-<a name="l00188"></a>00188 task::spawn(*first);
-<a name="l00189"></a>00189 first = &delay_list.pop_front();
-<a name="l00190"></a>00190 }
-<a name="l00191"></a>00191 }
-<a name="l00192"></a>00192 <span class="keywordflow">return</span> first;
-<a name="l00193"></a>00193 }
-<a name="l00194"></a>00194 <span class="keywordtype">bool</span> decide_whether_to_delay() {
-<a name="l00195"></a>00195 <span class="comment">// The possible underflow caused by "-1u" is deliberate</span>
-<a name="l00196"></a>00196 <span class="keywordflow">return</span> (map_begin&(factor-1))==0 && map_end-map_begin-1u<factor;
-<a name="l00197"></a>00197 }
-<a name="l00198"></a>00198 <span class="keywordtype">void</span> spawn_or_delay( <span class="keywordtype">bool</span> delay, task& b ) {
-<a name="l00199"></a>00199 <span class="keywordflow">if</span>( delay )
-<a name="l00200"></a>00200 delay_list.push_back(b);
-<a name="l00201"></a>00201 <span class="keywordflow">else</span>
-<a name="l00202"></a>00202 task::spawn(b);
-<a name="l00203"></a>00203 }
-<a name="l00204"></a>00204
-<a name="l00205"></a>00205 ~affinity_partition_type() {
-<a name="l00206"></a>00206 <span class="comment">// The delay_list can be non-empty if an exception is thrown.</span>
-<a name="l00207"></a>00207 <span class="keywordflow">while</span>( !delay_list.empty() ) {
-<a name="l00208"></a>00208 task& t = delay_list.pop_front();
-<a name="l00209"></a>00209 t.destroy(t);
-<a name="l00210"></a>00210 }
-<a name="l00211"></a>00211 }
-<a name="l00212"></a>00212 };
-<a name="l00213"></a>00213
-<a name="l00214"></a>00214 } <span class="comment">// namespace internal</span>
-<a name="l00216"></a>00216 <span class="comment"></span>
-<a name="l00217"></a>00217
-<a name="l00218"></a>00218 } <span class="comment">// namespace tbb</span>
-<a name="l00219"></a>00219
-<a name="l00220"></a>00220 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_partitioner_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00400.html b/doc/html/a00405.html
similarity index 98%
rename from doc/html/a00400.html
rename to doc/html/a00405.html
index 5e622c9..50cf87f 100644
--- a/doc/html/a00400.html
+++ b/doc/html/a00405.html
@@ -156,14 +156,14 @@
<a name="l00155"></a>00155
<a name="l00156"></a>00156 <span class="keyword">private</span>:
<a name="l00157"></a>00157 <span class="keyword">const</span> Body* my_body;
-<a name="l00158"></a>00158 <a class="code" href="a00163.html">empty_task</a>* my_barrier;
+<a name="l00158"></a>00158 <a class="code" href="a00162.html">empty_task</a>* my_barrier;
<a name="l00159"></a>00159 };
<a name="l00160"></a>00160
<a name="l00161"></a>00161 <span class="keyword">template</span><<span class="keyword">typename</span> Body>
<a name="l00162"></a>00162 <span class="keyword">template</span><<span class="keyword">typename</span> Stream>
<a name="l00163"></a><a class="code" href="a00179.html#b32a0a6e5e09ebb7fad3e6652c19afe5">00163</a> <span class="keywordtype">void</span> <a class="code" href="a00179.html">parallel_while<Body>::run</a>( Stream& stream, <span class="keyword">const</span> Body& body ) {
<a name="l00164"></a>00164 <span class="keyword">using namespace </span>internal;
-<a name="l00165"></a>00165 <a class="code" href="a00163.html">empty_task</a>& barrier = *<span class="keyword">new</span>( <a class="code" href="a00199.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>() ) <a class="code" href="a00163.html">empty_task</a>();
+<a name="l00165"></a>00165 <a class="code" href="a00162.html">empty_task</a>& barrier = *<span class="keyword">new</span>( <a class="code" href="a00199.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>() ) <a class="code" href="a00162.html">empty_task</a>();
<a name="l00166"></a>00166 my_body = &body;
<a name="l00167"></a>00167 my_barrier = &barrier;
<a name="l00168"></a>00168 my_barrier-><a class="code" href="a00199.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a>(2);
diff --git a/doc/html/a00409.html b/doc/html/a00409.html
index 7e1fb73..f1f8284 100644
--- a/doc/html/a00409.html
+++ b/doc/html/a00409.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>pipeline.h Source File</title>
+<title>partitioner.h Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -19,7 +19,7 @@
<li><a href="files.html"><span>File List</span></a></li>
<li><a href="globals.html"><span>File Members</span></a></li>
</ul></div>
-<h1>pipeline.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<h1>partitioner.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
<a name="l00003"></a>00003 <span class="comment"></span>
<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
@@ -39,447 +39,188 @@
<a name="l00018"></a>00018 <span class="comment"> writing.</span>
<a name="l00019"></a>00019 <span class="comment">*/</span>
<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_pipeline_H </span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_pipeline_H </span>
+<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_partitioner_H</span>
+<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_partitioner_H</span>
<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "atomic.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "task.h"</span>
-<a name="l00026"></a>00026 <span class="preprocessor">#include <cstddef></span>
-<a name="l00027"></a>00027
-<a name="l00028"></a>00028 <span class="keyword">namespace </span>tbb {
-<a name="l00029"></a>00029
-<a name="l00030"></a>00030 <span class="keyword">class </span>pipeline;
-<a name="l00031"></a>00031 <span class="keyword">class </span>filter;
+<a name="l00024"></a>00024 <span class="preprocessor">#include "task.h"</span>
+<a name="l00025"></a>00025
+<a name="l00026"></a>00026 <span class="keyword">namespace </span>tbb {
+<a name="l00027"></a>00027 <span class="keyword">class </span>affinity_partitioner;
+<a name="l00028"></a>00028
+<a name="l00030"></a>00030 <span class="keyword">namespace </span>internal {
+<a name="l00031"></a>00031 size_t __TBB_EXPORTED_FUNC get_initial_auto_partitioner_divisor();
<a name="l00032"></a>00032
-<a name="l00034"></a>00034 <span class="keyword">namespace </span>internal {
-<a name="l00035"></a>00035
-<a name="l00036"></a>00036 <span class="comment">// The argument for PIPELINE_VERSION should be an integer between 2 and 9</span>
-<a name="l00037"></a>00037 <span class="preprocessor">#define __TBB_PIPELINE_VERSION(x) (unsigned char)(x-2)<<1</span>
-<a name="l00038"></a>00038 <span class="preprocessor"></span>
-<a name="l00039"></a>00039 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> Token;
-<a name="l00040"></a>00040 <span class="keyword">typedef</span> <span class="keywordtype">long</span> tokendiff_t;
-<a name="l00041"></a>00041 <span class="keyword">class </span>stage_task;
-<a name="l00042"></a>00042 <span class="keyword">class </span>input_buffer;
-<a name="l00043"></a>00043 <span class="keyword">class </span>pipeline_root_task;
-<a name="l00044"></a>00044 <span class="keyword">class </span>pipeline_cleaner;
-<a name="l00045"></a>00045
-<a name="l00046"></a>00046 } <span class="comment">// namespace internal</span>
+<a name="l00034"></a>00034
+<a name="l00035"></a>00035 <span class="keyword">class </span>affinity_partitioner_base_v3: no_copy {
+<a name="l00036"></a>00036 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00140.html">tbb::affinity_partitioner</a>;
+<a name="l00038"></a>00038
+<a name="l00039"></a>00039 affinity_id* my_array;
+<a name="l00041"></a>00041 size_t my_size;
+<a name="l00043"></a>00043 affinity_partitioner_base_v3() : my_array(NULL), my_size(0) {}
+<a name="l00045"></a>00045 ~affinity_partitioner_base_v3() {resize(0);}
<a name="l00047"></a>00047
-<a name="l00048"></a>00048 <span class="keyword">namespace </span>interface5 {
-<a name="l00049"></a>00049 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U> <span class="keyword">class </span>filter_t;
-<a name="l00050"></a>00050
-<a name="l00051"></a>00051 <span class="keyword">namespace </span>internal {
-<a name="l00052"></a>00052 <span class="keyword">class </span>pipeline_proxy;
-<a name="l00053"></a>00053 }
-<a name="l00054"></a>00054 }
-<a name="l00055"></a>00055
-<a name="l00057"></a>00057
-<a name="l00059"></a>00059
-<a name="l00060"></a><a class="code" href="a00165.html">00060</a> <span class="keyword">class </span><a class="code" href="a00165.html">filter</a>: internal::no_copy {
-<a name="l00061"></a>00061 <span class="keyword">private</span>:
-<a name="l00063"></a>00063 <span class="keyword">static</span> <a class="code" href="a00165.html">filter</a>* not_in_pipeline() {<span class="keywordflow">return</span> reinterpret_cast<filter*>(intptr_t(-1));}
-<a name="l00064"></a>00064
-<a name="l00066"></a>00066 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> filter_is_serial = 0x1;
-<a name="l00067"></a>00067
-<a name="l00069"></a>00069
-<a name="l00071"></a>00071 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> filter_is_out_of_order = 0x1<<4;
-<a name="l00072"></a>00072
-<a name="l00074"></a>00074 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> filter_is_bound = 0x1<<5;
+<a name="l00048"></a>00048 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD resize( <span class="keywordtype">unsigned</span> factor );
+<a name="l00049"></a>00049 <span class="keyword">friend</span> <span class="keyword">class </span>affinity_partition_type;
+<a name="l00050"></a>00050 };
+<a name="l00051"></a>00051
+<a name="l00053"></a>00053 <span class="keyword">class </span>partition_type_base {
+<a name="l00054"></a>00054 <span class="keyword">public</span>:
+<a name="l00055"></a>00055 <span class="keywordtype">void</span> set_affinity( task & ) {}
+<a name="l00056"></a>00056 <span class="keywordtype">void</span> note_affinity( <a class="code" href="a00199.html#d61bb32389d3857bf7511d69beaafb76">task::affinity_id</a> ) {}
+<a name="l00057"></a>00057 task* continue_after_execute_range() {<span class="keywordflow">return</span> NULL;}
+<a name="l00058"></a>00058 <span class="keywordtype">bool</span> decide_whether_to_delay() {<span class="keywordflow">return</span> <span class="keyword">false</span>;}
+<a name="l00059"></a>00059 <span class="keywordtype">void</span> spawn_or_delay( <span class="keywordtype">bool</span>, task& b ) {
+<a name="l00060"></a>00060 task::spawn(b);
+<a name="l00061"></a>00061 }
+<a name="l00062"></a>00062 };
+<a name="l00063"></a>00063
+<a name="l00064"></a>00064 <span class="keyword">class </span>affinity_partition_type;
+<a name="l00065"></a>00065
+<a name="l00066"></a>00066 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">class </span>start_for;
+<a name="l00067"></a>00067 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">class </span>start_reduce;
+<a name="l00068"></a>00068 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body> <span class="keyword">class </span>start_reduce_with_affinity;
+<a name="l00069"></a>00069 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">class </span>start_scan;
+<a name="l00070"></a>00070
+<a name="l00071"></a>00071 } <span class="comment">// namespace internal</span>
+<a name="l00073"></a>00073 <span class="comment"></span>
<a name="l00075"></a>00075
-<a name="l00077"></a>00077 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> exact_exception_propagation =
-<a name="l00078"></a>00078 <span class="preprocessor">#if TBB_USE_CAPTURED_EXCEPTION</span>
-<a name="l00079"></a>00079 <span class="preprocessor"></span> 0x0;
-<a name="l00080"></a>00080 <span class="preprocessor">#else</span>
-<a name="l00081"></a>00081 <span class="preprocessor"></span> 0x1<<7;
-<a name="l00082"></a>00082 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_CAPTURED_EXCEPTION */</span>
-<a name="l00083"></a>00083
-<a name="l00084"></a>00084 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> current_version = __TBB_PIPELINE_VERSION(5);
-<a name="l00085"></a>00085 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> version_mask = 0x7<<1; <span class="comment">// bits 1-3 are for version</span>
-<a name="l00086"></a>00086 <span class="keyword">public</span>:
-<a name="l00087"></a>00087 <span class="keyword">enum</span> mode {
-<a name="l00089"></a>00089 parallel = current_version | filter_is_out_of_order,
-<a name="l00091"></a>00091 serial_in_order = current_version | filter_is_serial,
-<a name="l00093"></a>00093 serial_out_of_order = current_version | filter_is_serial | filter_is_out_of_order,
-<a name="l00095"></a>00095 serial = serial_in_order
-<a name="l00096"></a>00096 };
-<a name="l00097"></a>00097 <span class="keyword">protected</span>:
-<a name="l00098"></a>00098 <a class="code" href="a00165.html">filter</a>( <span class="keywordtype">bool</span> is_serial_ ) :
-<a name="l00099"></a>00099 next_filter_in_pipeline(not_in_pipeline()),
-<a name="l00100"></a>00100 my_input_buffer(NULL),
-<a name="l00101"></a>00101 my_filter_mode(static_cast<unsigned char>((is_serial_ ? serial : parallel) | exact_exception_propagation)),
-<a name="l00102"></a>00102 prev_filter_in_pipeline(not_in_pipeline()),
-<a name="l00103"></a>00103 my_pipeline(NULL),
-<a name="l00104"></a>00104 next_segment(NULL)
-<a name="l00105"></a>00105 {}
-<a name="l00106"></a>00106
-<a name="l00107"></a>00107 <a class="code" href="a00165.html">filter</a>( mode filter_mode ) :
-<a name="l00108"></a>00108 next_filter_in_pipeline(not_in_pipeline()),
-<a name="l00109"></a>00109 my_input_buffer(NULL),
-<a name="l00110"></a>00110 my_filter_mode(static_cast<unsigned char>(filter_mode | exact_exception_propagation)),
-<a name="l00111"></a>00111 prev_filter_in_pipeline(not_in_pipeline()),
-<a name="l00112"></a>00112 my_pipeline(NULL),
-<a name="l00113"></a>00113 next_segment(NULL)
-<a name="l00114"></a>00114 {}
-<a name="l00115"></a>00115
-<a name="l00116"></a>00116 <span class="keyword">public</span>:
-<a name="l00118"></a><a class="code" href="a00165.html#fcfec27656a69ff2072802ac001e936f">00118</a> <span class="keywordtype">bool</span> <a class="code" href="a00165.html#fcfec27656a69ff2072802ac001e936f">is_serial</a>()<span class="keyword"> const </span>{
-<a name="l00119"></a>00119 <span class="keywordflow">return</span> bool( my_filter_mode & filter_is_serial );
-<a name="l00120"></a>00120 }
-<a name="l00121"></a>00121
-<a name="l00123"></a><a class="code" href="a00165.html#cd53206c4795ef2df5df26b795caf692">00123</a> <span class="keywordtype">bool</span> <a class="code" href="a00165.html#cd53206c4795ef2df5df26b795caf692">is_ordered</a>()<span class="keyword"> const </span>{
-<a name="l00124"></a>00124 <span class="keywordflow">return</span> (my_filter_mode & (filter_is_out_of_order|filter_is_serial))==filter_is_serial;
-<a name="l00125"></a>00125 }
+<a name="l00077"></a><a class="code" href="a00193.html">00077</a> <span class="keyword">class </span><a class="code" href="a00193.html">simple_partitioner</a> {
+<a name="l00078"></a>00078 <span class="keyword">public</span>:
+<a name="l00079"></a>00079 <a class="code" href="a00193.html">simple_partitioner</a>() {}
+<a name="l00080"></a>00080 <span class="keyword">private</span>:
+<a name="l00081"></a>00081 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>internal::start_for;
+<a name="l00082"></a>00082 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>internal::start_reduce;
+<a name="l00083"></a>00083 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>internal::start_scan;
+<a name="l00084"></a>00084
+<a name="l00085"></a>00085 <span class="keyword">class </span>partition_type: <span class="keyword">public</span> internal::partition_type_base {
+<a name="l00086"></a>00086 <span class="keyword">public</span>:
+<a name="l00087"></a>00087 <span class="keywordtype">bool</span> should_execute_range(<span class="keyword">const</span> <a class="code" href="a00199.html">task</a>& ) {<span class="keywordflow">return</span> <span class="keyword">false</span>;}
+<a name="l00088"></a>00088 partition_type( <span class="keyword">const</span> <a class="code" href="a00193.html">simple_partitioner</a>& ) {}
+<a name="l00089"></a>00089 partition_type( <span class="keyword">const</span> partition_type&, <a class="code" href="a00198.html">split</a> ) {}
+<a name="l00090"></a>00090 };
+<a name="l00091"></a>00091 };
+<a name="l00092"></a>00092
+<a name="l00094"></a>00094
+<a name="l00097"></a><a class="code" href="a00145.html">00097</a> <span class="keyword">class </span><a class="code" href="a00145.html">auto_partitioner</a> {
+<a name="l00098"></a>00098 <span class="keyword">public</span>:
+<a name="l00099"></a>00099 <a class="code" href="a00145.html">auto_partitioner</a>() {}
+<a name="l00100"></a>00100
+<a name="l00101"></a>00101 <span class="keyword">private</span>:
+<a name="l00102"></a>00102 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>internal::start_for;
+<a name="l00103"></a>00103 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>internal::start_reduce;
+<a name="l00104"></a>00104 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>internal::start_scan;
+<a name="l00105"></a>00105
+<a name="l00106"></a>00106 <span class="keyword">class </span>partition_type: <span class="keyword">public</span> internal::partition_type_base {
+<a name="l00107"></a>00107 size_t num_chunks;
+<a name="l00108"></a>00108 <span class="keyword">static</span> <span class="keyword">const</span> size_t VICTIM_CHUNKS = 4;
+<a name="l00109"></a>00109 <span class="keyword">public</span>:
+<a name="l00110"></a>00110 <span class="keywordtype">bool</span> should_execute_range(<span class="keyword">const</span> <a class="code" href="a00199.html">task</a> &t) {
+<a name="l00111"></a>00111 <span class="keywordflow">if</span>( num_chunks<VICTIM_CHUNKS && t.<a class="code" href="a00199.html#f9169402702f56bf519448aaf34450aa">is_stolen_task</a>() )
+<a name="l00112"></a>00112 num_chunks = VICTIM_CHUNKS;
+<a name="l00113"></a>00113 <span class="keywordflow">return</span> num_chunks==1;
+<a name="l00114"></a>00114 }
+<a name="l00115"></a>00115 partition_type( <span class="keyword">const</span> <a class="code" href="a00145.html">auto_partitioner</a>& ) : num_chunks(internal::get_initial_auto_partitioner_divisor()) {}
+<a name="l00116"></a>00116 partition_type( partition_type& pt, <a class="code" href="a00198.html">split</a> ) {
+<a name="l00117"></a>00117 num_chunks = pt.num_chunks /= 2u;
+<a name="l00118"></a>00118 }
+<a name="l00119"></a>00119 };
+<a name="l00120"></a>00120 };
+<a name="l00121"></a>00121
+<a name="l00123"></a><a class="code" href="a00140.html">00123</a> <span class="keyword">class </span><a class="code" href="a00140.html">affinity_partitioner</a>: internal::affinity_partitioner_base_v3 {
+<a name="l00124"></a>00124 <span class="keyword">public</span>:
+<a name="l00125"></a>00125 <a class="code" href="a00140.html">affinity_partitioner</a>() {}
<a name="l00126"></a>00126
-<a name="l00128"></a><a class="code" href="a00165.html#15c29cae5d237e6d63dbfe5c94af89d5">00128</a> <span class="keywordtype">bool</span> <a class="code" href="a00165.html#15c29cae5d237e6d63dbfe5c94af89d5">is_bound</a>()<span class="keyword"> const </span>{
-<a name="l00129"></a>00129 <span class="keywordflow">return</span> ( my_filter_mode & filter_is_bound )==filter_is_bound;
-<a name="l00130"></a>00130 }
-<a name="l00131"></a>00131
-<a name="l00133"></a>00133
-<a name="l00134"></a>00134 <span class="keyword">virtual</span> <span class="keywordtype">void</span>* <a class="code" href="a00165.html#fa1b3dc1f4f47563ccab7f4d92f5b543">operator()</a>( <span class="keywordtype">void</span>* item ) = 0;
-<a name="l00135"></a>00135
-<a name="l00137"></a>00137
-<a name="l00138"></a>00138 <span class="keyword">virtual</span> __TBB_EXPORTED_METHOD <a class="code" href="a00165.html#66d159f362293e3964ba3da8bc1d2604">~filter</a>();
+<a name="l00127"></a>00127 <span class="keyword">private</span>:
+<a name="l00128"></a>00128 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>internal::start_for;
+<a name="l00129"></a>00129 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>internal::start_reduce;
+<a name="l00130"></a>00130 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body> <span class="keyword">friend</span> <span class="keyword">class </span>internal::start_reduce_with_affinity;
+<a name="l00131"></a>00131 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>internal::start_scan;
+<a name="l00132"></a>00132
+<a name="l00133"></a>00133 <span class="keyword">typedef</span> internal::affinity_partition_type partition_type;
+<a name="l00134"></a>00134 <span class="keyword">friend</span> <span class="keyword">class </span>internal::affinity_partition_type;
+<a name="l00135"></a>00135 };
+<a name="l00136"></a>00136
+<a name="l00138"></a>00138 <span class="keyword">namespace </span>internal {
<a name="l00139"></a>00139
-<a name="l00140"></a>00140 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00142"></a>00142 <span class="preprocessor"></span>
-<a name="l00144"></a><a class="code" href="a00165.html#56275eb889c77c4807967133e21401bd">00144</a> <span class="preprocessor"> virtual void finalize( void* </span><span class="comment">/*item*/</span> ) {};
-<a name="l00145"></a>00145 <span class="preprocessor">#endif</span>
-<a name="l00146"></a>00146 <span class="preprocessor"></span>
-<a name="l00147"></a>00147 <span class="keyword">private</span>:
-<a name="l00149"></a>00149 <a class="code" href="a00165.html">filter</a>* next_filter_in_pipeline;
-<a name="l00150"></a>00150
-<a name="l00152"></a>00152
-<a name="l00153"></a>00153 internal::input_buffer* my_input_buffer;
-<a name="l00154"></a>00154
-<a name="l00155"></a>00155 <span class="keyword">friend</span> <span class="keyword">class </span>internal::stage_task;
-<a name="l00156"></a>00156 <span class="keyword">friend</span> <span class="keyword">class </span>internal::pipeline_root_task;
-<a name="l00157"></a>00157 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00180.html">pipeline</a>;
-<a name="l00158"></a>00158 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00209.html">thread_bound_filter</a>;
-<a name="l00159"></a>00159
-<a name="l00161"></a>00161 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> my_filter_mode;
-<a name="l00162"></a>00162
-<a name="l00164"></a>00164 <a class="code" href="a00165.html">filter</a>* prev_filter_in_pipeline;
-<a name="l00165"></a>00165
-<a name="l00167"></a>00167 <a class="code" href="a00180.html">pipeline</a>* my_pipeline;
+<a name="l00140"></a>00140 <span class="keyword">class </span>affinity_partition_type: <span class="keyword">public</span> no_copy {
+<a name="l00142"></a>00142 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> factor = 16;
+<a name="l00143"></a>00143 <span class="keyword">static</span> <span class="keyword">const</span> size_t VICTIM_CHUNKS = 4;
+<a name="l00144"></a>00144
+<a name="l00145"></a>00145 internal::affinity_id* my_array;
+<a name="l00146"></a>00146 <a class="code" href="a00202.html">task_list</a> delay_list;
+<a name="l00147"></a>00147 <span class="keywordtype">unsigned</span> map_begin, map_end;
+<a name="l00148"></a>00148 size_t num_chunks;
+<a name="l00149"></a>00149 <span class="keyword">public</span>:
+<a name="l00150"></a>00150 affinity_partition_type( <a class="code" href="a00140.html">affinity_partitioner</a>& ap ) {
+<a name="l00151"></a>00151 __TBB_ASSERT( (factor&(factor-1))==0, <span class="stringliteral">"factor must be power of two"</span> );
+<a name="l00152"></a>00152 ap.resize(factor);
+<a name="l00153"></a>00153 my_array = ap.my_array;
+<a name="l00154"></a>00154 map_begin = 0;
+<a name="l00155"></a>00155 map_end = unsigned(ap.my_size);
+<a name="l00156"></a>00156 num_chunks = internal::get_initial_auto_partitioner_divisor();
+<a name="l00157"></a>00157 }
+<a name="l00158"></a>00158 affinity_partition_type(affinity_partition_type& p, split) : my_array(p.my_array) {
+<a name="l00159"></a>00159 __TBB_ASSERT( p.map_end-p.map_begin<factor || (p.map_end-p.map_begin)%factor==0, NULL );
+<a name="l00160"></a>00160 num_chunks = p.num_chunks /= 2;
+<a name="l00161"></a>00161 <span class="keywordtype">unsigned</span> e = p.map_end;
+<a name="l00162"></a>00162 <span class="keywordtype">unsigned</span> d = (e - p.map_begin)/2;
+<a name="l00163"></a>00163 <span class="keywordflow">if</span>( d>factor )
+<a name="l00164"></a>00164 d &= 0u-factor;
+<a name="l00165"></a>00165 map_end = e;
+<a name="l00166"></a>00166 map_begin = p.map_end = e-d;
+<a name="l00167"></a>00167 }
<a name="l00168"></a>00168
-<a name="l00170"></a>00170
-<a name="l00171"></a>00171 <a class="code" href="a00165.html">filter</a>* next_segment;
-<a name="l00172"></a>00172 };
-<a name="l00173"></a>00173
-<a name="l00175"></a>00175
-<a name="l00176"></a><a class="code" href="a00209.html">00176</a> <span class="keyword">class </span><a class="code" href="a00209.html">thread_bound_filter</a>: <span class="keyword">public</span> <a class="code" href="a00165.html">filter</a> {
-<a name="l00177"></a>00177 <span class="keyword">public</span>:
-<a name="l00178"></a>00178 <span class="keyword">enum</span> result_type {
-<a name="l00179"></a>00179 <span class="comment">// item was processed</span>
-<a name="l00180"></a>00180 success,
-<a name="l00181"></a>00181 <span class="comment">// item is currently not available</span>
-<a name="l00182"></a>00182 item_not_available,
-<a name="l00183"></a>00183 <span class="comment">// there are no more items to process</span>
-<a name="l00184"></a>00184 end_of_stream
-<a name="l00185"></a>00185 };
-<a name="l00186"></a>00186 <span class="keyword">protected</span>:
-<a name="l00187"></a>00187 <a class="code" href="a00209.html">thread_bound_filter</a>(mode filter_mode):
-<a name="l00188"></a>00188 <a class="code" href="a00165.html">filter</a>(static_cast<mode>(filter_mode | filter::filter_is_bound | filter::exact_exception_propagation))
-<a name="l00189"></a>00189 {}
-<a name="l00190"></a>00190 <span class="keyword">public</span>:
-<a name="l00192"></a>00192
-<a name="l00197"></a>00197 result_type __TBB_EXPORTED_METHOD <a class="code" href="a00209.html#c4f90f2c771bce748beb9be734fa286c">try_process_item</a>();
-<a name="l00198"></a>00198
-<a name="l00200"></a>00200
-<a name="l00204"></a>00204 result_type __TBB_EXPORTED_METHOD <a class="code" href="a00209.html#5e726bdc7fbd924c0b07bd558b1d4d5d">process_item</a>();
-<a name="l00205"></a>00205
-<a name="l00206"></a>00206 <span class="keyword">private</span>:
-<a name="l00208"></a>00208 result_type internal_process_item(<span class="keywordtype">bool</span> is_blocking);
-<a name="l00209"></a>00209 };
-<a name="l00210"></a>00210
-<a name="l00212"></a>00212
-<a name="l00213"></a><a class="code" href="a00180.html">00213</a> <span class="keyword">class </span><a class="code" href="a00180.html">pipeline</a> {
-<a name="l00214"></a>00214 <span class="keyword">public</span>:
-<a name="l00216"></a>00216 __TBB_EXPORTED_METHOD <a class="code" href="a00180.html#596dc3beba27099c4c8581cb419e1a59">pipeline</a>();
+<a name="l00169"></a>00169 <span class="keywordtype">bool</span> should_execute_range(<span class="keyword">const</span> task &t) {
+<a name="l00170"></a>00170 <span class="keywordflow">if</span>( num_chunks < VICTIM_CHUNKS && t.is_stolen_task() )
+<a name="l00171"></a>00171 num_chunks = VICTIM_CHUNKS;
+<a name="l00172"></a>00172 <span class="keywordflow">return</span> num_chunks == 1;
+<a name="l00173"></a>00173 }
+<a name="l00174"></a>00174
+<a name="l00175"></a>00175 <span class="keywordtype">void</span> set_affinity( task &t ) {
+<a name="l00176"></a>00176 <span class="keywordflow">if</span>( map_begin<map_end )
+<a name="l00177"></a>00177 t.set_affinity( my_array[map_begin] );
+<a name="l00178"></a>00178 }
+<a name="l00179"></a>00179 <span class="keywordtype">void</span> note_affinity( <a class="code" href="a00199.html#d61bb32389d3857bf7511d69beaafb76">task::affinity_id</a> <span class="keywordtype">id</span> ) {
+<a name="l00180"></a>00180 <span class="keywordflow">if</span>( map_begin<map_end )
+<a name="l00181"></a>00181 my_array[map_begin] = id;
+<a name="l00182"></a>00182 }
+<a name="l00183"></a>00183 task* continue_after_execute_range() {
+<a name="l00184"></a>00184 task* first = NULL;
+<a name="l00185"></a>00185 <span class="keywordflow">if</span>( !delay_list.empty() ) {
+<a name="l00186"></a>00186 first = &delay_list.pop_front();
+<a name="l00187"></a>00187 <span class="keywordflow">while</span>( !delay_list.empty() ) {
+<a name="l00188"></a>00188 task::spawn(*first);
+<a name="l00189"></a>00189 first = &delay_list.pop_front();
+<a name="l00190"></a>00190 }
+<a name="l00191"></a>00191 }
+<a name="l00192"></a>00192 <span class="keywordflow">return</span> first;
+<a name="l00193"></a>00193 }
+<a name="l00194"></a>00194 <span class="keywordtype">bool</span> decide_whether_to_delay() {
+<a name="l00195"></a>00195 <span class="comment">// The possible underflow caused by "-1u" is deliberate</span>
+<a name="l00196"></a>00196 <span class="keywordflow">return</span> (map_begin&(factor-1))==0 && map_end-map_begin-1u<factor;
+<a name="l00197"></a>00197 }
+<a name="l00198"></a>00198 <span class="keywordtype">void</span> spawn_or_delay( <span class="keywordtype">bool</span> delay, task& b ) {
+<a name="l00199"></a>00199 <span class="keywordflow">if</span>( delay )
+<a name="l00200"></a>00200 delay_list.push_back(b);
+<a name="l00201"></a>00201 <span class="keywordflow">else</span>
+<a name="l00202"></a>00202 task::spawn(b);
+<a name="l00203"></a>00203 }
+<a name="l00204"></a>00204
+<a name="l00205"></a>00205 ~affinity_partition_type() {
+<a name="l00206"></a>00206 <span class="comment">// The delay_list can be non-empty if an exception is thrown.</span>
+<a name="l00207"></a>00207 <span class="keywordflow">while</span>( !delay_list.empty() ) {
+<a name="l00208"></a>00208 task& t = delay_list.pop_front();
+<a name="l00209"></a>00209 t.destroy(t);
+<a name="l00210"></a>00210 }
+<a name="l00211"></a>00211 }
+<a name="l00212"></a>00212 };
+<a name="l00213"></a>00213
+<a name="l00214"></a>00214 } <span class="comment">// namespace internal</span>
+<a name="l00216"></a>00216 <span class="comment"></span>
<a name="l00217"></a>00217
-<a name="l00220"></a>00220 <span class="keyword">virtual</span> __TBB_EXPORTED_METHOD <a class="code" href="a00180.html#49513c6c24f9d5bbbb27edca5efe01c9">~pipeline</a>();
-<a name="l00221"></a>00221
-<a name="l00223"></a>00223 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00180.html#38fb5c9c8395dd6f89a4ae2011a83e0d">add_filter</a>( <a class="code" href="a00165.html">filter</a>& filter_ );
-<a name="l00224"></a>00224
-<a name="l00226"></a>00226 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00180.html#f627616049b3fe36801f37ee40403ef8">run</a>( size_t max_number_of_live_tokens );
-<a name="l00227"></a>00227
-<a name="l00228"></a>00228 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00230"></a>00230 <span class="preprocessor"> void __TBB_EXPORTED_METHOD run( size_t max_number_of_live_tokens, tbb::task_group_context& context );</span>
-<a name="l00231"></a>00231 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00232"></a>00232 <span class="preprocessor"></span>
-<a name="l00234"></a>00234 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00180.html#2c84aef5b834b555ee220b176e25931e">clear</a>();
-<a name="l00235"></a>00235
-<a name="l00236"></a>00236 <span class="keyword">private</span>:
-<a name="l00237"></a>00237 <span class="keyword">friend</span> <span class="keyword">class </span>internal::stage_task;
-<a name="l00238"></a>00238 <span class="keyword">friend</span> <span class="keyword">class </span>internal::pipeline_root_task;
-<a name="l00239"></a>00239 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00165.html">filter</a>;
-<a name="l00240"></a>00240 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00209.html">thread_bound_filter</a>;
-<a name="l00241"></a>00241 <span class="keyword">friend</span> <span class="keyword">class </span>internal::pipeline_cleaner;
-<a name="l00242"></a>00242 <span class="keyword">friend</span> <span class="keyword">class </span>tbb::interface5::internal::pipeline_proxy;
-<a name="l00243"></a>00243
-<a name="l00245"></a>00245 <a class="code" href="a00165.html">filter</a>* filter_list;
-<a name="l00246"></a>00246
-<a name="l00248"></a>00248 <a class="code" href="a00165.html">filter</a>* filter_end;
-<a name="l00249"></a>00249
-<a name="l00251"></a>00251 <a class="code" href="a00199.html">task</a>* end_counter;
-<a name="l00252"></a>00252
-<a name="l00254"></a>00254 <a class="code" href="a00143.html">atomic<internal::Token></a> input_tokens;
-<a name="l00255"></a>00255
-<a name="l00257"></a>00257 <a class="code" href="a00143.html">atomic<internal::Token></a> token_counter;
-<a name="l00258"></a>00258
-<a name="l00260"></a>00260 <span class="keywordtype">bool</span> end_of_input;
-<a name="l00261"></a>00261
-<a name="l00263"></a>00263 <span class="keywordtype">bool</span> has_thread_bound_filters;
-<a name="l00264"></a>00264
-<a name="l00266"></a>00266 <span class="keywordtype">void</span> remove_filter( <a class="code" href="a00165.html">filter</a>& filter_ );
-<a name="l00267"></a>00267
-<a name="l00269"></a>00269 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD inject_token( <a class="code" href="a00199.html">task</a>& <span class="keyword">self</span> );
-<a name="l00270"></a>00270
-<a name="l00271"></a>00271 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00273"></a>00273 <span class="preprocessor"> void clear_filters();</span>
-<a name="l00274"></a>00274 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00275"></a>00275 <span class="preprocessor"></span>};
-<a name="l00276"></a>00276
-<a name="l00277"></a>00277 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00278"></a>00278 <span class="comment">// Support for lambda-friendly parallel_pipeline interface</span>
-<a name="l00279"></a>00279 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00280"></a>00280
-<a name="l00281"></a>00281 <span class="keyword">namespace </span>interface5 {
-<a name="l00282"></a>00282
-<a name="l00283"></a>00283 <span class="keyword">namespace </span>internal {
-<a name="l00284"></a>00284 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U, <span class="keyword">typename</span> Body> <span class="keyword">class </span>concrete_filter;
-<a name="l00285"></a>00285 }
-<a name="l00286"></a>00286
-<a name="l00287"></a>00287 <span class="keyword">class </span>flow_control {
-<a name="l00288"></a>00288 <span class="keywordtype">bool</span> is_pipeline_stopped;
-<a name="l00289"></a>00289 flow_control() { is_pipeline_stopped = <span class="keyword">false</span>; }
-<a name="l00290"></a>00290 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U, <span class="keyword">typename</span> Body> <span class="keyword">friend</span> <span class="keyword">class </span>internal::concrete_filter;
-<a name="l00291"></a>00291 <span class="keyword">public</span>:
-<a name="l00292"></a>00292 <span class="keywordtype">void</span> stop() { is_pipeline_stopped = <span class="keyword">true</span>; }
-<a name="l00293"></a>00293 };
-<a name="l00294"></a>00294
-<a name="l00296"></a>00296 <span class="keyword">namespace </span>internal {
-<a name="l00297"></a>00297
-<a name="l00298"></a>00298 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U, <span class="keyword">typename</span> Body>
-<a name="l00299"></a>00299 <span class="keyword">class </span>concrete_filter: <span class="keyword">public</span> tbb::filter {
-<a name="l00300"></a>00300 Body my_body;
-<a name="l00301"></a>00301
-<a name="l00302"></a>00302 <span class="comment">/*override*/</span> <span class="keywordtype">void</span>* operator()(<span class="keywordtype">void</span>* input) {
-<a name="l00303"></a>00303 T* temp_input = (T*)input;
-<a name="l00304"></a>00304 <span class="comment">// Call user's operator()() here</span>
-<a name="l00305"></a>00305 <span class="keywordtype">void</span>* output = (<span class="keywordtype">void</span>*) <span class="keyword">new</span> U(my_body(*temp_input));
-<a name="l00306"></a>00306 <span class="keyword">delete</span> temp_input;
-<a name="l00307"></a>00307 <span class="keywordflow">return</span> output;
-<a name="l00308"></a>00308 }
-<a name="l00309"></a>00309
-<a name="l00310"></a>00310 <span class="keyword">public</span>:
-<a name="l00311"></a>00311 concrete_filter(tbb::filter::mode filter_mode, <span class="keyword">const</span> Body& body) : filter(filter_mode), my_body(body) {}
-<a name="l00312"></a>00312 };
-<a name="l00313"></a>00313
-<a name="l00314"></a>00314 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> Body>
-<a name="l00315"></a>00315 <span class="keyword">class </span>concrete_filter<void,U,Body>: <span class="keyword">public</span> filter {
-<a name="l00316"></a>00316 Body my_body;
-<a name="l00317"></a>00317
-<a name="l00318"></a>00318 <span class="comment">/*override*/</span><span class="keywordtype">void</span>* operator()(<span class="keywordtype">void</span>*) {
-<a name="l00319"></a>00319 flow_control control;
-<a name="l00320"></a>00320 U temp_output = my_body(control);
-<a name="l00321"></a>00321 <span class="keywordtype">void</span>* output = control.is_pipeline_stopped ? NULL : (<span class="keywordtype">void</span>*) <span class="keyword">new</span> U(temp_output);
-<a name="l00322"></a>00322 <span class="keywordflow">return</span> output;
-<a name="l00323"></a>00323 }
-<a name="l00324"></a>00324 <span class="keyword">public</span>:
-<a name="l00325"></a>00325 concrete_filter(tbb::filter::mode filter_mode, <span class="keyword">const</span> Body& body) : filter(filter_mode), my_body(body) {}
-<a name="l00326"></a>00326 };
-<a name="l00327"></a>00327
-<a name="l00328"></a>00328 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> Body>
-<a name="l00329"></a>00329 <span class="keyword">class </span>concrete_filter<T,void,Body>: <span class="keyword">public</span> filter {
-<a name="l00330"></a>00330 Body my_body;
-<a name="l00331"></a>00331
-<a name="l00332"></a>00332 <span class="comment">/*override*/</span> <span class="keywordtype">void</span>* operator()(<span class="keywordtype">void</span>* input) {
-<a name="l00333"></a>00333 T* temp_input = (T*)input;
-<a name="l00334"></a>00334 my_body(*temp_input);
-<a name="l00335"></a>00335 <span class="keyword">delete</span> temp_input;
-<a name="l00336"></a>00336 <span class="keywordflow">return</span> NULL;
-<a name="l00337"></a>00337 }
-<a name="l00338"></a>00338 <span class="keyword">public</span>:
-<a name="l00339"></a>00339 concrete_filter(tbb::filter::mode filter_mode, <span class="keyword">const</span> Body& body) : filter(filter_mode), my_body(body) {}
-<a name="l00340"></a>00340 };
-<a name="l00341"></a>00341
-<a name="l00342"></a>00342 <span class="keyword">template</span><<span class="keyword">typename</span> Body>
-<a name="l00343"></a>00343 <span class="keyword">class </span>concrete_filter<void,void,Body>: <span class="keyword">public</span> filter {
-<a name="l00344"></a>00344 Body my_body;
-<a name="l00345"></a>00345
-<a name="l00347"></a>00347 <span class="comment">/*override*/</span> <span class="keywordtype">void</span>* operator()(<span class="keywordtype">void</span>*) {
-<a name="l00348"></a>00348 flow_control control;
-<a name="l00349"></a>00349 my_body(control);
-<a name="l00350"></a>00350 <span class="keywordtype">void</span>* output = control.is_pipeline_stopped ? NULL : (<span class="keywordtype">void</span>*)(intptr_t)-1;
-<a name="l00351"></a>00351 <span class="keywordflow">return</span> output;
-<a name="l00352"></a>00352 }
-<a name="l00353"></a>00353 <span class="keyword">public</span>:
-<a name="l00354"></a>00354 concrete_filter(filter::mode filter_mode, <span class="keyword">const</span> Body& body) : filter(filter_mode), my_body(body) {}
-<a name="l00355"></a>00355 };
-<a name="l00356"></a>00356
-<a name="l00358"></a>00358
-<a name="l00359"></a>00359 <span class="keyword">class </span>pipeline_proxy {
-<a name="l00360"></a>00360 <a class="code" href="a00180.html">tbb::pipeline</a> my_pipe;
-<a name="l00361"></a>00361 <span class="keyword">public</span>:
-<a name="l00362"></a>00362 pipeline_proxy( <span class="keyword">const</span> filter_t<void,void>& filter_chain );
-<a name="l00363"></a>00363 ~pipeline_proxy() {
-<a name="l00364"></a>00364 <span class="keywordflow">while</span>( filter* f = my_pipe.filter_list )
-<a name="l00365"></a>00365 <span class="keyword">delete</span> f; <span class="comment">// filter destructor removes it from the pipeline</span>
-<a name="l00366"></a>00366 }
-<a name="l00367"></a>00367 <a class="code" href="a00180.html">tbb::pipeline</a>* operator->() { <span class="keywordflow">return</span> &my_pipe; }
-<a name="l00368"></a>00368 };
-<a name="l00369"></a>00369
-<a name="l00371"></a>00371
-<a name="l00372"></a>00372 <span class="keyword">class </span>filter_node: tbb::internal::no_copy {
-<a name="l00374"></a>00374 <a class="code" href="a00143.html">tbb::atomic<intptr_t></a> ref_count;
-<a name="l00375"></a>00375 <span class="keyword">protected</span>:
-<a name="l00376"></a>00376 filter_node() {
-<a name="l00377"></a>00377 ref_count = 0;
-<a name="l00378"></a>00378 <span class="preprocessor">#ifdef __TBB_TEST_FILTER_NODE_COUNT</span>
-<a name="l00379"></a>00379 <span class="preprocessor"></span> ++(__TBB_TEST_FILTER_NODE_COUNT);
-<a name="l00380"></a>00380 <span class="preprocessor">#endif</span>
-<a name="l00381"></a>00381 <span class="preprocessor"></span> }
-<a name="l00382"></a>00382 <span class="keyword">public</span>:
-<a name="l00384"></a>00384 <span class="keyword">virtual</span> <span class="keywordtype">void</span> add_to( pipeline& ) = 0;
-<a name="l00386"></a>00386 <span class="keywordtype">void</span> add_ref() {++ref_count;}
-<a name="l00388"></a>00388 <span class="keywordtype">void</span> remove_ref() {
-<a name="l00389"></a>00389 __TBB_ASSERT(ref_count>0,<span class="stringliteral">"ref_count underflow"</span>);
-<a name="l00390"></a>00390 <span class="keywordflow">if</span>( --ref_count==0 )
-<a name="l00391"></a>00391 <span class="keyword">delete</span> <span class="keyword">this</span>;
-<a name="l00392"></a>00392 }
-<a name="l00393"></a>00393 <span class="keyword">virtual</span> ~filter_node() {
-<a name="l00394"></a>00394 <span class="preprocessor">#ifdef __TBB_TEST_FILTER_NODE_COUNT</span>
-<a name="l00395"></a>00395 <span class="preprocessor"></span> --(__TBB_TEST_FILTER_NODE_COUNT);
-<a name="l00396"></a>00396 <span class="preprocessor">#endif</span>
-<a name="l00397"></a>00397 <span class="preprocessor"></span> }
-<a name="l00398"></a>00398 };
-<a name="l00399"></a>00399
-<a name="l00401"></a>00401 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U, <span class="keyword">typename</span> Body>
-<a name="l00402"></a>00402 <span class="keyword">class </span>filter_node_leaf: <span class="keyword">public</span> filter_node {
-<a name="l00403"></a>00403 <span class="keyword">const</span> tbb::filter::mode mode;
-<a name="l00404"></a>00404 <span class="keyword">const</span> Body& body;
-<a name="l00405"></a>00405 <span class="comment">/*override*/</span><span class="keywordtype">void</span> add_to( pipeline& p ) {
-<a name="l00406"></a>00406 concrete_filter<T,U,Body>* f = <span class="keyword">new</span> concrete_filter<T,U,Body>(mode,body);
-<a name="l00407"></a>00407 p.add_filter( *f );
-<a name="l00408"></a>00408 }
-<a name="l00409"></a>00409 <span class="keyword">public</span>:
-<a name="l00410"></a>00410 filter_node_leaf( tbb::filter::mode m, <span class="keyword">const</span> Body& b ) : mode(m), body(b) {}
-<a name="l00411"></a>00411 };
-<a name="l00412"></a>00412
-<a name="l00414"></a>00414 <span class="keyword">class </span>filter_node_join: <span class="keyword">public</span> filter_node {
-<a name="l00415"></a>00415 <span class="keyword">friend</span> <span class="keyword">class </span>filter_node; <span class="comment">// to suppress GCC 3.2 warnings</span>
-<a name="l00416"></a>00416 filter_node& left;
-<a name="l00417"></a>00417 filter_node& right;
-<a name="l00418"></a>00418 <span class="comment">/*override*/</span>~filter_node_join() {
-<a name="l00419"></a>00419 left.remove_ref();
-<a name="l00420"></a>00420 right.remove_ref();
-<a name="l00421"></a>00421 }
-<a name="l00422"></a>00422 <span class="comment">/*override*/</span><span class="keywordtype">void</span> add_to( pipeline& p ) {
-<a name="l00423"></a>00423 left.add_to(p);
-<a name="l00424"></a>00424 right.add_to(p);
-<a name="l00425"></a>00425 }
-<a name="l00426"></a>00426 <span class="keyword">public</span>:
-<a name="l00427"></a>00427 filter_node_join( filter_node& x, filter_node& y ) : left(x), right(y) {
-<a name="l00428"></a>00428 left.add_ref();
-<a name="l00429"></a>00429 right.add_ref();
-<a name="l00430"></a>00430 }
-<a name="l00431"></a>00431 };
-<a name="l00432"></a>00432
-<a name="l00433"></a>00433 } <span class="comment">// namespace internal</span>
-<a name="l00435"></a>00435 <span class="comment"></span>
-<a name="l00436"></a>00436 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U, <span class="keyword">typename</span> Body>
-<a name="l00437"></a>00437 filter_t<T,U> make_filter(tbb::filter::mode mode, <span class="keyword">const</span> Body& body) {
-<a name="l00438"></a>00438 <span class="keywordflow">return</span> <span class="keyword">new</span> internal::filter_node_leaf<T,U,Body>(mode, body);
-<a name="l00439"></a>00439 }
-<a name="l00440"></a>00440
-<a name="l00441"></a>00441 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> V, <span class="keyword">typename</span> U>
-<a name="l00442"></a>00442 filter_t<T,U> operator& (<span class="keyword">const</span> filter_t<T,V>& left, <span class="keyword">const</span> filter_t<V,U>& right) {
-<a name="l00443"></a>00443 __TBB_ASSERT(left.root,<span class="stringliteral">"cannot use default-constructed filter_t as left argument of '&'"</span>);
-<a name="l00444"></a>00444 __TBB_ASSERT(right.root,<span class="stringliteral">"cannot use default-constructed filter_t as right argument of '&'"</span>);
-<a name="l00445"></a>00445 <span class="keywordflow">return</span> <span class="keyword">new</span> internal::filter_node_join(*left.root,*right.root);
-<a name="l00446"></a>00446 }
-<a name="l00447"></a>00447
-<a name="l00449"></a>00449 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00450"></a><a class="code" href="a00166.html">00450</a> <span class="keyword">class </span><a class="code" href="a00166.html">filter_t</a> {
-<a name="l00451"></a>00451 <span class="keyword">typedef</span> internal::filter_node filter_node;
-<a name="l00452"></a>00452 filter_node* root;
-<a name="l00453"></a>00453 <a class="code" href="a00166.html">filter_t</a>( filter_node* root_ ) : root(root_) {
-<a name="l00454"></a>00454 root->add_ref();
-<a name="l00455"></a>00455 }
-<a name="l00456"></a>00456 <span class="keyword">friend</span> <span class="keyword">class </span>internal::pipeline_proxy;
-<a name="l00457"></a>00457 <span class="keyword">template</span><<span class="keyword">typename</span> T_, <span class="keyword">typename</span> U_, <span class="keyword">typename</span> Body>
-<a name="l00458"></a>00458 <span class="keyword">friend</span> <a class="code" href="a00166.html">filter_t<T_,U_></a> make_filter(tbb::filter::mode, <span class="keyword">const</span> Body& );
-<a name="l00459"></a>00459 <span class="keyword">template</span><<span class="keyword">typename</span> T_, <span class="keyword">typename</span> V_, <span class="keyword">typename</span> U_>
-<a name="l00460"></a>00460 <span class="keyword">friend</span> <a class="code" href="a00166.html">filter_t<T_,U_></a> operator& (<span class="keyword">const</span> <a class="code" href="a00166.html">filter_t<T_,V_></a>& , <span class="keyword">const</span> <a class="code" href="a00166.html">filter_t<V_,U_></a>& );
-<a name="l00461"></a>00461 <span class="keyword">public</span>:
-<a name="l00462"></a>00462 <a class="code" href="a00166.html">filter_t</a>() : root(NULL) {}
-<a name="l00463"></a>00463 <a class="code" href="a00166.html">filter_t</a>( <span class="keyword">const</span> <a class="code" href="a00166.html">filter_t<T,U></a>& rhs ) : root(rhs.<a class="code" href="a00166.html#a44d0f06c15bc89c324c5581956799fd">root</a>) {
-<a name="l00464"></a>00464 <span class="keywordflow">if</span>( root ) root->add_ref();
-<a name="l00465"></a>00465 }
-<a name="l00466"></a>00466 <span class="keyword">template</span><<span class="keyword">typename</span> Body>
-<a name="l00467"></a>00467 <a class="code" href="a00166.html">filter_t</a>( tbb::filter::mode mode, <span class="keyword">const</span> Body& body ) :
-<a name="l00468"></a>00468 root( <span class="keyword">new</span> internal::filter_node_leaf<T,U,Body>(mode, body) ) {
-<a name="l00469"></a>00469 root->add_ref();
-<a name="l00470"></a>00470 }
-<a name="l00471"></a>00471
-<a name="l00472"></a>00472 <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> <a class="code" href="a00166.html">filter_t<T,U></a>& rhs ) {
-<a name="l00473"></a>00473 <span class="comment">// Order of operations below carefully chosen so that reference counts remain correct</span>
-<a name="l00474"></a>00474 <span class="comment">// in unlikely event that remove_ref throws exception.</span>
-<a name="l00475"></a>00475 filter_node* old = root;
-<a name="l00476"></a>00476 root = rhs.<a class="code" href="a00166.html#a44d0f06c15bc89c324c5581956799fd">root</a>;
-<a name="l00477"></a>00477 <span class="keywordflow">if</span>( root ) root->add_ref();
-<a name="l00478"></a>00478 <span class="keywordflow">if</span>( old ) old->remove_ref();
-<a name="l00479"></a>00479 }
-<a name="l00480"></a>00480 ~<a class="code" href="a00166.html">filter_t</a>() {
-<a name="l00481"></a>00481 <span class="keywordflow">if</span>( root ) root->remove_ref();
-<a name="l00482"></a>00482 }
-<a name="l00483"></a>00483 <span class="keywordtype">void</span> clear() {
-<a name="l00484"></a>00484 <span class="comment">// Like operator= with filter_t() on right side.</span>
-<a name="l00485"></a>00485 <span class="keywordflow">if</span>( root ) {
-<a name="l00486"></a>00486 filter_node* old = root;
-<a name="l00487"></a>00487 root = NULL;
-<a name="l00488"></a>00488 old->remove_ref();
-<a name="l00489"></a>00489 }
-<a name="l00490"></a>00490 }
-<a name="l00491"></a>00491 };
-<a name="l00492"></a>00492
-<a name="l00493"></a>00493 <span class="keyword">inline</span> internal::pipeline_proxy::pipeline_proxy( <span class="keyword">const</span> <a class="code" href="a00166.html">filter_t<void,void></a>& filter_chain ) : my_pipe() {
-<a name="l00494"></a>00494 __TBB_ASSERT( filter_chain.<a class="code" href="a00166.html#a44d0f06c15bc89c324c5581956799fd">root</a>, <span class="stringliteral">"cannot apply parallel_pipeline to default-constructed filter_t"</span> );
-<a name="l00495"></a>00495 filter_chain.<a class="code" href="a00166.html#a44d0f06c15bc89c324c5581956799fd">root</a>->add_to(my_pipe);
-<a name="l00496"></a>00496 }
-<a name="l00497"></a>00497
-<a name="l00498"></a>00498 <span class="keyword">inline</span> <span class="keywordtype">void</span> parallel_pipeline(size_t max_number_of_live_tokens, <span class="keyword">const</span> <a class="code" href="a00166.html">filter_t<void,void></a>& filter_chain
-<a name="l00499"></a>00499 #<span class="keywordflow">if</span> __TBB_TASK_GROUP_CONTEXT
-<a name="l00500"></a>00500 , <a class="code" href="a00201.html">tbb::task_group_context</a>& context
-<a name="l00501"></a>00501 #endif
-<a name="l00502"></a>00502 ) {
-<a name="l00503"></a>00503 internal::pipeline_proxy pipe(filter_chain);
-<a name="l00504"></a>00504 <span class="comment">// tbb::pipeline::run() is called via the proxy</span>
-<a name="l00505"></a>00505 pipe->run(max_number_of_live_tokens
-<a name="l00506"></a>00506 #<span class="keywordflow">if</span> __TBB_TASK_GROUP_CONTEXT
-<a name="l00507"></a>00507 , context
-<a name="l00508"></a>00508 #endif
-<a name="l00509"></a>00509 );
-<a name="l00510"></a>00510 }
-<a name="l00511"></a>00511
-<a name="l00512"></a>00512 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00513"></a>00513 <span class="preprocessor"></span><span class="keyword">inline</span> <span class="keywordtype">void</span> parallel_pipeline(size_t max_number_of_live_tokens, <span class="keyword">const</span> filter_t<void,void>& filter_chain) {
-<a name="l00514"></a>00514 <a class="code" href="a00201.html">tbb::task_group_context</a> context;
-<a name="l00515"></a>00515 parallel_pipeline(max_number_of_live_tokens, filter_chain, context);
-<a name="l00516"></a>00516 }
-<a name="l00517"></a>00517 <span class="preprocessor">#endif // __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00518"></a>00518 <span class="preprocessor"></span>
-<a name="l00519"></a>00519 } <span class="comment">// interface5</span>
-<a name="l00520"></a>00520
-<a name="l00521"></a>00521 <span class="keyword">using</span> interface5::flow_control;
-<a name="l00522"></a>00522 <span class="keyword">using</span> interface5::filter_t;
-<a name="l00523"></a>00523 <span class="keyword">using</span> interface5::make_filter;
-<a name="l00524"></a>00524 <span class="keyword">using</span> interface5::parallel_pipeline;
-<a name="l00525"></a>00525
-<a name="l00526"></a>00526 } <span class="comment">// tbb</span>
-<a name="l00527"></a>00527
-<a name="l00528"></a>00528 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_pipeline_H */</span>
+<a name="l00218"></a>00218 } <span class="comment">// namespace tbb</span>
+<a name="l00219"></a>00219
+<a name="l00220"></a>00220 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_partitioner_H */</span>
</pre></div><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00414.html b/doc/html/a00414.html
new file mode 100644
index 0000000..d25676a
--- /dev/null
+++ b/doc/html/a00414.html
@@ -0,0 +1,507 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>pipeline.h Source File</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.7 -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li id="current"><a href="files.html"><span>Files</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="files.html"><span>File List</span></a></li>
+ <li><a href="globals.html"><span>File Members</span></a></li>
+ </ul></div>
+<h1>pipeline.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
+<a name="l00003"></a>00003 <span class="comment"></span>
+<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
+<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
+<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
+<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
+<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
+<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
+<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
+<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
+<a name="l00012"></a>00012 <span class="comment"></span>
+<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
+<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
+<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
+<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
+<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
+<a name="l00018"></a>00018 <span class="comment"> writing.</span>
+<a name="l00019"></a>00019 <span class="comment">*/</span>
+<a name="l00020"></a>00020
+<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_pipeline_H </span>
+<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_pipeline_H </span>
+<a name="l00023"></a>00023 <span class="preprocessor"></span>
+<a name="l00024"></a>00024 <span class="preprocessor">#include "atomic.h"</span>
+<a name="l00025"></a>00025 <span class="preprocessor">#include "task.h"</span>
+<a name="l00026"></a>00026 <span class="preprocessor">#include "tbb_allocator.h"</span>
+<a name="l00027"></a>00027 <span class="preprocessor">#include <cstddef></span>
+<a name="l00028"></a>00028
+<a name="l00029"></a>00029 <span class="keyword">namespace </span>tbb {
+<a name="l00030"></a>00030
+<a name="l00031"></a>00031 <span class="keyword">class </span>pipeline;
+<a name="l00032"></a>00032 <span class="keyword">class </span>filter;
+<a name="l00033"></a>00033
+<a name="l00035"></a>00035 <span class="keyword">namespace </span>internal {
+<a name="l00036"></a>00036
+<a name="l00037"></a>00037 <span class="comment">// The argument for PIPELINE_VERSION should be an integer between 2 and 9</span>
+<a name="l00038"></a>00038 <span class="preprocessor">#define __TBB_PIPELINE_VERSION(x) (unsigned char)(x-2)<<1</span>
+<a name="l00039"></a>00039 <span class="preprocessor"></span>
+<a name="l00040"></a>00040 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> Token;
+<a name="l00041"></a>00041 <span class="keyword">typedef</span> <span class="keywordtype">long</span> tokendiff_t;
+<a name="l00042"></a>00042 <span class="keyword">class </span>stage_task;
+<a name="l00043"></a>00043 <span class="keyword">class </span>input_buffer;
+<a name="l00044"></a>00044 <span class="keyword">class </span>pipeline_root_task;
+<a name="l00045"></a>00045 <span class="keyword">class </span>pipeline_cleaner;
+<a name="l00046"></a>00046
+<a name="l00047"></a>00047 } <span class="comment">// namespace internal</span>
+<a name="l00048"></a>00048
+<a name="l00049"></a>00049 <span class="keyword">namespace </span>interface5 {
+<a name="l00050"></a>00050 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U> <span class="keyword">class </span>filter_t;
+<a name="l00051"></a>00051
+<a name="l00052"></a>00052 <span class="keyword">namespace </span>internal {
+<a name="l00053"></a>00053 <span class="keyword">class </span>pipeline_proxy;
+<a name="l00054"></a>00054 }
+<a name="l00055"></a>00055 }
+<a name="l00056"></a>00056
+<a name="l00058"></a>00058
+<a name="l00060"></a>00060
+<a name="l00061"></a><a class="code" href="a00164.html">00061</a> <span class="keyword">class </span><a class="code" href="a00164.html">filter</a>: internal::no_copy {
+<a name="l00062"></a>00062 <span class="keyword">private</span>:
+<a name="l00064"></a>00064 <span class="keyword">static</span> <a class="code" href="a00164.html">filter</a>* not_in_pipeline() {<span class="keywordflow">return</span> reinterpret_cast<filter*>(intptr_t(-1));}
+<a name="l00065"></a>00065
+<a name="l00067"></a>00067 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> filter_is_serial = 0x1;
+<a name="l00068"></a>00068
+<a name="l00070"></a>00070
+<a name="l00072"></a>00072 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> filter_is_out_of_order = 0x1<<4;
+<a name="l00073"></a>00073
+<a name="l00075"></a>00075 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> filter_is_bound = 0x1<<5;
+<a name="l00076"></a>00076
+<a name="l00078"></a>00078 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> exact_exception_propagation =
+<a name="l00079"></a>00079 <span class="preprocessor">#if TBB_USE_CAPTURED_EXCEPTION</span>
+<a name="l00080"></a>00080 <span class="preprocessor"></span> 0x0;
+<a name="l00081"></a>00081 <span class="preprocessor">#else</span>
+<a name="l00082"></a>00082 <span class="preprocessor"></span> 0x1<<7;
+<a name="l00083"></a>00083 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_CAPTURED_EXCEPTION */</span>
+<a name="l00084"></a>00084
+<a name="l00085"></a>00085 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> current_version = __TBB_PIPELINE_VERSION(5);
+<a name="l00086"></a>00086 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> version_mask = 0x7<<1; <span class="comment">// bits 1-3 are for version</span>
+<a name="l00087"></a>00087 <span class="keyword">public</span>:
+<a name="l00088"></a>00088 <span class="keyword">enum</span> mode {
+<a name="l00090"></a>00090 parallel = current_version | filter_is_out_of_order,
+<a name="l00092"></a>00092 serial_in_order = current_version | filter_is_serial,
+<a name="l00094"></a>00094 serial_out_of_order = current_version | filter_is_serial | filter_is_out_of_order,
+<a name="l00096"></a>00096 serial = serial_in_order
+<a name="l00097"></a>00097 };
+<a name="l00098"></a>00098 <span class="keyword">protected</span>:
+<a name="l00099"></a>00099 <a class="code" href="a00164.html">filter</a>( <span class="keywordtype">bool</span> is_serial_ ) :
+<a name="l00100"></a>00100 next_filter_in_pipeline(not_in_pipeline()),
+<a name="l00101"></a>00101 my_input_buffer(NULL),
+<a name="l00102"></a>00102 my_filter_mode(static_cast<unsigned char>((is_serial_ ? serial : parallel) | exact_exception_propagation)),
+<a name="l00103"></a>00103 prev_filter_in_pipeline(not_in_pipeline()),
+<a name="l00104"></a>00104 my_pipeline(NULL),
+<a name="l00105"></a>00105 next_segment(NULL)
+<a name="l00106"></a>00106 {}
+<a name="l00107"></a>00107
+<a name="l00108"></a>00108 <a class="code" href="a00164.html">filter</a>( mode filter_mode ) :
+<a name="l00109"></a>00109 next_filter_in_pipeline(not_in_pipeline()),
+<a name="l00110"></a>00110 my_input_buffer(NULL),
+<a name="l00111"></a>00111 my_filter_mode(static_cast<unsigned char>(filter_mode | exact_exception_propagation)),
+<a name="l00112"></a>00112 prev_filter_in_pipeline(not_in_pipeline()),
+<a name="l00113"></a>00113 my_pipeline(NULL),
+<a name="l00114"></a>00114 next_segment(NULL)
+<a name="l00115"></a>00115 {}
+<a name="l00116"></a>00116
+<a name="l00117"></a>00117 <span class="keyword">public</span>:
+<a name="l00119"></a><a class="code" href="a00164.html#fcfec27656a69ff2072802ac001e936f">00119</a> <span class="keywordtype">bool</span> <a class="code" href="a00164.html#fcfec27656a69ff2072802ac001e936f">is_serial</a>()<span class="keyword"> const </span>{
+<a name="l00120"></a>00120 <span class="keywordflow">return</span> bool( my_filter_mode & filter_is_serial );
+<a name="l00121"></a>00121 }
+<a name="l00122"></a>00122
+<a name="l00124"></a><a class="code" href="a00164.html#cd53206c4795ef2df5df26b795caf692">00124</a> <span class="keywordtype">bool</span> <a class="code" href="a00164.html#cd53206c4795ef2df5df26b795caf692">is_ordered</a>()<span class="keyword"> const </span>{
+<a name="l00125"></a>00125 <span class="keywordflow">return</span> (my_filter_mode & (filter_is_out_of_order|filter_is_serial))==filter_is_serial;
+<a name="l00126"></a>00126 }
+<a name="l00127"></a>00127
+<a name="l00129"></a><a class="code" href="a00164.html#15c29cae5d237e6d63dbfe5c94af89d5">00129</a> <span class="keywordtype">bool</span> <a class="code" href="a00164.html#15c29cae5d237e6d63dbfe5c94af89d5">is_bound</a>()<span class="keyword"> const </span>{
+<a name="l00130"></a>00130 <span class="keywordflow">return</span> ( my_filter_mode & filter_is_bound )==filter_is_bound;
+<a name="l00131"></a>00131 }
+<a name="l00132"></a>00132
+<a name="l00134"></a>00134
+<a name="l00135"></a>00135 <span class="keyword">virtual</span> <span class="keywordtype">void</span>* <a class="code" href="a00164.html#fa1b3dc1f4f47563ccab7f4d92f5b543">operator()</a>( <span class="keywordtype">void</span>* item ) = 0;
+<a name="l00136"></a>00136
+<a name="l00138"></a>00138
+<a name="l00139"></a>00139 <span class="keyword">virtual</span> __TBB_EXPORTED_METHOD <a class="code" href="a00164.html#66d159f362293e3964ba3da8bc1d2604">~filter</a>();
+<a name="l00140"></a>00140
+<a name="l00141"></a>00141 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00143"></a>00143 <span class="preprocessor"></span>
+<a name="l00145"></a><a class="code" href="a00164.html#56275eb889c77c4807967133e21401bd">00145</a> <span class="preprocessor"> virtual void finalize( void* </span><span class="comment">/*item*/</span> ) {};
+<a name="l00146"></a>00146 <span class="preprocessor">#endif</span>
+<a name="l00147"></a>00147 <span class="preprocessor"></span>
+<a name="l00148"></a>00148 <span class="keyword">private</span>:
+<a name="l00150"></a>00150 <a class="code" href="a00164.html">filter</a>* next_filter_in_pipeline;
+<a name="l00151"></a>00151
+<a name="l00153"></a>00153
+<a name="l00154"></a>00154 internal::input_buffer* my_input_buffer;
+<a name="l00155"></a>00155
+<a name="l00156"></a>00156 <span class="keyword">friend</span> <span class="keyword">class </span>internal::stage_task;
+<a name="l00157"></a>00157 <span class="keyword">friend</span> <span class="keyword">class </span>internal::pipeline_root_task;
+<a name="l00158"></a>00158 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00180.html">pipeline</a>;
+<a name="l00159"></a>00159 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00209.html">thread_bound_filter</a>;
+<a name="l00160"></a>00160
+<a name="l00162"></a>00162 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> my_filter_mode;
+<a name="l00163"></a>00163
+<a name="l00165"></a>00165 <a class="code" href="a00164.html">filter</a>* prev_filter_in_pipeline;
+<a name="l00166"></a>00166
+<a name="l00168"></a>00168 <a class="code" href="a00180.html">pipeline</a>* my_pipeline;
+<a name="l00169"></a>00169
+<a name="l00171"></a>00171
+<a name="l00172"></a>00172 <a class="code" href="a00164.html">filter</a>* next_segment;
+<a name="l00173"></a>00173 };
+<a name="l00174"></a>00174
+<a name="l00176"></a>00176
+<a name="l00177"></a><a class="code" href="a00209.html">00177</a> <span class="keyword">class </span><a class="code" href="a00209.html">thread_bound_filter</a>: <span class="keyword">public</span> <a class="code" href="a00164.html">filter</a> {
+<a name="l00178"></a>00178 <span class="keyword">public</span>:
+<a name="l00179"></a>00179 <span class="keyword">enum</span> result_type {
+<a name="l00180"></a>00180 <span class="comment">// item was processed</span>
+<a name="l00181"></a>00181 success,
+<a name="l00182"></a>00182 <span class="comment">// item is currently not available</span>
+<a name="l00183"></a>00183 item_not_available,
+<a name="l00184"></a>00184 <span class="comment">// there are no more items to process</span>
+<a name="l00185"></a>00185 end_of_stream
+<a name="l00186"></a>00186 };
+<a name="l00187"></a>00187 <span class="keyword">protected</span>:
+<a name="l00188"></a>00188 <a class="code" href="a00209.html">thread_bound_filter</a>(mode filter_mode):
+<a name="l00189"></a>00189 <a class="code" href="a00164.html">filter</a>(static_cast<mode>(filter_mode | filter::filter_is_bound | filter::exact_exception_propagation))
+<a name="l00190"></a>00190 {}
+<a name="l00191"></a>00191 <span class="keyword">public</span>:
+<a name="l00193"></a>00193
+<a name="l00198"></a>00198 result_type __TBB_EXPORTED_METHOD <a class="code" href="a00209.html#c4f90f2c771bce748beb9be734fa286c">try_process_item</a>();
+<a name="l00199"></a>00199
+<a name="l00201"></a>00201
+<a name="l00205"></a>00205 result_type __TBB_EXPORTED_METHOD <a class="code" href="a00209.html#5e726bdc7fbd924c0b07bd558b1d4d5d">process_item</a>();
+<a name="l00206"></a>00206
+<a name="l00207"></a>00207 <span class="keyword">private</span>:
+<a name="l00209"></a>00209 result_type internal_process_item(<span class="keywordtype">bool</span> is_blocking);
+<a name="l00210"></a>00210 };
+<a name="l00211"></a>00211
+<a name="l00213"></a>00213
+<a name="l00214"></a><a class="code" href="a00180.html">00214</a> <span class="keyword">class </span><a class="code" href="a00180.html">pipeline</a> {
+<a name="l00215"></a>00215 <span class="keyword">public</span>:
+<a name="l00217"></a>00217 __TBB_EXPORTED_METHOD <a class="code" href="a00180.html#596dc3beba27099c4c8581cb419e1a59">pipeline</a>();
+<a name="l00218"></a>00218
+<a name="l00221"></a>00221 <span class="keyword">virtual</span> __TBB_EXPORTED_METHOD <a class="code" href="a00180.html#49513c6c24f9d5bbbb27edca5efe01c9">~pipeline</a>();
+<a name="l00222"></a>00222
+<a name="l00224"></a>00224 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00180.html#38fb5c9c8395dd6f89a4ae2011a83e0d">add_filter</a>( <a class="code" href="a00164.html">filter</a>& filter_ );
+<a name="l00225"></a>00225
+<a name="l00227"></a>00227 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00180.html#f627616049b3fe36801f37ee40403ef8">run</a>( size_t max_number_of_live_tokens );
+<a name="l00228"></a>00228
+<a name="l00229"></a>00229 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00231"></a>00231 <span class="preprocessor"> void __TBB_EXPORTED_METHOD run( size_t max_number_of_live_tokens, tbb::task_group_context& context );</span>
+<a name="l00232"></a>00232 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00233"></a>00233 <span class="preprocessor"></span>
+<a name="l00235"></a>00235 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00180.html#2c84aef5b834b555ee220b176e25931e">clear</a>();
+<a name="l00236"></a>00236
+<a name="l00237"></a>00237 <span class="keyword">private</span>:
+<a name="l00238"></a>00238 <span class="keyword">friend</span> <span class="keyword">class </span>internal::stage_task;
+<a name="l00239"></a>00239 <span class="keyword">friend</span> <span class="keyword">class </span>internal::pipeline_root_task;
+<a name="l00240"></a>00240 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00164.html">filter</a>;
+<a name="l00241"></a>00241 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00209.html">thread_bound_filter</a>;
+<a name="l00242"></a>00242 <span class="keyword">friend</span> <span class="keyword">class </span>internal::pipeline_cleaner;
+<a name="l00243"></a>00243 <span class="keyword">friend</span> <span class="keyword">class </span>tbb::interface5::internal::pipeline_proxy;
+<a name="l00244"></a>00244
+<a name="l00246"></a>00246 <a class="code" href="a00164.html">filter</a>* filter_list;
+<a name="l00247"></a>00247
+<a name="l00249"></a>00249 <a class="code" href="a00164.html">filter</a>* filter_end;
+<a name="l00250"></a>00250
+<a name="l00252"></a>00252 <a class="code" href="a00199.html">task</a>* end_counter;
+<a name="l00253"></a>00253
+<a name="l00255"></a>00255 <a class="code" href="a00142.html">atomic<internal::Token></a> input_tokens;
+<a name="l00256"></a>00256
+<a name="l00258"></a>00258 <a class="code" href="a00142.html">atomic<internal::Token></a> token_counter;
+<a name="l00259"></a>00259
+<a name="l00261"></a>00261 <span class="keywordtype">bool</span> end_of_input;
+<a name="l00262"></a>00262
+<a name="l00264"></a>00264 <span class="keywordtype">bool</span> has_thread_bound_filters;
+<a name="l00265"></a>00265
+<a name="l00267"></a>00267 <span class="keywordtype">void</span> remove_filter( <a class="code" href="a00164.html">filter</a>& filter_ );
+<a name="l00268"></a>00268
+<a name="l00270"></a>00270 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD inject_token( <a class="code" href="a00199.html">task</a>& <span class="keyword">self</span> );
+<a name="l00271"></a>00271
+<a name="l00272"></a>00272 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00274"></a>00274 <span class="preprocessor"> void clear_filters();</span>
+<a name="l00275"></a>00275 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00276"></a>00276 <span class="preprocessor"></span>};
+<a name="l00277"></a>00277
+<a name="l00278"></a>00278 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00279"></a>00279 <span class="comment">// Support for lambda-friendly parallel_pipeline interface</span>
+<a name="l00280"></a>00280 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00281"></a>00281
+<a name="l00282"></a>00282 <span class="keyword">namespace </span>interface5 {
+<a name="l00283"></a>00283
+<a name="l00284"></a>00284 <span class="keyword">namespace </span>internal {
+<a name="l00285"></a>00285 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U, <span class="keyword">typename</span> Body> <span class="keyword">class </span>concrete_filter;
+<a name="l00286"></a>00286 }
+<a name="l00287"></a>00287
+<a name="l00289"></a><a class="code" href="a00167.html">00289</a> <span class="keyword">class </span><a class="code" href="a00167.html">flow_control</a> {
+<a name="l00290"></a>00290 <span class="keywordtype">bool</span> is_pipeline_stopped;
+<a name="l00291"></a>00291 <a class="code" href="a00167.html">flow_control</a>() { is_pipeline_stopped = <span class="keyword">false</span>; }
+<a name="l00292"></a>00292 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U, <span class="keyword">typename</span> Body> <span class="keyword">friend</span> <span class="keyword">class </span>internal::concrete_filter;
+<a name="l00293"></a>00293 <span class="keyword">public</span>:
+<a name="l00294"></a>00294 <span class="keywordtype">void</span> stop() { is_pipeline_stopped = <span class="keyword">true</span>; }
+<a name="l00295"></a>00295 };
+<a name="l00296"></a>00296
+<a name="l00298"></a>00298 <span class="keyword">namespace </span>internal {
+<a name="l00299"></a>00299
+<a name="l00300"></a>00300 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U, <span class="keyword">typename</span> Body>
+<a name="l00301"></a>00301 <span class="keyword">class </span>concrete_filter: <span class="keyword">public</span> tbb::<a class="code" href="a00164.html">filter</a> {
+<a name="l00302"></a>00302 <span class="keyword">const</span> Body& my_body;
+<a name="l00303"></a>00303
+<a name="l00304"></a>00304 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00204.html">tbb::tbb_allocator<U></a> u_allocator;
+<a name="l00305"></a>00305 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00204.html">tbb::tbb_allocator<T></a> t_allocator;
+<a name="l00306"></a>00306
+<a name="l00307"></a>00307 <span class="comment">/*override*/</span> <span class="keywordtype">void</span>* operator()(<span class="keywordtype">void</span>* input) {
+<a name="l00308"></a>00308 T* temp_input = (T*)input;
+<a name="l00309"></a>00309 <span class="comment">// Call user's operator()() here</span>
+<a name="l00310"></a>00310 U* output_u = u_allocator().allocate(1);
+<a name="l00311"></a>00311 <span class="keywordtype">void</span>* output = (<span class="keywordtype">void</span>*) <span class="keyword">new</span> (output_u) U(my_body(*temp_input));
+<a name="l00312"></a>00312 t_allocator().destroy(temp_input);
+<a name="l00313"></a>00313 t_allocator().deallocate(temp_input,1);
+<a name="l00314"></a>00314 <span class="keywordflow">return</span> output;
+<a name="l00315"></a>00315 }
+<a name="l00316"></a>00316
+<a name="l00317"></a>00317 <span class="keyword">public</span>:
+<a name="l00318"></a>00318 concrete_filter(tbb::filter::mode filter_mode, <span class="keyword">const</span> Body& body) : <a class="code" href="a00164.html">filter</a>(filter_mode), my_body(body) {}
+<a name="l00319"></a>00319 };
+<a name="l00320"></a>00320
+<a name="l00321"></a>00321 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> Body>
+<a name="l00322"></a>00322 <span class="keyword">class </span>concrete_filter<void,U,Body>: <span class="keyword">public</span> filter {
+<a name="l00323"></a>00323 <span class="keyword">const</span> Body& my_body;
+<a name="l00324"></a>00324
+<a name="l00325"></a>00325 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00204.html">tbb::tbb_allocator<U></a> u_allocator;
+<a name="l00326"></a>00326
+<a name="l00327"></a>00327 <span class="comment">/*override*/</span><span class="keywordtype">void</span>* operator()(<span class="keywordtype">void</span>*) {
+<a name="l00328"></a>00328 flow_control control;
+<a name="l00329"></a>00329 U* output_u = u_allocator().allocate(1);
+<a name="l00330"></a>00330 (void) <span class="keyword">new</span> (output_u) U(my_body(control));
+<a name="l00331"></a>00331 <span class="keywordflow">if</span>(control.is_pipeline_stopped) {
+<a name="l00332"></a>00332 u_allocator().destroy(output_u);
+<a name="l00333"></a>00333 u_allocator().deallocate(output_u,1);
+<a name="l00334"></a>00334 output_u = NULL;
+<a name="l00335"></a>00335 }
+<a name="l00336"></a>00336 <span class="keywordflow">return</span> (<span class="keywordtype">void</span>*)output_u;
+<a name="l00337"></a>00337 }
+<a name="l00338"></a>00338 <span class="keyword">public</span>:
+<a name="l00339"></a>00339 concrete_filter(tbb::filter::mode filter_mode, <span class="keyword">const</span> Body& body) : filter(filter_mode), my_body(body) {}
+<a name="l00340"></a>00340 };
+<a name="l00341"></a>00341
+<a name="l00342"></a>00342 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> Body>
+<a name="l00343"></a>00343 <span class="keyword">class </span>concrete_filter<T,void,Body>: <span class="keyword">public</span> filter {
+<a name="l00344"></a>00344 <span class="keyword">const</span> Body& my_body;
+<a name="l00345"></a>00345
+<a name="l00346"></a>00346 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00204.html">tbb::tbb_allocator<T></a> t_allocator;
+<a name="l00347"></a>00347
+<a name="l00348"></a>00348 <span class="comment">/*override*/</span> <span class="keywordtype">void</span>* operator()(<span class="keywordtype">void</span>* input) {
+<a name="l00349"></a>00349 T* temp_input = (T*)input;
+<a name="l00350"></a>00350 my_body(*temp_input);
+<a name="l00351"></a>00351 t_allocator().destroy(temp_input);
+<a name="l00352"></a>00352 t_allocator().deallocate(temp_input,1);
+<a name="l00353"></a>00353 <span class="keywordflow">return</span> NULL;
+<a name="l00354"></a>00354 }
+<a name="l00355"></a>00355 <span class="keyword">public</span>:
+<a name="l00356"></a>00356 concrete_filter(tbb::filter::mode filter_mode, <span class="keyword">const</span> Body& body) : filter(filter_mode), my_body(body) {}
+<a name="l00357"></a>00357 };
+<a name="l00358"></a>00358
+<a name="l00359"></a>00359 <span class="keyword">template</span><<span class="keyword">typename</span> Body>
+<a name="l00360"></a>00360 <span class="keyword">class </span>concrete_filter<void,void,Body>: <span class="keyword">public</span> filter {
+<a name="l00361"></a>00361 <span class="keyword">const</span> Body& my_body;
+<a name="l00362"></a>00362
+<a name="l00364"></a>00364 <span class="comment">/*override*/</span> <span class="keywordtype">void</span>* operator()(<span class="keywordtype">void</span>*) {
+<a name="l00365"></a>00365 flow_control control;
+<a name="l00366"></a>00366 my_body(control);
+<a name="l00367"></a>00367 <span class="keywordtype">void</span>* output = control.is_pipeline_stopped ? NULL : (<span class="keywordtype">void</span>*)(intptr_t)-1;
+<a name="l00368"></a>00368 <span class="keywordflow">return</span> output;
+<a name="l00369"></a>00369 }
+<a name="l00370"></a>00370 <span class="keyword">public</span>:
+<a name="l00371"></a>00371 concrete_filter(filter::mode filter_mode, <span class="keyword">const</span> Body& body) : filter(filter_mode), my_body(body) {}
+<a name="l00372"></a>00372 };
+<a name="l00373"></a>00373
+<a name="l00375"></a>00375
+<a name="l00376"></a>00376 <span class="keyword">class </span>pipeline_proxy {
+<a name="l00377"></a>00377 <a class="code" href="a00180.html">tbb::pipeline</a> my_pipe;
+<a name="l00378"></a>00378 <span class="keyword">public</span>:
+<a name="l00379"></a>00379 pipeline_proxy( <span class="keyword">const</span> filter_t<void,void>& filter_chain );
+<a name="l00380"></a>00380 ~pipeline_proxy() {
+<a name="l00381"></a>00381 <span class="keywordflow">while</span>( filter* f = my_pipe.filter_list )
+<a name="l00382"></a>00382 <span class="keyword">delete</span> f; <span class="comment">// filter destructor removes it from the pipeline</span>
+<a name="l00383"></a>00383 }
+<a name="l00384"></a>00384 <a class="code" href="a00180.html">tbb::pipeline</a>* operator->() { <span class="keywordflow">return</span> &my_pipe; }
+<a name="l00385"></a>00385 };
+<a name="l00386"></a>00386
+<a name="l00388"></a>00388
+<a name="l00389"></a>00389 <span class="keyword">class </span>filter_node: tbb::internal::no_copy {
+<a name="l00391"></a>00391 <a class="code" href="a00142.html">tbb::atomic<intptr_t></a> ref_count;
+<a name="l00392"></a>00392 <span class="keyword">protected</span>:
+<a name="l00393"></a>00393 filter_node() {
+<a name="l00394"></a>00394 ref_count = 0;
+<a name="l00395"></a>00395 <span class="preprocessor">#ifdef __TBB_TEST_FILTER_NODE_COUNT</span>
+<a name="l00396"></a>00396 <span class="preprocessor"></span> ++(__TBB_TEST_FILTER_NODE_COUNT);
+<a name="l00397"></a>00397 <span class="preprocessor">#endif</span>
+<a name="l00398"></a>00398 <span class="preprocessor"></span> }
+<a name="l00399"></a>00399 <span class="keyword">public</span>:
+<a name="l00401"></a>00401 <span class="keyword">virtual</span> <span class="keywordtype">void</span> add_to( pipeline& ) = 0;
+<a name="l00403"></a>00403 <span class="keywordtype">void</span> add_ref() {++ref_count;}
+<a name="l00405"></a>00405 <span class="keywordtype">void</span> remove_ref() {
+<a name="l00406"></a>00406 __TBB_ASSERT(ref_count>0,<span class="stringliteral">"ref_count underflow"</span>);
+<a name="l00407"></a>00407 <span class="keywordflow">if</span>( --ref_count==0 )
+<a name="l00408"></a>00408 <span class="keyword">delete</span> <span class="keyword">this</span>;
+<a name="l00409"></a>00409 }
+<a name="l00410"></a>00410 <span class="keyword">virtual</span> ~filter_node() {
+<a name="l00411"></a>00411 <span class="preprocessor">#ifdef __TBB_TEST_FILTER_NODE_COUNT</span>
+<a name="l00412"></a>00412 <span class="preprocessor"></span> --(__TBB_TEST_FILTER_NODE_COUNT);
+<a name="l00413"></a>00413 <span class="preprocessor">#endif</span>
+<a name="l00414"></a>00414 <span class="preprocessor"></span> }
+<a name="l00415"></a>00415 };
+<a name="l00416"></a>00416
+<a name="l00418"></a>00418 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U, <span class="keyword">typename</span> Body>
+<a name="l00419"></a>00419 <span class="keyword">class </span>filter_node_leaf: <span class="keyword">public</span> filter_node {
+<a name="l00420"></a>00420 <span class="keyword">const</span> tbb::filter::mode mode;
+<a name="l00421"></a>00421 <span class="keyword">const</span> Body body;
+<a name="l00422"></a>00422 <span class="comment">/*override*/</span><span class="keywordtype">void</span> add_to( pipeline& p ) {
+<a name="l00423"></a>00423 concrete_filter<T,U,Body>* f = <span class="keyword">new</span> concrete_filter<T,U,Body>(mode,body);
+<a name="l00424"></a>00424 p.add_filter( *f );
+<a name="l00425"></a>00425 }
+<a name="l00426"></a>00426 <span class="keyword">public</span>:
+<a name="l00427"></a>00427 filter_node_leaf( tbb::filter::mode m, <span class="keyword">const</span> Body& b ) : mode(m), body(b) {}
+<a name="l00428"></a>00428 };
+<a name="l00429"></a>00429
+<a name="l00431"></a>00431 <span class="keyword">class </span>filter_node_join: <span class="keyword">public</span> filter_node {
+<a name="l00432"></a>00432 <span class="keyword">friend</span> <span class="keyword">class </span>filter_node; <span class="comment">// to suppress GCC 3.2 warnings</span>
+<a name="l00433"></a>00433 filter_node& left;
+<a name="l00434"></a>00434 filter_node& right;
+<a name="l00435"></a>00435 <span class="comment">/*override*/</span>~filter_node_join() {
+<a name="l00436"></a>00436 left.remove_ref();
+<a name="l00437"></a>00437 right.remove_ref();
+<a name="l00438"></a>00438 }
+<a name="l00439"></a>00439 <span class="comment">/*override*/</span><span class="keywordtype">void</span> add_to( pipeline& p ) {
+<a name="l00440"></a>00440 left.add_to(p);
+<a name="l00441"></a>00441 right.add_to(p);
+<a name="l00442"></a>00442 }
+<a name="l00443"></a>00443 <span class="keyword">public</span>:
+<a name="l00444"></a>00444 filter_node_join( filter_node& x, filter_node& y ) : left(x), right(y) {
+<a name="l00445"></a>00445 left.add_ref();
+<a name="l00446"></a>00446 right.add_ref();
+<a name="l00447"></a>00447 }
+<a name="l00448"></a>00448 };
+<a name="l00449"></a>00449
+<a name="l00450"></a>00450 } <span class="comment">// namespace internal</span>
+<a name="l00452"></a>00452 <span class="comment"></span>
+<a name="l00454"></a>00454 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U, <span class="keyword">typename</span> Body>
+<a name="l00455"></a><a class="code" href="a00165.html#85c2892eff1fddcd06e28911e75838bd">00455</a> <a class="code" href="a00165.html">filter_t<T,U></a> make_filter(tbb::filter::mode mode, <span class="keyword">const</span> Body& body) {
+<a name="l00456"></a>00456 <span class="keywordflow">return</span> <span class="keyword">new</span> internal::filter_node_leaf<T,U,Body>(mode, body);
+<a name="l00457"></a>00457 }
+<a name="l00458"></a>00458
+<a name="l00459"></a>00459 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> V, <span class="keyword">typename</span> U>
+<a name="l00460"></a>00460 <a class="code" href="a00165.html">filter_t<T,U></a> operator& (<span class="keyword">const</span> <a class="code" href="a00165.html">filter_t<T,V></a>& left, <span class="keyword">const</span> <a class="code" href="a00165.html">filter_t<V,U></a>& right) {
+<a name="l00461"></a>00461 __TBB_ASSERT(left.<a class="code" href="a00165.html#a44d0f06c15bc89c324c5581956799fd">root</a>,<span class="stringliteral">"cannot use default-constructed filter_t as left argument of '&'"</span>);
+<a name="l00462"></a>00462 __TBB_ASSERT(right.<a class="code" href="a00165.html#a44d0f06c15bc89c324c5581956799fd">root</a>,<span class="stringliteral">"cannot use default-constructed filter_t as right argument of '&'"</span>);
+<a name="l00463"></a>00463 <span class="keywordflow">return</span> <span class="keyword">new</span> internal::filter_node_join(*left.<a class="code" href="a00165.html#a44d0f06c15bc89c324c5581956799fd">root</a>,*right.<a class="code" href="a00165.html#a44d0f06c15bc89c324c5581956799fd">root</a>);
+<a name="l00464"></a>00464 }
+<a name="l00465"></a>00465
+<a name="l00467"></a>00467 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00468"></a><a class="code" href="a00165.html">00468</a> <span class="keyword">class </span><a class="code" href="a00165.html">filter_t</a> {
+<a name="l00469"></a>00469 <span class="keyword">typedef</span> internal::filter_node filter_node;
+<a name="l00470"></a>00470 filter_node* root;
+<a name="l00471"></a>00471 <a class="code" href="a00165.html">filter_t</a>( filter_node* root_ ) : root(root_) {
+<a name="l00472"></a>00472 root->add_ref();
+<a name="l00473"></a>00473 }
+<a name="l00474"></a>00474 <span class="keyword">friend</span> <span class="keyword">class </span>internal::pipeline_proxy;
+<a name="l00475"></a>00475 <span class="keyword">template</span><<span class="keyword">typename</span> T_, <span class="keyword">typename</span> U_, <span class="keyword">typename</span> Body>
+<a name="l00476"></a>00476 <span class="keyword">friend</span> <a class="code" href="a00165.html">filter_t<T_,U_></a> <a class="code" href="a00165.html#85c2892eff1fddcd06e28911e75838bd">make_filter</a>(tbb::filter::mode, <span class="keyword">const</span> Body& );
+<a name="l00477"></a>00477 <span class="keyword">template</span><<span class="keyword">typename</span> T_, <span class="keyword">typename</span> V_, <span class="keyword">typename</span> U_>
+<a name="l00478"></a>00478 <span class="keyword">friend</span> <a class="code" href="a00165.html">filter_t<T_,U_></a> operator& (<span class="keyword">const</span> <a class="code" href="a00165.html">filter_t<T_,V_></a>& , <span class="keyword">const</span> <a class="code" href="a00165.html">filter_t<V_,U_></a>& );
+<a name="l00479"></a>00479 <span class="keyword">public</span>:
+<a name="l00480"></a>00480 <a class="code" href="a00165.html">filter_t</a>() : root(NULL) {}
+<a name="l00481"></a>00481 <a class="code" href="a00165.html">filter_t</a>( <span class="keyword">const</span> <a class="code" href="a00165.html">filter_t<T,U></a>& rhs ) : root(rhs.<a class="code" href="a00165.html#a44d0f06c15bc89c324c5581956799fd">root</a>) {
+<a name="l00482"></a>00482 <span class="keywordflow">if</span>( root ) root->add_ref();
+<a name="l00483"></a>00483 }
+<a name="l00484"></a>00484 <span class="keyword">template</span><<span class="keyword">typename</span> Body>
+<a name="l00485"></a>00485 <a class="code" href="a00165.html">filter_t</a>( tbb::filter::mode mode, <span class="keyword">const</span> Body& body ) :
+<a name="l00486"></a>00486 root( <span class="keyword">new</span> internal::filter_node_leaf<T,U,Body>(mode, body) ) {
+<a name="l00487"></a>00487 root->add_ref();
+<a name="l00488"></a>00488 }
+<a name="l00489"></a>00489
+<a name="l00490"></a>00490 <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> <a class="code" href="a00165.html">filter_t<T,U></a>& rhs ) {
+<a name="l00491"></a>00491 <span class="comment">// Order of operations below carefully chosen so that reference counts remain correct</span>
+<a name="l00492"></a>00492 <span class="comment">// in unlikely event that remove_ref throws exception.</span>
+<a name="l00493"></a>00493 filter_node* old = root;
+<a name="l00494"></a>00494 root = rhs.<a class="code" href="a00165.html#a44d0f06c15bc89c324c5581956799fd">root</a>;
+<a name="l00495"></a>00495 <span class="keywordflow">if</span>( root ) root->add_ref();
+<a name="l00496"></a>00496 <span class="keywordflow">if</span>( old ) old->remove_ref();
+<a name="l00497"></a>00497 }
+<a name="l00498"></a>00498 ~<a class="code" href="a00165.html">filter_t</a>() {
+<a name="l00499"></a>00499 <span class="keywordflow">if</span>( root ) root->remove_ref();
+<a name="l00500"></a>00500 }
+<a name="l00501"></a>00501 <span class="keywordtype">void</span> clear() {
+<a name="l00502"></a>00502 <span class="comment">// Like operator= with filter_t() on right side.</span>
+<a name="l00503"></a>00503 <span class="keywordflow">if</span>( root ) {
+<a name="l00504"></a>00504 filter_node* old = root;
+<a name="l00505"></a>00505 root = NULL;
+<a name="l00506"></a>00506 old->remove_ref();
+<a name="l00507"></a>00507 }
+<a name="l00508"></a>00508 }
+<a name="l00509"></a>00509 };
+<a name="l00510"></a>00510
+<a name="l00511"></a>00511 <span class="keyword">inline</span> internal::pipeline_proxy::pipeline_proxy( <span class="keyword">const</span> <a class="code" href="a00165.html">filter_t<void,void></a>& filter_chain ) : my_pipe() {
+<a name="l00512"></a>00512 __TBB_ASSERT( filter_chain.<a class="code" href="a00165.html#a44d0f06c15bc89c324c5581956799fd">root</a>, <span class="stringliteral">"cannot apply parallel_pipeline to default-constructed filter_t"</span> );
+<a name="l00513"></a>00513 filter_chain.<a class="code" href="a00165.html#a44d0f06c15bc89c324c5581956799fd">root</a>->add_to(my_pipe);
+<a name="l00514"></a>00514 }
+<a name="l00515"></a>00515
+<a name="l00516"></a>00516 <span class="keyword">inline</span> <span class="keywordtype">void</span> parallel_pipeline(size_t max_number_of_live_tokens, <span class="keyword">const</span> <a class="code" href="a00165.html">filter_t<void,void></a>& filter_chain
+<a name="l00517"></a>00517 #<span class="keywordflow">if</span> __TBB_TASK_GROUP_CONTEXT
+<a name="l00518"></a>00518 , <a class="code" href="a00201.html">tbb::task_group_context</a>& context
+<a name="l00519"></a>00519 #endif
+<a name="l00520"></a>00520 ) {
+<a name="l00521"></a>00521 internal::pipeline_proxy pipe(filter_chain);
+<a name="l00522"></a>00522 <span class="comment">// tbb::pipeline::run() is called via the proxy</span>
+<a name="l00523"></a>00523 pipe->run(max_number_of_live_tokens
+<a name="l00524"></a>00524 #<span class="keywordflow">if</span> __TBB_TASK_GROUP_CONTEXT
+<a name="l00525"></a>00525 , context
+<a name="l00526"></a>00526 #endif
+<a name="l00527"></a>00527 );
+<a name="l00528"></a>00528 }
+<a name="l00529"></a>00529
+<a name="l00530"></a>00530 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00531"></a>00531 <span class="preprocessor"></span><span class="keyword">inline</span> <span class="keywordtype">void</span> parallel_pipeline(size_t max_number_of_live_tokens, <span class="keyword">const</span> filter_t<void,void>& filter_chain) {
+<a name="l00532"></a>00532 <a class="code" href="a00201.html">tbb::task_group_context</a> context;
+<a name="l00533"></a>00533 parallel_pipeline(max_number_of_live_tokens, filter_chain, context);
+<a name="l00534"></a>00534 }
+<a name="l00535"></a>00535 <span class="preprocessor">#endif // __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00536"></a>00536 <span class="preprocessor"></span>
+<a name="l00537"></a>00537 } <span class="comment">// interface5</span>
+<a name="l00538"></a>00538
+<a name="l00539"></a>00539 <span class="keyword">using</span> interface5::flow_control;
+<a name="l00540"></a>00540 <span class="keyword">using</span> interface5::filter_t;
+<a name="l00541"></a>00541 <span class="keyword">using</span> interface5::make_filter;
+<a name="l00542"></a>00542 <span class="keyword">using</span> interface5::parallel_pipeline;
+<a name="l00543"></a>00543
+<a name="l00544"></a>00544 } <span class="comment">// tbb</span>
+<a name="l00545"></a>00545
+<a name="l00546"></a>00546 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_pipeline_H */</span>
+</pre></div><hr>
+<p></p>
+Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
+<p></p>
+Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
+registered trademarks or trademarks of Intel Corporation or its
+subsidiaries in the United States and other countries.
+<p></p>
+* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00420.html b/doc/html/a00420.html
deleted file mode 100644
index 5fb5d30..0000000
--- a/doc/html/a00420.html
+++ /dev/null
@@ -1,136 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>queuing_mutex.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>queuing_mutex.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_queuing_mutex_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_queuing_mutex_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_config.h"</span>
-<a name="l00025"></a>00025
-<a name="l00026"></a>00026 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
-<a name="l00027"></a>00027 <span class="preprocessor"></span> <span class="comment">// Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers</span>
-<a name="l00028"></a>00028 <span class="preprocessor"> #pragma warning (push)</span>
-<a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4530)</span>
-<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00031"></a>00031 <span class="preprocessor"></span>
-<a name="l00032"></a>00032 <span class="preprocessor">#include <cstring></span>
-<a name="l00033"></a>00033
-<a name="l00034"></a>00034 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
-<a name="l00035"></a>00035 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
-<a name="l00036"></a>00036 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00037"></a>00037 <span class="preprocessor"></span>
-<a name="l00038"></a>00038 <span class="preprocessor">#include "atomic.h"</span>
-<a name="l00039"></a>00039 <span class="preprocessor">#include "tbb_profiling.h"</span>
-<a name="l00040"></a>00040
-<a name="l00041"></a>00041 <span class="keyword">namespace </span>tbb {
-<a name="l00042"></a>00042
-<a name="l00044"></a>00044
-<a name="l00045"></a><a class="code" href="a00182.html">00045</a> <span class="keyword">class </span><a class="code" href="a00182.html">queuing_mutex</a> {
-<a name="l00046"></a>00046 <span class="keyword">public</span>:
-<a name="l00048"></a><a class="code" href="a00182.html#b389ad9c4db7293e4bdb5b8cda69ec04">00048</a> <a class="code" href="a00182.html#b389ad9c4db7293e4bdb5b8cda69ec04">queuing_mutex</a>() {
-<a name="l00049"></a>00049 q_tail = NULL;
-<a name="l00050"></a>00050 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00051"></a>00051 <span class="preprocessor"></span> internal_construct();
-<a name="l00052"></a>00052 <span class="preprocessor">#endif</span>
-<a name="l00053"></a>00053 <span class="preprocessor"></span> }
-<a name="l00054"></a>00054
-<a name="l00056"></a>00056
-<a name="l00058"></a><a class="code" href="a00183.html">00058</a> <span class="keyword">class </span><a class="code" href="a00183.html">scoped_lock</a>: internal::no_copy {
-<a name="l00060"></a>00060 <span class="keywordtype">void</span> initialize() {
-<a name="l00061"></a>00061 <a class="code" href="a00172.html">mutex</a> = NULL;
-<a name="l00062"></a>00062 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00063"></a>00063 <span class="preprocessor"></span> internal::poison_pointer(next);
-<a name="l00064"></a>00064 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00065"></a>00065 }
-<a name="l00066"></a>00066 <span class="keyword">public</span>:
-<a name="l00068"></a>00068
-<a name="l00069"></a><a class="code" href="a00183.html#db0fa3967491014572e24d6607bdc971">00069</a> <a class="code" href="a00183.html#db0fa3967491014572e24d6607bdc971">scoped_lock</a>() {initialize();}
-<a name="l00070"></a>00070
-<a name="l00072"></a><a class="code" href="a00183.html#9b51ef972f5618ac17caadb58841ab6d">00072</a> <a class="code" href="a00183.html#db0fa3967491014572e24d6607bdc971">scoped_lock</a>( <a class="code" href="a00182.html">queuing_mutex</a>& m ) {
-<a name="l00073"></a>00073 initialize();
-<a name="l00074"></a>00074 <a class="code" href="a00183.html#533e4fc8355ee321206a0609c42d909d">acquire</a>(m);
-<a name="l00075"></a>00075 }
-<a name="l00076"></a>00076
-<a name="l00078"></a><a class="code" href="a00183.html#ac2c576a93570957d694192a5f491443">00078</a> <a class="code" href="a00183.html#ac2c576a93570957d694192a5f491443">~scoped_lock</a>() {
-<a name="l00079"></a>00079 <span class="keywordflow">if</span>( <a class="code" href="a00172.html">mutex</a> ) <a class="code" href="a00183.html#3bf2b8c87ff22115be9b2eac179f2d30">release</a>();
-<a name="l00080"></a>00080 }
-<a name="l00081"></a>00081
-<a name="l00083"></a>00083 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00183.html#533e4fc8355ee321206a0609c42d909d">acquire</a>( <a class="code" href="a00182.html">queuing_mutex</a>& m );
-<a name="l00084"></a>00084
-<a name="l00086"></a>00086 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD <a class="code" href="a00183.html#e5a014fb817599386a87170cf2cf51a9">try_acquire</a>( <a class="code" href="a00182.html">queuing_mutex</a>& m );
-<a name="l00087"></a>00087
-<a name="l00089"></a>00089 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00183.html#3bf2b8c87ff22115be9b2eac179f2d30">release</a>();
-<a name="l00090"></a>00090
-<a name="l00091"></a>00091 <span class="keyword">private</span>:
-<a name="l00093"></a>00093 <a class="code" href="a00182.html">queuing_mutex</a>* <a class="code" href="a00172.html">mutex</a>;
-<a name="l00094"></a>00094
-<a name="l00096"></a>00096 <a class="code" href="a00183.html">scoped_lock</a> *next;
-<a name="l00097"></a>00097
-<a name="l00099"></a>00099
-<a name="l00102"></a>00102 uintptr_t going;
-<a name="l00103"></a>00103 };
-<a name="l00104"></a>00104
-<a name="l00105"></a>00105 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_construct();
-<a name="l00106"></a>00106
-<a name="l00107"></a>00107 <span class="comment">// Mutex traits</span>
-<a name="l00108"></a>00108 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_rw_mutex = <span class="keyword">false</span>;
-<a name="l00109"></a>00109 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_recursive_mutex = <span class="keyword">false</span>;
-<a name="l00110"></a>00110 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_fair_mutex = <span class="keyword">true</span>;
-<a name="l00111"></a>00111
-<a name="l00112"></a>00112 <span class="keyword">friend</span> <span class="keyword">class </span>scoped_lock;
-<a name="l00113"></a>00113 <span class="keyword">private</span>:
-<a name="l00115"></a>00115 <a class="code" href="a00143.html">atomic<scoped_lock*></a> q_tail;
-<a name="l00116"></a>00116
-<a name="l00117"></a>00117 };
-<a name="l00118"></a>00118
-<a name="l00119"></a>00119 __TBB_DEFINE_PROFILING_SET_NAME(queuing_mutex)
-<a name="l00120"></a>00120
-<a name="l00121"></a>00121 } <span class="comment">// namespace tbb</span>
-<a name="l00122"></a>00122
-<a name="l00123"></a>00123 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_queuing_mutex_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00421.html b/doc/html/a00421.html
deleted file mode 100644
index e997a39..0000000
--- a/doc/html/a00421.html
+++ /dev/null
@@ -1,168 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>queuing_rw_mutex.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>queuing_rw_mutex.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_queuing_rw_mutex_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_queuing_rw_mutex_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_config.h"</span>
-<a name="l00025"></a>00025
-<a name="l00026"></a>00026 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
-<a name="l00027"></a>00027 <span class="preprocessor"></span> <span class="comment">// Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers</span>
-<a name="l00028"></a>00028 <span class="preprocessor"> #pragma warning (push)</span>
-<a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4530)</span>
-<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00031"></a>00031 <span class="preprocessor"></span>
-<a name="l00032"></a>00032 <span class="preprocessor">#include <cstring></span>
-<a name="l00033"></a>00033
-<a name="l00034"></a>00034 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
-<a name="l00035"></a>00035 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
-<a name="l00036"></a>00036 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00037"></a>00037 <span class="preprocessor"></span>
-<a name="l00038"></a>00038 <span class="preprocessor">#include "atomic.h"</span>
-<a name="l00039"></a>00039 <span class="preprocessor">#include "tbb_profiling.h"</span>
-<a name="l00040"></a>00040
-<a name="l00041"></a>00041 <span class="keyword">namespace </span>tbb {
-<a name="l00042"></a>00042
-<a name="l00044"></a>00044
-<a name="l00047"></a><a class="code" href="a00184.html">00047</a> <span class="keyword">class </span><a class="code" href="a00184.html">queuing_rw_mutex</a> {
-<a name="l00048"></a>00048 <span class="keyword">public</span>:
-<a name="l00050"></a><a class="code" href="a00184.html#85c90877c3447690ac4e2ac4ff8dea5e">00050</a> <a class="code" href="a00184.html#85c90877c3447690ac4e2ac4ff8dea5e">queuing_rw_mutex</a>() {
-<a name="l00051"></a>00051 q_tail = NULL;
-<a name="l00052"></a>00052 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00053"></a>00053 <span class="preprocessor"></span> internal_construct();
-<a name="l00054"></a>00054 <span class="preprocessor">#endif</span>
-<a name="l00055"></a>00055 <span class="preprocessor"></span> }
-<a name="l00056"></a>00056
-<a name="l00058"></a><a class="code" href="a00184.html#1ba73e3d95cfdf8323880bc623af9099">00058</a> <a class="code" href="a00184.html#1ba73e3d95cfdf8323880bc623af9099">~queuing_rw_mutex</a>() {
-<a name="l00059"></a>00059 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00060"></a>00060 <span class="preprocessor"></span> __TBB_ASSERT( !q_tail, <span class="stringliteral">"destruction of an acquired mutex"</span>);
-<a name="l00061"></a>00061 <span class="preprocessor">#endif</span>
-<a name="l00062"></a>00062 <span class="preprocessor"></span> }
-<a name="l00063"></a>00063
-<a name="l00064"></a>00064 <span class="keyword">class </span>scoped_lock;
-<a name="l00065"></a>00065 <span class="keyword">friend</span> <span class="keyword">class </span>scoped_lock;
-<a name="l00066"></a>00066
-<a name="l00068"></a>00068
-<a name="l00070"></a><a class="code" href="a00185.html">00070</a> <span class="keyword">class </span><a class="code" href="a00185.html">scoped_lock</a>: internal::no_copy {
-<a name="l00072"></a>00072 <span class="keywordtype">void</span> initialize() {
-<a name="l00073"></a>00073 <a class="code" href="a00172.html">mutex</a> = NULL;
-<a name="l00074"></a>00074 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00075"></a>00075 <span class="preprocessor"></span> state = 0xFF; <span class="comment">// Set to invalid state</span>
-<a name="l00076"></a>00076 internal::poison_pointer(next);
-<a name="l00077"></a>00077 internal::poison_pointer(prev);
-<a name="l00078"></a>00078 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00079"></a>00079 }
-<a name="l00080"></a>00080 <span class="keyword">public</span>:
-<a name="l00082"></a>00082
-<a name="l00083"></a><a class="code" href="a00185.html#c62e365be7bcbba091c9ea7454a4d22c">00083</a> <a class="code" href="a00185.html#c62e365be7bcbba091c9ea7454a4d22c">scoped_lock</a>() {initialize();}
-<a name="l00084"></a>00084
-<a name="l00086"></a><a class="code" href="a00185.html#fbb8798792d3aebb136c46fc63d2529e">00086</a> <a class="code" href="a00185.html#c62e365be7bcbba091c9ea7454a4d22c">scoped_lock</a>( <a class="code" href="a00184.html">queuing_rw_mutex</a>& m, <span class="keywordtype">bool</span> write=<span class="keyword">true</span> ) {
-<a name="l00087"></a>00087 initialize();
-<a name="l00088"></a>00088 <a class="code" href="a00185.html#a8dd5ab8686e76de21587544dbb681e0">acquire</a>(m,write);
-<a name="l00089"></a>00089 }
-<a name="l00090"></a>00090
-<a name="l00092"></a><a class="code" href="a00185.html#32c7d67a660d23ebbaab1a1d2826d31a">00092</a> <a class="code" href="a00185.html#32c7d67a660d23ebbaab1a1d2826d31a">~scoped_lock</a>() {
-<a name="l00093"></a>00093 <span class="keywordflow">if</span>( <a class="code" href="a00172.html">mutex</a> ) <a class="code" href="a00185.html#67ae221109ddc69510ab593874e435d4">release</a>();
-<a name="l00094"></a>00094 }
-<a name="l00095"></a>00095
-<a name="l00097"></a>00097 <span class="keywordtype">void</span> <a class="code" href="a00185.html#a8dd5ab8686e76de21587544dbb681e0">acquire</a>( <a class="code" href="a00184.html">queuing_rw_mutex</a>& m, <span class="keywordtype">bool</span> write=<span class="keyword">true</span> );
-<a name="l00098"></a>00098
-<a name="l00100"></a>00100 <span class="keywordtype">bool</span> <a class="code" href="a00185.html#2e4ff6c9ec2fee6682f95290d1f42baa">try_acquire</a>( <a class="code" href="a00184.html">queuing_rw_mutex</a>& m, <span class="keywordtype">bool</span> write=<span class="keyword">true</span> );
-<a name="l00101"></a>00101
-<a name="l00103"></a>00103 <span class="keywordtype">void</span> <a class="code" href="a00185.html#67ae221109ddc69510ab593874e435d4">release</a>();
-<a name="l00104"></a>00104
-<a name="l00106"></a>00106
-<a name="l00107"></a>00107 <span class="keywordtype">bool</span> <a class="code" href="a00185.html#11ba1da4a722c9e6f73339a52c487e82">upgrade_to_writer</a>();
-<a name="l00108"></a>00108
-<a name="l00110"></a>00110 <span class="keywordtype">bool</span> <a class="code" href="a00185.html#0d2f93edf7b15ec4bcee138823220c52">downgrade_to_reader</a>();
-<a name="l00111"></a>00111
-<a name="l00112"></a>00112 <span class="keyword">private</span>:
-<a name="l00114"></a>00114 <a class="code" href="a00184.html">queuing_rw_mutex</a>* <a class="code" href="a00172.html">mutex</a>;
-<a name="l00115"></a>00115
-<a name="l00117"></a>00117 <a class="code" href="a00185.html">scoped_lock</a> * prev, * next;
-<a name="l00118"></a>00118
-<a name="l00119"></a>00119 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> state_t;
-<a name="l00120"></a>00120
-<a name="l00122"></a>00122 <a class="code" href="a00143.html">atomic<state_t></a> state;
-<a name="l00123"></a>00123
-<a name="l00125"></a>00125
-<a name="l00126"></a>00126 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> going;
-<a name="l00127"></a>00127
-<a name="l00129"></a>00129 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> internal_lock;
-<a name="l00130"></a>00130
-<a name="l00132"></a>00132 <span class="keywordtype">void</span> acquire_internal_lock();
-<a name="l00133"></a>00133
-<a name="l00135"></a>00135
-<a name="l00136"></a>00136 <span class="keywordtype">bool</span> try_acquire_internal_lock();
-<a name="l00137"></a>00137
-<a name="l00139"></a>00139 <span class="keywordtype">void</span> release_internal_lock();
-<a name="l00140"></a>00140
-<a name="l00142"></a>00142 <span class="keywordtype">void</span> wait_for_release_of_internal_lock();
-<a name="l00143"></a>00143
-<a name="l00145"></a>00145 <span class="keywordtype">void</span> unblock_or_wait_on_internal_lock( uintptr_t );
-<a name="l00146"></a>00146 };
-<a name="l00147"></a>00147
-<a name="l00148"></a>00148 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_construct();
-<a name="l00149"></a>00149
-<a name="l00150"></a>00150 <span class="comment">// Mutex traits</span>
-<a name="l00151"></a>00151 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_rw_mutex = <span class="keyword">true</span>;
-<a name="l00152"></a>00152 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_recursive_mutex = <span class="keyword">false</span>;
-<a name="l00153"></a>00153 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_fair_mutex = <span class="keyword">true</span>;
-<a name="l00154"></a>00154
-<a name="l00155"></a>00155 <span class="keyword">private</span>:
-<a name="l00157"></a>00157 <a class="code" href="a00143.html">atomic<scoped_lock*></a> q_tail;
-<a name="l00158"></a>00158
-<a name="l00159"></a>00159 };
-<a name="l00160"></a>00160
-<a name="l00161"></a>00161 __TBB_DEFINE_PROFILING_SET_NAME(queuing_rw_mutex)
-<a name="l00162"></a>00162
-<a name="l00163"></a>00163 } <span class="comment">// namespace tbb</span>
-<a name="l00164"></a>00164
-<a name="l00165"></a>00165 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_queuing_rw_mutex_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00426.html b/doc/html/a00426.html
index a3161d8..8e0c3f1 100644
--- a/doc/html/a00426.html
+++ b/doc/html/a00426.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>spin_rw_mutex.h Source File</title>
+<title>queuing_mutex.h Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -19,7 +19,7 @@
<li><a href="files.html"><span>File List</span></a></li>
<li><a href="globals.html"><span>File Members</span></a></li>
</ul></div>
-<h1>spin_rw_mutex.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<h1>queuing_mutex.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
<a name="l00003"></a>00003 <span class="comment"></span>
<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
@@ -39,173 +39,92 @@
<a name="l00018"></a>00018 <span class="comment"> writing.</span>
<a name="l00019"></a>00019 <span class="comment">*/</span>
<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_spin_rw_mutex_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_spin_rw_mutex_H</span>
+<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_queuing_mutex_H</span>
+<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_queuing_mutex_H</span>
<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "tbb_machine.h"</span>
-<a name="l00026"></a>00026 <span class="preprocessor">#include "tbb_profiling.h"</span>
-<a name="l00027"></a>00027
-<a name="l00028"></a>00028 <span class="keyword">namespace </span>tbb {
-<a name="l00029"></a>00029
-<a name="l00030"></a>00030 <span class="keyword">class </span>spin_rw_mutex_v3;
-<a name="l00031"></a>00031 <span class="keyword">typedef</span> spin_rw_mutex_v3 spin_rw_mutex;
-<a name="l00032"></a>00032
-<a name="l00034"></a>00034
-<a name="l00035"></a><a class="code" href="a00196.html">00035</a> <span class="keyword">class </span><a class="code" href="a00196.html">spin_rw_mutex_v3</a> {
-<a name="l00037"></a>00037
-<a name="l00039"></a>00039 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD internal_acquire_writer();
+<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_config.h"</span>
+<a name="l00025"></a>00025
+<a name="l00026"></a>00026 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
+<a name="l00027"></a>00027 <span class="preprocessor"></span> <span class="comment">// Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers</span>
+<a name="l00028"></a>00028 <span class="preprocessor"> #pragma warning (push)</span>
+<a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4530)</span>
+<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00031"></a>00031 <span class="preprocessor"></span>
+<a name="l00032"></a>00032 <span class="preprocessor">#include <cstring></span>
+<a name="l00033"></a>00033
+<a name="l00034"></a>00034 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
+<a name="l00035"></a>00035 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
+<a name="l00036"></a>00036 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00037"></a>00037 <span class="preprocessor"></span>
+<a name="l00038"></a>00038 <span class="preprocessor">#include "atomic.h"</span>
+<a name="l00039"></a>00039 <span class="preprocessor">#include "tbb_profiling.h"</span>
<a name="l00040"></a>00040
+<a name="l00041"></a>00041 <span class="keyword">namespace </span>tbb {
<a name="l00042"></a>00042
-<a name="l00043"></a>00043 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_release_writer();
<a name="l00044"></a>00044
-<a name="l00046"></a>00046 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_acquire_reader();
-<a name="l00047"></a>00047
-<a name="l00049"></a>00049 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD internal_upgrade();
-<a name="l00050"></a>00050
-<a name="l00052"></a>00052
-<a name="l00053"></a>00053 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_downgrade();
+<a name="l00045"></a><a class="code" href="a00182.html">00045</a> <span class="keyword">class </span><a class="code" href="a00182.html">queuing_mutex</a> {
+<a name="l00046"></a>00046 <span class="keyword">public</span>:
+<a name="l00048"></a><a class="code" href="a00182.html#b389ad9c4db7293e4bdb5b8cda69ec04">00048</a> <a class="code" href="a00182.html#b389ad9c4db7293e4bdb5b8cda69ec04">queuing_mutex</a>() {
+<a name="l00049"></a>00049 q_tail = NULL;
+<a name="l00050"></a>00050 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
+<a name="l00051"></a>00051 <span class="preprocessor"></span> internal_construct();
+<a name="l00052"></a>00052 <span class="preprocessor">#endif</span>
+<a name="l00053"></a>00053 <span class="preprocessor"></span> }
<a name="l00054"></a>00054
-<a name="l00056"></a>00056 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_release_reader();
-<a name="l00057"></a>00057
-<a name="l00059"></a>00059 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD internal_try_acquire_writer();
-<a name="l00060"></a>00060
-<a name="l00062"></a>00062 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD internal_try_acquire_reader();
-<a name="l00063"></a>00063
-<a name="l00065"></a>00065 <span class="keyword">public</span>:
-<a name="l00067"></a><a class="code" href="a00196.html#61332b2756de89f3f5f69310cbb6e70c">00067</a> <a class="code" href="a00196.html#61332b2756de89f3f5f69310cbb6e70c">spin_rw_mutex_v3</a>() : state(0) {
-<a name="l00068"></a>00068 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00069"></a>00069 <span class="preprocessor"></span> internal_construct();
-<a name="l00070"></a>00070 <span class="preprocessor">#endif</span>
-<a name="l00071"></a>00071 <span class="preprocessor"></span> }
-<a name="l00072"></a>00072
-<a name="l00073"></a>00073 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00075"></a><a class="code" href="a00196.html#9a815fb2759e55072ed413f1b6970cf3">00075</a> <span class="preprocessor"> ~spin_rw_mutex_v3() {</span>
-<a name="l00076"></a>00076 <span class="preprocessor"></span> __TBB_ASSERT( !state, <span class="stringliteral">"destruction of an acquired mutex"</span>);
-<a name="l00077"></a>00077 };
-<a name="l00078"></a>00078 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00079"></a>00079
+<a name="l00056"></a>00056
+<a name="l00058"></a><a class="code" href="a00183.html">00058</a> <span class="keyword">class </span><a class="code" href="a00183.html">scoped_lock</a>: internal::no_copy {
+<a name="l00060"></a>00060 <span class="keywordtype">void</span> initialize() {
+<a name="l00061"></a>00061 <a class="code" href="a00172.html">mutex</a> = NULL;
+<a name="l00062"></a>00062 <span class="preprocessor">#if TBB_USE_ASSERT</span>
+<a name="l00063"></a>00063 <span class="preprocessor"></span> internal::poison_pointer(next);
+<a name="l00064"></a>00064 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
+<a name="l00065"></a>00065 }
+<a name="l00066"></a>00066 <span class="keyword">public</span>:
+<a name="l00068"></a>00068
+<a name="l00069"></a><a class="code" href="a00183.html#db0fa3967491014572e24d6607bdc971">00069</a> <a class="code" href="a00183.html#db0fa3967491014572e24d6607bdc971">scoped_lock</a>() {initialize();}
+<a name="l00070"></a>00070
+<a name="l00072"></a><a class="code" href="a00183.html#9b51ef972f5618ac17caadb58841ab6d">00072</a> <a class="code" href="a00183.html#db0fa3967491014572e24d6607bdc971">scoped_lock</a>( <a class="code" href="a00182.html">queuing_mutex</a>& m ) {
+<a name="l00073"></a>00073 initialize();
+<a name="l00074"></a>00074 <a class="code" href="a00183.html#533e4fc8355ee321206a0609c42d909d">acquire</a>(m);
+<a name="l00075"></a>00075 }
+<a name="l00076"></a>00076
+<a name="l00078"></a><a class="code" href="a00183.html#ac2c576a93570957d694192a5f491443">00078</a> <a class="code" href="a00183.html#ac2c576a93570957d694192a5f491443">~scoped_lock</a>() {
+<a name="l00079"></a>00079 <span class="keywordflow">if</span>( <a class="code" href="a00172.html">mutex</a> ) <a class="code" href="a00183.html#3bf2b8c87ff22115be9b2eac179f2d30">release</a>();
+<a name="l00080"></a>00080 }
<a name="l00081"></a>00081
-<a name="l00083"></a><a class="code" href="a00197.html">00083</a> <span class="keyword">class </span><a class="code" href="a00197.html">scoped_lock</a> : internal::no_copy {
-<a name="l00084"></a>00084 <span class="keyword">public</span>:
-<a name="l00086"></a>00086
-<a name="l00087"></a><a class="code" href="a00197.html#d6ea60dee5563f702379bf5e51aa8806">00087</a> <a class="code" href="a00197.html">scoped_lock</a>() : <a class="code" href="a00172.html">mutex</a>(NULL), is_writer(false) {}
-<a name="l00088"></a>00088
-<a name="l00090"></a><a class="code" href="a00197.html#42a92d4f8fdde425b111cfa8a9228071">00090</a> <a class="code" href="a00197.html">scoped_lock</a>( <a class="code" href="a00196.html">spin_rw_mutex</a>& m, <span class="keywordtype">bool</span> write = <span class="keyword">true</span> ) : <a class="code" href="a00172.html">mutex</a>(NULL) {
-<a name="l00091"></a>00091 <a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>(m, write);
-<a name="l00092"></a>00092 }
-<a name="l00093"></a>00093
-<a name="l00095"></a><a class="code" href="a00197.html#d7eaaa3f2e2c5dc11e7005811b1bdd04">00095</a> <a class="code" href="a00187.html#70246e0260493625ff956fa5926fc71f">~scoped_lock</a>() {
-<a name="l00096"></a>00096 <span class="keywordflow">if</span>( <a class="code" href="a00172.html">mutex</a> ) <a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>();
-<a name="l00097"></a>00097 }
-<a name="l00098"></a>00098
-<a name="l00100"></a><a class="code" href="a00197.html#b0b646ec5be02a127d159bbb7ca65353">00100</a> <span class="keywordtype">void</span> <a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>( <a class="code" href="a00196.html">spin_rw_mutex</a>& m, <span class="keywordtype">bool</span> write = <span class="keyword">true</span> ) {
-<a name="l00101"></a>00101 __TBB_ASSERT( !<a class="code" href="a00172.html">mutex</a>, <span class="stringliteral">"holding mutex already"</span> );
-<a name="l00102"></a>00102 is_writer = write;
-<a name="l00103"></a>00103 <a class="code" href="a00172.html">mutex</a> = &m;
-<a name="l00104"></a>00104 <span class="keywordflow">if</span>( write ) <a class="code" href="a00172.html">mutex</a>->internal_acquire_writer();
-<a name="l00105"></a>00105 <span class="keywordflow">else</span> <a class="code" href="a00172.html">mutex</a>->internal_acquire_reader();
-<a name="l00106"></a>00106 }
-<a name="l00107"></a>00107
-<a name="l00109"></a>00109
-<a name="l00110"></a><a class="code" href="a00197.html#3f0b1e3f2efab63336400348bd070226">00110</a> <span class="keywordtype">bool</span> upgrade_to_writer() {
-<a name="l00111"></a>00111 __TBB_ASSERT( <a class="code" href="a00172.html">mutex</a>, <span class="stringliteral">"lock is not acquired"</span> );
-<a name="l00112"></a>00112 __TBB_ASSERT( !is_writer, <span class="stringliteral">"not a reader"</span> );
-<a name="l00113"></a>00113 is_writer = <span class="keyword">true</span>;
-<a name="l00114"></a>00114 <span class="keywordflow">return</span> <a class="code" href="a00172.html">mutex</a>->internal_upgrade();
-<a name="l00115"></a>00115 }
+<a name="l00083"></a>00083 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00183.html#533e4fc8355ee321206a0609c42d909d">acquire</a>( <a class="code" href="a00182.html">queuing_mutex</a>& m );
+<a name="l00084"></a>00084
+<a name="l00086"></a>00086 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD <a class="code" href="a00183.html#e5a014fb817599386a87170cf2cf51a9">try_acquire</a>( <a class="code" href="a00182.html">queuing_mutex</a>& m );
+<a name="l00087"></a>00087
+<a name="l00089"></a>00089 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00183.html#3bf2b8c87ff22115be9b2eac179f2d30">release</a>();
+<a name="l00090"></a>00090
+<a name="l00091"></a>00091 <span class="keyword">private</span>:
+<a name="l00093"></a>00093 <a class="code" href="a00182.html">queuing_mutex</a>* <a class="code" href="a00172.html">mutex</a>;
+<a name="l00094"></a>00094
+<a name="l00096"></a>00096 <a class="code" href="a00183.html">scoped_lock</a> *next;
+<a name="l00097"></a>00097
+<a name="l00099"></a>00099
+<a name="l00102"></a>00102 uintptr_t going;
+<a name="l00103"></a>00103 };
+<a name="l00104"></a>00104
+<a name="l00105"></a>00105 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_construct();
+<a name="l00106"></a>00106
+<a name="l00107"></a>00107 <span class="comment">// Mutex traits</span>
+<a name="l00108"></a>00108 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_rw_mutex = <span class="keyword">false</span>;
+<a name="l00109"></a>00109 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_recursive_mutex = <span class="keyword">false</span>;
+<a name="l00110"></a>00110 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_fair_mutex = <span class="keyword">true</span>;
+<a name="l00111"></a>00111
+<a name="l00112"></a>00112 <span class="keyword">friend</span> <span class="keyword">class </span>scoped_lock;
+<a name="l00113"></a>00113 <span class="keyword">private</span>:
+<a name="l00115"></a>00115 <a class="code" href="a00142.html">atomic<scoped_lock*></a> q_tail;
<a name="l00116"></a>00116
-<a name="l00118"></a><a class="code" href="a00197.html#61b14d00a78185c9b2d206ebfc379124">00118</a> <span class="keywordtype">void</span> <a class="code" href="a00267.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>() {
-<a name="l00119"></a>00119 __TBB_ASSERT( <a class="code" href="a00172.html">mutex</a>, <span class="stringliteral">"lock is not acquired"</span> );
-<a name="l00120"></a>00120 <a class="code" href="a00196.html">spin_rw_mutex</a> *m = <a class="code" href="a00172.html">mutex</a>;
-<a name="l00121"></a>00121 <a class="code" href="a00172.html">mutex</a> = NULL;
-<a name="l00122"></a>00122 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT</span>
-<a name="l00123"></a>00123 <span class="preprocessor"></span> <span class="keywordflow">if</span>( is_writer ) m->internal_release_writer();
-<a name="l00124"></a>00124 <span class="keywordflow">else</span> m->internal_release_reader();
-<a name="l00125"></a>00125 <span class="preprocessor">#else</span>
-<a name="l00126"></a>00126 <span class="preprocessor"></span> <span class="keywordflow">if</span>( is_writer ) __TBB_AtomicAND( &m-><a class="code" href="a00196.html#621b900d5fef23d2e401aabcbb777c76">state</a>, READERS );
-<a name="l00127"></a>00127 <span class="keywordflow">else</span> __TBB_FetchAndAddWrelease( &m-><a class="code" href="a00196.html#621b900d5fef23d2e401aabcbb777c76">state</a>, -(intptr_t)ONE_READER);
-<a name="l00128"></a>00128 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */</span>
-<a name="l00129"></a>00129 }
-<a name="l00130"></a>00130
-<a name="l00132"></a><a class="code" href="a00197.html#c2c2c38a08cb9080e87099fac3e5bc94">00132</a> <span class="keywordtype">bool</span> downgrade_to_reader() {
-<a name="l00133"></a>00133 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT</span>
-<a name="l00134"></a>00134 <span class="preprocessor"></span> __TBB_ASSERT( <a class="code" href="a00172.html">mutex</a>, <span class="stringliteral">"lock is not acquired"</span> );
-<a name="l00135"></a>00135 __TBB_ASSERT( is_writer, <span class="stringliteral">"not a writer"</span> );
-<a name="l00136"></a>00136 <a class="code" href="a00172.html">mutex</a>->internal_downgrade();
-<a name="l00137"></a>00137 <span class="preprocessor">#else</span>
-<a name="l00138"></a>00138 <span class="preprocessor"></span> __TBB_FetchAndAddW( &<a class="code" href="a00172.html">mutex</a>->state, ((intptr_t)ONE_READER-WRITER));
-<a name="l00139"></a>00139 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */</span>
-<a name="l00140"></a>00140 is_writer = <span class="keyword">false</span>;
-<a name="l00141"></a>00141
-<a name="l00142"></a>00142 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00143"></a>00143 }
-<a name="l00144"></a>00144
-<a name="l00146"></a><a class="code" href="a00197.html#9879626968d9b9a04cd2ec0fb2e84ae1">00146</a> <span class="keywordtype">bool</span> try_acquire( <a class="code" href="a00196.html">spin_rw_mutex</a>& m, <span class="keywordtype">bool</span> write = <span class="keyword">true</span> ) {
-<a name="l00147"></a>00147 __TBB_ASSERT( !<a class="code" href="a00172.html">mutex</a>, <span class="stringliteral">"holding mutex already"</span> );
-<a name="l00148"></a>00148 <span class="keywordtype">bool</span> result;
-<a name="l00149"></a>00149 is_writer = write;
-<a name="l00150"></a>00150 result = write? m.internal_try_acquire_writer()
-<a name="l00151"></a>00151 : m.internal_try_acquire_reader();
-<a name="l00152"></a>00152 <span class="keywordflow">if</span>( result )
-<a name="l00153"></a>00153 <a class="code" href="a00172.html">mutex</a> = &m;
-<a name="l00154"></a>00154 <span class="keywordflow">return</span> result;
-<a name="l00155"></a>00155 }
-<a name="l00156"></a>00156
-<a name="l00157"></a>00157 <span class="keyword">private</span>:
-<a name="l00159"></a>00159 <a class="code" href="a00196.html">spin_rw_mutex</a>* <a class="code" href="a00172.html">mutex</a>;
-<a name="l00160"></a>00160
-<a name="l00162"></a>00162
-<a name="l00163"></a>00163 <span class="keywordtype">bool</span> is_writer;
-<a name="l00164"></a>00164 };
-<a name="l00165"></a>00165
-<a name="l00166"></a>00166 <span class="comment">// Mutex traits</span>
-<a name="l00167"></a>00167 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_rw_mutex = <span class="keyword">true</span>;
-<a name="l00168"></a>00168 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_recursive_mutex = <span class="keyword">false</span>;
-<a name="l00169"></a>00169 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_fair_mutex = <span class="keyword">false</span>;
-<a name="l00170"></a>00170
-<a name="l00171"></a>00171 <span class="comment">// ISO C++0x compatibility methods</span>
-<a name="l00172"></a>00172
-<a name="l00174"></a><a class="code" href="a00196.html#4007d6e1523dbc3c2bb7f889ab789a8a">00174</a> <span class="keywordtype">void</span> lock() {internal_acquire_writer();}
-<a name="l00175"></a>00175
-<a name="l00177"></a>00177
-<a name="l00178"></a><a class="code" href="a00196.html#088bb256be794cc47d3b83791632fdfc">00178</a> <span class="keywordtype">bool</span> try_lock() {<span class="keywordflow">return</span> internal_try_acquire_writer();}
-<a name="l00179"></a>00179
-<a name="l00181"></a><a class="code" href="a00196.html#f9f52ead2098eb5fb12da59d5ae53b55">00181</a> <span class="keywordtype">void</span> unlock() {
-<a name="l00182"></a>00182 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT</span>
-<a name="l00183"></a>00183 <span class="preprocessor"></span> <span class="keywordflow">if</span>( state&WRITER ) internal_release_writer();
-<a name="l00184"></a>00184 <span class="keywordflow">else</span> internal_release_reader();
-<a name="l00185"></a>00185 <span class="preprocessor">#else</span>
-<a name="l00186"></a>00186 <span class="preprocessor"></span> <span class="keywordflow">if</span>( state&WRITER ) __TBB_AtomicAND( &state, READERS );
-<a name="l00187"></a>00187 <span class="keywordflow">else</span> __TBB_FetchAndAddWrelease( &state, -(intptr_t)ONE_READER);
-<a name="l00188"></a>00188 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */</span>
-<a name="l00189"></a>00189 }
-<a name="l00190"></a>00190
-<a name="l00191"></a>00191 <span class="comment">// Methods for reader locks that resemble ISO C++0x compatibility methods.</span>
-<a name="l00192"></a>00192
-<a name="l00194"></a><a class="code" href="a00196.html#13f799708ac4ca437a16be202e263e18">00194</a> <span class="keywordtype">void</span> lock_read() {internal_acquire_reader();}
-<a name="l00195"></a>00195
-<a name="l00197"></a>00197
-<a name="l00198"></a><a class="code" href="a00196.html#b8667415869013f840d976aa406d385a">00198</a> <span class="keywordtype">bool</span> try_lock_read() {<span class="keywordflow">return</span> internal_try_acquire_reader();}
-<a name="l00199"></a>00199
-<a name="l00200"></a>00200 <span class="keyword">private</span>:
-<a name="l00201"></a>00201 <span class="keyword">typedef</span> intptr_t state_t;
-<a name="l00202"></a>00202 <span class="keyword">static</span> <span class="keyword">const</span> state_t WRITER = 1;
-<a name="l00203"></a>00203 <span class="keyword">static</span> <span class="keyword">const</span> state_t WRITER_PENDING = 2;
-<a name="l00204"></a>00204 <span class="keyword">static</span> <span class="keyword">const</span> state_t READERS = ~(WRITER | WRITER_PENDING);
-<a name="l00205"></a>00205 <span class="keyword">static</span> <span class="keyword">const</span> state_t ONE_READER = 4;
-<a name="l00206"></a>00206 <span class="keyword">static</span> <span class="keyword">const</span> state_t BUSY = WRITER | READERS;
-<a name="l00208"></a>00208
-<a name="l00211"></a>00211 state_t state;
-<a name="l00212"></a>00212
-<a name="l00213"></a>00213 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_construct();
-<a name="l00214"></a>00214 };
-<a name="l00215"></a>00215
-<a name="l00216"></a>00216 __TBB_DEFINE_PROFILING_SET_NAME(spin_rw_mutex)
-<a name="l00217"></a>00217
-<a name="l00218"></a>00218 } <span class="comment">// namespace tbb</span>
-<a name="l00219"></a>00219
-<a name="l00220"></a>00220 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_spin_rw_mutex_H */</span>
+<a name="l00117"></a>00117 };
+<a name="l00118"></a>00118
+<a name="l00119"></a>00119 __TBB_DEFINE_PROFILING_SET_NAME(queuing_mutex)
+<a name="l00120"></a>00120
+<a name="l00121"></a>00121 } <span class="comment">// namespace tbb</span>
+<a name="l00122"></a>00122
+<a name="l00123"></a>00123 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_queuing_mutex_H */</span>
</pre></div><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00427.html b/doc/html/a00427.html
index 55ea6c0..bb67d91 100644
--- a/doc/html/a00427.html
+++ b/doc/html/a00427.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>task.h Source File</title>
+<title>queuing_rw_mutex.h Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -19,7 +19,7 @@
<li><a href="files.html"><span>File List</span></a></li>
<li><a href="globals.html"><span>File Members</span></a></li>
</ul></div>
-<h1>task.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<h1>queuing_rw_mutex.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
<a name="l00003"></a>00003 <span class="comment"></span>
<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
@@ -39,612 +39,124 @@
<a name="l00018"></a>00018 <span class="comment"> writing.</span>
<a name="l00019"></a>00019 <span class="comment">*/</span>
<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_task_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_task_H</span>
+<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_queuing_rw_mutex_H</span>
+<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_queuing_rw_mutex_H</span>
<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "tbb_machine.h"</span>
-<a name="l00026"></a>00026
-<a name="l00027"></a>00027 <span class="keyword">typedef</span> <span class="keyword">struct </span>___itt_caller *__itt_caller;
-<a name="l00028"></a>00028
-<a name="l00029"></a>00029 <span class="keyword">namespace </span>tbb {
-<a name="l00030"></a>00030
-<a name="l00031"></a>00031 <span class="keyword">class </span>task;
-<a name="l00032"></a>00032 <span class="keyword">class </span>task_list;
+<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_config.h"</span>
+<a name="l00025"></a>00025
+<a name="l00026"></a>00026 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
+<a name="l00027"></a>00027 <span class="preprocessor"></span> <span class="comment">// Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers</span>
+<a name="l00028"></a>00028 <span class="preprocessor"> #pragma warning (push)</span>
+<a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4530)</span>
+<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00031"></a>00031 <span class="preprocessor"></span>
+<a name="l00032"></a>00032 <span class="preprocessor">#include <cstring></span>
<a name="l00033"></a>00033
-<a name="l00034"></a>00034 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00035"></a>00035 <span class="preprocessor"></span><span class="keyword">class </span>task_group_context;
-<a name="l00036"></a>00036 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00037"></a>00037
-<a name="l00038"></a>00038 <span class="comment">// MSVC does not allow taking the address of a member that was defined </span>
-<a name="l00039"></a>00039 <span class="comment">// privately in task_base and made public in class task via a using declaration.</span>
-<a name="l00040"></a>00040 <span class="preprocessor">#if _MSC_VER || (__GNUC__==3 && __GNUC_MINOR__<3)</span>
-<a name="l00041"></a>00041 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_TASK_BASE_ACCESS public</span>
-<a name="l00042"></a>00042 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00043"></a>00043 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_TASK_BASE_ACCESS private</span>
-<a name="l00044"></a>00044 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00045"></a>00045 <span class="preprocessor"></span>
-<a name="l00046"></a>00046 <span class="keyword">namespace </span>internal {
-<a name="l00047"></a>00047
-<a name="l00048"></a>00048 <span class="keyword">class </span>allocate_additional_child_of_proxy: no_assign {
-<a name="l00050"></a>00050 task* <span class="keyword">self</span>;
-<a name="l00051"></a>00051 task& parent;
-<a name="l00052"></a>00052 <span class="keyword">public</span>:
-<a name="l00053"></a>00053 <span class="keyword">explicit</span> allocate_additional_child_of_proxy( task& parent_ ) : self(NULL), parent(parent_) {}
-<a name="l00054"></a>00054 task& __TBB_EXPORTED_METHOD allocate( size_t size ) <span class="keyword">const</span>;
-<a name="l00055"></a>00055 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD free( task& ) <span class="keyword">const</span>;
-<a name="l00056"></a>00056 };
-<a name="l00057"></a>00057
-<a name="l00058"></a>00058 }
-<a name="l00059"></a>00059
-<a name="l00060"></a>00060 <span class="keyword">namespace </span>interface5 {
-<a name="l00061"></a>00061 <span class="keyword">namespace </span>internal {
+<a name="l00034"></a>00034 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
+<a name="l00035"></a>00035 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
+<a name="l00036"></a>00036 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00037"></a>00037 <span class="preprocessor"></span>
+<a name="l00038"></a>00038 <span class="preprocessor">#include "atomic.h"</span>
+<a name="l00039"></a>00039 <span class="preprocessor">#include "tbb_profiling.h"</span>
+<a name="l00040"></a>00040
+<a name="l00041"></a>00041 <span class="keyword">namespace </span>tbb {
+<a name="l00042"></a>00042
+<a name="l00044"></a>00044
+<a name="l00047"></a><a class="code" href="a00184.html">00047</a> <span class="keyword">class </span><a class="code" href="a00184.html">queuing_rw_mutex</a> {
+<a name="l00048"></a>00048 <span class="keyword">public</span>:
+<a name="l00050"></a><a class="code" href="a00184.html#85c90877c3447690ac4e2ac4ff8dea5e">00050</a> <a class="code" href="a00184.html#85c90877c3447690ac4e2ac4ff8dea5e">queuing_rw_mutex</a>() {
+<a name="l00051"></a>00051 q_tail = NULL;
+<a name="l00052"></a>00052 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
+<a name="l00053"></a>00053 <span class="preprocessor"></span> internal_construct();
+<a name="l00054"></a>00054 <span class="preprocessor">#endif</span>
+<a name="l00055"></a>00055 <span class="preprocessor"></span> }
+<a name="l00056"></a>00056
+<a name="l00058"></a><a class="code" href="a00184.html#1ba73e3d95cfdf8323880bc623af9099">00058</a> <a class="code" href="a00184.html#1ba73e3d95cfdf8323880bc623af9099">~queuing_rw_mutex</a>() {
+<a name="l00059"></a>00059 <span class="preprocessor">#if TBB_USE_ASSERT</span>
+<a name="l00060"></a>00060 <span class="preprocessor"></span> __TBB_ASSERT( !q_tail, <span class="stringliteral">"destruction of an acquired mutex"</span>);
+<a name="l00061"></a>00061 <span class="preprocessor">#endif</span>
+<a name="l00062"></a>00062 <span class="preprocessor"></span> }
<a name="l00063"></a>00063
-<a name="l00068"></a><a class="code" href="a00200.html">00068</a> <span class="keyword">class </span><a class="code" href="a00200.html">task_base</a>: tbb::internal::no_copy {
-<a name="l00069"></a>00069 __TBB_TASK_BASE_ACCESS:
-<a name="l00070"></a>00070 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00199.html">tbb::task</a>;
-<a name="l00071"></a>00071
-<a name="l00073"></a>00073 <span class="keyword">static</span> <span class="keywordtype">void</span> spawn( <a class="code" href="a00199.html">task</a>& t );
-<a name="l00074"></a>00074
-<a name="l00076"></a>00076 <span class="keyword">static</span> <span class="keywordtype">void</span> spawn( <a class="code" href="a00202.html">task_list</a>& list );
-<a name="l00077"></a>00077
-<a name="l00079"></a>00079
-<a name="l00081"></a>00081 <span class="keyword">static</span> tbb::internal::allocate_additional_child_of_proxy allocate_additional_child_of( <a class="code" href="a00199.html">task</a>& t ) {
-<a name="l00082"></a>00082 <span class="keywordflow">return</span> tbb::internal::allocate_additional_child_of_proxy(t);
-<a name="l00083"></a>00083 }
+<a name="l00064"></a>00064 <span class="keyword">class </span>scoped_lock;
+<a name="l00065"></a>00065 <span class="keyword">friend</span> <span class="keyword">class </span>scoped_lock;
+<a name="l00066"></a>00066
+<a name="l00068"></a>00068
+<a name="l00070"></a><a class="code" href="a00185.html">00070</a> <span class="keyword">class </span><a class="code" href="a00185.html">scoped_lock</a>: internal::no_copy {
+<a name="l00072"></a>00072 <span class="keywordtype">void</span> initialize() {
+<a name="l00073"></a>00073 <a class="code" href="a00172.html">mutex</a> = NULL;
+<a name="l00074"></a>00074 <span class="preprocessor">#if TBB_USE_ASSERT</span>
+<a name="l00075"></a>00075 <span class="preprocessor"></span> state = 0xFF; <span class="comment">// Set to invalid state</span>
+<a name="l00076"></a>00076 internal::poison_pointer(next);
+<a name="l00077"></a>00077 internal::poison_pointer(prev);
+<a name="l00078"></a>00078 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
+<a name="l00079"></a>00079 }
+<a name="l00080"></a>00080 <span class="keyword">public</span>:
+<a name="l00082"></a>00082
+<a name="l00083"></a><a class="code" href="a00185.html#c62e365be7bcbba091c9ea7454a4d22c">00083</a> <a class="code" href="a00185.html#c62e365be7bcbba091c9ea7454a4d22c">scoped_lock</a>() {initialize();}
<a name="l00084"></a>00084
-<a name="l00086"></a>00086
-<a name="l00090"></a>00090 <span class="keyword">static</span> <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC <a class="code" href="a00199.html#dfaacf92685e5f86393bf657b2853bf8">destroy</a>( <a class="code" href="a00199.html">task</a>& victim );
-<a name="l00091"></a>00091 };
-<a name="l00092"></a>00092 } <span class="comment">// internal</span>
-<a name="l00093"></a>00093 } <span class="comment">// interface5</span>
-<a name="l00094"></a>00094
-<a name="l00096"></a>00096 <span class="keyword">namespace </span>internal {
-<a name="l00097"></a>00097
-<a name="l00098"></a>00098 <span class="keyword">class </span>scheduler: no_copy {
-<a name="l00099"></a>00099 <span class="keyword">public</span>:
-<a name="l00101"></a>00101 <span class="keyword">virtual</span> <span class="keywordtype">void</span> spawn( <a class="code" href="a00199.html">task</a>& first, <a class="code" href="a00199.html">task</a>*& next ) = 0;
-<a name="l00102"></a>00102
-<a name="l00104"></a>00104 <span class="keyword">virtual</span> <span class="keywordtype">void</span> wait_for_all( <a class="code" href="a00199.html">task</a>& parent, <a class="code" href="a00199.html">task</a>* child ) = 0;
-<a name="l00105"></a>00105
-<a name="l00107"></a>00107 <span class="keyword">virtual</span> <span class="keywordtype">void</span> spawn_root_and_wait( <a class="code" href="a00199.html">task</a>& first, <a class="code" href="a00199.html">task</a>*& next ) = 0;
+<a name="l00086"></a><a class="code" href="a00185.html#fbb8798792d3aebb136c46fc63d2529e">00086</a> <a class="code" href="a00185.html#c62e365be7bcbba091c9ea7454a4d22c">scoped_lock</a>( <a class="code" href="a00184.html">queuing_rw_mutex</a>& m, <span class="keywordtype">bool</span> write=<span class="keyword">true</span> ) {
+<a name="l00087"></a>00087 initialize();
+<a name="l00088"></a>00088 <a class="code" href="a00185.html#a8dd5ab8686e76de21587544dbb681e0">acquire</a>(m,write);
+<a name="l00089"></a>00089 }
+<a name="l00090"></a>00090
+<a name="l00092"></a><a class="code" href="a00185.html#32c7d67a660d23ebbaab1a1d2826d31a">00092</a> <a class="code" href="a00185.html#32c7d67a660d23ebbaab1a1d2826d31a">~scoped_lock</a>() {
+<a name="l00093"></a>00093 <span class="keywordflow">if</span>( <a class="code" href="a00172.html">mutex</a> ) <a class="code" href="a00185.html#67ae221109ddc69510ab593874e435d4">release</a>();
+<a name="l00094"></a>00094 }
+<a name="l00095"></a>00095
+<a name="l00097"></a>00097 <span class="keywordtype">void</span> <a class="code" href="a00185.html#a8dd5ab8686e76de21587544dbb681e0">acquire</a>( <a class="code" href="a00184.html">queuing_rw_mutex</a>& m, <span class="keywordtype">bool</span> write=<span class="keyword">true</span> );
+<a name="l00098"></a>00098
+<a name="l00100"></a>00100 <span class="keywordtype">bool</span> <a class="code" href="a00185.html#2e4ff6c9ec2fee6682f95290d1f42baa">try_acquire</a>( <a class="code" href="a00184.html">queuing_rw_mutex</a>& m, <span class="keywordtype">bool</span> write=<span class="keyword">true</span> );
+<a name="l00101"></a>00101
+<a name="l00103"></a>00103 <span class="keywordtype">void</span> <a class="code" href="a00185.html#67ae221109ddc69510ab593874e435d4">release</a>();
+<a name="l00104"></a>00104
+<a name="l00106"></a>00106
+<a name="l00107"></a>00107 <span class="keywordtype">bool</span> <a class="code" href="a00185.html#11ba1da4a722c9e6f73339a52c487e82">upgrade_to_writer</a>();
<a name="l00108"></a>00108
-<a name="l00110"></a>00110 <span class="comment">// Have to have it just to shut up overzealous compilation warnings</span>
-<a name="l00111"></a>00111 <span class="keyword">virtual</span> ~scheduler() = 0;
-<a name="l00112"></a>00112 <span class="preprocessor">#if __TBB_ARENA_PER_MASTER</span>
-<a name="l00113"></a>00113 <span class="preprocessor"></span>
-<a name="l00115"></a>00115 <span class="keyword">virtual</span> <span class="keywordtype">void</span> enqueue( <a class="code" href="a00199.html">task</a>& t, <span class="keywordtype">void</span>* reserved ) = 0;
-<a name="l00116"></a>00116 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_ARENA_PER_MASTER */</span>
-<a name="l00117"></a>00117 };
+<a name="l00110"></a>00110 <span class="keywordtype">bool</span> <a class="code" href="a00185.html#0d2f93edf7b15ec4bcee138823220c52">downgrade_to_reader</a>();
+<a name="l00111"></a>00111
+<a name="l00112"></a>00112 <span class="keyword">private</span>:
+<a name="l00114"></a>00114 <a class="code" href="a00184.html">queuing_rw_mutex</a>* <a class="code" href="a00172.html">mutex</a>;
+<a name="l00115"></a>00115
+<a name="l00117"></a>00117 <a class="code" href="a00185.html">scoped_lock</a> * prev, * next;
<a name="l00118"></a>00118
+<a name="l00119"></a>00119 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> state_t;
<a name="l00120"></a>00120
-<a name="l00121"></a>00121 <span class="keyword">typedef</span> intptr_t reference_count;
-<a name="l00122"></a>00122
-<a name="l00124"></a>00124 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> affinity_id;
+<a name="l00122"></a>00122 <a class="code" href="a00142.html">atomic<state_t></a> state;
+<a name="l00123"></a>00123
<a name="l00125"></a>00125
-<a name="l00126"></a>00126 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00127"></a>00127 <span class="preprocessor"></span> <span class="keyword">struct </span>context_list_node_t {
-<a name="l00128"></a>00128 context_list_node_t *my_prev,
-<a name="l00129"></a>00129 *my_next;
-<a name="l00130"></a>00130 };
-<a name="l00131"></a>00131
-<a name="l00132"></a>00132 <span class="keyword">class </span>allocate_root_with_context_proxy: no_assign {
-<a name="l00133"></a>00133 task_group_context& my_context;
-<a name="l00134"></a>00134 <span class="keyword">public</span>:
-<a name="l00135"></a>00135 allocate_root_with_context_proxy ( task_group_context& ctx ) : my_context(ctx) {}
-<a name="l00136"></a>00136 task& __TBB_EXPORTED_METHOD allocate( size_t size ) <span class="keyword">const</span>;
-<a name="l00137"></a>00137 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD free( task& ) <span class="keyword">const</span>;
-<a name="l00138"></a>00138 };
-<a name="l00139"></a>00139 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00126"></a>00126 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> going;
+<a name="l00127"></a>00127
+<a name="l00129"></a>00129 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> internal_lock;
+<a name="l00130"></a>00130
+<a name="l00132"></a>00132 <span class="keywordtype">void</span> acquire_internal_lock();
+<a name="l00133"></a>00133
+<a name="l00135"></a>00135
+<a name="l00136"></a>00136 <span class="keywordtype">bool</span> try_acquire_internal_lock();
+<a name="l00137"></a>00137
+<a name="l00139"></a>00139 <span class="keywordtype">void</span> release_internal_lock();
<a name="l00140"></a>00140
-<a name="l00141"></a>00141 <span class="keyword">class </span>allocate_root_proxy: no_assign {
-<a name="l00142"></a>00142 <span class="keyword">public</span>:
-<a name="l00143"></a>00143 <span class="keyword">static</span> task& __TBB_EXPORTED_FUNC allocate( size_t size );
-<a name="l00144"></a>00144 <span class="keyword">static</span> <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC free( task& );
-<a name="l00145"></a>00145 };
-<a name="l00146"></a>00146
-<a name="l00147"></a>00147 <span class="keyword">class </span>allocate_continuation_proxy: no_assign {
-<a name="l00148"></a>00148 <span class="keyword">public</span>:
-<a name="l00149"></a>00149 task& __TBB_EXPORTED_METHOD allocate( size_t size ) <span class="keyword">const</span>;
-<a name="l00150"></a>00150 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD free( task& ) <span class="keyword">const</span>;
-<a name="l00151"></a>00151 };
-<a name="l00152"></a>00152
-<a name="l00153"></a>00153 <span class="keyword">class </span>allocate_child_proxy: no_assign {
-<a name="l00154"></a>00154 <span class="keyword">public</span>:
-<a name="l00155"></a>00155 task& __TBB_EXPORTED_METHOD allocate( size_t size ) <span class="keyword">const</span>;
-<a name="l00156"></a>00156 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD free( task& ) <span class="keyword">const</span>;
-<a name="l00157"></a>00157 };
+<a name="l00142"></a>00142 <span class="keywordtype">void</span> wait_for_release_of_internal_lock();
+<a name="l00143"></a>00143
+<a name="l00145"></a>00145 <span class="keywordtype">void</span> unblock_or_wait_on_internal_lock( uintptr_t );
+<a name="l00146"></a>00146 };
+<a name="l00147"></a>00147
+<a name="l00148"></a>00148 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_construct();
+<a name="l00149"></a>00149
+<a name="l00150"></a>00150 <span class="comment">// Mutex traits</span>
+<a name="l00151"></a>00151 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_rw_mutex = <span class="keyword">true</span>;
+<a name="l00152"></a>00152 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_recursive_mutex = <span class="keyword">false</span>;
+<a name="l00153"></a>00153 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_fair_mutex = <span class="keyword">true</span>;
+<a name="l00154"></a>00154
+<a name="l00155"></a>00155 <span class="keyword">private</span>:
+<a name="l00157"></a>00157 <a class="code" href="a00142.html">atomic<scoped_lock*></a> q_tail;
<a name="l00158"></a>00158
+<a name="l00159"></a>00159 };
<a name="l00160"></a>00160
-<a name="l00165"></a>00165 <span class="keyword">class </span>task_prefix {
-<a name="l00166"></a>00166 <span class="keyword">private</span>:
-<a name="l00167"></a>00167 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00199.html">tbb::task</a>;
-<a name="l00168"></a>00168 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00200.html">tbb::interface5::internal::task_base</a>;
-<a name="l00169"></a>00169 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00202.html">tbb::task_list</a>;
-<a name="l00170"></a>00170 <span class="keyword">friend</span> <span class="keyword">class </span>internal::scheduler;
-<a name="l00171"></a>00171 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_root_proxy;
-<a name="l00172"></a>00172 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_child_proxy;
-<a name="l00173"></a>00173 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_continuation_proxy;
-<a name="l00174"></a>00174 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_additional_child_of_proxy;
-<a name="l00175"></a>00175
-<a name="l00176"></a>00176 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00178"></a>00178 <span class="preprocessor"></span>
-<a name="l00181"></a>00181 <span class="preprocessor"> task_group_context *context;</span>
-<a name="l00182"></a>00182 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00183"></a>00183
-<a name="l00185"></a>00185
-<a name="l00190"></a>00190 scheduler* origin;
-<a name="l00191"></a>00191
-<a name="l00193"></a>00193 scheduler* owner;
-<a name="l00194"></a>00194
-<a name="l00196"></a>00196
-<a name="l00199"></a>00199 <a class="code" href="a00199.html">tbb::task</a>* parent;
-<a name="l00200"></a>00200
-<a name="l00202"></a>00202
-<a name="l00206"></a>00206 reference_count ref_count;
-<a name="l00207"></a>00207
-<a name="l00209"></a>00209
-<a name="l00210"></a>00210 <span class="keywordtype">int</span> depth;
-<a name="l00211"></a>00211
-<a name="l00213"></a>00213
-<a name="l00214"></a>00214 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> state;
-<a name="l00215"></a>00215
-<a name="l00217"></a>00217
-<a name="l00222"></a>00222 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> extra_state;
-<a name="l00223"></a>00223
-<a name="l00224"></a>00224 affinity_id affinity;
-<a name="l00225"></a>00225
-<a name="l00227"></a>00227 <a class="code" href="a00199.html">tbb::task</a>* next;
-<a name="l00228"></a>00228
-<a name="l00230"></a>00230 <a class="code" href="a00199.html">tbb::task</a>& task() {<span class="keywordflow">return</span> *reinterpret_cast<tbb::task*>(<span class="keyword">this</span>+1);}
-<a name="l00231"></a>00231 };
-<a name="l00232"></a>00232
-<a name="l00233"></a>00233 } <span class="comment">// namespace internal</span>
-<a name="l00235"></a>00235 <span class="comment"></span>
-<a name="l00236"></a>00236 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00237"></a>00237 <span class="preprocessor"></span>
-<a name="l00238"></a>00238 <span class="preprocessor">#if TBB_USE_CAPTURED_EXCEPTION</span>
-<a name="l00239"></a>00239 <span class="preprocessor"></span> <span class="keyword">class </span>tbb_exception;
-<a name="l00240"></a>00240 <span class="preprocessor">#else</span>
-<a name="l00241"></a>00241 <span class="preprocessor"></span> <span class="keyword">namespace </span>internal {
-<a name="l00242"></a>00242 <span class="keyword">class </span>tbb_exception_ptr;
-<a name="l00243"></a>00243 }
-<a name="l00244"></a>00244 <span class="preprocessor">#endif </span><span class="comment">/* !TBB_USE_CAPTURED_EXCEPTION */</span>
-<a name="l00245"></a>00245
-<a name="l00247"></a>00247
-<a name="l00267"></a><a class="code" href="a00201.html">00267</a> <span class="keyword">class </span><a class="code" href="a00201.html">task_group_context</a> : internal::no_copy {
-<a name="l00268"></a>00268 <span class="keyword">private</span>:
-<a name="l00269"></a>00269 <span class="preprocessor">#if TBB_USE_CAPTURED_EXCEPTION</span>
-<a name="l00270"></a>00270 <span class="preprocessor"></span> <span class="keyword">typedef</span> <a class="code" href="a00206.html">tbb_exception</a> <a class="code" href="a00206.html">exception_container_type</a>;
-<a name="l00271"></a>00271 <span class="preprocessor">#else</span>
-<a name="l00272"></a>00272 <span class="preprocessor"></span> <span class="keyword">typedef</span> <a class="code" href="a00207.html">internal::tbb_exception_ptr</a> <a class="code" href="a00206.html">exception_container_type</a>;
-<a name="l00273"></a>00273 <span class="preprocessor">#endif</span>
-<a name="l00274"></a>00274 <span class="preprocessor"></span>
-<a name="l00275"></a>00275 <span class="keyword">enum</span> version_traits_word_layout {
-<a name="l00276"></a>00276 traits_offset = 16,
-<a name="l00277"></a>00277 version_mask = 0xFFFF,
-<a name="l00278"></a>00278 traits_mask = 0xFFFFul << traits_offset
-<a name="l00279"></a>00279 };
-<a name="l00280"></a>00280
-<a name="l00281"></a>00281 <span class="keyword">public</span>:
-<a name="l00282"></a>00282 <span class="keyword">enum</span> kind_type {
-<a name="l00283"></a>00283 isolated,
-<a name="l00284"></a>00284 bound
-<a name="l00285"></a>00285 };
-<a name="l00286"></a>00286
-<a name="l00287"></a>00287 <span class="keyword">enum</span> traits_type {
-<a name="l00288"></a>00288 exact_exception = 0x0001ul << traits_offset,
-<a name="l00289"></a>00289 concurrent_wait = 0x0004ul << traits_offset,
-<a name="l00290"></a>00290 <span class="preprocessor">#if TBB_USE_CAPTURED_EXCEPTION</span>
-<a name="l00291"></a>00291 <span class="preprocessor"></span> default_traits = 0
-<a name="l00292"></a>00292 <span class="preprocessor">#else</span>
-<a name="l00293"></a>00293 <span class="preprocessor"></span> default_traits = exact_exception
-<a name="l00294"></a>00294 <span class="preprocessor">#endif </span><span class="comment">/* !TBB_USE_CAPTURED_EXCEPTION */</span>
-<a name="l00295"></a>00295 };
-<a name="l00296"></a>00296
-<a name="l00297"></a>00297 <span class="keyword">private</span>:
-<a name="l00298"></a>00298 <span class="keyword">union </span>{
-<a name="l00300"></a>00300 kind_type my_kind;
-<a name="l00301"></a>00301 uintptr_t _my_kind_aligner;
-<a name="l00302"></a>00302 };
-<a name="l00303"></a>00303
-<a name="l00305"></a>00305 <a class="code" href="a00201.html">task_group_context</a> *my_parent;
-<a name="l00306"></a>00306
-<a name="l00308"></a>00308
-<a name="l00310"></a>00310 internal::context_list_node_t my_node;
-<a name="l00311"></a>00311
-<a name="l00313"></a>00313 __itt_caller itt_caller;
-<a name="l00314"></a>00314
-<a name="l00316"></a>00316
-<a name="l00319"></a>00319 <span class="keywordtype">char</span> _leading_padding[internal::NFS_MaxLineSize -
-<a name="l00320"></a>00320 2 * <span class="keyword">sizeof</span>(uintptr_t)- <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*) - <span class="keyword">sizeof</span>(internal::context_list_node_t)
-<a name="l00321"></a>00321 - <span class="keyword">sizeof</span>(__itt_caller)];
-<a name="l00322"></a>00322
-<a name="l00324"></a>00324 uintptr_t my_cancellation_requested;
-<a name="l00325"></a>00325
-<a name="l00327"></a>00327
-<a name="l00330"></a>00330 uintptr_t my_version_and_traits;
-<a name="l00331"></a>00331
-<a name="l00333"></a>00333 <a class="code" href="a00206.html">exception_container_type</a> *my_exception;
-<a name="l00334"></a>00334
-<a name="l00336"></a>00336
-<a name="l00339"></a>00339 <span class="keywordtype">void</span> *my_owner;
-<a name="l00340"></a>00340
-<a name="l00342"></a>00342
-<a name="l00343"></a>00343 <span class="keywordtype">char</span> _trailing_padding[internal::NFS_MaxLineSize - <span class="keyword">sizeof</span>(intptr_t) - 2 * <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*)];
-<a name="l00344"></a>00344
-<a name="l00345"></a>00345 <span class="keyword">public</span>:
-<a name="l00347"></a>00347
-<a name="l00374"></a><a class="code" href="a00201.html#19fee08fb8ac98adccfe69c1aa63c491">00374</a> <a class="code" href="a00201.html#19fee08fb8ac98adccfe69c1aa63c491">task_group_context</a> ( kind_type relation_with_parent = bound,
-<a name="l00375"></a>00375 uintptr_t traits = default_traits )
-<a name="l00376"></a>00376 : my_kind(relation_with_parent)
-<a name="l00377"></a>00377 , my_version_and_traits(1 | traits)
-<a name="l00378"></a>00378 {
-<a name="l00379"></a>00379 <a class="code" href="a00201.html#49a55352084fd44b8863d182e839e6dc">init</a>();
-<a name="l00380"></a>00380 }
-<a name="l00381"></a>00381
-<a name="l00382"></a>00382 __TBB_EXPORTED_METHOD ~<a class="code" href="a00201.html">task_group_context</a> ();
-<a name="l00383"></a>00383
-<a name="l00385"></a>00385
-<a name="l00392"></a>00392 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00201.html#6d30d16bf1cd22f86c6afaf29c2b430c">reset</a> ();
-<a name="l00393"></a>00393
-<a name="l00395"></a>00395
-<a name="l00402"></a>00402 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD <a class="code" href="a00201.html#8bcdfdf4e6bfb76125b6de15c00b571d">cancel_group_execution</a> ();
-<a name="l00403"></a>00403
-<a name="l00405"></a>00405 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD <a class="code" href="a00201.html#4db72f16210b0a991b2c134d6763a4cc">is_group_execution_cancelled</a> () <span class="keyword">const</span>;
-<a name="l00406"></a>00406
-<a name="l00408"></a>00408
-<a name="l00414"></a>00414 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00201.html#d97c8a03615594b71b4ef06ff75cf561">register_pending_exception</a> ();
-<a name="l00415"></a>00415
-<a name="l00416"></a>00416 <span class="keyword">protected</span>:
-<a name="l00418"></a>00418
-<a name="l00419"></a>00419 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00201.html#49a55352084fd44b8863d182e839e6dc">init</a> ();
-<a name="l00420"></a>00420
-<a name="l00421"></a>00421 <span class="keyword">private</span>:
-<a name="l00422"></a>00422 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00199.html">task</a>;
-<a name="l00423"></a>00423 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_root_with_context_proxy;
-<a name="l00424"></a>00424
-<a name="l00425"></a>00425 <span class="keyword">static</span> <span class="keyword">const</span> kind_type binding_required = bound;
-<a name="l00426"></a>00426 <span class="keyword">static</span> <span class="keyword">const</span> kind_type binding_completed = kind_type(bound+1);
-<a name="l00427"></a>00427 <span class="keyword">static</span> <span class="keyword">const</span> kind_type detached = kind_type(binding_completed+1);
-<a name="l00428"></a>00428 <span class="keyword">static</span> <span class="keyword">const</span> kind_type dying = kind_type(detached+1);
-<a name="l00429"></a>00429
-<a name="l00432"></a>00432 <span class="keywordtype">void</span> propagate_cancellation_from_ancestors ();
-<a name="l00433"></a>00433
-<a name="l00435"></a>00435 <span class="keywordtype">bool</span> is_alive () {
-<a name="l00436"></a>00436 <span class="preprocessor">#if TBB_USE_DEBUG</span>
-<a name="l00437"></a>00437 <span class="preprocessor"></span> <span class="keywordflow">return</span> my_version_and_traits != 0xDeadBeef;
-<a name="l00438"></a>00438 <span class="preprocessor">#else</span>
-<a name="l00439"></a>00439 <span class="preprocessor"></span> <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00440"></a>00440 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_DEBUG */</span>
-<a name="l00441"></a>00441 }
-<a name="l00442"></a>00442 }; <span class="comment">// class task_group_context</span>
-<a name="l00443"></a>00443
-<a name="l00444"></a>00444 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00445"></a>00445
-<a name="l00447"></a>00447
-<a name="l00448"></a><a class="code" href="a00199.html">00448</a> <span class="keyword">class </span><a class="code" href="a00199.html">task</a>: __TBB_TASK_BASE_ACCESS interface5::internal::task_base {
-<a name="l00449"></a>00449
-<a name="l00451"></a>00451 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_set_ref_count( <span class="keywordtype">int</span> count );
-<a name="l00452"></a>00452
-<a name="l00454"></a>00454 internal::reference_count __TBB_EXPORTED_METHOD internal_decrement_ref_count();
-<a name="l00455"></a>00455
-<a name="l00456"></a>00456 <span class="keyword">protected</span>:
-<a name="l00458"></a><a class="code" href="a00199.html#2bce8ec6e44706e70128f5cf91b76e67">00458</a> <a class="code" href="a00199.html#2bce8ec6e44706e70128f5cf91b76e67">task</a>() {prefix().extra_state=1;}
-<a name="l00459"></a>00459
-<a name="l00460"></a>00460 <span class="keyword">public</span>:
-<a name="l00462"></a><a class="code" href="a00199.html#98245ee0473f84cb19dbbf8c81134908">00462</a> <span class="keyword">virtual</span> <a class="code" href="a00199.html#98245ee0473f84cb19dbbf8c81134908">~task</a>() {}
-<a name="l00463"></a>00463
-<a name="l00465"></a>00465 <span class="keyword">virtual</span> <a class="code" href="a00199.html">task</a>* <a class="code" href="a00199.html#22c298cd40937a431a06777423f002f6">execute</a>() = 0;
-<a name="l00466"></a>00466
-<a name="l00468"></a><a class="code" href="a00199.html#4a3c415562d17905390ea5b49d12293e">00468</a> <span class="keyword">enum</span> <a class="code" href="a00199.html#4a3c415562d17905390ea5b49d12293e">state_type</a> {
-<a name="l00470"></a>00470 <a class="code" href="a00199.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">executing</a>,
-<a name="l00472"></a>00472 <a class="code" href="a00199.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">reexecute</a>,
-<a name="l00474"></a>00474 <a class="code" href="a00199.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">ready</a>,
-<a name="l00476"></a>00476 <a class="code" href="a00199.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">allocated</a>,
-<a name="l00478"></a>00478 <a class="code" href="a00199.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">freed</a>,
-<a name="l00480"></a>00480 <a class="code" href="a00199.html#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d">recycle</a>
-<a name="l00481"></a>00481 };
-<a name="l00482"></a>00482
-<a name="l00483"></a>00483 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00484"></a>00484 <span class="comment">// Allocating tasks</span>
-<a name="l00485"></a>00485 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00486"></a>00486
-<a name="l00488"></a><a class="code" href="a00199.html#23acb0da0afd690da797f9f882027d34">00488</a> <span class="keyword">static</span> internal::allocate_root_proxy <a class="code" href="a00199.html#23acb0da0afd690da797f9f882027d34">allocate_root</a>() {
-<a name="l00489"></a>00489 <span class="keywordflow">return</span> internal::allocate_root_proxy();
-<a name="l00490"></a>00490 }
-<a name="l00491"></a>00491
-<a name="l00492"></a>00492 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00494"></a><a class="code" href="a00199.html#8ccc518caf31075a3e073996d2d240a4">00494</a> <span class="preprocessor"> static internal::allocate_root_with_context_proxy allocate_root( task_group_context& ctx ) {</span>
-<a name="l00495"></a>00495 <span class="preprocessor"></span> <span class="keywordflow">return</span> internal::allocate_root_with_context_proxy(ctx);
-<a name="l00496"></a>00496 }
-<a name="l00497"></a>00497 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00498"></a>00498
-<a name="l00500"></a>00500
-<a name="l00501"></a><a class="code" href="a00199.html#1434c79a5138993269d034008bff7329">00501</a> internal::allocate_continuation_proxy& allocate_continuation() {
-<a name="l00502"></a>00502 <span class="keywordflow">return</span> *reinterpret_cast<internal::allocate_continuation_proxy*>(<span class="keyword">this</span>);
-<a name="l00503"></a>00503 }
-<a name="l00504"></a>00504
-<a name="l00506"></a><a class="code" href="a00199.html#1ff794f7053cd9148d5f280fbf07377f">00506</a> internal::allocate_child_proxy& allocate_child() {
-<a name="l00507"></a>00507 <span class="keywordflow">return</span> *reinterpret_cast<internal::allocate_child_proxy*>(<span class="keyword">this</span>);
-<a name="l00508"></a>00508 }
-<a name="l00509"></a>00509
-<a name="l00511"></a>00511 <span class="keyword">using</span> task_base::allocate_additional_child_of;
-<a name="l00512"></a>00512
-<a name="l00513"></a>00513 <span class="preprocessor">#if __TBB_DEPRECATED_TASK_INTERFACE</span>
-<a name="l00515"></a>00515 <span class="preprocessor"></span>
-<a name="l00519"></a>00519 <span class="preprocessor"> void __TBB_EXPORTED_METHOD destroy( task& t );</span>
-<a name="l00520"></a>00520 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* !__TBB_DEPRECATED_TASK_INTERFACE */</span>
-<a name="l00522"></a>00522 using task_base::destroy;
-<a name="l00523"></a>00523 <span class="preprocessor">#endif </span><span class="comment">/* !__TBB_DEPRECATED_TASK_INTERFACE */</span>
-<a name="l00524"></a>00524
-<a name="l00525"></a>00525 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00526"></a>00526 <span class="comment">// Recycling of tasks</span>
-<a name="l00527"></a>00527 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00528"></a>00528
-<a name="l00530"></a>00530
-<a name="l00536"></a><a class="code" href="a00199.html#a67a79e18f62b43a623a00cfbd76db4c">00536</a> <span class="keywordtype">void</span> recycle_as_continuation() {
-<a name="l00537"></a>00537 __TBB_ASSERT( prefix().state==executing, <span class="stringliteral">"execute not running?"</span> );
-<a name="l00538"></a>00538 prefix().state = allocated;
-<a name="l00539"></a>00539 }
-<a name="l00540"></a>00540
-<a name="l00542"></a>00542
-<a name="l00544"></a><a class="code" href="a00199.html#3b290d14109704e2b69dc1ac980a7a76">00544</a> <span class="keywordtype">void</span> recycle_as_safe_continuation() {
-<a name="l00545"></a>00545 __TBB_ASSERT( prefix().state==executing, <span class="stringliteral">"execute not running?"</span> );
-<a name="l00546"></a>00546 prefix().state = recycle;
-<a name="l00547"></a>00547 }
-<a name="l00548"></a>00548
-<a name="l00550"></a><a class="code" href="a00199.html#db399855177438bbc9cc61d508dae8d2">00550</a> <span class="keywordtype">void</span> recycle_as_child_of( <a class="code" href="a00199.html">task</a>& new_parent ) {
-<a name="l00551"></a>00551 internal::task_prefix& p = prefix();
-<a name="l00552"></a>00552 __TBB_ASSERT( prefix().state==executing||prefix().state==allocated, <span class="stringliteral">"execute not running, or already recycled"</span> );
-<a name="l00553"></a>00553 __TBB_ASSERT( prefix().ref_count==0, <span class="stringliteral">"no child tasks allowed when recycled as a child"</span> );
-<a name="l00554"></a>00554 __TBB_ASSERT( p.parent==NULL, <span class="stringliteral">"parent must be null"</span> );
-<a name="l00555"></a>00555 __TBB_ASSERT( new_parent.<a class="code" href="a00199.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().state<=recycle, <span class="stringliteral">"corrupt parent's state"</span> );
-<a name="l00556"></a>00556 __TBB_ASSERT( new_parent.<a class="code" href="a00199.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().state!=freed, <span class="stringliteral">"parent already freed"</span> );
-<a name="l00557"></a>00557 p.state = allocated;
-<a name="l00558"></a>00558 p.parent = &new_parent;
-<a name="l00559"></a>00559 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00560"></a>00560 <span class="preprocessor"></span> p.<a class="code" href="a00199.html#d8c36a93f3972590fbb65ff1cef3173b">context</a> = new_parent.<a class="code" href="a00199.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().context;
-<a name="l00561"></a>00561 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00562"></a>00562 }
-<a name="l00563"></a>00563
-<a name="l00565"></a>00565
-<a name="l00566"></a><a class="code" href="a00199.html#4f1be9bbcdb487830dbe298b68d85144">00566</a> <span class="keywordtype">void</span> recycle_to_reexecute() {
-<a name="l00567"></a>00567 __TBB_ASSERT( prefix().state==executing, <span class="stringliteral">"execute not running, or already recycled"</span> );
-<a name="l00568"></a>00568 __TBB_ASSERT( prefix().ref_count==0, <span class="stringliteral">"no child tasks allowed when recycled for reexecution"</span> );
-<a name="l00569"></a>00569 prefix().state = reexecute;
-<a name="l00570"></a>00570 }
-<a name="l00571"></a>00571
-<a name="l00572"></a>00572 <span class="comment">// All depth-related methods are obsolete, and are retained for the sake </span>
-<a name="l00573"></a>00573 <span class="comment">// of backward source compatibility only</span>
-<a name="l00574"></a>00574 intptr_t depth()<span class="keyword"> const </span>{<span class="keywordflow">return</span> 0;}
-<a name="l00575"></a>00575 <span class="keywordtype">void</span> set_depth( intptr_t ) {}
-<a name="l00576"></a>00576 <span class="keywordtype">void</span> add_to_depth( <span class="keywordtype">int</span> ) {}
-<a name="l00577"></a>00577
-<a name="l00578"></a>00578
-<a name="l00579"></a>00579 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00580"></a>00580 <span class="comment">// Spawning and blocking</span>
-<a name="l00581"></a>00581 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00582"></a>00582
-<a name="l00584"></a><a class="code" href="a00199.html#06a4206a57e8e12a439b14d6d41cfd92">00584</a> <span class="keywordtype">void</span> set_ref_count( <span class="keywordtype">int</span> count ) {
-<a name="l00585"></a>00585 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT</span>
-<a name="l00586"></a>00586 <span class="preprocessor"></span> internal_set_ref_count(count);
-<a name="l00587"></a>00587 <span class="preprocessor">#else</span>
-<a name="l00588"></a>00588 <span class="preprocessor"></span> prefix().ref_count = count;
-<a name="l00589"></a>00589 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */</span>
-<a name="l00590"></a>00590 }
-<a name="l00591"></a>00591
-<a name="l00593"></a>00593
-<a name="l00594"></a><a class="code" href="a00199.html#f5fb43c7ad0de5a4b95703cebc39e345">00594</a> <span class="keywordtype">void</span> increment_ref_count() {
-<a name="l00595"></a>00595 __TBB_FetchAndIncrementWacquire( &prefix().ref_count );
-<a name="l00596"></a>00596 }
-<a name="l00597"></a>00597
-<a name="l00599"></a>00599
-<a name="l00600"></a><a class="code" href="a00199.html#ef4680f5c148020c5e7e43ddef44cd5d">00600</a> <span class="keywordtype">int</span> decrement_ref_count() {
-<a name="l00601"></a>00601 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT</span>
-<a name="l00602"></a>00602 <span class="preprocessor"></span> <span class="keywordflow">return</span> int(internal_decrement_ref_count());
-<a name="l00603"></a>00603 <span class="preprocessor">#else</span>
-<a name="l00604"></a>00604 <span class="preprocessor"></span> <span class="keywordflow">return</span> int(__TBB_FetchAndDecrementWrelease( &prefix().ref_count ))-1;
-<a name="l00605"></a>00605 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */</span>
-<a name="l00606"></a>00606 }
-<a name="l00607"></a>00607
-<a name="l00609"></a>00609 <span class="keyword">using</span> task_base::spawn;
-<a name="l00610"></a>00610
-<a name="l00612"></a><a class="code" href="a00199.html#3ce28ca9baa771cfc37ecd72e69c4f3c">00612</a> <span class="keywordtype">void</span> spawn_and_wait_for_all( <a class="code" href="a00199.html">task</a>& child ) {
-<a name="l00613"></a>00613 prefix().owner->wait_for_all( *<span class="keyword">this</span>, &child );
-<a name="l00614"></a>00614 }
-<a name="l00615"></a>00615
-<a name="l00617"></a>00617 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD spawn_and_wait_for_all( <a class="code" href="a00202.html">task_list</a>& list );
-<a name="l00618"></a>00618
-<a name="l00620"></a><a class="code" href="a00199.html#ce8ce689c26a4ddf343829bc3c73290a">00620</a> <span class="keyword">static</span> <span class="keywordtype">void</span> spawn_root_and_wait( <a class="code" href="a00199.html">task</a>& root ) {
-<a name="l00621"></a>00621 root.<a class="code" href="a00199.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().owner->spawn_root_and_wait( root, root.<a class="code" href="a00199.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().next );
-<a name="l00622"></a>00622 }
-<a name="l00623"></a>00623
-<a name="l00625"></a>00625
-<a name="l00627"></a>00627 <span class="keyword">static</span> <span class="keywordtype">void</span> spawn_root_and_wait( <a class="code" href="a00202.html">task_list</a>& root_list );
-<a name="l00628"></a>00628
-<a name="l00630"></a>00630
-<a name="l00631"></a><a class="code" href="a00199.html#53d2615ad9c38859b4c8080936600283">00631</a> <span class="keywordtype">void</span> wait_for_all() {
-<a name="l00632"></a>00632 prefix().owner->wait_for_all( *<span class="keyword">this</span>, NULL );
-<a name="l00633"></a>00633 }
-<a name="l00634"></a>00634
-<a name="l00635"></a>00635 <span class="preprocessor">#if __TBB_ARENA_PER_MASTER</span>
-<a name="l00637"></a><a class="code" href="a00199.html#8365d063c0cc9d7bd616bca47256b93c">00637</a> <span class="preprocessor"> static void enqueue( task& t ) {</span>
-<a name="l00638"></a>00638 <span class="preprocessor"></span> t.prefix().owner->enqueue( t, NULL );
-<a name="l00639"></a>00639 }
-<a name="l00640"></a>00640
-<a name="l00641"></a>00641 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_ARENA_PER_MASTER */</span>
-<a name="l00643"></a>00643 static task& __TBB_EXPORTED_FUNC self();
-<a name="l00644"></a>00644
-<a name="l00646"></a><a class="code" href="a00199.html#314e98ee4347ccec83efcb9ee22e8596">00646</a> <a class="code" href="a00199.html">task</a>* parent()<span class="keyword"> const </span>{<span class="keywordflow">return</span> prefix().parent;}
-<a name="l00647"></a>00647
-<a name="l00648"></a>00648 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00650"></a><a class="code" href="a00199.html#d8c36a93f3972590fbb65ff1cef3173b">00650</a> <span class="preprocessor"> task_group_context* context() {return prefix().context;}</span>
-<a name="l00651"></a>00651 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00652"></a>00652
-<a name="l00654"></a><a class="code" href="a00199.html#f9169402702f56bf519448aaf34450aa">00654</a> <span class="keywordtype">bool</span> is_stolen_task()<span class="keyword"> const </span>{
-<a name="l00655"></a>00655 <span class="keywordflow">return</span> (prefix().extra_state & 0x80)!=0;
-<a name="l00656"></a>00656 }
-<a name="l00657"></a>00657
-<a name="l00658"></a>00658 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00659"></a>00659 <span class="comment">// Debugging</span>
-<a name="l00660"></a>00660 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00661"></a>00661
-<a name="l00663"></a><a class="code" href="a00199.html#0af7b2d7e6e8b4333b2accfce3dfb374">00663</a> <a class="code" href="a00199.html#4a3c415562d17905390ea5b49d12293e">state_type</a> state()<span class="keyword"> const </span>{<span class="keywordflow">return</span> <a class="code" href="a00199.html#4a3c415562d17905390ea5b49d12293e">state_type</a>(prefix().state);}
-<a name="l00664"></a>00664
-<a name="l00666"></a><a class="code" href="a00199.html#ad774f55eaec008ae02b236423209ced">00666</a> <span class="keywordtype">int</span> ref_count()<span class="keyword"> const </span>{
-<a name="l00667"></a>00667 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00668"></a>00668 <span class="preprocessor"></span> internal::reference_count ref_count_ = prefix().ref_count;
-<a name="l00669"></a>00669 __TBB_ASSERT( ref_count_==<span class="keywordtype">int</span>(ref_count_), <span class="stringliteral">"integer overflow error"</span>);
-<a name="l00670"></a>00670 <span class="preprocessor">#endif</span>
-<a name="l00671"></a>00671 <span class="preprocessor"></span> <span class="keywordflow">return</span> int(prefix().ref_count);
-<a name="l00672"></a>00672 }
-<a name="l00673"></a>00673
-<a name="l00675"></a>00675 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD is_owned_by_current_thread() <span class="keyword">const</span>;
-<a name="l00676"></a>00676
-<a name="l00677"></a>00677 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00678"></a>00678 <span class="comment">// Affinity</span>
-<a name="l00679"></a>00679 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00680"></a>00680
-<a name="l00682"></a>00682
-<a name="l00683"></a><a class="code" href="a00199.html#d61bb32389d3857bf7511d69beaafb76">00683</a> <span class="keyword">typedef</span> internal::affinity_id affinity_id;
-<a name="l00684"></a>00684
-<a name="l00686"></a><a class="code" href="a00199.html#dca19d7a45487a7d67a0db517e2b57c9">00686</a> <span class="keywordtype">void</span> set_affinity( affinity_id <span class="keywordtype">id</span> ) {prefix().affinity = id;}
-<a name="l00687"></a>00687
-<a name="l00689"></a><a class="code" href="a00199.html#3a920a56b0bcf2801518fb45b2c9d2be">00689</a> affinity_id affinity()<span class="keyword"> const </span>{<span class="keywordflow">return</span> prefix().affinity;}
-<a name="l00690"></a>00690
-<a name="l00692"></a>00692
-<a name="l00696"></a>00696 <span class="keyword">virtual</span> <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD note_affinity( affinity_id <span class="keywordtype">id</span> );
-<a name="l00697"></a>00697
-<a name="l00698"></a>00698 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00700"></a>00700 <span class="preprocessor"></span>
-<a name="l00701"></a><a class="code" href="a00199.html#0f3fb4aac549ab642022450a4bd13326">00701</a> <span class="preprocessor"> bool cancel_group_execution () { return prefix().context->cancel_group_execution(); }</span>
-<a name="l00702"></a>00702 <span class="preprocessor"></span>
-<a name="l00704"></a><a class="code" href="a00199.html#025f18118c057c4c8db87ff2ce8df975">00704</a> <span class="keywordtype">bool</span> is_cancelled ()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> prefix().context->is_group_execution_cancelled(); }
-<a name="l00705"></a>00705 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00706"></a>00706
-<a name="l00707"></a>00707 <span class="keyword">private</span>:
-<a name="l00708"></a>00708 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00200.html">interface5::internal::task_base</a>;
-<a name="l00709"></a>00709 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00202.html">task_list</a>;
-<a name="l00710"></a>00710 <span class="keyword">friend</span> <span class="keyword">class </span>internal::scheduler;
-<a name="l00711"></a>00711 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_root_proxy;
-<a name="l00712"></a>00712 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00713"></a>00713 <span class="preprocessor"></span> <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_root_with_context_proxy;
-<a name="l00714"></a>00714 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00715"></a>00715 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_continuation_proxy;
-<a name="l00716"></a>00716 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_child_proxy;
-<a name="l00717"></a>00717 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_additional_child_of_proxy;
-<a name="l00718"></a>00718
-<a name="l00720"></a>00720
-<a name="l00721"></a>00721 internal::task_prefix& prefix( internal::version_tag* = NULL )<span class="keyword"> const </span>{
-<a name="l00722"></a>00722 <span class="keywordflow">return</span> reinterpret_cast<internal::task_prefix*>(const_cast<task*>(<span class="keyword">this</span>))[-1];
-<a name="l00723"></a>00723 }
-<a name="l00724"></a>00724 }; <span class="comment">// class task</span>
-<a name="l00725"></a>00725
-<a name="l00727"></a>00727
-<a name="l00728"></a><a class="code" href="a00163.html">00728</a> <span class="keyword">class </span><a class="code" href="a00163.html">empty_task</a>: <span class="keyword">public</span> <a class="code" href="a00199.html">task</a> {
-<a name="l00729"></a>00729 <span class="comment">/*override*/</span> <a class="code" href="a00199.html">task</a>* execute() {
-<a name="l00730"></a>00730 <span class="keywordflow">return</span> NULL;
-<a name="l00731"></a>00731 }
-<a name="l00732"></a>00732 };
-<a name="l00733"></a>00733
-<a name="l00735"></a>00735
-<a name="l00737"></a><a class="code" href="a00202.html">00737</a> <span class="keyword">class </span><a class="code" href="a00202.html">task_list</a>: internal::no_copy {
-<a name="l00738"></a>00738 <span class="keyword">private</span>:
-<a name="l00739"></a>00739 <a class="code" href="a00199.html">task</a>* first;
-<a name="l00740"></a>00740 <a class="code" href="a00199.html">task</a>** next_ptr;
-<a name="l00741"></a>00741 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00199.html">task</a>;
-<a name="l00742"></a>00742 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00200.html">interface5::internal::task_base</a>;
-<a name="l00743"></a>00743 <span class="keyword">public</span>:
-<a name="l00745"></a><a class="code" href="a00202.html#416341c2047eaef50417b41eaf7e9de6">00745</a> <a class="code" href="a00202.html">task_list</a>() : first(NULL), next_ptr(&first) {}
-<a name="l00746"></a>00746
-<a name="l00748"></a><a class="code" href="a00202.html#6d438f1499a02db1e59c24ab6043e5ba">00748</a> ~<a class="code" href="a00202.html">task_list</a>() {}
-<a name="l00749"></a>00749
-<a name="l00751"></a><a class="code" href="a00202.html#f3ac31e092814b90929f81bb30441959">00751</a> <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{<span class="keywordflow">return</span> !first;}
-<a name="l00752"></a>00752
-<a name="l00754"></a><a class="code" href="a00202.html#4cd34756bc4763dafb8c84838a0124ff">00754</a> <span class="keywordtype">void</span> push_back( <a class="code" href="a00199.html">task</a>& <a class="code" href="a00199.html">task</a> ) {
-<a name="l00755"></a>00755 task.<a class="code" href="a00199.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().next = NULL;
-<a name="l00756"></a>00756 *next_ptr = &task;
-<a name="l00757"></a>00757 next_ptr = &task.<a class="code" href="a00199.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().next;
-<a name="l00758"></a>00758 }
-<a name="l00759"></a>00759
-<a name="l00761"></a><a class="code" href="a00202.html#5fe85df5ed524418389d34051750347d">00761</a> <a class="code" href="a00199.html">task</a>& pop_front() {
-<a name="l00762"></a>00762 __TBB_ASSERT( !empty(), <span class="stringliteral">"attempt to pop item from empty task_list"</span> );
-<a name="l00763"></a>00763 <a class="code" href="a00199.html">task</a>* result = first;
-<a name="l00764"></a>00764 first = result-><a class="code" href="a00199.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().next;
-<a name="l00765"></a>00765 <span class="keywordflow">if</span>( !first ) next_ptr = &first;
-<a name="l00766"></a>00766 <span class="keywordflow">return</span> *result;
-<a name="l00767"></a>00767 }
-<a name="l00768"></a>00768
-<a name="l00770"></a><a class="code" href="a00202.html#fce446ee13e025969945328f3ff59b95">00770</a> <span class="keywordtype">void</span> clear() {
-<a name="l00771"></a>00771 first=NULL;
-<a name="l00772"></a>00772 next_ptr=&first;
-<a name="l00773"></a>00773 }
-<a name="l00774"></a>00774 };
-<a name="l00775"></a>00775
-<a name="l00776"></a>00776 <span class="keyword">inline</span> <span class="keywordtype">void</span> interface5::internal::task_base::spawn( task& t ) {
-<a name="l00777"></a>00777 t.<a class="code" href="a00199.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().owner->spawn( t, t.prefix().next );
-<a name="l00778"></a>00778 }
-<a name="l00779"></a>00779
-<a name="l00780"></a>00780 <span class="keyword">inline</span> <span class="keywordtype">void</span> interface5::internal::task_base::spawn( task_list& list ) {
-<a name="l00781"></a>00781 <span class="keywordflow">if</span>( task* t = list.first ) {
-<a name="l00782"></a>00782 t->prefix().owner->spawn( *t, *list.next_ptr );
-<a name="l00783"></a>00783 list.clear();
-<a name="l00784"></a>00784 }
-<a name="l00785"></a>00785 }
-<a name="l00786"></a>00786
-<a name="l00787"></a><a class="code" href="a00199.html#c33c7edbaec67aa8a56f48986a9dc69f">00787</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00199.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>( <a class="code" href="a00202.html">task_list</a>& root_list ) {
-<a name="l00788"></a>00788 <span class="keywordflow">if</span>( <a class="code" href="a00199.html">task</a>* t = root_list.<a class="code" href="a00202.html#78fcc389819ee34427d510f7d8cb8b1e">first</a> ) {
-<a name="l00789"></a>00789 t->prefix().owner->spawn_root_and_wait( *t, *root_list.<a class="code" href="a00202.html#21553a32bcd08f980aa28f61254307da">next_ptr</a> );
-<a name="l00790"></a>00790 root_list.<a class="code" href="a00202.html#fce446ee13e025969945328f3ff59b95">clear</a>();
-<a name="l00791"></a>00791 }
-<a name="l00792"></a>00792 }
-<a name="l00793"></a>00793
-<a name="l00794"></a>00794 } <span class="comment">// namespace tbb</span>
-<a name="l00795"></a>00795
-<a name="l00796"></a>00796 <span class="keyword">inline</span> <span class="keywordtype">void</span> *operator new( size_t bytes, <span class="keyword">const</span> tbb::internal::allocate_root_proxy& ) {
-<a name="l00797"></a>00797 <span class="keywordflow">return</span> &tbb::internal::allocate_root_proxy::allocate(bytes);
-<a name="l00798"></a>00798 }
-<a name="l00799"></a>00799
-<a name="l00800"></a>00800 <span class="keyword">inline</span> <span class="keywordtype">void</span> operator delete( <span class="keywordtype">void</span>* task, <span class="keyword">const</span> tbb::internal::allocate_root_proxy& ) {
-<a name="l00801"></a>00801 tbb::internal::allocate_root_proxy::free( *static_cast<tbb::task*>(task) );
-<a name="l00802"></a>00802 }
-<a name="l00803"></a>00803
-<a name="l00804"></a>00804 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00805"></a>00805 <span class="preprocessor"></span><span class="keyword">inline</span> <span class="keywordtype">void</span> *operator new( size_t bytes, <span class="keyword">const</span> tbb::internal::allocate_root_with_context_proxy& p ) {
-<a name="l00806"></a>00806 <span class="keywordflow">return</span> &p.allocate(bytes);
-<a name="l00807"></a>00807 }
-<a name="l00808"></a>00808
-<a name="l00809"></a>00809 <span class="keyword">inline</span> <span class="keywordtype">void</span> operator delete( <span class="keywordtype">void</span>* task, <span class="keyword">const</span> tbb::internal::allocate_root_with_context_proxy& p ) {
-<a name="l00810"></a>00810 p.free( *static_cast<tbb::task*>(task) );
-<a name="l00811"></a>00811 }
-<a name="l00812"></a>00812 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00813"></a>00813
-<a name="l00814"></a>00814 <span class="keyword">inline</span> <span class="keywordtype">void</span> *operator new( size_t bytes, <span class="keyword">const</span> tbb::internal::allocate_continuation_proxy& p ) {
-<a name="l00815"></a>00815 <span class="keywordflow">return</span> &p.allocate(bytes);
-<a name="l00816"></a>00816 }
-<a name="l00817"></a>00817
-<a name="l00818"></a>00818 <span class="keyword">inline</span> <span class="keywordtype">void</span> operator delete( <span class="keywordtype">void</span>* task, <span class="keyword">const</span> tbb::internal::allocate_continuation_proxy& p ) {
-<a name="l00819"></a>00819 p.free( *static_cast<tbb::task*>(task) );
-<a name="l00820"></a>00820 }
-<a name="l00821"></a>00821
-<a name="l00822"></a>00822 <span class="keyword">inline</span> <span class="keywordtype">void</span> *operator new( size_t bytes, <span class="keyword">const</span> tbb::internal::allocate_child_proxy& p ) {
-<a name="l00823"></a>00823 <span class="keywordflow">return</span> &p.allocate(bytes);
-<a name="l00824"></a>00824 }
-<a name="l00825"></a>00825
-<a name="l00826"></a>00826 <span class="keyword">inline</span> <span class="keywordtype">void</span> operator delete( <span class="keywordtype">void</span>* task, <span class="keyword">const</span> tbb::internal::allocate_child_proxy& p ) {
-<a name="l00827"></a>00827 p.free( *static_cast<tbb::task*>(task) );
-<a name="l00828"></a>00828 }
-<a name="l00829"></a>00829
-<a name="l00830"></a>00830 <span class="keyword">inline</span> <span class="keywordtype">void</span> *operator new( size_t bytes, <span class="keyword">const</span> tbb::internal::allocate_additional_child_of_proxy& p ) {
-<a name="l00831"></a>00831 <span class="keywordflow">return</span> &p.allocate(bytes);
-<a name="l00832"></a>00832 }
-<a name="l00833"></a>00833
-<a name="l00834"></a>00834 <span class="keyword">inline</span> <span class="keywordtype">void</span> operator delete( <span class="keywordtype">void</span>* task, <span class="keyword">const</span> tbb::internal::allocate_additional_child_of_proxy& p ) {
-<a name="l00835"></a>00835 p.free( *static_cast<tbb::task*>(task) );
-<a name="l00836"></a>00836 }
-<a name="l00837"></a>00837
-<a name="l00838"></a>00838 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_task_H */</span>
+<a name="l00161"></a>00161 __TBB_DEFINE_PROFILING_SET_NAME(queuing_rw_mutex)
+<a name="l00162"></a>00162
+<a name="l00163"></a>00163 } <span class="comment">// namespace tbb</span>
+<a name="l00164"></a>00164
+<a name="l00165"></a>00165 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_queuing_rw_mutex_H */</span>
</pre></div><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00422.html b/doc/html/a00428.html
similarity index 99%
rename from doc/html/a00422.html
rename to doc/html/a00428.html
index 38ebc5f..ff58bd8 100644
--- a/doc/html/a00422.html
+++ b/doc/html/a00428.html
@@ -87,7 +87,7 @@
<a name="l00110"></a>00110 <span class="keyword">private</span>:
<a name="l00112"></a>00112 <a class="code" href="a00186.html">reader_writer_lock</a> *<a class="code" href="a00172.html">mutex</a>;
<a name="l00114"></a>00114 scoped_lock* next;
-<a name="l00116"></a>00116 <a class="code" href="a00143.html">atomic<status_t></a> status;
+<a name="l00116"></a>00116 <a class="code" href="a00142.html">atomic<status_t></a> status;
<a name="l00117"></a>00117
<a name="l00119"></a>00119 scoped_lock();
<a name="l00120"></a>00120
@@ -117,7 +117,7 @@
<a name="l00147"></a>00147 <span class="keyword">private</span>:
<a name="l00149"></a>00149 <a class="code" href="a00186.html">reader_writer_lock</a> *<a class="code" href="a00172.html">mutex</a>;
<a name="l00151"></a>00151 scoped_lock_read *next;
-<a name="l00153"></a>00153 <a class="code" href="a00143.html">atomic<status_t></a> status;
+<a name="l00153"></a>00153 <a class="code" href="a00142.html">atomic<status_t></a> status;
<a name="l00154"></a>00154
<a name="l00156"></a>00156 scoped_lock_read();
<a name="l00157"></a>00157
diff --git a/doc/html/a00423.html b/doc/html/a00429.html
similarity index 98%
rename from doc/html/a00423.html
rename to doc/html/a00429.html
index 3230f45..838fb13 100644
--- a/doc/html/a00423.html
+++ b/doc/html/a00429.html
@@ -167,8 +167,8 @@
<a name="l00161"></a>00161
<a name="l00163"></a><a class="code" href="a00189.html#4c342c69d47f4bb0b393535dee4015d6">00163</a> <span class="keywordtype">void</span> <a class="code" href="a00189.html#4c342c69d47f4bb0b393535dee4015d6">lock</a>() {
<a name="l00164"></a>00164 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00165"></a>00165 <span class="preprocessor"></span> <a class="code" href="a00142.html">aligned_space<scoped_lock,1></a> tmp;
-<a name="l00166"></a>00166 <span class="keyword">new</span>(tmp.<a class="code" href="a00142.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00190.html">scoped_lock</a>(*<span class="keyword">this</span>);
+<a name="l00165"></a>00165 <span class="preprocessor"></span> <a class="code" href="a00141.html">aligned_space<scoped_lock,1></a> tmp;
+<a name="l00166"></a>00166 <span class="keyword">new</span>(tmp.<a class="code" href="a00141.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00190.html">scoped_lock</a>(*<span class="keyword">this</span>);
<a name="l00167"></a>00167 <span class="preprocessor">#else</span>
<a name="l00168"></a>00168 <span class="preprocessor"></span><span class="preprocessor"> #if _WIN32||_WIN64</span>
<a name="l00169"></a>00169 <span class="preprocessor"></span> EnterCriticalSection(&impl);
@@ -181,8 +181,8 @@
<a name="l00177"></a>00177
<a name="l00178"></a><a class="code" href="a00189.html#86e719b0afee25704af11ab97694d240">00178</a> <span class="keywordtype">bool</span> <a class="code" href="a00189.html#86e719b0afee25704af11ab97694d240">try_lock</a>() {
<a name="l00179"></a>00179 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00180"></a>00180 <span class="preprocessor"></span> <a class="code" href="a00142.html">aligned_space<scoped_lock,1></a> tmp;
-<a name="l00181"></a>00181 <span class="keywordflow">return</span> (<span class="keyword">new</span>(tmp.<a class="code" href="a00142.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00190.html">scoped_lock</a>)->internal_try_acquire(*<span class="keyword">this</span>);
+<a name="l00180"></a>00180 <span class="preprocessor"></span> <a class="code" href="a00141.html">aligned_space<scoped_lock,1></a> tmp;
+<a name="l00181"></a>00181 <span class="keywordflow">return</span> (<span class="keyword">new</span>(tmp.<a class="code" href="a00141.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00190.html">scoped_lock</a>)->internal_try_acquire(*<span class="keyword">this</span>);
<a name="l00182"></a>00182 <span class="preprocessor">#else </span>
<a name="l00183"></a>00183 <span class="preprocessor"></span><span class="preprocessor"> #if _WIN32||_WIN64</span>
<a name="l00184"></a>00184 <span class="preprocessor"></span> <span class="keywordflow">return</span> TryEnterCriticalSection(&impl)!=0;
@@ -194,8 +194,8 @@
<a name="l00190"></a>00190
<a name="l00192"></a><a class="code" href="a00189.html#f0a96e26b7f074588dc31e32524856ae">00192</a> <span class="keywordtype">void</span> <a class="code" href="a00189.html#f0a96e26b7f074588dc31e32524856ae">unlock</a>() {
<a name="l00193"></a>00193 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00194"></a>00194 <span class="preprocessor"></span> <a class="code" href="a00142.html">aligned_space<scoped_lock,1></a> tmp;
-<a name="l00195"></a>00195 <a class="code" href="a00190.html">scoped_lock</a>& s = *tmp.<a class="code" href="a00142.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>();
+<a name="l00194"></a>00194 <span class="preprocessor"></span> <a class="code" href="a00141.html">aligned_space<scoped_lock,1></a> tmp;
+<a name="l00195"></a>00195 <a class="code" href="a00190.html">scoped_lock</a>& s = *tmp.<a class="code" href="a00141.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>();
<a name="l00196"></a>00196 s.<a class="code" href="a00190.html#3efd10a49e2435ea5215b49907f93ba2">my_mutex</a> = <span class="keyword">this</span>;
<a name="l00197"></a>00197 s.<a class="code" href="a00190.html#43ed37cec508072e53a52113c8040137">internal_release</a>();
<a name="l00198"></a>00198 <span class="preprocessor">#else</span>
diff --git a/doc/html/a00424.html b/doc/html/a00430.html
similarity index 96%
rename from doc/html/a00424.html
rename to doc/html/a00430.html
index 213525b..2ac2592 100644
--- a/doc/html/a00424.html
+++ b/doc/html/a00430.html
@@ -59,23 +59,23 @@
<a name="l00039"></a>00039 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_EXPORTED_FUNC</span>
<a name="l00040"></a>00040 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00041"></a>00041 <span class="preprocessor"></span>
-<a name="l00044"></a>00044 <span class="keywordtype">void</span> * __TBB_EXPORTED_FUNC <a class="code" href="a00276.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_malloc</a> (size_t size);
+<a name="l00044"></a>00044 <span class="keywordtype">void</span> * __TBB_EXPORTED_FUNC <a class="code" href="a00277.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_malloc</a> (size_t size);
<a name="l00045"></a>00045
-<a name="l00048"></a>00048 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC <a class="code" href="a00276.html#gca3579c21244dba9f0c351e5984d4565">scalable_free</a> (<span class="keywordtype">void</span>* ptr);
+<a name="l00048"></a>00048 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC <a class="code" href="a00277.html#gca3579c21244dba9f0c351e5984d4565">scalable_free</a> (<span class="keywordtype">void</span>* ptr);
<a name="l00049"></a>00049
-<a name="l00052"></a>00052 <span class="keywordtype">void</span> * __TBB_EXPORTED_FUNC <a class="code" href="a00276.html#g951bbbbd2d041acb59ba5fa910b52543">scalable_realloc</a> (<span class="keywordtype">void</span>* ptr, size_t size);
+<a name="l00052"></a>00052 <span class="keywordtype">void</span> * __TBB_EXPORTED_FUNC <a class="code" href="a00277.html#g951bbbbd2d041acb59ba5fa910b52543">scalable_realloc</a> (<span class="keywordtype">void</span>* ptr, size_t size);
<a name="l00053"></a>00053
-<a name="l00056"></a>00056 <span class="keywordtype">void</span> * __TBB_EXPORTED_FUNC <a class="code" href="a00276.html#g3f5a2fde0bcaa3eda35be32c8658f444">scalable_calloc</a> (size_t nobj, size_t size);
+<a name="l00056"></a>00056 <span class="keywordtype">void</span> * __TBB_EXPORTED_FUNC <a class="code" href="a00277.html#g3f5a2fde0bcaa3eda35be32c8658f444">scalable_calloc</a> (size_t nobj, size_t size);
<a name="l00057"></a>00057
-<a name="l00060"></a>00060 <span class="keywordtype">int</span> __TBB_EXPORTED_FUNC <a class="code" href="a00276.html#g05dcec987480bb2c82ecdead6a085899">scalable_posix_memalign</a> (<span class="keywordtype">void</span>** memptr, size_t alignment, size_t size);
+<a name="l00060"></a>00060 <span class="keywordtype">int</span> __TBB_EXPORTED_FUNC <a class="code" href="a00277.html#g05dcec987480bb2c82ecdead6a085899">scalable_posix_memalign</a> (<span class="keywordtype">void</span>** memptr, size_t alignment, size_t size);
<a name="l00061"></a>00061
-<a name="l00064"></a>00064 <span class="keywordtype">void</span> * __TBB_EXPORTED_FUNC <a class="code" href="a00276.html#gc1c7aaa1fe85c17ba5a3a96f7e8d89e7">scalable_aligned_malloc</a> (size_t size, size_t alignment);
+<a name="l00064"></a>00064 <span class="keywordtype">void</span> * __TBB_EXPORTED_FUNC <a class="code" href="a00277.html#gc1c7aaa1fe85c17ba5a3a96f7e8d89e7">scalable_aligned_malloc</a> (size_t size, size_t alignment);
<a name="l00065"></a>00065
-<a name="l00068"></a>00068 <span class="keywordtype">void</span> * __TBB_EXPORTED_FUNC <a class="code" href="a00276.html#gbaea91376be80dfabd7c93eaffd9abaa">scalable_aligned_realloc</a> (<span class="keywordtype">void</span>* ptr, size_t size, size_t alignment);
+<a name="l00068"></a>00068 <span class="keywordtype">void</span> * __TBB_EXPORTED_FUNC <a class="code" href="a00277.html#gbaea91376be80dfabd7c93eaffd9abaa">scalable_aligned_realloc</a> (<span class="keywordtype">void</span>* ptr, size_t size, size_t alignment);
<a name="l00069"></a>00069
-<a name="l00072"></a>00072 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC <a class="code" href="a00276.html#g65a20e812012f15ec7442d5b45d0cba5">scalable_aligned_free</a> (<span class="keywordtype">void</span>* ptr);
+<a name="l00072"></a>00072 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC <a class="code" href="a00277.html#g65a20e812012f15ec7442d5b45d0cba5">scalable_aligned_free</a> (<span class="keywordtype">void</span>* ptr);
<a name="l00073"></a>00073
-<a name="l00078"></a>00078 size_t __TBB_EXPORTED_FUNC <a class="code" href="a00276.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_msize</a> (<span class="keywordtype">void</span>* ptr);
+<a name="l00078"></a>00078 size_t __TBB_EXPORTED_FUNC <a class="code" href="a00277.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_msize</a> (<span class="keywordtype">void</span>* ptr);
<a name="l00079"></a>00079
<a name="l00080"></a>00080 <span class="preprocessor">#ifdef __cplusplus</span>
<a name="l00081"></a>00081 <span class="preprocessor"></span>} <span class="comment">/* extern "C" */</span>
@@ -126,11 +126,11 @@
<a name="l00129"></a>00129 const_pointer address(const_reference x)<span class="keyword"> const </span>{<span class="keywordflow">return</span> &x;}
<a name="l00130"></a>00130
<a name="l00132"></a><a class="code" href="a00191.html#726b1586d05d44665a36e1c7b2699bfd">00132</a> pointer <a class="code" href="a00191.html#726b1586d05d44665a36e1c7b2699bfd">allocate</a>( size_type n, <span class="keyword">const</span> <span class="keywordtype">void</span>* <span class="comment">/*hint*/</span> =0 ) {
-<a name="l00133"></a>00133 <span class="keywordflow">return</span> static_cast<pointer>( <a class="code" href="a00276.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_malloc</a>( n * <span class="keyword">sizeof</span>(value_type) ) );
+<a name="l00133"></a>00133 <span class="keywordflow">return</span> static_cast<pointer>( <a class="code" href="a00277.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_malloc</a>( n * <span class="keyword">sizeof</span>(value_type) ) );
<a name="l00134"></a>00134 }
<a name="l00135"></a>00135
<a name="l00137"></a><a class="code" href="a00191.html#f806a238c18cbcfb531e1e0a0d2ec59d">00137</a> <span class="keywordtype">void</span> <a class="code" href="a00191.html#f806a238c18cbcfb531e1e0a0d2ec59d">deallocate</a>( pointer p, size_type ) {
-<a name="l00138"></a>00138 <a class="code" href="a00276.html#gca3579c21244dba9f0c351e5984d4565">scalable_free</a>( p );
+<a name="l00138"></a>00138 <a class="code" href="a00277.html#gca3579c21244dba9f0c351e5984d4565">scalable_free</a>( p );
<a name="l00139"></a>00139 }
<a name="l00140"></a>00140
<a name="l00142"></a><a class="code" href="a00191.html#880e766f1d913988c21973dbdd874fd5">00142</a> size_type <a class="code" href="a00191.html#880e766f1d913988c21973dbdd874fd5">max_size</a>() const throw() {
diff --git a/doc/html/a00425.html b/doc/html/a00431.html
similarity index 97%
rename from doc/html/a00425.html
rename to doc/html/a00431.html
index 49e79a1..3687329 100644
--- a/doc/html/a00425.html
+++ b/doc/html/a00431.html
@@ -144,8 +144,8 @@
<a name="l00142"></a>00142
<a name="l00144"></a><a class="code" href="a00194.html#4f748989e19b6045e3a2d2ee73626a28">00144</a> <span class="keywordtype">void</span> <a class="code" href="a00194.html#4f748989e19b6045e3a2d2ee73626a28">lock</a>() {
<a name="l00145"></a>00145 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00146"></a>00146 <span class="preprocessor"></span> <a class="code" href="a00142.html">aligned_space<scoped_lock,1></a> tmp;
-<a name="l00147"></a>00147 <span class="keyword">new</span>(tmp.<a class="code" href="a00142.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00195.html">scoped_lock</a>(*<span class="keyword">this</span>);
+<a name="l00146"></a>00146 <span class="preprocessor"></span> <a class="code" href="a00141.html">aligned_space<scoped_lock,1></a> tmp;
+<a name="l00147"></a>00147 <span class="keyword">new</span>(tmp.<a class="code" href="a00141.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00195.html">scoped_lock</a>(*<span class="keyword">this</span>);
<a name="l00148"></a>00148 <span class="preprocessor">#else</span>
<a name="l00149"></a>00149 <span class="preprocessor"></span> __TBB_LockByte(flag);
<a name="l00150"></a>00150 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS*/</span>
@@ -154,8 +154,8 @@
<a name="l00154"></a>00154
<a name="l00155"></a><a class="code" href="a00194.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">00155</a> <span class="keywordtype">bool</span> <a class="code" href="a00194.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">try_lock</a>() {
<a name="l00156"></a>00156 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00157"></a>00157 <span class="preprocessor"></span> <a class="code" href="a00142.html">aligned_space<scoped_lock,1></a> tmp;
-<a name="l00158"></a>00158 <span class="keywordflow">return</span> (<span class="keyword">new</span>(tmp.<a class="code" href="a00142.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00195.html">scoped_lock</a>)->internal_try_acquire(*<span class="keyword">this</span>);
+<a name="l00157"></a>00157 <span class="preprocessor"></span> <a class="code" href="a00141.html">aligned_space<scoped_lock,1></a> tmp;
+<a name="l00158"></a>00158 <span class="keywordflow">return</span> (<span class="keyword">new</span>(tmp.<a class="code" href="a00141.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00195.html">scoped_lock</a>)->internal_try_acquire(*<span class="keyword">this</span>);
<a name="l00159"></a>00159 <span class="preprocessor">#else</span>
<a name="l00160"></a>00160 <span class="preprocessor"></span> <span class="keywordflow">return</span> __TBB_TryLockByte(flag);
<a name="l00161"></a>00161 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS*/</span>
@@ -163,8 +163,8 @@
<a name="l00163"></a>00163
<a name="l00165"></a><a class="code" href="a00194.html#0e843ee6265f57f27d228ba91e7308ef">00165</a> <span class="keywordtype">void</span> <a class="code" href="a00194.html#0e843ee6265f57f27d228ba91e7308ef">unlock</a>() {
<a name="l00166"></a>00166 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00167"></a>00167 <span class="preprocessor"></span> <a class="code" href="a00142.html">aligned_space<scoped_lock,1></a> tmp;
-<a name="l00168"></a>00168 <a class="code" href="a00195.html">scoped_lock</a>& s = *tmp.<a class="code" href="a00142.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>();
+<a name="l00167"></a>00167 <span class="preprocessor"></span> <a class="code" href="a00141.html">aligned_space<scoped_lock,1></a> tmp;
+<a name="l00168"></a>00168 <a class="code" href="a00195.html">scoped_lock</a>& s = *tmp.<a class="code" href="a00141.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>();
<a name="l00169"></a>00169 s.<a class="code" href="a00195.html#d968921bed018503214f36e09007ee7b">my_mutex</a> = <span class="keyword">this</span>;
<a name="l00170"></a>00170 s.<a class="code" href="a00195.html#43a6f8977cd1ed2752f417f3ad9fc4af">my_unlock_value</a> = 0;
<a name="l00171"></a>00171 s.<a class="code" href="a00195.html#8f4d19aa2d6d112034d281eed0dab5fa">internal_release</a>();
diff --git a/doc/html/a00426.html b/doc/html/a00432.html
similarity index 100%
copy from doc/html/a00426.html
copy to doc/html/a00432.html
diff --git a/doc/html/a00427.html b/doc/html/a00433.html
similarity index 99%
copy from doc/html/a00427.html
copy to doc/html/a00433.html
index 55ea6c0..58eccd3 100644
--- a/doc/html/a00427.html
+++ b/doc/html/a00433.html
@@ -542,7 +542,7 @@
<a name="l00724"></a>00724 }; <span class="comment">// class task</span>
<a name="l00725"></a>00725
<a name="l00727"></a>00727
-<a name="l00728"></a><a class="code" href="a00163.html">00728</a> <span class="keyword">class </span><a class="code" href="a00163.html">empty_task</a>: <span class="keyword">public</span> <a class="code" href="a00199.html">task</a> {
+<a name="l00728"></a><a class="code" href="a00162.html">00728</a> <span class="keyword">class </span><a class="code" href="a00162.html">empty_task</a>: <span class="keyword">public</span> <a class="code" href="a00199.html">task</a> {
<a name="l00729"></a>00729 <span class="comment">/*override*/</span> <a class="code" href="a00199.html">task</a>* execute() {
<a name="l00730"></a>00730 <span class="keywordflow">return</span> NULL;
<a name="l00731"></a>00731 }
diff --git a/doc/html/a00436.html b/doc/html/a00442.html
similarity index 100%
rename from doc/html/a00436.html
rename to doc/html/a00442.html
diff --git a/doc/html/a00446.html b/doc/html/a00446.html
deleted file mode 100644
index 0f5074f..0000000
--- a/doc/html/a00446.html
+++ /dev/null
@@ -1,94 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>tbb.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_tbb_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_tbb_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00032"></a>00032 <span class="preprocessor">#include "aligned_space.h"</span>
-<a name="l00033"></a>00033 <span class="preprocessor">#include "atomic.h"</span>
-<a name="l00034"></a>00034 <span class="preprocessor">#include "blocked_range.h"</span>
-<a name="l00035"></a>00035 <span class="preprocessor">#include "blocked_range2d.h"</span>
-<a name="l00036"></a>00036 <span class="preprocessor">#include "blocked_range3d.h"</span>
-<a name="l00037"></a>00037 <span class="preprocessor">#include "cache_aligned_allocator.h"</span>
-<a name="l00038"></a>00038 <span class="preprocessor">#include "combinable.h"</span>
-<a name="l00039"></a>00039 <span class="preprocessor">#include "concurrent_unordered_map.h"</span>
-<a name="l00040"></a>00040 <span class="preprocessor">#include "concurrent_hash_map.h"</span>
-<a name="l00041"></a>00041 <span class="preprocessor">#include "concurrent_queue.h"</span>
-<a name="l00042"></a>00042 <span class="preprocessor">#include "concurrent_vector.h"</span>
-<a name="l00043"></a>00043 <span class="preprocessor">#include "critical_section.h"</span>
-<a name="l00044"></a>00044 <span class="preprocessor">#include "enumerable_thread_specific.h"</span>
-<a name="l00045"></a>00045 <span class="preprocessor">#include "mutex.h"</span>
-<a name="l00046"></a>00046 <span class="preprocessor">#include "null_mutex.h"</span>
-<a name="l00047"></a>00047 <span class="preprocessor">#include "null_rw_mutex.h"</span>
-<a name="l00048"></a>00048 <span class="preprocessor">#include "parallel_do.h"</span>
-<a name="l00049"></a>00049 <span class="preprocessor">#include "parallel_for.h"</span>
-<a name="l00050"></a>00050 <span class="preprocessor">#include "parallel_for_each.h"</span>
-<a name="l00051"></a>00051 <span class="preprocessor">#include "parallel_invoke.h"</span>
-<a name="l00052"></a>00052 <span class="preprocessor">#include "parallel_reduce.h"</span>
-<a name="l00053"></a>00053 <span class="preprocessor">#include "parallel_scan.h"</span>
-<a name="l00054"></a>00054 <span class="preprocessor">#include "parallel_sort.h"</span>
-<a name="l00055"></a>00055 <span class="preprocessor">#include "partitioner.h"</span>
-<a name="l00056"></a>00056 <span class="preprocessor">#include "pipeline.h"</span>
-<a name="l00057"></a>00057 <span class="preprocessor">#include "queuing_mutex.h"</span>
-<a name="l00058"></a>00058 <span class="preprocessor">#include "queuing_rw_mutex.h"</span>
-<a name="l00059"></a>00059 <span class="preprocessor">#include "reader_writer_lock.h"</span>
-<a name="l00060"></a>00060 <span class="preprocessor">#include "recursive_mutex.h"</span>
-<a name="l00061"></a>00061 <span class="preprocessor">#include "spin_mutex.h"</span>
-<a name="l00062"></a>00062 <span class="preprocessor">#include "spin_rw_mutex.h"</span>
-<a name="l00063"></a>00063 <span class="preprocessor">#include "task.h"</span>
-<a name="l00064"></a>00064 <span class="preprocessor">#include "task_group.h"</span>
-<a name="l00065"></a>00065 <span class="preprocessor">#include "task_scheduler_init.h"</span>
-<a name="l00066"></a>00066 <span class="preprocessor">#include "task_scheduler_observer.h"</span>
-<a name="l00067"></a>00067 <span class="preprocessor">#include "tbb_allocator.h"</span>
-<a name="l00068"></a>00068 <span class="preprocessor">#include "tbb_exception.h"</span>
-<a name="l00069"></a>00069 <span class="preprocessor">#include "tbb_thread.h"</span>
-<a name="l00070"></a>00070 <span class="preprocessor">#include "tick_count.h"</span>
-<a name="l00071"></a>00071
-<a name="l00072"></a>00072 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_tbb_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00447.html b/doc/html/a00447.html
deleted file mode 100644
index 0131842..0000000
--- a/doc/html/a00447.html
+++ /dev/null
@@ -1,212 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb_allocator.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li id="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- </ul></div>
-<div class="tabs">
- <ul>
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul></div>
-<h1>tbb_allocator.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
-<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment"> writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_tbb_allocator_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_tbb_allocator_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include <new></span>
-<a name="l00026"></a>00026
-<a name="l00027"></a>00027 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
-<a name="l00028"></a>00028 <span class="preprocessor"></span> <span class="comment">// Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers</span>
-<a name="l00029"></a>00029 <span class="preprocessor"> #pragma warning (push)</span>
-<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4530)</span>
-<a name="l00031"></a>00031 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00032"></a>00032 <span class="preprocessor"></span>
-<a name="l00033"></a>00033 <span class="preprocessor">#include <cstring></span>
-<a name="l00034"></a>00034
-<a name="l00035"></a>00035 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
-<a name="l00036"></a>00036 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
-<a name="l00037"></a>00037 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00038"></a>00038 <span class="preprocessor"></span>
-<a name="l00039"></a>00039 <span class="keyword">namespace </span>tbb {
-<a name="l00040"></a>00040
-<a name="l00042"></a>00042 <span class="keyword">namespace </span>internal {
-<a name="l00043"></a>00043
-<a name="l00045"></a>00045
-<a name="l00046"></a>00046 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC deallocate_via_handler_v3( <span class="keywordtype">void</span> *p );
-<a name="l00047"></a>00047
-<a name="l00049"></a>00049
-<a name="l00050"></a>00050 <span class="keywordtype">void</span>* __TBB_EXPORTED_FUNC allocate_via_handler_v3( size_t n );
-<a name="l00051"></a>00051
-<a name="l00053"></a>00053 <span class="keywordtype">bool</span> __TBB_EXPORTED_FUNC is_malloc_used_v3();
-<a name="l00054"></a>00054 }
-<a name="l00056"></a>00056
-<a name="l00057"></a>00057 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
-<a name="l00058"></a>00058 <span class="preprocessor"></span> <span class="comment">// Workaround for erroneous "unreferenced parameter" warning in method destroy.</span>
-<a name="l00059"></a>00059 <span class="preprocessor"> #pragma warning (push)</span>
-<a name="l00060"></a>00060 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4100)</span>
-<a name="l00061"></a>00061 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00062"></a>00062 <span class="preprocessor"></span>
-<a name="l00064"></a>00064
-<a name="l00069"></a>00069 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00070"></a><a class="code" href="a00204.html">00070</a> <span class="keyword">class </span><a class="code" href="a00204.html">tbb_allocator</a> {
-<a name="l00071"></a>00071 <span class="keyword">public</span>:
-<a name="l00072"></a>00072 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::allocator_type<T>::value_type value_type;
-<a name="l00073"></a>00073 <span class="keyword">typedef</span> value_type* pointer;
-<a name="l00074"></a>00074 <span class="keyword">typedef</span> <span class="keyword">const</span> value_type* const_pointer;
-<a name="l00075"></a>00075 <span class="keyword">typedef</span> value_type& reference;
-<a name="l00076"></a>00076 <span class="keyword">typedef</span> <span class="keyword">const</span> value_type& const_reference;
-<a name="l00077"></a>00077 <span class="keyword">typedef</span> size_t size_type;
-<a name="l00078"></a>00078 <span class="keyword">typedef</span> ptrdiff_t difference_type;
-<a name="l00079"></a>00079 <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">struct </span>rebind {
-<a name="l00080"></a>00080 <span class="keyword">typedef</span> <a class="code" href="a00204.html">tbb_allocator<U></a> other;
-<a name="l00081"></a>00081 };
-<a name="l00082"></a>00082
-<a name="l00084"></a><a class="code" href="a00204.html#09a7f81fb2c3055aaecf058b11538544">00084</a> <span class="keyword">enum</span> <a class="code" href="a00204.html#09a7f81fb2c3055aaecf058b11538544">malloc_type</a> {
-<a name="l00085"></a>00085 scalable,
-<a name="l00086"></a>00086 standard
-<a name="l00087"></a>00087 };
-<a name="l00088"></a>00088
-<a name="l00089"></a>00089 <a class="code" href="a00204.html">tbb_allocator</a>() throw() {}
-<a name="l00090"></a>00090 tbb_allocator( <span class="keyword">const</span> tbb_allocator& ) throw() {}
-<a name="l00091"></a>00091 <span class="keyword">template</span><<span class="keyword">typename</span> U> tbb_allocator(<span class="keyword">const</span> tbb_allocator<U>&) throw() {}
-<a name="l00092"></a>00092
-<a name="l00093"></a>00093 pointer address(reference x)<span class="keyword"> const </span>{<span class="keywordflow">return</span> &x;}
-<a name="l00094"></a>00094 const_pointer address(const_reference x)<span class="keyword"> const </span>{<span class="keywordflow">return</span> &x;}
-<a name="l00095"></a>00095
-<a name="l00097"></a><a class="code" href="a00204.html#f6cb487b1bdce0b581f265a77dca6d53">00097</a> pointer <a class="code" href="a00204.html#f6cb487b1bdce0b581f265a77dca6d53">allocate</a>( size_type n, <span class="keyword">const</span> <span class="keywordtype">void</span>* <span class="comment">/*hint*/</span> = 0) {
-<a name="l00098"></a>00098 <span class="keywordflow">return</span> pointer(internal::allocate_via_handler_v3( n * <span class="keyword">sizeof</span>(value_type) ));
-<a name="l00099"></a>00099 }
-<a name="l00100"></a>00100
-<a name="l00102"></a><a class="code" href="a00204.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">00102</a> <span class="keywordtype">void</span> <a class="code" href="a00204.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">deallocate</a>( pointer p, size_type ) {
-<a name="l00103"></a>00103 internal::deallocate_via_handler_v3(p);
-<a name="l00104"></a>00104 }
-<a name="l00105"></a>00105
-<a name="l00107"></a><a class="code" href="a00204.html#f059ca2c96243024f0d562ee3a87a3a5">00107</a> size_type <a class="code" href="a00204.html#f059ca2c96243024f0d562ee3a87a3a5">max_size</a>() const throw() {
-<a name="l00108"></a>00108 size_type max = static_cast<size_type>(-1) / <span class="keyword">sizeof</span> (value_type);
-<a name="l00109"></a>00109 <span class="keywordflow">return</span> (max > 0 ? max : 1);
-<a name="l00110"></a>00110 }
-<a name="l00111"></a>00111
-<a name="l00113"></a><a class="code" href="a00204.html#ab228ab9e324ed041c2226e1d717df5f">00113</a> <span class="keywordtype">void</span> <a class="code" href="a00204.html#ab228ab9e324ed041c2226e1d717df5f">construct</a>( pointer p, <span class="keyword">const</span> value_type& value ) {::new((<span class="keywordtype">void</span>*)(p)) value_type(value);}
-<a name="l00114"></a>00114
-<a name="l00116"></a><a class="code" href="a00204.html#ef133522bf55f05a605bee0763208281">00116</a> <span class="keywordtype">void</span> <a class="code" href="a00204.html#ef133522bf55f05a605bee0763208281">destroy</a>( pointer p ) {p->~value_type();}
-<a name="l00117"></a>00117
-<a name="l00119"></a><a class="code" href="a00204.html#78701e7454ef8e1a25b5acd364367080">00119</a> <span class="keyword">static</span> <a class="code" href="a00204.html#09a7f81fb2c3055aaecf058b11538544">malloc_type</a> <a class="code" href="a00204.html#78701e7454ef8e1a25b5acd364367080">allocator_type</a>() {
-<a name="l00120"></a>00120 <span class="keywordflow">return</span> internal::is_malloc_used_v3() ? standard : scalable;
-<a name="l00121"></a>00121 }
-<a name="l00122"></a>00122 };
-<a name="l00123"></a>00123
-<a name="l00124"></a>00124 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
-<a name="l00125"></a>00125 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
-<a name="l00126"></a>00126 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4100 is back</span>
-<a name="l00127"></a>00127 <span class="preprocessor"></span>
-<a name="l00129"></a>00129
-<a name="l00130"></a>00130 <span class="keyword">template</span><>
-<a name="l00131"></a><a class="code" href="a00205.html">00131</a> <span class="keyword">class </span><a class="code" href="a00204.html">tbb_allocator</a><void> {
-<a name="l00132"></a>00132 <span class="keyword">public</span>:
-<a name="l00133"></a>00133 <span class="keyword">typedef</span> <span class="keywordtype">void</span>* pointer;
-<a name="l00134"></a>00134 <span class="keyword">typedef</span> <span class="keyword">const</span> <span class="keywordtype">void</span>* const_pointer;
-<a name="l00135"></a>00135 <span class="keyword">typedef</span> <span class="keywordtype">void</span> value_type;
-<a name="l00136"></a>00136 <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">struct </span>rebind {
-<a name="l00137"></a>00137 <span class="keyword">typedef</span> <a class="code" href="a00204.html">tbb_allocator<U></a> other;
-<a name="l00138"></a>00138 };
-<a name="l00139"></a>00139 };
-<a name="l00140"></a>00140
-<a name="l00141"></a>00141 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00142"></a>00142 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> <a class="code" href="a00204.html">tbb_allocator<T></a>&, <span class="keyword">const</span> <a class="code" href="a00204.html">tbb_allocator<U></a>& ) {<span class="keywordflow">return</span> <span class="keyword">true</span>;}
-<a name="l00143"></a>00143
-<a name="l00144"></a>00144 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00145"></a>00145 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> tbb_allocator<T>&, <span class="keyword">const</span> tbb_allocator<U>& ) {<span class="keywordflow">return</span> <span class="keyword">false</span>;}
-<a name="l00146"></a>00146
-<a name="l00148"></a>00148
-<a name="l00153"></a>00153 <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">template</span><<span class="keyword">typename</span> X> <span class="keyword">class </span>Allocator = tbb_allocator>
-<a name="l00154"></a><a class="code" href="a00213.html">00154</a> <span class="keyword">class </span><a class="code" href="a00213.html">zero_allocator</a> : <span class="keyword">public</span> Allocator<T>
-<a name="l00155"></a>00155 {
-<a name="l00156"></a>00156 <span class="keyword">public</span>:
-<a name="l00157"></a>00157 <span class="keyword">typedef</span> Allocator<T> base_allocator_type;
-<a name="l00158"></a>00158 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::value_type value_type;
-<a name="l00159"></a>00159 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::pointer pointer;
-<a name="l00160"></a>00160 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::const_pointer const_pointer;
-<a name="l00161"></a>00161 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::reference reference;
-<a name="l00162"></a>00162 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::const_reference const_reference;
-<a name="l00163"></a>00163 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::size_type size_type;
-<a name="l00164"></a>00164 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::difference_type difference_type;
-<a name="l00165"></a>00165 <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">struct </span>rebind {
-<a name="l00166"></a>00166 <span class="keyword">typedef</span> <a class="code" href="a00213.html">zero_allocator<U, Allocator></a> other;
-<a name="l00167"></a>00167 };
-<a name="l00168"></a>00168
-<a name="l00169"></a>00169 <a class="code" href="a00213.html">zero_allocator</a>() <span class="keywordflow">throw</span>() { }
-<a name="l00170"></a>00170 <a class="code" href="a00213.html">zero_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00213.html">zero_allocator</a> &a) <span class="keywordflow">throw</span>() : base_allocator_type( a ) { }
-<a name="l00171"></a>00171 <span class="keyword">template</span><<span class="keyword">typename</span> U>
-<a name="l00172"></a>00172 <a class="code" href="a00213.html">zero_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00213.html">zero_allocator<U></a> &a) <span class="keywordflow">throw</span>() : base_allocator_type( Allocator<U>( a ) ) { }
-<a name="l00173"></a>00173
-<a name="l00174"></a>00174 pointer allocate(<span class="keyword">const</span> size_type n, <span class="keyword">const</span> <span class="keywordtype">void</span> *hint = 0 ) {
-<a name="l00175"></a>00175 pointer ptr = base_allocator_type::allocate( n, hint );
-<a name="l00176"></a>00176 std::memset( ptr, 0, n * <span class="keyword">sizeof</span>(value_type) );
-<a name="l00177"></a>00177 <span class="keywordflow">return</span> ptr;
-<a name="l00178"></a>00178 }
-<a name="l00179"></a>00179 };
-<a name="l00180"></a>00180
-<a name="l00182"></a>00182
-<a name="l00183"></a>00183 <span class="keyword">template</span><<span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">class </span>Allocator>
-<a name="l00184"></a><a class="code" href="a00214.html">00184</a> <span class="keyword">class </span><a class="code" href="a00213.html">zero_allocator</a><void, Allocator> : <span class="keyword">public</span> Allocator<void> {
-<a name="l00185"></a>00185 <span class="keyword">public</span>:
-<a name="l00186"></a>00186 <span class="keyword">typedef</span> Allocator<void> base_allocator_type;
-<a name="l00187"></a>00187 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::value_type value_type;
-<a name="l00188"></a>00188 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::pointer pointer;
-<a name="l00189"></a>00189 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::const_pointer const_pointer;
-<a name="l00190"></a>00190 <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">struct </span>rebind {
-<a name="l00191"></a>00191 <span class="keyword">typedef</span> <a class="code" href="a00213.html">zero_allocator<U, Allocator></a> other;
-<a name="l00192"></a>00192 };
-<a name="l00193"></a>00193 };
-<a name="l00194"></a>00194
-<a name="l00195"></a>00195 <span class="keyword">template</span><<span class="keyword">typename</span> T1, <span class="keyword">template</span><<span class="keyword">typename</span> X1> <span class="keyword">class </span>B1, <span class="keyword">typename</span> T2, <span class="keyword">template</span><<span class="keyword">typename</span> X2> <span class="keyword">class </span>B2>
-<a name="l00196"></a>00196 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> <a class="code" href="a00213.html">zero_allocator<T1,B1></a> &a, <span class="keyword">const</span> <a class="code" href="a00213.html">zero_allocator<T2,B2></a> &b) {
-<a name="l00197"></a>00197 <span class="keywordflow">return</span> static_cast< B1<T1> >(a) == <span class="keyword">static_cast</span>< B2<T2> >(b);
-<a name="l00198"></a>00198 }
-<a name="l00199"></a>00199 <span class="keyword">template</span><<span class="keyword">typename</span> T1, <span class="keyword">template</span><<span class="keyword">typename</span> X1> <span class="keyword">class </span>B1, <span class="keyword">typename</span> T2, <span class="keyword">template</span><<span class="keyword">typename</span> X2> <span class="keyword">class </span>B2>
-<a name="l00200"></a>00200 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> zero_allocator<T1,B1> &a, <span class="keyword">const</span> zero_allocator<T2,B2> &b) {
-<a name="l00201"></a>00201 <span class="keywordflow">return</span> static_cast< B1<T1> >(a) != <span class="keyword">static_cast</span>< B2<T2> >(b);
-<a name="l00202"></a>00202 }
-<a name="l00203"></a>00203
-<a name="l00204"></a>00204 } <span class="comment">// namespace tbb </span>
-<a name="l00205"></a>00205
-<a name="l00206"></a>00206 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_tbb_allocator_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00443.html b/doc/html/a00449.html
similarity index 100%
rename from doc/html/a00443.html
rename to doc/html/a00449.html
diff --git a/doc/html/a00444.html b/doc/html/a00450.html
similarity index 100%
rename from doc/html/a00444.html
rename to doc/html/a00450.html
diff --git a/doc/html/a00452.html b/doc/html/a00452.html
index 5842d63..0f5074f 100644
--- a/doc/html/a00452.html
+++ b/doc/html/a00452.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb_config_lrb.h Source File</title>
+<title>tbb.h Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -19,7 +19,7 @@
<li><a href="files.html"><span>File List</span></a></li>
<li><a href="globals.html"><span>File Members</span></a></li>
</ul></div>
-<h1>tbb_config_lrb.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<h1>tbb.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
<a name="l00003"></a>00003 <span class="comment"></span>
<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
@@ -39,24 +39,50 @@
<a name="l00018"></a>00018 <span class="comment"> writing.</span>
<a name="l00019"></a>00019 <span class="comment">*/</span>
<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_tbb_config_lrb_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_tbb_config_lrb_H</span>
+<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_tbb_H</span>
+<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_tbb_H</span>
<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor"> #error tbb_config_lrb.h should be included only when building for LRB platform</span>
-<a name="l00025"></a>00025 <span class="preprocessor"></span>
-<a name="l00026"></a>00026 <span class="preprocessor">#if __TBB_LRB_NATIVE</span>
-<a name="l00027"></a>00027 <span class="preprocessor"></span>
-<a name="l00029"></a>00029 <span class="preprocessor">#define __TBB_FLOATING_POINT_BROKEN 1</span>
-<a name="l00030"></a>00030 <span class="preprocessor"></span>
-<a name="l00032"></a>00032 <span class="preprocessor">#define __TBB_rel_acq_fence __TBB_release_consistency_helper</span>
-<a name="l00033"></a>00033 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_Pause(x) _mm_delay_32(x)</span>
-<a name="l00034"></a>00034 <span class="preprocessor"></span>
-<a name="l00035"></a>00035 <span class="preprocessor">#if !__FreeBSD__</span>
-<a name="l00036"></a>00036 <span class="preprocessor"></span><span class="preprocessor"> #error LRB compiler does not define __FreeBSD__ anymore. Check for the __TBB_XXX_BROKEN defined under __FreeBSD__</span>
-<a name="l00037"></a>00037 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* !__FreeBSD__ */</span>
-<a name="l00038"></a>00038 <span class="preprocessor">#endif </span><span class="comment">/*__TBB_LRB_NATIVE*/</span>
-<a name="l00039"></a>00039
-<a name="l00040"></a>00040 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_tbb_config_lrb_H */</span>
+<a name="l00032"></a>00032 <span class="preprocessor">#include "aligned_space.h"</span>
+<a name="l00033"></a>00033 <span class="preprocessor">#include "atomic.h"</span>
+<a name="l00034"></a>00034 <span class="preprocessor">#include "blocked_range.h"</span>
+<a name="l00035"></a>00035 <span class="preprocessor">#include "blocked_range2d.h"</span>
+<a name="l00036"></a>00036 <span class="preprocessor">#include "blocked_range3d.h"</span>
+<a name="l00037"></a>00037 <span class="preprocessor">#include "cache_aligned_allocator.h"</span>
+<a name="l00038"></a>00038 <span class="preprocessor">#include "combinable.h"</span>
+<a name="l00039"></a>00039 <span class="preprocessor">#include "concurrent_unordered_map.h"</span>
+<a name="l00040"></a>00040 <span class="preprocessor">#include "concurrent_hash_map.h"</span>
+<a name="l00041"></a>00041 <span class="preprocessor">#include "concurrent_queue.h"</span>
+<a name="l00042"></a>00042 <span class="preprocessor">#include "concurrent_vector.h"</span>
+<a name="l00043"></a>00043 <span class="preprocessor">#include "critical_section.h"</span>
+<a name="l00044"></a>00044 <span class="preprocessor">#include "enumerable_thread_specific.h"</span>
+<a name="l00045"></a>00045 <span class="preprocessor">#include "mutex.h"</span>
+<a name="l00046"></a>00046 <span class="preprocessor">#include "null_mutex.h"</span>
+<a name="l00047"></a>00047 <span class="preprocessor">#include "null_rw_mutex.h"</span>
+<a name="l00048"></a>00048 <span class="preprocessor">#include "parallel_do.h"</span>
+<a name="l00049"></a>00049 <span class="preprocessor">#include "parallel_for.h"</span>
+<a name="l00050"></a>00050 <span class="preprocessor">#include "parallel_for_each.h"</span>
+<a name="l00051"></a>00051 <span class="preprocessor">#include "parallel_invoke.h"</span>
+<a name="l00052"></a>00052 <span class="preprocessor">#include "parallel_reduce.h"</span>
+<a name="l00053"></a>00053 <span class="preprocessor">#include "parallel_scan.h"</span>
+<a name="l00054"></a>00054 <span class="preprocessor">#include "parallel_sort.h"</span>
+<a name="l00055"></a>00055 <span class="preprocessor">#include "partitioner.h"</span>
+<a name="l00056"></a>00056 <span class="preprocessor">#include "pipeline.h"</span>
+<a name="l00057"></a>00057 <span class="preprocessor">#include "queuing_mutex.h"</span>
+<a name="l00058"></a>00058 <span class="preprocessor">#include "queuing_rw_mutex.h"</span>
+<a name="l00059"></a>00059 <span class="preprocessor">#include "reader_writer_lock.h"</span>
+<a name="l00060"></a>00060 <span class="preprocessor">#include "recursive_mutex.h"</span>
+<a name="l00061"></a>00061 <span class="preprocessor">#include "spin_mutex.h"</span>
+<a name="l00062"></a>00062 <span class="preprocessor">#include "spin_rw_mutex.h"</span>
+<a name="l00063"></a>00063 <span class="preprocessor">#include "task.h"</span>
+<a name="l00064"></a>00064 <span class="preprocessor">#include "task_group.h"</span>
+<a name="l00065"></a>00065 <span class="preprocessor">#include "task_scheduler_init.h"</span>
+<a name="l00066"></a>00066 <span class="preprocessor">#include "task_scheduler_observer.h"</span>
+<a name="l00067"></a>00067 <span class="preprocessor">#include "tbb_allocator.h"</span>
+<a name="l00068"></a>00068 <span class="preprocessor">#include "tbb_exception.h"</span>
+<a name="l00069"></a>00069 <span class="preprocessor">#include "tbb_thread.h"</span>
+<a name="l00070"></a>00070 <span class="preprocessor">#include "tick_count.h"</span>
+<a name="l00071"></a>00071
+<a name="l00072"></a>00072 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_tbb_H */</span>
</pre></div><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00453.html b/doc/html/a00453.html
index 7777cd7..0131842 100644
--- a/doc/html/a00453.html
+++ b/doc/html/a00453.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb_exception.h Source File</title>
+<title>tbb_allocator.h Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -19,7 +19,7 @@
<li><a href="files.html"><span>File List</span></a></li>
<li><a href="globals.html"><span>File Members</span></a></li>
</ul></div>
-<h1>tbb_exception.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<h1>tbb_allocator.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
<a name="l00003"></a>00003 <span class="comment"></span>
<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
@@ -39,277 +39,168 @@
<a name="l00018"></a>00018 <span class="comment"> writing.</span>
<a name="l00019"></a>00019 <span class="comment">*/</span>
<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_exception_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_exception_H</span>
+<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_tbb_allocator_H</span>
+<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_tbb_allocator_H</span>
<a name="l00023"></a>00023 <span class="preprocessor"></span>
<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00025"></a>00025
-<a name="l00026"></a>00026 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
-<a name="l00027"></a>00027 <span class="preprocessor"></span> <span class="comment">// Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers</span>
-<a name="l00028"></a>00028 <span class="preprocessor"> #pragma warning (push)</span>
-<a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4530)</span>
-<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00031"></a>00031 <span class="preprocessor"></span>
-<a name="l00032"></a>00032 <span class="preprocessor">#include <stdexcept></span>
-<a name="l00033"></a>00033
-<a name="l00034"></a>00034 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
-<a name="l00035"></a>00035 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
-<a name="l00036"></a>00036 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00037"></a>00037 <span class="preprocessor"></span>
-<a name="l00038"></a>00038 <span class="preprocessor">#if __SUNPRO_CC</span>
-<a name="l00039"></a>00039 <span class="preprocessor"></span><span class="preprocessor">#include <string></span> <span class="comment">// required to construct std exception classes</span>
-<a name="l00040"></a>00040 <span class="preprocessor">#endif</span>
-<a name="l00041"></a>00041 <span class="preprocessor"></span>
-<a name="l00042"></a>00042 <span class="keyword">namespace </span>tbb {
+<a name="l00025"></a>00025 <span class="preprocessor">#include <new></span>
+<a name="l00026"></a>00026
+<a name="l00027"></a>00027 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
+<a name="l00028"></a>00028 <span class="preprocessor"></span> <span class="comment">// Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers</span>
+<a name="l00029"></a>00029 <span class="preprocessor"> #pragma warning (push)</span>
+<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4530)</span>
+<a name="l00031"></a>00031 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00032"></a>00032 <span class="preprocessor"></span>
+<a name="l00033"></a>00033 <span class="preprocessor">#include <cstring></span>
+<a name="l00034"></a>00034
+<a name="l00035"></a>00035 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
+<a name="l00036"></a>00036 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
+<a name="l00037"></a>00037 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00038"></a>00038 <span class="preprocessor"></span>
+<a name="l00039"></a>00039 <span class="keyword">namespace </span>tbb {
+<a name="l00040"></a>00040
+<a name="l00042"></a>00042 <span class="keyword">namespace </span>internal {
<a name="l00043"></a>00043
-<a name="l00045"></a><a class="code" href="a00147.html">00045</a> <span class="keyword">class </span><a class="code" href="a00147.html">bad_last_alloc</a> : <span class="keyword">public</span> std::bad_alloc {
-<a name="l00046"></a>00046 <span class="keyword">public</span>:
-<a name="l00047"></a>00047 <span class="comment">/*override*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* what() <span class="keyword">const</span> <span class="keywordflow">throw</span>();
-<a name="l00048"></a>00048 <span class="preprocessor">#if __TBB_DEFAULT_DTOR_THROW_SPEC_BROKEN</span>
-<a name="l00049"></a>00049 <span class="preprocessor"></span> <span class="comment">/*override*/</span> ~<a class="code" href="a00147.html">bad_last_alloc</a>() <span class="keywordflow">throw</span>() {}
-<a name="l00050"></a>00050 <span class="preprocessor">#endif</span>
-<a name="l00051"></a>00051 <span class="preprocessor"></span>};
-<a name="l00052"></a>00052
-<a name="l00054"></a><a class="code" href="a00168.html">00054</a> <span class="keyword">class </span><a class="code" href="a00168.html">improper_lock</a> : <span class="keyword">public</span> std::exception {
-<a name="l00055"></a>00055 <span class="keyword">public</span>:
-<a name="l00056"></a>00056 <span class="comment">/*override*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* what() <span class="keyword">const</span> <span class="keywordflow">throw</span>();
-<a name="l00057"></a>00057 };
-<a name="l00058"></a>00058
-<a name="l00060"></a><a class="code" href="a00170.html">00060</a> <span class="keyword">class </span><a class="code" href="a00170.html">missing_wait</a> : <span class="keyword">public</span> std::exception {
-<a name="l00061"></a>00061 <span class="keyword">public</span>:
-<a name="l00062"></a>00062 <span class="comment">/*override*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* what() <span class="keyword">const</span> <span class="keywordflow">throw</span>();
-<a name="l00063"></a>00063 };
+<a name="l00045"></a>00045
+<a name="l00046"></a>00046 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC deallocate_via_handler_v3( <span class="keywordtype">void</span> *p );
+<a name="l00047"></a>00047
+<a name="l00049"></a>00049
+<a name="l00050"></a>00050 <span class="keywordtype">void</span>* __TBB_EXPORTED_FUNC allocate_via_handler_v3( size_t n );
+<a name="l00051"></a>00051
+<a name="l00053"></a>00053 <span class="keywordtype">bool</span> __TBB_EXPORTED_FUNC is_malloc_used_v3();
+<a name="l00054"></a>00054 }
+<a name="l00056"></a>00056
+<a name="l00057"></a>00057 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
+<a name="l00058"></a>00058 <span class="preprocessor"></span> <span class="comment">// Workaround for erroneous "unreferenced parameter" warning in method destroy.</span>
+<a name="l00059"></a>00059 <span class="preprocessor"> #pragma warning (push)</span>
+<a name="l00060"></a>00060 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4100)</span>
+<a name="l00061"></a>00061 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00062"></a>00062 <span class="preprocessor"></span>
<a name="l00064"></a>00064
-<a name="l00066"></a><a class="code" href="a00169.html">00066</a> <span class="keyword">class </span><a class="code" href="a00169.html">invalid_multiple_scheduling</a> : <span class="keyword">public</span> std::exception {
-<a name="l00067"></a>00067 <span class="keyword">public</span>:
-<a name="l00068"></a>00068 <span class="comment">/*override*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* what() <span class="keyword">const</span> <span class="keywordflow">throw</span>();
-<a name="l00069"></a>00069 };
-<a name="l00070"></a>00070
-<a name="l00071"></a>00071 <span class="keyword">namespace </span>internal {
-<a name="l00073"></a>00073 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC throw_bad_last_alloc_exception_v4();
-<a name="l00074"></a>00074
-<a name="l00075"></a>00075 <span class="keyword">enum</span> exception_id {
-<a name="l00076"></a>00076 eid_bad_alloc = 1,
-<a name="l00077"></a>00077 eid_bad_last_alloc,
-<a name="l00078"></a>00078 eid_nonpositive_step,
-<a name="l00079"></a>00079 eid_out_of_range,
-<a name="l00080"></a>00080 eid_segment_range_error,
-<a name="l00081"></a>00081 eid_index_range_error,
-<a name="l00082"></a>00082 eid_missing_wait,
-<a name="l00083"></a>00083 eid_invalid_multiple_scheduling,
-<a name="l00084"></a>00084 eid_improper_lock,
-<a name="l00085"></a>00085 eid_possible_deadlock,
-<a name="l00086"></a>00086 eid_operation_not_permitted,
-<a name="l00087"></a>00087 eid_condvar_wait_failed,
-<a name="l00088"></a>00088 eid_invalid_load_factor,
-<a name="l00089"></a>00089 eid_invalid_buckets_number,
-<a name="l00090"></a>00090 eid_invalid_swap,
-<a name="l00091"></a>00091 eid_reservation_length_error,
-<a name="l00092"></a>00092 eid_invalid_key,
-<a name="l00094"></a>00094
-<a name="l00096"></a>00096 eid_max
-<a name="l00097"></a>00097 };
-<a name="l00098"></a>00098
+<a name="l00069"></a>00069 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00070"></a><a class="code" href="a00204.html">00070</a> <span class="keyword">class </span><a class="code" href="a00204.html">tbb_allocator</a> {
+<a name="l00071"></a>00071 <span class="keyword">public</span>:
+<a name="l00072"></a>00072 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::allocator_type<T>::value_type value_type;
+<a name="l00073"></a>00073 <span class="keyword">typedef</span> value_type* pointer;
+<a name="l00074"></a>00074 <span class="keyword">typedef</span> <span class="keyword">const</span> value_type* const_pointer;
+<a name="l00075"></a>00075 <span class="keyword">typedef</span> value_type& reference;
+<a name="l00076"></a>00076 <span class="keyword">typedef</span> <span class="keyword">const</span> value_type& const_reference;
+<a name="l00077"></a>00077 <span class="keyword">typedef</span> size_t size_type;
+<a name="l00078"></a>00078 <span class="keyword">typedef</span> ptrdiff_t difference_type;
+<a name="l00079"></a>00079 <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">struct </span>rebind {
+<a name="l00080"></a>00080 <span class="keyword">typedef</span> <a class="code" href="a00204.html">tbb_allocator<U></a> other;
+<a name="l00081"></a>00081 };
+<a name="l00082"></a>00082
+<a name="l00084"></a><a class="code" href="a00204.html#09a7f81fb2c3055aaecf058b11538544">00084</a> <span class="keyword">enum</span> <a class="code" href="a00204.html#09a7f81fb2c3055aaecf058b11538544">malloc_type</a> {
+<a name="l00085"></a>00085 scalable,
+<a name="l00086"></a>00086 standard
+<a name="l00087"></a>00087 };
+<a name="l00088"></a>00088
+<a name="l00089"></a>00089 <a class="code" href="a00204.html">tbb_allocator</a>() throw() {}
+<a name="l00090"></a>00090 tbb_allocator( <span class="keyword">const</span> tbb_allocator& ) throw() {}
+<a name="l00091"></a>00091 <span class="keyword">template</span><<span class="keyword">typename</span> U> tbb_allocator(<span class="keyword">const</span> tbb_allocator<U>&) throw() {}
+<a name="l00092"></a>00092
+<a name="l00093"></a>00093 pointer address(reference x)<span class="keyword"> const </span>{<span class="keywordflow">return</span> &x;}
+<a name="l00094"></a>00094 const_pointer address(const_reference x)<span class="keyword"> const </span>{<span class="keywordflow">return</span> &x;}
+<a name="l00095"></a>00095
+<a name="l00097"></a><a class="code" href="a00204.html#f6cb487b1bdce0b581f265a77dca6d53">00097</a> pointer <a class="code" href="a00204.html#f6cb487b1bdce0b581f265a77dca6d53">allocate</a>( size_type n, <span class="keyword">const</span> <span class="keywordtype">void</span>* <span class="comment">/*hint*/</span> = 0) {
+<a name="l00098"></a>00098 <span class="keywordflow">return</span> pointer(internal::allocate_via_handler_v3( n * <span class="keyword">sizeof</span>(value_type) ));
+<a name="l00099"></a>00099 }
<a name="l00100"></a>00100
-<a name="l00102"></a>00102 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC throw_exception_v4 ( exception_id );
-<a name="l00103"></a>00103
-<a name="l00105"></a>00105 <span class="keyword">inline</span> <span class="keywordtype">void</span> throw_exception ( exception_id eid ) { throw_exception_v4(eid); }
-<a name="l00106"></a>00106
-<a name="l00107"></a>00107 } <span class="comment">// namespace internal</span>
-<a name="l00108"></a>00108 } <span class="comment">// namespace tbb</span>
-<a name="l00109"></a>00109
-<a name="l00110"></a>00110 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00111"></a>00111 <span class="preprocessor"></span><span class="preprocessor">#include "tbb_allocator.h"</span>
-<a name="l00112"></a>00112 <span class="preprocessor">#include <exception></span>
-<a name="l00113"></a>00113 <span class="preprocessor">#include <typeinfo></span>
-<a name="l00114"></a>00114 <span class="preprocessor">#include <new></span>
-<a name="l00115"></a>00115
-<a name="l00116"></a>00116 <span class="keyword">namespace </span>tbb {
+<a name="l00102"></a><a class="code" href="a00204.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">00102</a> <span class="keywordtype">void</span> <a class="code" href="a00204.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">deallocate</a>( pointer p, size_type ) {
+<a name="l00103"></a>00103 internal::deallocate_via_handler_v3(p);
+<a name="l00104"></a>00104 }
+<a name="l00105"></a>00105
+<a name="l00107"></a><a class="code" href="a00204.html#f059ca2c96243024f0d562ee3a87a3a5">00107</a> size_type <a class="code" href="a00204.html#f059ca2c96243024f0d562ee3a87a3a5">max_size</a>() const throw() {
+<a name="l00108"></a>00108 size_type max = static_cast<size_type>(-1) / <span class="keyword">sizeof</span> (value_type);
+<a name="l00109"></a>00109 <span class="keywordflow">return</span> (max > 0 ? max : 1);
+<a name="l00110"></a>00110 }
+<a name="l00111"></a>00111
+<a name="l00113"></a><a class="code" href="a00204.html#ab228ab9e324ed041c2226e1d717df5f">00113</a> <span class="keywordtype">void</span> <a class="code" href="a00204.html#ab228ab9e324ed041c2226e1d717df5f">construct</a>( pointer p, <span class="keyword">const</span> value_type& value ) {::new((<span class="keywordtype">void</span>*)(p)) value_type(value);}
+<a name="l00114"></a>00114
+<a name="l00116"></a><a class="code" href="a00204.html#ef133522bf55f05a605bee0763208281">00116</a> <span class="keywordtype">void</span> <a class="code" href="a00204.html#ef133522bf55f05a605bee0763208281">destroy</a>( pointer p ) {p->~value_type();}
<a name="l00117"></a>00117
-<a name="l00119"></a>00119
-<a name="l00139"></a><a class="code" href="a00206.html">00139</a> <span class="keyword">class </span><a class="code" href="a00206.html">tbb_exception</a> : <span class="keyword">public</span> std::exception
-<a name="l00140"></a>00140 {
-<a name="l00144"></a>00144 <span class="keywordtype">void</span>* operator new ( size_t );
-<a name="l00145"></a>00145
-<a name="l00146"></a>00146 <span class="keyword">public</span>:
+<a name="l00119"></a><a class="code" href="a00204.html#78701e7454ef8e1a25b5acd364367080">00119</a> <span class="keyword">static</span> <a class="code" href="a00204.html#09a7f81fb2c3055aaecf058b11538544">malloc_type</a> <a class="code" href="a00204.html#78701e7454ef8e1a25b5acd364367080">allocator_type</a>() {
+<a name="l00120"></a>00120 <span class="keywordflow">return</span> internal::is_malloc_used_v3() ? standard : scalable;
+<a name="l00121"></a>00121 }
+<a name="l00122"></a>00122 };
+<a name="l00123"></a>00123
+<a name="l00124"></a>00124 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
+<a name="l00125"></a>00125 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
+<a name="l00126"></a>00126 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4100 is back</span>
+<a name="l00127"></a>00127 <span class="preprocessor"></span>
+<a name="l00129"></a>00129
+<a name="l00130"></a>00130 <span class="keyword">template</span><>
+<a name="l00131"></a><a class="code" href="a00205.html">00131</a> <span class="keyword">class </span><a class="code" href="a00204.html">tbb_allocator</a><void> {
+<a name="l00132"></a>00132 <span class="keyword">public</span>:
+<a name="l00133"></a>00133 <span class="keyword">typedef</span> <span class="keywordtype">void</span>* pointer;
+<a name="l00134"></a>00134 <span class="keyword">typedef</span> <span class="keyword">const</span> <span class="keywordtype">void</span>* const_pointer;
+<a name="l00135"></a>00135 <span class="keyword">typedef</span> <span class="keywordtype">void</span> value_type;
+<a name="l00136"></a>00136 <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">struct </span>rebind {
+<a name="l00137"></a>00137 <span class="keyword">typedef</span> <a class="code" href="a00204.html">tbb_allocator<U></a> other;
+<a name="l00138"></a>00138 };
+<a name="l00139"></a>00139 };
+<a name="l00140"></a>00140
+<a name="l00141"></a>00141 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00142"></a>00142 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> <a class="code" href="a00204.html">tbb_allocator<T></a>&, <span class="keyword">const</span> <a class="code" href="a00204.html">tbb_allocator<U></a>& ) {<span class="keywordflow">return</span> <span class="keyword">true</span>;}
+<a name="l00143"></a>00143
+<a name="l00144"></a>00144 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00145"></a>00145 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> tbb_allocator<T>&, <span class="keyword">const</span> tbb_allocator<U>& ) {<span class="keywordflow">return</span> <span class="keyword">false</span>;}
+<a name="l00146"></a>00146
<a name="l00148"></a>00148
-<a name="l00149"></a>00149 <span class="keyword">virtual</span> <a class="code" href="a00206.html">tbb_exception</a>* <a class="code" href="a00206.html#3e3482bf264d4ca4dde046cd9c02c766">move</a> () <span class="keywordflow">throw</span>() = 0;
-<a name="l00150"></a>00150
-<a name="l00152"></a>00152
-<a name="l00154"></a>00154 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="a00206.html#66c94938eca8bf88b76f3eccaaf215d8">destroy</a> () <span class="keywordflow">throw</span>() = 0;
-<a name="l00155"></a>00155
-<a name="l00157"></a>00157
-<a name="l00161"></a>00161 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="a00206.html#8588e07fa49692f4d734e4f2e4f048f4">throw_self</a> () = 0;
-<a name="l00162"></a>00162
-<a name="l00164"></a>00164 <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00206.html#d00f6497e552fee978a02bfcbebf46e2">name</a>() <span class="keyword">const</span> <span class="keywordflow">throw</span>() = 0;
-<a name="l00165"></a>00165
-<a name="l00167"></a>00167 <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00206.html#e8157689ecb66bc6c72d3618bf3cc371">what</a>() <span class="keyword">const</span> <span class="keywordflow">throw</span>() = 0;
+<a name="l00153"></a>00153 <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">template</span><<span class="keyword">typename</span> X> <span class="keyword">class </span>Allocator = tbb_allocator>
+<a name="l00154"></a><a class="code" href="a00213.html">00154</a> <span class="keyword">class </span><a class="code" href="a00213.html">zero_allocator</a> : <span class="keyword">public</span> Allocator<T>
+<a name="l00155"></a>00155 {
+<a name="l00156"></a>00156 <span class="keyword">public</span>:
+<a name="l00157"></a>00157 <span class="keyword">typedef</span> Allocator<T> base_allocator_type;
+<a name="l00158"></a>00158 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::value_type value_type;
+<a name="l00159"></a>00159 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::pointer pointer;
+<a name="l00160"></a>00160 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::const_pointer const_pointer;
+<a name="l00161"></a>00161 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::reference reference;
+<a name="l00162"></a>00162 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::const_reference const_reference;
+<a name="l00163"></a>00163 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::size_type size_type;
+<a name="l00164"></a>00164 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::difference_type difference_type;
+<a name="l00165"></a>00165 <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">struct </span>rebind {
+<a name="l00166"></a>00166 <span class="keyword">typedef</span> <a class="code" href="a00213.html">zero_allocator<U, Allocator></a> other;
+<a name="l00167"></a>00167 };
<a name="l00168"></a>00168
-<a name="l00175"></a><a class="code" href="a00206.html#3f2da7f3d8a6e4c1df522af1213afb5a">00175</a> <span class="keywordtype">void</span> <a class="code" href="a00206.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete </a>( <span class="keywordtype">void</span>* p ) {
-<a name="l00176"></a>00176 internal::deallocate_via_handler_v3(p);
-<a name="l00177"></a>00177 }
-<a name="l00178"></a>00178 };
-<a name="l00179"></a>00179
-<a name="l00181"></a>00181
-<a name="l00185"></a><a class="code" href="a00153.html">00185</a> <span class="keyword">class </span><a class="code" href="a00153.html">captured_exception</a> : <span class="keyword">public</span> <a class="code" href="a00206.html">tbb_exception</a>
-<a name="l00186"></a>00186 {
-<a name="l00187"></a>00187 <span class="keyword">public</span>:
-<a name="l00188"></a>00188 <a class="code" href="a00153.html">captured_exception</a> ( <span class="keyword">const</span> <a class="code" href="a00153.html">captured_exception</a>& src )
-<a name="l00189"></a>00189 : <a class="code" href="a00206.html">tbb_exception</a>(src), my_dynamic(<span class="keyword">false</span>)
-<a name="l00190"></a>00190 {
-<a name="l00191"></a>00191 set(src.<a class="code" href="a00153.html#6a57f9aa0bce72392492d109b9e1d941">my_exception_name</a>, src.<a class="code" href="a00153.html#788adf4e55cdad7abc178a48a1d47e69">my_exception_info</a>);
-<a name="l00192"></a>00192 }
-<a name="l00193"></a>00193
-<a name="l00194"></a>00194 <a class="code" href="a00153.html">captured_exception</a> ( <span class="keyword">const</span> <span class="keywordtype">char</span>* name_, <span class="keyword">const</span> <span class="keywordtype">char</span>* info )
-<a name="l00195"></a>00195 : my_dynamic(<span class="keyword">false</span>)
-<a name="l00196"></a>00196 {
-<a name="l00197"></a>00197 set(name_, info);
-<a name="l00198"></a>00198 }
-<a name="l00199"></a>00199
-<a name="l00200"></a>00200 __TBB_EXPORTED_METHOD ~<a class="code" href="a00153.html">captured_exception</a> () <span class="keywordflow">throw</span>() {
-<a name="l00201"></a>00201 clear();
-<a name="l00202"></a>00202 }
+<a name="l00169"></a>00169 <a class="code" href="a00213.html">zero_allocator</a>() <span class="keywordflow">throw</span>() { }
+<a name="l00170"></a>00170 <a class="code" href="a00213.html">zero_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00213.html">zero_allocator</a> &a) <span class="keywordflow">throw</span>() : base_allocator_type( a ) { }
+<a name="l00171"></a>00171 <span class="keyword">template</span><<span class="keyword">typename</span> U>
+<a name="l00172"></a>00172 <a class="code" href="a00213.html">zero_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00213.html">zero_allocator<U></a> &a) <span class="keywordflow">throw</span>() : base_allocator_type( Allocator<U>( a ) ) { }
+<a name="l00173"></a>00173
+<a name="l00174"></a>00174 pointer allocate(<span class="keyword">const</span> size_type n, <span class="keyword">const</span> <span class="keywordtype">void</span> *hint = 0 ) {
+<a name="l00175"></a>00175 pointer ptr = base_allocator_type::allocate( n, hint );
+<a name="l00176"></a>00176 std::memset( ptr, 0, n * <span class="keyword">sizeof</span>(value_type) );
+<a name="l00177"></a>00177 <span class="keywordflow">return</span> ptr;
+<a name="l00178"></a>00178 }
+<a name="l00179"></a>00179 };
+<a name="l00180"></a>00180
+<a name="l00182"></a>00182
+<a name="l00183"></a>00183 <span class="keyword">template</span><<span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">class </span>Allocator>
+<a name="l00184"></a><a class="code" href="a00214.html">00184</a> <span class="keyword">class </span><a class="code" href="a00213.html">zero_allocator</a><void, Allocator> : <span class="keyword">public</span> Allocator<void> {
+<a name="l00185"></a>00185 <span class="keyword">public</span>:
+<a name="l00186"></a>00186 <span class="keyword">typedef</span> Allocator<void> base_allocator_type;
+<a name="l00187"></a>00187 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::value_type value_type;
+<a name="l00188"></a>00188 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::pointer pointer;
+<a name="l00189"></a>00189 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::const_pointer const_pointer;
+<a name="l00190"></a>00190 <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">struct </span>rebind {
+<a name="l00191"></a>00191 <span class="keyword">typedef</span> <a class="code" href="a00213.html">zero_allocator<U, Allocator></a> other;
+<a name="l00192"></a>00192 };
+<a name="l00193"></a>00193 };
+<a name="l00194"></a>00194
+<a name="l00195"></a>00195 <span class="keyword">template</span><<span class="keyword">typename</span> T1, <span class="keyword">template</span><<span class="keyword">typename</span> X1> <span class="keyword">class </span>B1, <span class="keyword">typename</span> T2, <span class="keyword">template</span><<span class="keyword">typename</span> X2> <span class="keyword">class </span>B2>
+<a name="l00196"></a>00196 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> <a class="code" href="a00213.html">zero_allocator<T1,B1></a> &a, <span class="keyword">const</span> <a class="code" href="a00213.html">zero_allocator<T2,B2></a> &b) {
+<a name="l00197"></a>00197 <span class="keywordflow">return</span> static_cast< B1<T1> >(a) == <span class="keyword">static_cast</span>< B2<T2> >(b);
+<a name="l00198"></a>00198 }
+<a name="l00199"></a>00199 <span class="keyword">template</span><<span class="keyword">typename</span> T1, <span class="keyword">template</span><<span class="keyword">typename</span> X1> <span class="keyword">class </span>B1, <span class="keyword">typename</span> T2, <span class="keyword">template</span><<span class="keyword">typename</span> X2> <span class="keyword">class </span>B2>
+<a name="l00200"></a>00200 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> zero_allocator<T1,B1> &a, <span class="keyword">const</span> zero_allocator<T2,B2> &b) {
+<a name="l00201"></a>00201 <span class="keywordflow">return</span> static_cast< B1<T1> >(a) != <span class="keyword">static_cast</span>< B2<T2> >(b);
+<a name="l00202"></a>00202 }
<a name="l00203"></a>00203
-<a name="l00204"></a>00204 <a class="code" href="a00153.html">captured_exception</a>& operator= ( <span class="keyword">const</span> <a class="code" href="a00153.html">captured_exception</a>& src ) {
-<a name="l00205"></a>00205 <span class="keywordflow">if</span> ( <span class="keyword">this</span> != &src ) {
-<a name="l00206"></a>00206 clear();
-<a name="l00207"></a>00207 set(src.<a class="code" href="a00153.html#6a57f9aa0bce72392492d109b9e1d941">my_exception_name</a>, src.<a class="code" href="a00153.html#788adf4e55cdad7abc178a48a1d47e69">my_exception_info</a>);
-<a name="l00208"></a>00208 }
-<a name="l00209"></a>00209 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00210"></a>00210 }
-<a name="l00211"></a>00211
-<a name="l00212"></a>00212 <span class="comment">/*override*/</span>
-<a name="l00213"></a>00213 <a class="code" href="a00153.html">captured_exception</a>* __TBB_EXPORTED_METHOD <a class="code" href="a00153.html#837a50b8f6a800bda225c39d1699643f">move</a> () <span class="keywordflow">throw</span>();
-<a name="l00214"></a>00214
-<a name="l00215"></a>00215 <span class="comment">/*override*/</span>
-<a name="l00216"></a>00216 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00153.html#93d875d3555502ff6f18513525de204c">destroy</a> () <span class="keywordflow">throw</span>();
-<a name="l00217"></a>00217
-<a name="l00218"></a>00218 <span class="comment">/*override*/</span>
-<a name="l00219"></a><a class="code" href="a00153.html#2dd1be66ab32fa27e0ddef5707fa67ef">00219</a> <span class="keywordtype">void</span> <a class="code" href="a00153.html#2dd1be66ab32fa27e0ddef5707fa67ef">throw_self</a> () { __TBB_THROW(*<span class="keyword">this</span>); }
-<a name="l00220"></a>00220
-<a name="l00221"></a>00221 <span class="comment">/*override*/</span>
-<a name="l00222"></a>00222 <span class="keyword">const</span> <span class="keywordtype">char</span>* __TBB_EXPORTED_METHOD <a class="code" href="a00153.html#5af82fd677449c5ca727fa1d7e16f9f5">name</a>() const throw();
-<a name="l00223"></a>00223
-<a name="l00224"></a>00224 <span class="comment">/*override*/</span>
-<a name="l00225"></a>00225 const <span class="keywordtype">char</span>* __TBB_EXPORTED_METHOD <a class="code" href="a00153.html#6b5988ef74a1fe2a58998d110b3633e0">what</a>() const throw();
-<a name="l00226"></a>00226
-<a name="l00227"></a>00227 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD set ( const <span class="keywordtype">char</span>* <a class="code" href="a00153.html#5af82fd677449c5ca727fa1d7e16f9f5">name</a>, const <span class="keywordtype">char</span>* info ) throw();
-<a name="l00228"></a>00228 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD clear () throw();
-<a name="l00229"></a>00229
-<a name="l00230"></a>00230 private:
-<a name="l00232"></a>00232 <a class="code" href="a00153.html">captured_exception</a>() {}
-<a name="l00233"></a>00233
-<a name="l00235"></a>00235 <span class="keyword">static</span> captured_exception* allocate ( <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00153.html#5af82fd677449c5ca727fa1d7e16f9f5">name</a>, <span class="keyword">const</span> <span class="keywordtype">char</span>* info );
-<a name="l00236"></a>00236
-<a name="l00237"></a>00237 <span class="keywordtype">bool</span> my_dynamic;
-<a name="l00238"></a>00238 <span class="keyword">const</span> <span class="keywordtype">char</span>* my_exception_name;
-<a name="l00239"></a>00239 <span class="keyword">const</span> <span class="keywordtype">char</span>* my_exception_info;
-<a name="l00240"></a>00240 };
-<a name="l00241"></a>00241
-<a name="l00243"></a>00243
-<a name="l00247"></a>00247 <span class="keyword">template</span><<span class="keyword">typename</span> ExceptionData>
-<a name="l00248"></a><a class="code" href="a00171.html">00248</a> <span class="keyword">class </span><a class="code" href="a00171.html">movable_exception</a> : <span class="keyword">public</span> <a class="code" href="a00206.html">tbb_exception</a>
-<a name="l00249"></a>00249 {
-<a name="l00250"></a>00250 <span class="keyword">typedef</span> <a class="code" href="a00171.html">movable_exception<ExceptionData></a> <a class="code" href="a00171.html">self_type</a>;
-<a name="l00251"></a>00251
-<a name="l00252"></a>00252 <span class="keyword">public</span>:
-<a name="l00253"></a>00253 <a class="code" href="a00171.html">movable_exception</a> ( <span class="keyword">const</span> ExceptionData& data_ )
-<a name="l00254"></a>00254 : <a class="code" href="a00171.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>(data_)
-<a name="l00255"></a>00255 , my_dynamic(<span class="keyword">false</span>)
-<a name="l00256"></a>00256 , my_exception_name(
-<a name="l00257"></a>00257 #<span class="keywordflow">if</span> TBB_USE_EXCEPTIONS
-<a name="l00258"></a>00258 <span class="keyword">typeid</span>(<a class="code" href="a00171.html">self_type</a>).<a class="code" href="a00171.html#bc5f5c4739b17ac5211ac58226c2f5a5">name</a>()
-<a name="l00259"></a>00259 #<span class="keywordflow">else</span> <span class="comment">/* !TBB_USE_EXCEPTIONS */</span>
-<a name="l00260"></a>00260 <span class="stringliteral">"movable_exception"</span>
-<a name="l00261"></a>00261 #endif <span class="comment">/* !TBB_USE_EXCEPTIONS */</span>
-<a name="l00262"></a>00262 )
-<a name="l00263"></a>00263 {}
-<a name="l00264"></a>00264
-<a name="l00265"></a>00265 <a class="code" href="a00171.html">movable_exception</a> ( <span class="keyword">const</span> <a class="code" href="a00171.html">movable_exception</a>& src ) <span class="keywordflow">throw</span> ()
-<a name="l00266"></a>00266 : <a class="code" href="a00206.html">tbb_exception</a>(src)
-<a name="l00267"></a>00267 , <a class="code" href="a00171.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>(src.<a class="code" href="a00171.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>)
-<a name="l00268"></a>00268 , my_dynamic(<span class="keyword">false</span>)
-<a name="l00269"></a>00269 , my_exception_name(src.<a class="code" href="a00171.html#5f5843b501829ff824c9c8d28c8283eb">my_exception_name</a>)
-<a name="l00270"></a>00270 {}
-<a name="l00271"></a>00271
-<a name="l00272"></a>00272 ~<a class="code" href="a00171.html">movable_exception</a> () <span class="keywordflow">throw</span>() {}
-<a name="l00273"></a>00273
-<a name="l00274"></a>00274 <span class="keyword">const</span> <a class="code" href="a00171.html">movable_exception</a>& operator= ( <span class="keyword">const</span> <a class="code" href="a00171.html">movable_exception</a>& src ) {
-<a name="l00275"></a>00275 <span class="keywordflow">if</span> ( <span class="keyword">this</span> != &src ) {
-<a name="l00276"></a>00276 <a class="code" href="a00171.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a> = src.<a class="code" href="a00171.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>;
-<a name="l00277"></a>00277 my_exception_name = src.<a class="code" href="a00171.html#5f5843b501829ff824c9c8d28c8283eb">my_exception_name</a>;
-<a name="l00278"></a>00278 }
-<a name="l00279"></a>00279 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00280"></a>00280 }
-<a name="l00281"></a>00281
-<a name="l00282"></a>00282 ExceptionData& data () <span class="keywordflow">throw</span>() { <span class="keywordflow">return</span> <a class="code" href="a00171.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>; }
-<a name="l00283"></a>00283
-<a name="l00284"></a>00284 <span class="keyword">const</span> ExceptionData& data () <span class="keyword">const</span> <span class="keywordflow">throw</span>() { <span class="keywordflow">return</span> <a class="code" href="a00171.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>; }
-<a name="l00285"></a>00285
-<a name="l00286"></a><a class="code" href="a00171.html#bc5f5c4739b17ac5211ac58226c2f5a5">00286</a> <span class="comment">/*override*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00171.html#bc5f5c4739b17ac5211ac58226c2f5a5">name</a> () const throw() { <span class="keywordflow">return</span> my_exception_name; }
-<a name="l00287"></a>00287
-<a name="l00288"></a><a class="code" href="a00171.html#b33a89bccf0c63106f1270c7bfaaf54f">00288</a> <span class="comment">/*override*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00171.html#b33a89bccf0c63106f1270c7bfaaf54f">what</a> () const throw() { <span class="keywordflow">return</span> <span class="stringliteral">"tbb::movable_exception"</span>; }
-<a name="l00289"></a>00289
-<a name="l00290"></a>00290 <span class="comment">/*override*/</span>
-<a name="l00291"></a><a class="code" href="a00171.html#1aea0ad179d6f0481fe7f3495f66adf9">00291</a> <a class="code" href="a00171.html">movable_exception</a>* <a class="code" href="a00171.html#1aea0ad179d6f0481fe7f3495f66adf9">move</a> () throw() {
-<a name="l00292"></a>00292 <span class="keywordtype">void</span>* e = internal::allocate_via_handler_v3(<span class="keyword">sizeof</span>(<a class="code" href="a00171.html">movable_exception</a>));
-<a name="l00293"></a>00293 <span class="keywordflow">if</span> ( e ) {
-<a name="l00294"></a>00294 ::new (e) movable_exception(*<span class="keyword">this</span>);
-<a name="l00295"></a>00295 ((movable_exception*)e)->my_dynamic = <span class="keyword">true</span>;
-<a name="l00296"></a>00296 }
-<a name="l00297"></a>00297 <span class="keywordflow">return</span> (movable_exception*)e;
-<a name="l00298"></a>00298 }
-<a name="l00299"></a>00299 <span class="comment">/*override*/</span>
-<a name="l00300"></a><a class="code" href="a00171.html#7a46873119d9f85a7b0009c13e41a258">00300</a> <span class="keywordtype">void</span> <a class="code" href="a00171.html#7a46873119d9f85a7b0009c13e41a258">destroy</a> () throw() {
-<a name="l00301"></a>00301 __TBB_ASSERT ( my_dynamic, <span class="stringliteral">"Method destroy can be called only on dynamically allocated movable_exceptions"</span> );
-<a name="l00302"></a>00302 <span class="keywordflow">if</span> ( my_dynamic ) {
-<a name="l00303"></a>00303 this->~<a class="code" href="a00171.html">movable_exception</a>();
-<a name="l00304"></a>00304 internal::deallocate_via_handler_v3(<span class="keyword">this</span>);
-<a name="l00305"></a>00305 }
-<a name="l00306"></a>00306 }
-<a name="l00307"></a>00307 <span class="comment">/*override*/</span>
-<a name="l00308"></a><a class="code" href="a00171.html#17cffba35811c92b7e65d63506b69602">00308</a> <span class="keywordtype">void</span> <a class="code" href="a00171.html#17cffba35811c92b7e65d63506b69602">throw_self</a> () { __TBB_THROW( *<span class="keyword">this</span> ); }
-<a name="l00309"></a>00309
-<a name="l00310"></a>00310 <span class="keyword">protected</span>:
-<a name="l00312"></a><a class="code" href="a00171.html#a8c0ae2089ae784b28907cf748b89416">00312</a> ExceptionData <a class="code" href="a00171.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>;
-<a name="l00313"></a>00313
-<a name="l00314"></a>00314 <span class="keyword">private</span>:
-<a name="l00316"></a>00316 <span class="keywordtype">bool</span> my_dynamic;
-<a name="l00317"></a>00317
-<a name="l00319"></a>00319
-<a name="l00320"></a>00320 <span class="keyword">const</span> <span class="keywordtype">char</span>* my_exception_name;
-<a name="l00321"></a>00321 };
-<a name="l00322"></a>00322
-<a name="l00323"></a>00323 <span class="preprocessor">#if !TBB_USE_CAPTURED_EXCEPTION</span>
-<a name="l00324"></a>00324 <span class="preprocessor"></span><span class="keyword">namespace </span>internal {
-<a name="l00325"></a>00325
-<a name="l00327"></a>00327
-<a name="l00329"></a><a class="code" href="a00207.html">00329</a> <span class="keyword">class </span><a class="code" href="a00207.html">tbb_exception_ptr</a> {
-<a name="l00330"></a>00330 std::exception_ptr my_ptr;
-<a name="l00331"></a>00331
-<a name="l00332"></a>00332 <span class="keyword">public</span>:
-<a name="l00333"></a>00333 <span class="keyword">static</span> <a class="code" href="a00207.html">tbb_exception_ptr</a>* allocate ();
-<a name="l00334"></a>00334 <span class="keyword">static</span> <a class="code" href="a00207.html">tbb_exception_ptr</a>* allocate ( <span class="keyword">const</span> <a class="code" href="a00206.html">tbb_exception</a>& tag );
-<a name="l00336"></a>00336 <span class="keyword">static</span> <a class="code" href="a00207.html">tbb_exception_ptr</a>* allocate ( <a class="code" href="a00153.html">captured_exception</a>& src );
-<a name="l00337"></a>00337
-<a name="l00339"></a>00339
-<a name="l00340"></a>00340 <span class="keywordtype">void</span> <a class="code" href="a00207.html#921875bbacd2c8a5f324c7da7a415262">destroy</a> () <span class="keywordflow">throw</span>();
-<a name="l00341"></a>00341
-<a name="l00343"></a><a class="code" href="a00207.html#292832fd5c523e3d8081a22247840a1d">00343</a> <span class="keywordtype">void</span> <a class="code" href="a00207.html#292832fd5c523e3d8081a22247840a1d">throw_self</a> () { std::rethrow_exception(my_ptr); }
-<a name="l00344"></a>00344
-<a name="l00345"></a>00345 <span class="keyword">private</span>:
-<a name="l00346"></a>00346 <a class="code" href="a00207.html">tbb_exception_ptr</a> ( <span class="keyword">const</span> std::exception_ptr& src ) : my_ptr(src) {}
-<a name="l00347"></a>00347 tbb_exception_ptr ( <span class="keyword">const</span> <a class="code" href="a00153.html">captured_exception</a>& src ) : my_ptr(std::copy_exception(src)) {}
-<a name="l00348"></a>00348 }; <span class="comment">// class tbb::internal::tbb_exception_ptr</span>
-<a name="l00349"></a>00349
-<a name="l00350"></a>00350 } <span class="comment">// namespace internal</span>
-<a name="l00351"></a>00351 <span class="preprocessor">#endif </span><span class="comment">/* !TBB_USE_CAPTURED_EXCEPTION */</span>
-<a name="l00352"></a>00352
-<a name="l00353"></a>00353 } <span class="comment">// namespace tbb</span>
-<a name="l00354"></a>00354
-<a name="l00355"></a>00355 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00356"></a>00356
-<a name="l00357"></a>00357 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_exception_H */</span>
+<a name="l00204"></a>00204 } <span class="comment">// namespace tbb </span>
+<a name="l00205"></a>00205
+<a name="l00206"></a>00206 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_tbb_allocator_H */</span>
</pre></div><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00451.html b/doc/html/a00457.html
similarity index 94%
rename from doc/html/a00451.html
rename to doc/html/a00457.html
index 266a9b4..09a4bb2 100644
--- a/doc/html/a00451.html
+++ b/doc/html/a00457.html
@@ -168,20 +168,25 @@
<a name="l00170"></a>00170 <span class="preprocessor"> #define __TBB_GCC_3_3_PROTECTED_BROKEN 1</span>
<a name="l00171"></a>00171 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00172"></a>00172 <span class="preprocessor"></span>
-<a name="l00173"></a>00173 <span class="preprocessor">#if __FreeBSD__</span>
+<a name="l00173"></a>00173 <span class="preprocessor">#if __MINGW32__ && (__GNUC__<4 || __GNUC__==4 && __GNUC_MINOR__<2)</span>
<a name="l00174"></a>00174 <span class="preprocessor"></span>
-<a name="l00176"></a>00176 <span class="preprocessor"> #define __TBB_PRIO_INHERIT_BROKEN 1</span>
-<a name="l00177"></a>00177 <span class="preprocessor"></span>
-<a name="l00180"></a>00180 <span class="preprocessor"> #define __TBB_PLACEMENT_NEW_EXCEPTION_SAFETY_BROKEN 1</span>
-<a name="l00181"></a>00181 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __FreeBSD__ */</span>
-<a name="l00182"></a>00182
-<a name="l00183"></a>00183 <span class="preprocessor">#if (__linux__ || __APPLE__) && __i386__ && defined(__INTEL_COMPILER)</span>
-<a name="l00184"></a>00184 <span class="preprocessor"></span>
-<a name="l00186"></a>00186 <span class="preprocessor"> #define __TBB_ICC_ASM_VOLATILE_BROKEN 1</span>
-<a name="l00187"></a>00187 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00188"></a>00188 <span class="preprocessor"></span>
-<a name="l00189"></a>00189
-<a name="l00190"></a>00190 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_tbb_config_H */</span>
+<a name="l00176"></a>00176 <span class="preprocessor"> #define __TBB_SSE_STACK_ALIGNMENT_BROKEN 1</span>
+<a name="l00177"></a>00177 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00178"></a>00178 <span class="preprocessor"></span>
+<a name="l00179"></a>00179 <span class="preprocessor">#if __FreeBSD__</span>
+<a name="l00180"></a>00180 <span class="preprocessor"></span>
+<a name="l00182"></a>00182 <span class="preprocessor"> #define __TBB_PRIO_INHERIT_BROKEN 1</span>
+<a name="l00183"></a>00183 <span class="preprocessor"></span>
+<a name="l00186"></a>00186 <span class="preprocessor"> #define __TBB_PLACEMENT_NEW_EXCEPTION_SAFETY_BROKEN 1</span>
+<a name="l00187"></a>00187 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __FreeBSD__ */</span>
+<a name="l00188"></a>00188
+<a name="l00189"></a>00189 <span class="preprocessor">#if (__linux__ || __APPLE__) && __i386__ && defined(__INTEL_COMPILER)</span>
+<a name="l00190"></a>00190 <span class="preprocessor"></span>
+<a name="l00192"></a>00192 <span class="preprocessor"> #define __TBB_ICC_ASM_VOLATILE_BROKEN 1</span>
+<a name="l00193"></a>00193 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00194"></a>00194 <span class="preprocessor"></span>
+<a name="l00195"></a>00195
+<a name="l00196"></a>00196 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_tbb_config_H */</span>
</pre></div><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00458.html b/doc/html/a00458.html
index cf221d6..f9d3047 100644
--- a/doc/html/a00458.html
+++ b/doc/html/a00458.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb_profiling.h Source File</title>
+<title>tbb_config_lrb.h Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -19,7 +19,7 @@
<li><a href="files.html"><span>File List</span></a></li>
<li><a href="globals.html"><span>File Members</span></a></li>
</ul></div>
-<h1>tbb_profiling.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<h1>tbb_config_lrb.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
<a name="l00003"></a>00003 <span class="comment"></span>
<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
@@ -39,81 +39,24 @@
<a name="l00018"></a>00018 <span class="comment"> writing.</span>
<a name="l00019"></a>00019 <span class="comment">*/</span>
<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_profiling_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_profiling_H</span>
+<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_tbb_config_lrb_H</span>
+<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_tbb_config_lrb_H</span>
<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="comment">// Check if the tools support is enabled</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#if (_WIN32||_WIN64||__linux__) && !__MINGW32__ && TBB_USE_THREADING_TOOLS</span>
-<a name="l00026"></a>00026 <span class="preprocessor"></span>
-<a name="l00027"></a>00027 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00028"></a>00028 <span class="preprocessor"></span><span class="preprocessor">#include <stdlib.h></span> <span class="comment">/* mbstowcs_s */</span>
-<a name="l00029"></a>00029 <span class="preprocessor">#endif</span>
-<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00031"></a>00031
-<a name="l00032"></a>00032 <span class="keyword">namespace </span>tbb {
-<a name="l00033"></a>00033 <span class="keyword">namespace </span>internal {
-<a name="l00034"></a>00034 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00035"></a>00035 <span class="preprocessor"></span> <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC itt_set_sync_name_v3( <span class="keywordtype">void</span> *obj, <span class="keyword">const</span> <span class="keywordtype">wchar_t</span>* name );
-<a name="l00036"></a>00036 <span class="keyword">inline</span> size_t multibyte_to_widechar( <span class="keywordtype">wchar_t</span>* wcs, <span class="keyword">const</span> <span class="keywordtype">char</span>* mbs, size_t bufsize) {
-<a name="l00037"></a>00037 <span class="preprocessor">#if _MSC_VER>=1400</span>
-<a name="l00038"></a>00038 <span class="preprocessor"></span> size_t len;
-<a name="l00039"></a>00039 mbstowcs_s( &len, wcs, bufsize, mbs, _TRUNCATE );
-<a name="l00040"></a>00040 <span class="keywordflow">return</span> len; <span class="comment">// mbstowcs_s counts null terminator</span>
-<a name="l00041"></a>00041 <span class="preprocessor">#else</span>
-<a name="l00042"></a>00042 <span class="preprocessor"></span> size_t len = mbstowcs( wcs, mbs, bufsize );
-<a name="l00043"></a>00043 <span class="keywordflow">if</span>(wcs && len!=size_t(-1) )
-<a name="l00044"></a>00044 wcs[len<bufsize-1? len: bufsize-1] = wchar_t(<span class="charliteral">'\0'</span>);
-<a name="l00045"></a>00045 <span class="keywordflow">return</span> len+1; <span class="comment">// mbstowcs does not count null terminator</span>
-<a name="l00046"></a>00046 <span class="preprocessor">#endif</span>
-<a name="l00047"></a>00047 <span class="preprocessor"></span> }
-<a name="l00048"></a>00048 <span class="preprocessor">#else</span>
-<a name="l00049"></a>00049 <span class="preprocessor"></span> <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC itt_set_sync_name_v3( <span class="keywordtype">void</span> *obj, <span class="keyword">const</span> <span class="keywordtype">char</span>* name );
-<a name="l00050"></a>00050 <span class="preprocessor">#endif</span>
-<a name="l00051"></a>00051 <span class="preprocessor"></span> } <span class="comment">// namespace internal</span>
-<a name="l00052"></a>00052 } <span class="comment">// namespace tbb</span>
-<a name="l00053"></a>00053
-<a name="l00055"></a>00055
-<a name="l00057"></a>00057 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00058"></a>00058 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_DEFINE_PROFILING_SET_NAME(sync_object_type) \</span>
-<a name="l00059"></a>00059 <span class="preprocessor"> namespace profiling { \</span>
-<a name="l00060"></a>00060 <span class="preprocessor"> inline void set_name( sync_object_type& obj, const wchar_t* name ) { \</span>
-<a name="l00061"></a>00061 <span class="preprocessor"> tbb::internal::itt_set_sync_name_v3( &obj, name ); \</span>
-<a name="l00062"></a>00062 <span class="preprocessor"> } \</span>
-<a name="l00063"></a>00063 <span class="preprocessor"> inline void set_name( sync_object_type& obj, const char* name ) { \</span>
-<a name="l00064"></a>00064 <span class="preprocessor"> size_t len = tbb::internal::multibyte_to_widechar(NULL, name, 0); \</span>
-<a name="l00065"></a>00065 <span class="preprocessor"> wchar_t *wname = new wchar_t[len]; \</span>
-<a name="l00066"></a>00066 <span class="preprocessor"> tbb::internal::multibyte_to_widechar(wname, name, len); \</span>
-<a name="l00067"></a>00067 <span class="preprocessor"> set_name( obj, wname ); \</span>
-<a name="l00068"></a>00068 <span class="preprocessor"> delete[] wname; \</span>
-<a name="l00069"></a>00069 <span class="preprocessor"> } \</span>
-<a name="l00070"></a>00070 <span class="preprocessor"> }</span>
-<a name="l00071"></a>00071 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* !WIN */</span>
-<a name="l00072"></a>00072 <span class="preprocessor"> #define __TBB_DEFINE_PROFILING_SET_NAME(sync_object_type) \</span>
-<a name="l00073"></a>00073 <span class="preprocessor"> namespace profiling { \</span>
-<a name="l00074"></a>00074 <span class="preprocessor"> inline void set_name( sync_object_type& obj, const char* name ) { \</span>
-<a name="l00075"></a>00075 <span class="preprocessor"> tbb::internal::itt_set_sync_name_v3( &obj, name ); \</span>
-<a name="l00076"></a>00076 <span class="preprocessor"> } \</span>
-<a name="l00077"></a>00077 <span class="preprocessor"> }</span>
-<a name="l00078"></a>00078 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* !WIN */</span>
-<a name="l00079"></a>00079
-<a name="l00080"></a>00080 <span class="preprocessor">#else </span><span class="comment">/* no tools support */</span>
-<a name="l00081"></a>00081
-<a name="l00082"></a>00082 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00083"></a>00083 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_DEFINE_PROFILING_SET_NAME(sync_object_type) \</span>
-<a name="l00084"></a>00084 <span class="preprocessor"> namespace profiling { \</span>
-<a name="l00085"></a>00085 <span class="preprocessor"> inline void set_name( sync_object_type&, const wchar_t* ) {} \</span>
-<a name="l00086"></a>00086 <span class="preprocessor"> inline void set_name( sync_object_type&, const char* ) {} \</span>
-<a name="l00087"></a>00087 <span class="preprocessor"> }</span>
-<a name="l00088"></a>00088 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* !WIN */</span>
-<a name="l00089"></a>00089 <span class="preprocessor"> #define __TBB_DEFINE_PROFILING_SET_NAME(sync_object_type) \</span>
-<a name="l00090"></a>00090 <span class="preprocessor"> namespace profiling { \</span>
-<a name="l00091"></a>00091 <span class="preprocessor"> inline void set_name( sync_object_type&, const char* ) {} \</span>
-<a name="l00092"></a>00092 <span class="preprocessor"> }</span>
-<a name="l00093"></a>00093 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* !WIN */</span>
-<a name="l00094"></a>00094
-<a name="l00095"></a>00095 <span class="preprocessor">#endif </span><span class="comment">/* no tools support */</span>
-<a name="l00096"></a>00096
-<a name="l00097"></a>00097 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_profiling_H */</span>
+<a name="l00024"></a>00024 <span class="preprocessor"> #error tbb_config_lrb.h should be included only when building for LRB platform</span>
+<a name="l00025"></a>00025 <span class="preprocessor"></span>
+<a name="l00026"></a>00026 <span class="preprocessor">#if __TBB_LRB_NATIVE</span>
+<a name="l00027"></a>00027 <span class="preprocessor"></span>
+<a name="l00029"></a>00029 <span class="preprocessor">#define __TBB_FLOATING_POINT_BROKEN 1</span>
+<a name="l00030"></a>00030 <span class="preprocessor"></span>
+<a name="l00032"></a>00032 <span class="preprocessor">#define __TBB_full_memory_fence __TBB_release_consistency_helper</span>
+<a name="l00033"></a>00033 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_Pause(x) _mm_delay_32(x)</span>
+<a name="l00034"></a>00034 <span class="preprocessor"></span>
+<a name="l00035"></a>00035 <span class="preprocessor">#if !__FreeBSD__</span>
+<a name="l00036"></a>00036 <span class="preprocessor"></span><span class="preprocessor"> #error LRB compiler does not define __FreeBSD__ anymore. Check for the __TBB_XXX_BROKEN defined under __FreeBSD__</span>
+<a name="l00037"></a>00037 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* !__FreeBSD__ */</span>
+<a name="l00038"></a>00038 <span class="preprocessor">#endif </span><span class="comment">/*__TBB_LRB_NATIVE*/</span>
+<a name="l00039"></a>00039
+<a name="l00040"></a>00040 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_tbb_config_lrb_H */</span>
</pre></div><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00459.html b/doc/html/a00459.html
index 2eb8a4a..c1bdf09 100644
--- a/doc/html/a00459.html
+++ b/doc/html/a00459.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb_stddef.h Source File</title>
+<title>tbb_exception.h Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -19,7 +19,7 @@
<li><a href="files.html"><span>File List</span></a></li>
<li><a href="globals.html"><span>File Members</span></a></li>
</ul></div>
-<h1>tbb_stddef.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<h1>tbb_exception.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
<a name="l00003"></a>00003 <span class="comment"></span>
<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
@@ -39,205 +39,277 @@
<a name="l00018"></a>00018 <span class="comment"> writing.</span>
<a name="l00019"></a>00019 <span class="comment">*/</span>
<a name="l00020"></a>00020
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_tbb_stddef_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_tbb_stddef_H</span>
+<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_exception_H</span>
+<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_exception_H</span>
<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="comment">// Marketing-driven product version</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#define TBB_VERSION_MAJOR 3</span>
-<a name="l00026"></a>00026 <span class="preprocessor"></span><span class="preprocessor">#define TBB_VERSION_MINOR 0</span>
-<a name="l00027"></a>00027 <span class="preprocessor"></span>
-<a name="l00028"></a>00028 <span class="comment">// Engineering-focused interface version</span>
-<a name="l00029"></a>00029 <span class="preprocessor">#define TBB_INTERFACE_VERSION 5000</span>
-<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#define TBB_INTERFACE_VERSION_MAJOR TBB_INTERFACE_VERSION/1000</span>
+<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
+<a name="l00025"></a>00025
+<a name="l00026"></a>00026 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
+<a name="l00027"></a>00027 <span class="preprocessor"></span> <span class="comment">// Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers</span>
+<a name="l00028"></a>00028 <span class="preprocessor"> #pragma warning (push)</span>
+<a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4530)</span>
+<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00031"></a>00031 <span class="preprocessor"></span>
-<a name="l00032"></a>00032 <span class="comment">// The oldest major interface version still supported</span>
-<a name="l00033"></a>00033 <span class="comment">// To be used in SONAME, manifests, etc.</span>
-<a name="l00034"></a>00034 <span class="preprocessor">#define TBB_COMPATIBLE_INTERFACE_VERSION 2</span>
-<a name="l00035"></a>00035 <span class="preprocessor"></span>
-<a name="l00036"></a>00036 <span class="preprocessor">#define __TBB_STRING_AUX(x) #x</span>
-<a name="l00037"></a>00037 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_STRING(x) __TBB_STRING_AUX(x)</span>
-<a name="l00038"></a>00038 <span class="preprocessor"></span>
-<a name="l00039"></a>00039 <span class="comment">// We do not need defines below for resource processing on windows</span>
-<a name="l00040"></a>00040 <span class="preprocessor">#if !defined RC_INVOKED</span>
+<a name="l00032"></a>00032 <span class="preprocessor">#include <stdexcept></span>
+<a name="l00033"></a>00033
+<a name="l00034"></a>00034 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
+<a name="l00035"></a>00035 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
+<a name="l00036"></a>00036 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00037"></a>00037 <span class="preprocessor"></span>
+<a name="l00038"></a>00038 <span class="preprocessor">#if __SUNPRO_CC</span>
+<a name="l00039"></a>00039 <span class="preprocessor"></span><span class="preprocessor">#include <string></span> <span class="comment">// required to construct std exception classes</span>
+<a name="l00040"></a>00040 <span class="preprocessor">#endif</span>
<a name="l00041"></a>00041 <span class="preprocessor"></span>
-<a name="l00042"></a>00042 <span class="comment">// Define groups for Doxygen documentation</span>
-<a name="l00052"></a>00052 <span class="comment"></span><span class="comment">// Simple text that is displayed on the main page of Doxygen documentation.</span>
-<a name="l00094"></a>00094 <span class="comment"></span><span class="comment">// Define preprocessor symbols used to determine architecture</span>
-<a name="l00095"></a>00095 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00096"></a>00096 <span class="preprocessor"></span><span class="preprocessor"># if defined(_M_AMD64)</span>
-<a name="l00097"></a>00097 <span class="preprocessor"></span><span class="preprocessor"># define __TBB_x86_64 1</span>
-<a name="l00098"></a>00098 <span class="preprocessor"></span><span class="preprocessor"># elif defined(_M_IA64)</span>
-<a name="l00099"></a>00099 <span class="preprocessor"></span><span class="preprocessor"># define __TBB_ipf 1</span>
-<a name="l00100"></a>00100 <span class="preprocessor"></span><span class="preprocessor"># elif defined(_M_IX86)||defined(__i386__) // the latter for MinGW support</span>
-<a name="l00101"></a>00101 <span class="preprocessor"></span><span class="preprocessor"># define __TBB_x86_32 1</span>
-<a name="l00102"></a>00102 <span class="preprocessor"></span><span class="preprocessor"># endif</span>
-<a name="l00103"></a>00103 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* Assume generic Unix */</span>
-<a name="l00104"></a>00104 <span class="preprocessor"># if !__linux__ && !__APPLE__</span>
-<a name="l00105"></a>00105 <span class="preprocessor"></span><span class="preprocessor"># define __TBB_generic_os 1</span>
-<a name="l00106"></a>00106 <span class="preprocessor"></span><span class="preprocessor"># endif</span>
-<a name="l00107"></a>00107 <span class="preprocessor"></span><span class="preprocessor"># if __x86_64__</span>
-<a name="l00108"></a>00108 <span class="preprocessor"></span><span class="preprocessor"># define __TBB_x86_64 1</span>
-<a name="l00109"></a>00109 <span class="preprocessor"></span><span class="preprocessor"># elif __ia64__</span>
-<a name="l00110"></a>00110 <span class="preprocessor"></span><span class="preprocessor"># define __TBB_ipf 1</span>
-<a name="l00111"></a>00111 <span class="preprocessor"></span><span class="preprocessor"># elif __i386__||__i386 // __i386 is for Sun OS</span>
-<a name="l00112"></a>00112 <span class="preprocessor"></span><span class="preprocessor"># define __TBB_x86_32 1</span>
-<a name="l00113"></a>00113 <span class="preprocessor"></span><span class="preprocessor"># else</span>
-<a name="l00114"></a>00114 <span class="preprocessor"></span><span class="preprocessor"># define __TBB_generic_arch 1</span>
-<a name="l00115"></a>00115 <span class="preprocessor"></span><span class="preprocessor"># endif</span>
-<a name="l00116"></a>00116 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00117"></a>00117 <span class="preprocessor"></span>
-<a name="l00118"></a>00118 <span class="preprocessor">#if _MSC_VER</span>
-<a name="l00119"></a>00119 <span class="preprocessor"></span><span class="comment">// define the parts of stdint.h that are needed, but put them inside tbb::internal</span>
-<a name="l00120"></a>00120 <span class="keyword">namespace </span>tbb {
-<a name="l00121"></a>00121 <span class="keyword">namespace </span>internal {
-<a name="l00122"></a>00122 <span class="keyword">typedef</span> __int8 int8_t;
-<a name="l00123"></a>00123 <span class="keyword">typedef</span> __int16 int16_t;
-<a name="l00124"></a>00124 <span class="keyword">typedef</span> __int32 int32_t;
-<a name="l00125"></a>00125 <span class="keyword">typedef</span> __int64 int64_t;
-<a name="l00126"></a>00126 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> __int8 uint8_t;
-<a name="l00127"></a>00127 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> __int16 uint16_t;
-<a name="l00128"></a>00128 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> __int32 uint32_t;
-<a name="l00129"></a>00129 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> __int64 uint64_t;
-<a name="l00130"></a>00130 } <span class="comment">// namespace internal</span>
-<a name="l00131"></a>00131 } <span class="comment">// namespace tbb</span>
-<a name="l00132"></a>00132 <span class="preprocessor">#else</span>
-<a name="l00133"></a>00133 <span class="preprocessor"></span><span class="preprocessor">#include <stdint.h></span>
-<a name="l00134"></a>00134 <span class="preprocessor">#endif </span><span class="comment">/* _MSC_VER */</span>
-<a name="l00135"></a>00135
-<a name="l00136"></a>00136 <span class="preprocessor">#if _MSC_VER >=1400</span>
-<a name="l00137"></a>00137 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_EXPORTED_FUNC __cdecl</span>
-<a name="l00138"></a>00138 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_EXPORTED_METHOD __thiscall</span>
-<a name="l00139"></a>00139 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00140"></a>00140 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_EXPORTED_FUNC</span>
-<a name="l00141"></a>00141 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_EXPORTED_METHOD</span>
-<a name="l00142"></a>00142 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00143"></a>00143 <span class="preprocessor"></span>
-<a name="l00144"></a>00144 <span class="preprocessor">#include <cstddef></span> <span class="comment">/* Need size_t and ptrdiff_t (the latter on Windows only) from here. */</span>
+<a name="l00042"></a>00042 <span class="keyword">namespace </span>tbb {
+<a name="l00043"></a>00043
+<a name="l00045"></a><a class="code" href="a00146.html">00045</a> <span class="keyword">class </span><a class="code" href="a00146.html">bad_last_alloc</a> : <span class="keyword">public</span> std::bad_alloc {
+<a name="l00046"></a>00046 <span class="keyword">public</span>:
+<a name="l00047"></a>00047 <span class="comment">/*override*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* what() <span class="keyword">const</span> <span class="keywordflow">throw</span>();
+<a name="l00048"></a>00048 <span class="preprocessor">#if __TBB_DEFAULT_DTOR_THROW_SPEC_BROKEN</span>
+<a name="l00049"></a>00049 <span class="preprocessor"></span> <span class="comment">/*override*/</span> ~<a class="code" href="a00146.html">bad_last_alloc</a>() <span class="keywordflow">throw</span>() {}
+<a name="l00050"></a>00050 <span class="preprocessor">#endif</span>
+<a name="l00051"></a>00051 <span class="preprocessor"></span>};
+<a name="l00052"></a>00052
+<a name="l00054"></a><a class="code" href="a00168.html">00054</a> <span class="keyword">class </span><a class="code" href="a00168.html">improper_lock</a> : <span class="keyword">public</span> std::exception {
+<a name="l00055"></a>00055 <span class="keyword">public</span>:
+<a name="l00056"></a>00056 <span class="comment">/*override*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* what() <span class="keyword">const</span> <span class="keywordflow">throw</span>();
+<a name="l00057"></a>00057 };
+<a name="l00058"></a>00058
+<a name="l00060"></a><a class="code" href="a00170.html">00060</a> <span class="keyword">class </span><a class="code" href="a00170.html">missing_wait</a> : <span class="keyword">public</span> std::exception {
+<a name="l00061"></a>00061 <span class="keyword">public</span>:
+<a name="l00062"></a>00062 <span class="comment">/*override*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* what() <span class="keyword">const</span> <span class="keywordflow">throw</span>();
+<a name="l00063"></a>00063 };
+<a name="l00064"></a>00064
+<a name="l00066"></a><a class="code" href="a00169.html">00066</a> <span class="keyword">class </span><a class="code" href="a00169.html">invalid_multiple_scheduling</a> : <span class="keyword">public</span> std::exception {
+<a name="l00067"></a>00067 <span class="keyword">public</span>:
+<a name="l00068"></a>00068 <span class="comment">/*override*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* what() <span class="keyword">const</span> <span class="keywordflow">throw</span>();
+<a name="l00069"></a>00069 };
+<a name="l00070"></a>00070
+<a name="l00071"></a>00071 <span class="keyword">namespace </span>internal {
+<a name="l00073"></a>00073 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC throw_bad_last_alloc_exception_v4();
+<a name="l00074"></a>00074
+<a name="l00075"></a>00075 <span class="keyword">enum</span> exception_id {
+<a name="l00076"></a>00076 eid_bad_alloc = 1,
+<a name="l00077"></a>00077 eid_bad_last_alloc,
+<a name="l00078"></a>00078 eid_nonpositive_step,
+<a name="l00079"></a>00079 eid_out_of_range,
+<a name="l00080"></a>00080 eid_segment_range_error,
+<a name="l00081"></a>00081 eid_index_range_error,
+<a name="l00082"></a>00082 eid_missing_wait,
+<a name="l00083"></a>00083 eid_invalid_multiple_scheduling,
+<a name="l00084"></a>00084 eid_improper_lock,
+<a name="l00085"></a>00085 eid_possible_deadlock,
+<a name="l00086"></a>00086 eid_operation_not_permitted,
+<a name="l00087"></a>00087 eid_condvar_wait_failed,
+<a name="l00088"></a>00088 eid_invalid_load_factor,
+<a name="l00089"></a>00089 eid_reserved, <span class="comment">// free slot for backward compatibility, can be reused.</span>
+<a name="l00090"></a>00090 eid_invalid_swap,
+<a name="l00091"></a>00091 eid_reservation_length_error,
+<a name="l00092"></a>00092 eid_invalid_key,
+<a name="l00094"></a>00094
+<a name="l00096"></a>00096 eid_max
+<a name="l00097"></a>00097 };
+<a name="l00098"></a>00098
+<a name="l00100"></a>00100
+<a name="l00102"></a>00102 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC throw_exception_v4 ( exception_id );
+<a name="l00103"></a>00103
+<a name="l00105"></a>00105 <span class="keyword">inline</span> <span class="keywordtype">void</span> throw_exception ( exception_id eid ) { throw_exception_v4(eid); }
+<a name="l00106"></a>00106
+<a name="l00107"></a>00107 } <span class="comment">// namespace internal</span>
+<a name="l00108"></a>00108 } <span class="comment">// namespace tbb</span>
+<a name="l00109"></a>00109
+<a name="l00110"></a>00110 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00111"></a>00111 <span class="preprocessor"></span><span class="preprocessor">#include "tbb_allocator.h"</span>
+<a name="l00112"></a>00112 <span class="preprocessor">#include <exception></span>
+<a name="l00113"></a>00113 <span class="preprocessor">#include <typeinfo></span>
+<a name="l00114"></a>00114 <span class="preprocessor">#include <new></span>
+<a name="l00115"></a>00115
+<a name="l00116"></a>00116 <span class="keyword">namespace </span>tbb {
+<a name="l00117"></a>00117
+<a name="l00119"></a>00119
+<a name="l00139"></a><a class="code" href="a00206.html">00139</a> <span class="keyword">class </span><a class="code" href="a00206.html">tbb_exception</a> : <span class="keyword">public</span> std::exception
+<a name="l00140"></a>00140 {
+<a name="l00144"></a>00144 <span class="keywordtype">void</span>* operator new ( size_t );
<a name="l00145"></a>00145
-<a name="l00146"></a>00146 <span class="preprocessor">#if _MSC_VER</span>
-<a name="l00147"></a>00147 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_tbb_windef_H</span>
-<a name="l00148"></a>00148 <span class="preprocessor"></span><span class="preprocessor">#include "_tbb_windef.h"</span>
-<a name="l00149"></a>00149 <span class="preprocessor">#undef __TBB_tbb_windef_H</span>
-<a name="l00150"></a>00150 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00151"></a>00151 <span class="preprocessor"></span>
-<a name="l00152"></a>00152 <span class="preprocessor">#include "tbb_config.h"</span>
-<a name="l00153"></a>00153
-<a name="l00155"></a>00155 <span class="keyword">namespace </span>tbb {
-<a name="l00157"></a><a class="code" href="a00267.html#ed375248ff6019a70ca0f9da528e5d0b">00157</a> <span class="keyword">typedef</span> void(*<a class="code" href="a00267.html#ed375248ff6019a70ca0f9da528e5d0b">assertion_handler_type</a>)( <span class="keyword">const</span> <span class="keywordtype">char</span>* filename, <span class="keywordtype">int</span> line, <span class="keyword">const</span> <span class="keywordtype">char</span>* expression, <span class="keyword">const</span> < [...]
-<a name="l00158"></a>00158
-<a name="l00159"></a>00159 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00160"></a>00160 <span class="preprocessor"></span>
+<a name="l00146"></a>00146 <span class="keyword">public</span>:
+<a name="l00148"></a>00148
+<a name="l00149"></a>00149 <span class="keyword">virtual</span> <a class="code" href="a00206.html">tbb_exception</a>* <a class="code" href="a00206.html#3e3482bf264d4ca4dde046cd9c02c766">move</a> () <span class="keywordflow">throw</span>() = 0;
+<a name="l00150"></a>00150
+<a name="l00152"></a>00152
+<a name="l00154"></a>00154 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="a00206.html#66c94938eca8bf88b76f3eccaaf215d8">destroy</a> () <span class="keywordflow">throw</span>() = 0;
+<a name="l00155"></a>00155
+<a name="l00157"></a>00157
+<a name="l00161"></a>00161 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="a00206.html#8588e07fa49692f4d734e4f2e4f048f4">throw_self</a> () = 0;
<a name="l00162"></a>00162
-<a name="l00165"></a>00165 <span class="preprocessor">#define __TBB_ASSERT(predicate,message) ((predicate)?((void)0):tbb::assertion_failure(__FILE__,__LINE__,#predicate,message))</span>
-<a name="l00166"></a>00166 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_ASSERT_EX __TBB_ASSERT</span>
-<a name="l00167"></a>00167 <span class="preprocessor"></span>
-<a name="l00169"></a>00169 <a class="code" href="a00267.html#ed375248ff6019a70ca0f9da528e5d0b">assertion_handler_type</a> __TBB_EXPORTED_FUNC <a class="code" href="a00267.html#823fa1c15dd829d1d9167157450ddcd9">set_assertion_handler</a>( <a class="code" href="a00267.html#ed375248ff6019a70ca0f9da528e5d0b">assertion_handler_type</a> new_handler );
-<a name="l00170"></a>00170
-<a name="l00172"></a>00172
-<a name="l00175"></a>00175 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC <a class="code" href="a00267.html#3d1252787be39b4aef311f1cadaff9e8">assertion_failure</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* filename, <span class="keywordtype">int</span> line, <span class="keyword">const</span> <span class="keywordtype">char</span>* expression, <span class="keyword">const</span> <span class="keywordtype">char</span>* comment );
-<a name="l00176"></a>00176
-<a name="l00177"></a>00177 <span class="preprocessor">#else</span>
-<a name="l00178"></a>00178 <span class="preprocessor"></span>
-<a name="l00180"></a>00180 <span class="preprocessor">#define __TBB_ASSERT(predicate,comment) ((void)0)</span>
-<a name="l00182"></a>00182 <span class="preprocessor">#define __TBB_ASSERT_EX(predicate,comment) ((void)(1 && (predicate)))</span>
-<a name="l00183"></a>00183 <span class="preprocessor"></span>
-<a name="l00184"></a>00184 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00185"></a>00185
-<a name="l00187"></a>00187
-<a name="l00191"></a>00191 <span class="keyword">extern</span> <span class="stringliteral">"C"</span> <span class="keywordtype">int</span> __TBB_EXPORTED_FUNC <a class="code" href="a00267.html#a6858b22e90041c9c4669674ff39b056">TBB_runtime_interface_version</a>();
-<a name="l00192"></a>00192
-<a name="l00194"></a>00194
-<a name="l00198"></a><a class="code" href="a00198.html">00198</a> <span class="keyword">class </span><a class="code" href="a00198.html">split</a> {
-<a name="l00199"></a>00199 };
-<a name="l00200"></a>00200
-<a name="l00205"></a>00205 <span class="keyword">namespace </span>internal {
-<a name="l00206"></a>00206
-<a name="l00207"></a>00207 <span class="keyword">using</span> std::size_t;
-<a name="l00208"></a>00208
-<a name="l00210"></a>00210
-<a name="l00213"></a>00213 <span class="keyword">const</span> size_t NFS_MaxLineSize = 128;
+<a name="l00164"></a>00164 <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00206.html#d00f6497e552fee978a02bfcbebf46e2">name</a>() <span class="keyword">const</span> <span class="keywordflow">throw</span>() = 0;
+<a name="l00165"></a>00165
+<a name="l00167"></a>00167 <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00206.html#e8157689ecb66bc6c72d3618bf3cc371">what</a>() <span class="keyword">const</span> <span class="keywordflow">throw</span>() = 0;
+<a name="l00168"></a>00168
+<a name="l00175"></a><a class="code" href="a00206.html#3f2da7f3d8a6e4c1df522af1213afb5a">00175</a> <span class="keywordtype">void</span> <a class="code" href="a00206.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete </a>( <span class="keywordtype">void</span>* p ) {
+<a name="l00176"></a>00176 internal::deallocate_via_handler_v3(p);
+<a name="l00177"></a>00177 }
+<a name="l00178"></a>00178 };
+<a name="l00179"></a>00179
+<a name="l00181"></a>00181
+<a name="l00185"></a><a class="code" href="a00152.html">00185</a> <span class="keyword">class </span><a class="code" href="a00152.html">captured_exception</a> : <span class="keyword">public</span> <a class="code" href="a00206.html">tbb_exception</a>
+<a name="l00186"></a>00186 {
+<a name="l00187"></a>00187 <span class="keyword">public</span>:
+<a name="l00188"></a>00188 <a class="code" href="a00152.html">captured_exception</a> ( <span class="keyword">const</span> <a class="code" href="a00152.html">captured_exception</a>& src )
+<a name="l00189"></a>00189 : <a class="code" href="a00206.html">tbb_exception</a>(src), my_dynamic(<span class="keyword">false</span>)
+<a name="l00190"></a>00190 {
+<a name="l00191"></a>00191 set(src.<a class="code" href="a00152.html#6a57f9aa0bce72392492d109b9e1d941">my_exception_name</a>, src.<a class="code" href="a00152.html#788adf4e55cdad7abc178a48a1d47e69">my_exception_info</a>);
+<a name="l00192"></a>00192 }
+<a name="l00193"></a>00193
+<a name="l00194"></a>00194 <a class="code" href="a00152.html">captured_exception</a> ( <span class="keyword">const</span> <span class="keywordtype">char</span>* name_, <span class="keyword">const</span> <span class="keywordtype">char</span>* info )
+<a name="l00195"></a>00195 : my_dynamic(<span class="keyword">false</span>)
+<a name="l00196"></a>00196 {
+<a name="l00197"></a>00197 set(name_, info);
+<a name="l00198"></a>00198 }
+<a name="l00199"></a>00199
+<a name="l00200"></a>00200 __TBB_EXPORTED_METHOD ~<a class="code" href="a00152.html">captured_exception</a> () <span class="keywordflow">throw</span>() {
+<a name="l00201"></a>00201 clear();
+<a name="l00202"></a>00202 }
+<a name="l00203"></a>00203
+<a name="l00204"></a>00204 <a class="code" href="a00152.html">captured_exception</a>& operator= ( <span class="keyword">const</span> <a class="code" href="a00152.html">captured_exception</a>& src ) {
+<a name="l00205"></a>00205 <span class="keywordflow">if</span> ( <span class="keyword">this</span> != &src ) {
+<a name="l00206"></a>00206 clear();
+<a name="l00207"></a>00207 set(src.<a class="code" href="a00152.html#6a57f9aa0bce72392492d109b9e1d941">my_exception_name</a>, src.<a class="code" href="a00152.html#788adf4e55cdad7abc178a48a1d47e69">my_exception_info</a>);
+<a name="l00208"></a>00208 }
+<a name="l00209"></a>00209 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00210"></a>00210 }
+<a name="l00211"></a>00211
+<a name="l00212"></a>00212 <span class="comment">/*override*/</span>
+<a name="l00213"></a>00213 <a class="code" href="a00152.html">captured_exception</a>* __TBB_EXPORTED_METHOD <a class="code" href="a00152.html#837a50b8f6a800bda225c39d1699643f">move</a> () <span class="keywordflow">throw</span>();
<a name="l00214"></a>00214
-<a name="l00215"></a>00215 <span class="keyword">template</span><<span class="keyword">class</span> T, <span class="keywordtype">int</span> S>
-<a name="l00216"></a>00216 <span class="keyword">struct </span>padded_base : T {
-<a name="l00217"></a>00217 <span class="keywordtype">char</span> pad[NFS_MaxLineSize - <span class="keyword">sizeof</span>(T) % NFS_MaxLineSize];
-<a name="l00218"></a>00218 };
-<a name="l00219"></a>00219 <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">struct </span>padded_base<T, 0> : T {};
+<a name="l00215"></a>00215 <span class="comment">/*override*/</span>
+<a name="l00216"></a>00216 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00152.html#93d875d3555502ff6f18513525de204c">destroy</a> () <span class="keywordflow">throw</span>();
+<a name="l00217"></a>00217
+<a name="l00218"></a>00218 <span class="comment">/*override*/</span>
+<a name="l00219"></a><a class="code" href="a00152.html#2dd1be66ab32fa27e0ddef5707fa67ef">00219</a> <span class="keywordtype">void</span> <a class="code" href="a00152.html#2dd1be66ab32fa27e0ddef5707fa67ef">throw_self</a> () { __TBB_THROW(*<span class="keyword">this</span>); }
<a name="l00220"></a>00220
-<a name="l00222"></a>00222 <span class="keyword">template</span><<span class="keyword">class</span> T>
-<a name="l00223"></a>00223 <span class="keyword">struct </span>padded : padded_base<T, sizeof(T)> {};
-<a name="l00224"></a>00224
+<a name="l00221"></a>00221 <span class="comment">/*override*/</span>
+<a name="l00222"></a>00222 <span class="keyword">const</span> <span class="keywordtype">char</span>* __TBB_EXPORTED_METHOD <a class="code" href="a00152.html#5af82fd677449c5ca727fa1d7e16f9f5">name</a>() const throw();
+<a name="l00223"></a>00223
+<a name="l00224"></a>00224 <span class="comment">/*override*/</span>
+<a name="l00225"></a>00225 const <span class="keywordtype">char</span>* __TBB_EXPORTED_METHOD <a class="code" href="a00152.html#6b5988ef74a1fe2a58998d110b3633e0">what</a>() const throw();
<a name="l00226"></a>00226
-<a name="l00228"></a>00228 <span class="preprocessor">#define __TBB_offsetof(class_name, member_name) \</span>
-<a name="l00229"></a>00229 <span class="preprocessor"> ((ptrdiff_t)&(reinterpret_cast<class_name*>(0x1000)->member_name) - 0x1000)</span>
-<a name="l00230"></a>00230 <span class="preprocessor"></span>
-<a name="l00232"></a>00232 <span class="preprocessor">#define __TBB_get_object_ref(class_name, member_name, member_addr) \</span>
-<a name="l00233"></a>00233 <span class="preprocessor"> (*reinterpret_cast<class_name*>((char*)member_addr - __TBB_offsetof(class_name, member_name)))</span>
-<a name="l00234"></a>00234 <span class="preprocessor"></span>
-<a name="l00236"></a>00236 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC handle_perror( <span class="keywordtype">int</span> error_code, <span class="keyword">const</span> <span class="keywordtype">char</span>* aux_info );
-<a name="l00237"></a>00237
-<a name="l00238"></a>00238 <span class="preprocessor">#if TBB_USE_EXCEPTIONS</span>
-<a name="l00239"></a>00239 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_TRY try</span>
-<a name="l00240"></a>00240 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_CATCH(e) catch(e)</span>
-<a name="l00241"></a>00241 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_THROW(e) throw e</span>
-<a name="l00242"></a>00242 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_RETHROW() throw</span>
-<a name="l00243"></a>00243 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* !TBB_USE_EXCEPTIONS */</span>
-<a name="l00244"></a>00244 <span class="keyword">inline</span> <span class="keywordtype">bool</span> __TBB_false() { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
-<a name="l00245"></a>00245 <span class="preprocessor"> #define __TBB_TRY</span>
-<a name="l00246"></a>00246 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_CATCH(e) if ( tbb::internal::__TBB_false() )</span>
-<a name="l00247"></a>00247 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_THROW(e) ((void)0)</span>
-<a name="l00248"></a>00248 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_RETHROW() ((void)0)</span>
-<a name="l00249"></a>00249 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* !TBB_USE_EXCEPTIONS */</span>
-<a name="l00250"></a>00250
-<a name="l00252"></a>00252 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC runtime_warning( <span class="keyword">const</span> <span class="keywordtype">char</span>* format, ... );
-<a name="l00253"></a>00253
-<a name="l00254"></a>00254 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00256"></a>00256 <span class="preprocessor">template<typename T></span>
-<a name="l00257"></a>00257 <span class="preprocessor"></span><span class="keyword">inline</span> <span class="keywordtype">void</span> poison_pointer( T* & p ) {
-<a name="l00258"></a>00258 p = reinterpret_cast<T*>(-1);
-<a name="l00259"></a>00259 }
-<a name="l00260"></a>00260 <span class="preprocessor">#else</span>
-<a name="l00261"></a>00261 <span class="preprocessor"></span><span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00262"></a>00262 <span class="keyword">inline</span> <span class="keywordtype">void</span> poison_pointer( T* ) {<span class="comment">/*do nothing*/</span>}
-<a name="l00263"></a>00263 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
+<a name="l00227"></a>00227 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD set ( const <span class="keywordtype">char</span>* <a class="code" href="a00152.html#5af82fd677449c5ca727fa1d7e16f9f5">name</a>, const <span class="keywordtype">char</span>* info ) throw();
+<a name="l00228"></a>00228 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD clear () throw();
+<a name="l00229"></a>00229
+<a name="l00230"></a>00230 private:
+<a name="l00232"></a>00232 <a class="code" href="a00152.html">captured_exception</a>() {}
+<a name="l00233"></a>00233
+<a name="l00235"></a>00235 <span class="keyword">static</span> captured_exception* allocate ( <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00152.html#5af82fd677449c5ca727fa1d7e16f9f5">name</a>, <span class="keyword">const</span> <span class="keywordtype">char</span>* info );
+<a name="l00236"></a>00236
+<a name="l00237"></a>00237 <span class="keywordtype">bool</span> my_dynamic;
+<a name="l00238"></a>00238 <span class="keyword">const</span> <span class="keywordtype">char</span>* my_exception_name;
+<a name="l00239"></a>00239 <span class="keyword">const</span> <span class="keywordtype">char</span>* my_exception_info;
+<a name="l00240"></a>00240 };
+<a name="l00241"></a>00241
+<a name="l00243"></a>00243
+<a name="l00247"></a>00247 <span class="keyword">template</span><<span class="keyword">typename</span> ExceptionData>
+<a name="l00248"></a><a class="code" href="a00171.html">00248</a> <span class="keyword">class </span><a class="code" href="a00171.html">movable_exception</a> : <span class="keyword">public</span> <a class="code" href="a00206.html">tbb_exception</a>
+<a name="l00249"></a>00249 {
+<a name="l00250"></a>00250 <span class="keyword">typedef</span> <a class="code" href="a00171.html">movable_exception<ExceptionData></a> <a class="code" href="a00171.html">self_type</a>;
+<a name="l00251"></a>00251
+<a name="l00252"></a>00252 <span class="keyword">public</span>:
+<a name="l00253"></a>00253 <a class="code" href="a00171.html">movable_exception</a> ( <span class="keyword">const</span> ExceptionData& data_ )
+<a name="l00254"></a>00254 : <a class="code" href="a00171.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>(data_)
+<a name="l00255"></a>00255 , my_dynamic(<span class="keyword">false</span>)
+<a name="l00256"></a>00256 , my_exception_name(
+<a name="l00257"></a>00257 #<span class="keywordflow">if</span> TBB_USE_EXCEPTIONS
+<a name="l00258"></a>00258 <span class="keyword">typeid</span>(<a class="code" href="a00171.html">self_type</a>).<a class="code" href="a00171.html#bc5f5c4739b17ac5211ac58226c2f5a5">name</a>()
+<a name="l00259"></a>00259 #<span class="keywordflow">else</span> <span class="comment">/* !TBB_USE_EXCEPTIONS */</span>
+<a name="l00260"></a>00260 <span class="stringliteral">"movable_exception"</span>
+<a name="l00261"></a>00261 #endif <span class="comment">/* !TBB_USE_EXCEPTIONS */</span>
+<a name="l00262"></a>00262 )
+<a name="l00263"></a>00263 {}
<a name="l00264"></a>00264
-<a name="l00266"></a>00266 <span class="keyword">class </span>no_assign {
-<a name="l00267"></a>00267 <span class="comment">// Deny assignment</span>
-<a name="l00268"></a>00268 <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> no_assign& );
-<a name="l00269"></a>00269 <span class="keyword">public</span>:
-<a name="l00270"></a>00270 <span class="preprocessor">#if __GNUC__</span>
-<a name="l00272"></a>00272 <span class="preprocessor"> no_assign() {}</span>
-<a name="l00273"></a>00273 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __GNUC__ */</span>
-<a name="l00274"></a>00274 };
-<a name="l00275"></a>00275
-<a name="l00277"></a>00277 <span class="keyword">class </span>no_copy: no_assign {
-<a name="l00279"></a>00279 no_copy( <span class="keyword">const</span> no_copy& );
-<a name="l00280"></a>00280 <span class="keyword">public</span>:
-<a name="l00282"></a>00282 no_copy() {}
-<a name="l00283"></a>00283 };
-<a name="l00284"></a>00284
-<a name="l00286"></a>00286 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00287"></a>00287 <span class="keyword">struct </span>allocator_type {
-<a name="l00288"></a>00288 <span class="keyword">typedef</span> T value_type;
-<a name="l00289"></a>00289 };
-<a name="l00290"></a>00290
-<a name="l00291"></a>00291 <span class="preprocessor">#if _MSC_VER</span>
-<a name="l00293"></a>00293 <span class="preprocessor">template<typename T></span>
-<a name="l00294"></a>00294 <span class="preprocessor"></span><span class="keyword">struct </span>allocator_type<const T> {
-<a name="l00295"></a>00295 <span class="keyword">typedef</span> T value_type;
-<a name="l00296"></a>00296 };
-<a name="l00297"></a>00297 <span class="preprocessor">#endif</span>
-<a name="l00298"></a>00298 <span class="preprocessor"></span>
-<a name="l00299"></a>00299 <span class="comment">// Struct to be used as a version tag for inline functions.</span>
-<a name="l00302"></a>00302 <span class="comment"></span><span class="keyword">struct </span>version_tag_v3 {};
-<a name="l00303"></a>00303
-<a name="l00304"></a>00304 <span class="keyword">typedef</span> version_tag_v3 version_tag;
-<a name="l00305"></a>00305
-<a name="l00306"></a>00306 } <span class="comment">// internal</span>
-<a name="l00308"></a>00308 <span class="comment"></span>
-<a name="l00309"></a>00309 } <span class="comment">// tbb</span>
-<a name="l00310"></a>00310
-<a name="l00311"></a>00311 <span class="preprocessor">#endif </span><span class="comment">/* RC_INVOKED */</span>
-<a name="l00312"></a>00312 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_tbb_stddef_H */</span>
+<a name="l00265"></a>00265 <a class="code" href="a00171.html">movable_exception</a> ( <span class="keyword">const</span> <a class="code" href="a00171.html">movable_exception</a>& src ) <span class="keywordflow">throw</span> ()
+<a name="l00266"></a>00266 : <a class="code" href="a00206.html">tbb_exception</a>(src)
+<a name="l00267"></a>00267 , <a class="code" href="a00171.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>(src.<a class="code" href="a00171.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>)
+<a name="l00268"></a>00268 , my_dynamic(<span class="keyword">false</span>)
+<a name="l00269"></a>00269 , my_exception_name(src.<a class="code" href="a00171.html#5f5843b501829ff824c9c8d28c8283eb">my_exception_name</a>)
+<a name="l00270"></a>00270 {}
+<a name="l00271"></a>00271
+<a name="l00272"></a>00272 ~<a class="code" href="a00171.html">movable_exception</a> () <span class="keywordflow">throw</span>() {}
+<a name="l00273"></a>00273
+<a name="l00274"></a>00274 <span class="keyword">const</span> <a class="code" href="a00171.html">movable_exception</a>& operator= ( <span class="keyword">const</span> <a class="code" href="a00171.html">movable_exception</a>& src ) {
+<a name="l00275"></a>00275 <span class="keywordflow">if</span> ( <span class="keyword">this</span> != &src ) {
+<a name="l00276"></a>00276 <a class="code" href="a00171.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a> = src.<a class="code" href="a00171.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>;
+<a name="l00277"></a>00277 my_exception_name = src.<a class="code" href="a00171.html#5f5843b501829ff824c9c8d28c8283eb">my_exception_name</a>;
+<a name="l00278"></a>00278 }
+<a name="l00279"></a>00279 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00280"></a>00280 }
+<a name="l00281"></a>00281
+<a name="l00282"></a>00282 ExceptionData& data () <span class="keywordflow">throw</span>() { <span class="keywordflow">return</span> <a class="code" href="a00171.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>; }
+<a name="l00283"></a>00283
+<a name="l00284"></a>00284 <span class="keyword">const</span> ExceptionData& data () <span class="keyword">const</span> <span class="keywordflow">throw</span>() { <span class="keywordflow">return</span> <a class="code" href="a00171.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>; }
+<a name="l00285"></a>00285
+<a name="l00286"></a><a class="code" href="a00171.html#bc5f5c4739b17ac5211ac58226c2f5a5">00286</a> <span class="comment">/*override*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00171.html#bc5f5c4739b17ac5211ac58226c2f5a5">name</a> () const throw() { <span class="keywordflow">return</span> my_exception_name; }
+<a name="l00287"></a>00287
+<a name="l00288"></a><a class="code" href="a00171.html#b33a89bccf0c63106f1270c7bfaaf54f">00288</a> <span class="comment">/*override*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00171.html#b33a89bccf0c63106f1270c7bfaaf54f">what</a> () const throw() { <span class="keywordflow">return</span> <span class="stringliteral">"tbb::movable_exception"</span>; }
+<a name="l00289"></a>00289
+<a name="l00290"></a>00290 <span class="comment">/*override*/</span>
+<a name="l00291"></a><a class="code" href="a00171.html#1aea0ad179d6f0481fe7f3495f66adf9">00291</a> <a class="code" href="a00171.html">movable_exception</a>* <a class="code" href="a00171.html#1aea0ad179d6f0481fe7f3495f66adf9">move</a> () throw() {
+<a name="l00292"></a>00292 <span class="keywordtype">void</span>* e = internal::allocate_via_handler_v3(<span class="keyword">sizeof</span>(<a class="code" href="a00171.html">movable_exception</a>));
+<a name="l00293"></a>00293 <span class="keywordflow">if</span> ( e ) {
+<a name="l00294"></a>00294 ::new (e) movable_exception(*<span class="keyword">this</span>);
+<a name="l00295"></a>00295 ((movable_exception*)e)->my_dynamic = <span class="keyword">true</span>;
+<a name="l00296"></a>00296 }
+<a name="l00297"></a>00297 <span class="keywordflow">return</span> (movable_exception*)e;
+<a name="l00298"></a>00298 }
+<a name="l00299"></a>00299 <span class="comment">/*override*/</span>
+<a name="l00300"></a><a class="code" href="a00171.html#7a46873119d9f85a7b0009c13e41a258">00300</a> <span class="keywordtype">void</span> <a class="code" href="a00171.html#7a46873119d9f85a7b0009c13e41a258">destroy</a> () throw() {
+<a name="l00301"></a>00301 __TBB_ASSERT ( my_dynamic, <span class="stringliteral">"Method destroy can be called only on dynamically allocated movable_exceptions"</span> );
+<a name="l00302"></a>00302 <span class="keywordflow">if</span> ( my_dynamic ) {
+<a name="l00303"></a>00303 this->~<a class="code" href="a00171.html">movable_exception</a>();
+<a name="l00304"></a>00304 internal::deallocate_via_handler_v3(<span class="keyword">this</span>);
+<a name="l00305"></a>00305 }
+<a name="l00306"></a>00306 }
+<a name="l00307"></a>00307 <span class="comment">/*override*/</span>
+<a name="l00308"></a><a class="code" href="a00171.html#17cffba35811c92b7e65d63506b69602">00308</a> <span class="keywordtype">void</span> <a class="code" href="a00171.html#17cffba35811c92b7e65d63506b69602">throw_self</a> () { __TBB_THROW( *<span class="keyword">this</span> ); }
+<a name="l00309"></a>00309
+<a name="l00310"></a>00310 <span class="keyword">protected</span>:
+<a name="l00312"></a><a class="code" href="a00171.html#a8c0ae2089ae784b28907cf748b89416">00312</a> ExceptionData <a class="code" href="a00171.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>;
+<a name="l00313"></a>00313
+<a name="l00314"></a>00314 <span class="keyword">private</span>:
+<a name="l00316"></a>00316 <span class="keywordtype">bool</span> my_dynamic;
+<a name="l00317"></a>00317
+<a name="l00319"></a>00319
+<a name="l00320"></a>00320 <span class="keyword">const</span> <span class="keywordtype">char</span>* my_exception_name;
+<a name="l00321"></a>00321 };
+<a name="l00322"></a>00322
+<a name="l00323"></a>00323 <span class="preprocessor">#if !TBB_USE_CAPTURED_EXCEPTION</span>
+<a name="l00324"></a>00324 <span class="preprocessor"></span><span class="keyword">namespace </span>internal {
+<a name="l00325"></a>00325
+<a name="l00327"></a>00327
+<a name="l00329"></a><a class="code" href="a00207.html">00329</a> <span class="keyword">class </span><a class="code" href="a00207.html">tbb_exception_ptr</a> {
+<a name="l00330"></a>00330 std::exception_ptr my_ptr;
+<a name="l00331"></a>00331
+<a name="l00332"></a>00332 <span class="keyword">public</span>:
+<a name="l00333"></a>00333 <span class="keyword">static</span> <a class="code" href="a00207.html">tbb_exception_ptr</a>* allocate ();
+<a name="l00334"></a>00334 <span class="keyword">static</span> <a class="code" href="a00207.html">tbb_exception_ptr</a>* allocate ( <span class="keyword">const</span> <a class="code" href="a00206.html">tbb_exception</a>& tag );
+<a name="l00336"></a>00336 <span class="keyword">static</span> <a class="code" href="a00207.html">tbb_exception_ptr</a>* allocate ( <a class="code" href="a00152.html">captured_exception</a>& src );
+<a name="l00337"></a>00337
+<a name="l00339"></a>00339
+<a name="l00340"></a>00340 <span class="keywordtype">void</span> <a class="code" href="a00207.html#921875bbacd2c8a5f324c7da7a415262">destroy</a> () <span class="keywordflow">throw</span>();
+<a name="l00341"></a>00341
+<a name="l00343"></a><a class="code" href="a00207.html#292832fd5c523e3d8081a22247840a1d">00343</a> <span class="keywordtype">void</span> <a class="code" href="a00207.html#292832fd5c523e3d8081a22247840a1d">throw_self</a> () { std::rethrow_exception(my_ptr); }
+<a name="l00344"></a>00344
+<a name="l00345"></a>00345 <span class="keyword">private</span>:
+<a name="l00346"></a>00346 <a class="code" href="a00207.html">tbb_exception_ptr</a> ( <span class="keyword">const</span> std::exception_ptr& src ) : my_ptr(src) {}
+<a name="l00347"></a>00347 tbb_exception_ptr ( <span class="keyword">const</span> <a class="code" href="a00152.html">captured_exception</a>& src ) : my_ptr(std::copy_exception(src)) {}
+<a name="l00348"></a>00348 }; <span class="comment">// class tbb::internal::tbb_exception_ptr</span>
+<a name="l00349"></a>00349
+<a name="l00350"></a>00350 } <span class="comment">// namespace internal</span>
+<a name="l00351"></a>00351 <span class="preprocessor">#endif </span><span class="comment">/* !TBB_USE_CAPTURED_EXCEPTION */</span>
+<a name="l00352"></a>00352
+<a name="l00353"></a>00353 } <span class="comment">// namespace tbb</span>
+<a name="l00354"></a>00354
+<a name="l00355"></a>00355 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00356"></a>00356
+<a name="l00357"></a>00357 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_exception_H */</span>
</pre></div><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00454.html b/doc/html/a00460.html
similarity index 60%
rename from doc/html/a00454.html
rename to doc/html/a00460.html
index a8b9aaa..14de40d 100644
--- a/doc/html/a00454.html
+++ b/doc/html/a00460.html
@@ -106,543 +106,545 @@
<a name="l00085"></a>00085 <span class="preprocessor"></span>
<a name="l00086"></a>00086 <span class="preprocessor">#endif</span>
<a name="l00087"></a>00087 <span class="preprocessor"></span>
-<a name="l00088"></a>00088 <span class="preprocessor">#if !defined(__TBB_CompareAndSwap4) \</span>
-<a name="l00089"></a>00089 <span class="preprocessor"> || !defined(__TBB_CompareAndSwap8) \</span>
-<a name="l00090"></a>00090 <span class="preprocessor"> || !defined(__TBB_Yield) \</span>
-<a name="l00091"></a>00091 <span class="preprocessor"> || !defined(__TBB_release_consistency_helper)</span>
-<a name="l00092"></a>00092 <span class="preprocessor"></span><span class="preprocessor">#error Minimal requirements for tbb_machine.h not satisfied </span>
-<a name="l00093"></a>00093 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00094"></a>00094 <span class="preprocessor"></span>
-<a name="l00095"></a>00095 <span class="preprocessor">#ifndef __TBB_load_with_acquire</span>
-<a name="l00097"></a>00097 <span class="preprocessor"> template<typename T></span>
-<a name="l00098"></a>00098 <span class="preprocessor"></span> <span class="keyword">inline</span> T __TBB_load_with_acquire(<span class="keyword">const</span> <span class="keyword">volatile</span> T& location) {
-<a name="l00099"></a>00099 T temp = location;
-<a name="l00100"></a>00100 __TBB_release_consistency_helper();
-<a name="l00101"></a>00101 <span class="keywordflow">return</span> temp;
-<a name="l00102"></a>00102 }
-<a name="l00103"></a>00103 <span class="preprocessor">#endif</span>
-<a name="l00104"></a>00104 <span class="preprocessor"></span>
-<a name="l00105"></a>00105 <span class="preprocessor">#ifndef __TBB_store_with_release</span>
-<a name="l00107"></a>00107 <span class="preprocessor"> template<typename T, typename V></span>
-<a name="l00108"></a>00108 <span class="preprocessor"></span> <span class="keyword">inline</span> <span class="keywordtype">void</span> __TBB_store_with_release(<span class="keyword">volatile</span> T& location, V value) {
-<a name="l00109"></a>00109 __TBB_release_consistency_helper();
-<a name="l00110"></a>00110 location = T(value);
-<a name="l00111"></a>00111 }
-<a name="l00112"></a>00112 <span class="preprocessor">#endif</span>
-<a name="l00113"></a>00113 <span class="preprocessor"></span>
-<a name="l00114"></a>00114 <span class="preprocessor">#ifndef __TBB_Pause</span>
-<a name="l00115"></a>00115 <span class="preprocessor"></span> <span class="keyword">inline</span> <span class="keywordtype">void</span> __TBB_Pause(int32_t) {
-<a name="l00116"></a>00116 __TBB_Yield();
-<a name="l00117"></a>00117 }
-<a name="l00118"></a>00118 <span class="preprocessor">#endif</span>
-<a name="l00119"></a>00119 <span class="preprocessor"></span>
-<a name="l00120"></a>00120 <span class="keyword">namespace </span>tbb {
-<a name="l00121"></a>00121 <span class="keyword">namespace </span>internal {
-<a name="l00122"></a>00122
-<a name="l00124"></a>00124
-<a name="l00125"></a><a class="code" href="a00145.html">00125</a> <span class="keyword">class </span><a class="code" href="a00145.html">atomic_backoff</a> {
-<a name="l00127"></a>00127
-<a name="l00129"></a>00129 <span class="keyword">static</span> <span class="keyword">const</span> int32_t LOOPS_BEFORE_YIELD = 16;
-<a name="l00130"></a>00130 int32_t count;
-<a name="l00131"></a>00131 <span class="keyword">public</span>:
-<a name="l00132"></a>00132 <a class="code" href="a00145.html">atomic_backoff</a>() : count(1) {}
-<a name="l00133"></a>00133
-<a name="l00135"></a><a class="code" href="a00145.html#a174ea93e3bd3d5cce82389c2f28d037">00135</a> <span class="keywordtype">void</span> <a class="code" href="a00145.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>() {
-<a name="l00136"></a>00136 <span class="keywordflow">if</span>( count<=LOOPS_BEFORE_YIELD ) {
-<a name="l00137"></a>00137 __TBB_Pause(count);
-<a name="l00138"></a>00138 <span class="comment">// Pause twice as long the next time.</span>
-<a name="l00139"></a>00139 count*=2;
-<a name="l00140"></a>00140 } <span class="keywordflow">else</span> {
-<a name="l00141"></a>00141 <span class="comment">// Pause is so long that we might as well yield CPU to scheduler.</span>
-<a name="l00142"></a>00142 __TBB_Yield();
-<a name="l00143"></a>00143 }
-<a name="l00144"></a>00144 }
-<a name="l00145"></a>00145
-<a name="l00146"></a>00146 <span class="comment">// pause for a few times and then return false immediately.</span>
-<a name="l00147"></a>00147 <span class="keywordtype">bool</span> bounded_pause() {
-<a name="l00148"></a>00148 <span class="keywordflow">if</span>( count<=LOOPS_BEFORE_YIELD ) {
-<a name="l00149"></a>00149 __TBB_Pause(count);
-<a name="l00150"></a>00150 <span class="comment">// Pause twice as long the next time.</span>
-<a name="l00151"></a>00151 count*=2;
-<a name="l00152"></a>00152 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00153"></a>00153 } <span class="keywordflow">else</span> {
-<a name="l00154"></a>00154 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00155"></a>00155 }
-<a name="l00156"></a>00156 }
-<a name="l00157"></a>00157
-<a name="l00158"></a>00158 <span class="keywordtype">void</span> reset() {
-<a name="l00159"></a>00159 count = 1;
-<a name="l00160"></a>00160 }
-<a name="l00161"></a>00161 };
-<a name="l00162"></a>00162
-<a name="l00164"></a>00164
-<a name="l00165"></a>00165 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00166"></a>00166 <span class="keywordtype">void</span> spin_wait_while_eq( <span class="keyword">const</span> <span class="keyword">volatile</span> T& location, U value ) {
-<a name="l00167"></a>00167 atomic_backoff backoff;
-<a name="l00168"></a>00168 <span class="keywordflow">while</span>( location==value ) backoff.pause();
-<a name="l00169"></a>00169 }
-<a name="l00170"></a>00170
-<a name="l00172"></a>00172
-<a name="l00173"></a>00173 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00174"></a>00174 <span class="keywordtype">void</span> spin_wait_until_eq( <span class="keyword">const</span> <span class="keyword">volatile</span> T& location, <span class="keyword">const</span> U value ) {
-<a name="l00175"></a>00175 atomic_backoff backoff;
-<a name="l00176"></a>00176 <span class="keywordflow">while</span>( location!=value ) backoff.pause();
-<a name="l00177"></a>00177 }
+<a name="l00089"></a>00089
+<a name="l00101"></a>00101 <span class="preprocessor">#if !defined(__TBB_CompareAndSwap4) \</span>
+<a name="l00102"></a>00102 <span class="preprocessor"> || !defined(__TBB_CompareAndSwap8) \</span>
+<a name="l00103"></a>00103 <span class="preprocessor"> || !defined(__TBB_Yield) \</span>
+<a name="l00104"></a>00104 <span class="preprocessor"> || !defined(__TBB_full_memory_fence) \</span>
+<a name="l00105"></a>00105 <span class="preprocessor"> || !defined(__TBB_release_consistency_helper)</span>
+<a name="l00106"></a>00106 <span class="preprocessor"></span><span class="preprocessor">#error Minimal requirements for tbb_machine.h not satisfied </span>
+<a name="l00107"></a>00107 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00108"></a>00108 <span class="preprocessor"></span>
+<a name="l00109"></a>00109 <span class="preprocessor">#ifndef __TBB_load_with_acquire</span>
+<a name="l00111"></a>00111 <span class="preprocessor"> template<typename T></span>
+<a name="l00112"></a>00112 <span class="preprocessor"></span> <span class="keyword">inline</span> T __TBB_load_with_acquire(<span class="keyword">const</span> <span class="keyword">volatile</span> T& location) {
+<a name="l00113"></a>00113 T temp = location;
+<a name="l00114"></a>00114 __TBB_release_consistency_helper();
+<a name="l00115"></a>00115 <span class="keywordflow">return</span> temp;
+<a name="l00116"></a>00116 }
+<a name="l00117"></a>00117 <span class="preprocessor">#endif</span>
+<a name="l00118"></a>00118 <span class="preprocessor"></span>
+<a name="l00119"></a>00119 <span class="preprocessor">#ifndef __TBB_store_with_release</span>
+<a name="l00121"></a>00121 <span class="preprocessor"> template<typename T, typename V></span>
+<a name="l00122"></a>00122 <span class="preprocessor"></span> <span class="keyword">inline</span> <span class="keywordtype">void</span> __TBB_store_with_release(<span class="keyword">volatile</span> T& location, V value) {
+<a name="l00123"></a>00123 __TBB_release_consistency_helper();
+<a name="l00124"></a>00124 location = T(value);
+<a name="l00125"></a>00125 }
+<a name="l00126"></a>00126 <span class="preprocessor">#endif</span>
+<a name="l00127"></a>00127 <span class="preprocessor"></span>
+<a name="l00128"></a>00128 <span class="preprocessor">#ifndef __TBB_Pause</span>
+<a name="l00129"></a>00129 <span class="preprocessor"></span> <span class="keyword">inline</span> <span class="keywordtype">void</span> __TBB_Pause(int32_t) {
+<a name="l00130"></a>00130 __TBB_Yield();
+<a name="l00131"></a>00131 }
+<a name="l00132"></a>00132 <span class="preprocessor">#endif</span>
+<a name="l00133"></a>00133 <span class="preprocessor"></span>
+<a name="l00134"></a>00134 <span class="keyword">namespace </span>tbb {
+<a name="l00135"></a>00135 <span class="keyword">namespace </span>internal {
+<a name="l00136"></a>00136
+<a name="l00138"></a>00138
+<a name="l00139"></a><a class="code" href="a00144.html">00139</a> <span class="keyword">class </span><a class="code" href="a00144.html">atomic_backoff</a> {
+<a name="l00141"></a>00141
+<a name="l00143"></a>00143 <span class="keyword">static</span> <span class="keyword">const</span> int32_t LOOPS_BEFORE_YIELD = 16;
+<a name="l00144"></a>00144 int32_t count;
+<a name="l00145"></a>00145 <span class="keyword">public</span>:
+<a name="l00146"></a>00146 <a class="code" href="a00144.html">atomic_backoff</a>() : count(1) {}
+<a name="l00147"></a>00147
+<a name="l00149"></a><a class="code" href="a00144.html#a174ea93e3bd3d5cce82389c2f28d037">00149</a> <span class="keywordtype">void</span> <a class="code" href="a00144.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>() {
+<a name="l00150"></a>00150 <span class="keywordflow">if</span>( count<=LOOPS_BEFORE_YIELD ) {
+<a name="l00151"></a>00151 __TBB_Pause(count);
+<a name="l00152"></a>00152 <span class="comment">// Pause twice as long the next time.</span>
+<a name="l00153"></a>00153 count*=2;
+<a name="l00154"></a>00154 } <span class="keywordflow">else</span> {
+<a name="l00155"></a>00155 <span class="comment">// Pause is so long that we might as well yield CPU to scheduler.</span>
+<a name="l00156"></a>00156 __TBB_Yield();
+<a name="l00157"></a>00157 }
+<a name="l00158"></a>00158 }
+<a name="l00159"></a>00159
+<a name="l00160"></a>00160 <span class="comment">// pause for a few times and then return false immediately.</span>
+<a name="l00161"></a>00161 <span class="keywordtype">bool</span> bounded_pause() {
+<a name="l00162"></a>00162 <span class="keywordflow">if</span>( count<=LOOPS_BEFORE_YIELD ) {
+<a name="l00163"></a>00163 __TBB_Pause(count);
+<a name="l00164"></a>00164 <span class="comment">// Pause twice as long the next time.</span>
+<a name="l00165"></a>00165 count*=2;
+<a name="l00166"></a>00166 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00167"></a>00167 } <span class="keywordflow">else</span> {
+<a name="l00168"></a>00168 <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00169"></a>00169 }
+<a name="l00170"></a>00170 }
+<a name="l00171"></a>00171
+<a name="l00172"></a>00172 <span class="keywordtype">void</span> reset() {
+<a name="l00173"></a>00173 count = 1;
+<a name="l00174"></a>00174 }
+<a name="l00175"></a>00175 };
+<a name="l00176"></a>00176
<a name="l00178"></a>00178
-<a name="l00179"></a>00179 <span class="comment">// T should be unsigned, otherwise sign propagation will break correctness of bit manipulations.</span>
-<a name="l00180"></a>00180 <span class="comment">// S should be either 1 or 2, for the mask calculation to work correctly.</span>
-<a name="l00181"></a>00181 <span class="comment">// Together, these rules limit applicability of Masked CAS to unsigned char and unsigned short.</span>
-<a name="l00182"></a>00182 <span class="keyword">template</span><size_t S, <span class="keyword">typename</span> T>
-<a name="l00183"></a>00183 <span class="keyword">inline</span> T __TBB_MaskedCompareAndSwap (<span class="keyword">volatile</span> T *ptr, T value, T comparand ) {
-<a name="l00184"></a>00184 <span class="keyword">volatile</span> uint32_t * base = (uint32_t*)( (uintptr_t)ptr & ~(uintptr_t)0x3 );
-<a name="l00185"></a>00185 <span class="preprocessor">#if __TBB_BIG_ENDIAN</span>
-<a name="l00186"></a>00186 <span class="preprocessor"></span> <span class="keyword">const</span> uint8_t bitoffset = uint8_t( 8*( 4-S - (uintptr_t(ptr) & 0x3) ) );
-<a name="l00187"></a>00187 <span class="preprocessor">#else</span>
-<a name="l00188"></a>00188 <span class="preprocessor"></span> <span class="keyword">const</span> uint8_t bitoffset = uint8_t( 8*((uintptr_t)ptr & 0x3) );
-<a name="l00189"></a>00189 <span class="preprocessor">#endif</span>
-<a name="l00190"></a>00190 <span class="preprocessor"></span> <span class="keyword">const</span> uint32_t mask = ( (1<<(S*8)) - 1 )<<bitoffset;
-<a name="l00191"></a>00191 atomic_backoff b;
-<a name="l00192"></a>00192 uint32_t result;
-<a name="l00193"></a>00193 <span class="keywordflow">for</span>(;;) {
-<a name="l00194"></a>00194 result = *base; <span class="comment">// reload the base value which might change during the pause</span>
-<a name="l00195"></a>00195 uint32_t old_value = ( result & ~mask ) | ( comparand << bitoffset );
-<a name="l00196"></a>00196 uint32_t new_value = ( result & ~mask ) | ( value << bitoffset );
-<a name="l00197"></a>00197 <span class="comment">// __TBB_CompareAndSwap4 presumed to have full fence. </span>
-<a name="l00198"></a>00198 result = __TBB_CompareAndSwap4( base, new_value, old_value );
-<a name="l00199"></a>00199 <span class="keywordflow">if</span>( result==old_value <span class="comment">// CAS succeeded</span>
-<a name="l00200"></a>00200 || ((result^old_value)&mask)!=0 ) <span class="comment">// CAS failed and the bits of interest have changed</span>
-<a name="l00201"></a>00201 <span class="keywordflow">break</span>;
-<a name="l00202"></a>00202 <span class="keywordflow">else</span> <span class="comment">// CAS failed but the bits of interest left unchanged</span>
-<a name="l00203"></a>00203 b.pause();
-<a name="l00204"></a>00204 }
-<a name="l00205"></a>00205 <span class="keywordflow">return</span> T((result & mask) >> bitoffset);
-<a name="l00206"></a>00206 }
-<a name="l00207"></a>00207
-<a name="l00208"></a>00208 <span class="keyword">template</span><size_t S, <span class="keyword">typename</span> T>
-<a name="l00209"></a>00209 <span class="keyword">inline</span> T __TBB_CompareAndSwapGeneric (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, T value, T comparand ) {
-<a name="l00210"></a>00210 <span class="keywordflow">return</span> __TBB_CompareAndSwapW((T *)ptr,value,comparand);
-<a name="l00211"></a>00211 }
-<a name="l00212"></a>00212
-<a name="l00213"></a>00213 <span class="keyword">template</span><>
-<a name="l00214"></a>00214 <span class="keyword">inline</span> uint8_t __TBB_CompareAndSwapGeneric <1,uint8_t> (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, uint8_t value, uint8_t comparand ) {
-<a name="l00215"></a>00215 #ifdef __TBB_CompareAndSwap1
-<a name="l00216"></a>00216 <span class="keywordflow">return</span> __TBB_CompareAndSwap1(ptr,value,comparand);
-<a name="l00217"></a>00217 <span class="preprocessor">#else</span>
-<a name="l00218"></a>00218 <span class="preprocessor"></span> <span class="keywordflow">return</span> __TBB_MaskedCompareAndSwap<1,uint8_t>((<span class="keyword">volatile</span> uint8_t *)ptr,value,comparand);
-<a name="l00219"></a>00219 <span class="preprocessor">#endif</span>
-<a name="l00220"></a>00220 <span class="preprocessor"></span>}
+<a name="l00179"></a>00179 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00180"></a>00180 <span class="keywordtype">void</span> spin_wait_while_eq( <span class="keyword">const</span> <span class="keyword">volatile</span> T& location, U value ) {
+<a name="l00181"></a>00181 atomic_backoff backoff;
+<a name="l00182"></a>00182 <span class="keywordflow">while</span>( location==value ) backoff.pause();
+<a name="l00183"></a>00183 }
+<a name="l00184"></a>00184
+<a name="l00186"></a>00186
+<a name="l00187"></a>00187 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00188"></a>00188 <span class="keywordtype">void</span> spin_wait_until_eq( <span class="keyword">const</span> <span class="keyword">volatile</span> T& location, <span class="keyword">const</span> U value ) {
+<a name="l00189"></a>00189 atomic_backoff backoff;
+<a name="l00190"></a>00190 <span class="keywordflow">while</span>( location!=value ) backoff.pause();
+<a name="l00191"></a>00191 }
+<a name="l00192"></a>00192
+<a name="l00193"></a>00193 <span class="comment">// T should be unsigned, otherwise sign propagation will break correctness of bit manipulations.</span>
+<a name="l00194"></a>00194 <span class="comment">// S should be either 1 or 2, for the mask calculation to work correctly.</span>
+<a name="l00195"></a>00195 <span class="comment">// Together, these rules limit applicability of Masked CAS to unsigned char and unsigned short.</span>
+<a name="l00196"></a>00196 <span class="keyword">template</span><size_t S, <span class="keyword">typename</span> T>
+<a name="l00197"></a>00197 <span class="keyword">inline</span> T __TBB_MaskedCompareAndSwap (<span class="keyword">volatile</span> T *ptr, T value, T comparand ) {
+<a name="l00198"></a>00198 <span class="keyword">volatile</span> uint32_t * base = (uint32_t*)( (uintptr_t)ptr & ~(uintptr_t)0x3 );
+<a name="l00199"></a>00199 <span class="preprocessor">#if __TBB_BIG_ENDIAN</span>
+<a name="l00200"></a>00200 <span class="preprocessor"></span> <span class="keyword">const</span> uint8_t bitoffset = uint8_t( 8*( 4-S - (uintptr_t(ptr) & 0x3) ) );
+<a name="l00201"></a>00201 <span class="preprocessor">#else</span>
+<a name="l00202"></a>00202 <span class="preprocessor"></span> <span class="keyword">const</span> uint8_t bitoffset = uint8_t( 8*((uintptr_t)ptr & 0x3) );
+<a name="l00203"></a>00203 <span class="preprocessor">#endif</span>
+<a name="l00204"></a>00204 <span class="preprocessor"></span> <span class="keyword">const</span> uint32_t mask = ( (1<<(S*8)) - 1 )<<bitoffset;
+<a name="l00205"></a>00205 atomic_backoff b;
+<a name="l00206"></a>00206 uint32_t result;
+<a name="l00207"></a>00207 <span class="keywordflow">for</span>(;;) {
+<a name="l00208"></a>00208 result = *base; <span class="comment">// reload the base value which might change during the pause</span>
+<a name="l00209"></a>00209 uint32_t old_value = ( result & ~mask ) | ( comparand << bitoffset );
+<a name="l00210"></a>00210 uint32_t new_value = ( result & ~mask ) | ( value << bitoffset );
+<a name="l00211"></a>00211 <span class="comment">// __TBB_CompareAndSwap4 presumed to have full fence. </span>
+<a name="l00212"></a>00212 result = __TBB_CompareAndSwap4( base, new_value, old_value );
+<a name="l00213"></a>00213 <span class="keywordflow">if</span>( result==old_value <span class="comment">// CAS succeeded</span>
+<a name="l00214"></a>00214 || ((result^old_value)&mask)!=0 ) <span class="comment">// CAS failed and the bits of interest have changed</span>
+<a name="l00215"></a>00215 <span class="keywordflow">break</span>;
+<a name="l00216"></a>00216 <span class="keywordflow">else</span> <span class="comment">// CAS failed but the bits of interest left unchanged</span>
+<a name="l00217"></a>00217 b.pause();
+<a name="l00218"></a>00218 }
+<a name="l00219"></a>00219 <span class="keywordflow">return</span> T((result & mask) >> bitoffset);
+<a name="l00220"></a>00220 }
<a name="l00221"></a>00221
-<a name="l00222"></a>00222 <span class="keyword">template</span><>
-<a name="l00223"></a>00223 <span class="keyword">inline</span> uint16_t __TBB_CompareAndSwapGeneric <2,uint16_t> (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, uint16_t value, uint16_t comparand ) {
-<a name="l00224"></a>00224 #ifdef __TBB_CompareAndSwap2
-<a name="l00225"></a>00225 <span class="keywordflow">return</span> __TBB_CompareAndSwap2(ptr,value,comparand);
-<a name="l00226"></a>00226 <span class="preprocessor">#else</span>
-<a name="l00227"></a>00227 <span class="preprocessor"></span> <span class="keywordflow">return</span> __TBB_MaskedCompareAndSwap<2,uint16_t>((<span class="keyword">volatile</span> uint16_t *)ptr,value,comparand);
-<a name="l00228"></a>00228 <span class="preprocessor">#endif</span>
-<a name="l00229"></a>00229 <span class="preprocessor"></span>}
-<a name="l00230"></a>00230
-<a name="l00231"></a>00231 <span class="keyword">template</span><>
-<a name="l00232"></a>00232 <span class="keyword">inline</span> uint32_t __TBB_CompareAndSwapGeneric <4,uint32_t> (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, uint32_t value, uint32_t comparand ) {
-<a name="l00233"></a>00233 <span class="keywordflow">return</span> __TBB_CompareAndSwap4(ptr,value,comparand);
-<a name="l00234"></a>00234 }
+<a name="l00222"></a>00222 <span class="keyword">template</span><size_t S, <span class="keyword">typename</span> T>
+<a name="l00223"></a>00223 <span class="keyword">inline</span> T __TBB_CompareAndSwapGeneric (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, T value, T comparand ) {
+<a name="l00224"></a>00224 <span class="keywordflow">return</span> __TBB_CompareAndSwapW((T *)ptr,value,comparand);
+<a name="l00225"></a>00225 }
+<a name="l00226"></a>00226
+<a name="l00227"></a>00227 <span class="keyword">template</span><>
+<a name="l00228"></a>00228 <span class="keyword">inline</span> uint8_t __TBB_CompareAndSwapGeneric <1,uint8_t> (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, uint8_t value, uint8_t comparand ) {
+<a name="l00229"></a>00229 #ifdef __TBB_CompareAndSwap1
+<a name="l00230"></a>00230 <span class="keywordflow">return</span> __TBB_CompareAndSwap1(ptr,value,comparand);
+<a name="l00231"></a>00231 <span class="preprocessor">#else</span>
+<a name="l00232"></a>00232 <span class="preprocessor"></span> <span class="keywordflow">return</span> __TBB_MaskedCompareAndSwap<1,uint8_t>((<span class="keyword">volatile</span> uint8_t *)ptr,value,comparand);
+<a name="l00233"></a>00233 <span class="preprocessor">#endif</span>
+<a name="l00234"></a>00234 <span class="preprocessor"></span>}
<a name="l00235"></a>00235
<a name="l00236"></a>00236 <span class="keyword">template</span><>
-<a name="l00237"></a>00237 <span class="keyword">inline</span> uint64_t __TBB_CompareAndSwapGeneric <8,uint64_t> (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, uint64_t value, uint64_t comparand ) {
-<a name="l00238"></a>00238 <span class="keywordflow">return</span> __TBB_CompareAndSwap8(ptr,value,comparand);
-<a name="l00239"></a>00239 }
-<a name="l00240"></a>00240
-<a name="l00241"></a>00241 <span class="keyword">template</span><size_t S, <span class="keyword">typename</span> T>
-<a name="l00242"></a>00242 <span class="keyword">inline</span> T __TBB_FetchAndAddGeneric (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, T addend) {
-<a name="l00243"></a>00243 atomic_backoff b;
-<a name="l00244"></a>00244 T result;
-<a name="l00245"></a>00245 <span class="keywordflow">for</span>(;;) {
-<a name="l00246"></a>00246 result = *reinterpret_cast<volatile T *>(ptr);
-<a name="l00247"></a>00247 <span class="comment">// __TBB_CompareAndSwapGeneric presumed to have full fence. </span>
-<a name="l00248"></a>00248 <span class="keywordflow">if</span>( __TBB_CompareAndSwapGeneric<S,T> ( ptr, result+addend, result )==result )
-<a name="l00249"></a>00249 <span class="keywordflow">break</span>;
-<a name="l00250"></a>00250 b.pause();
-<a name="l00251"></a>00251 }
-<a name="l00252"></a>00252 <span class="keywordflow">return</span> result;
+<a name="l00237"></a>00237 <span class="keyword">inline</span> uint16_t __TBB_CompareAndSwapGeneric <2,uint16_t> (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, uint16_t value, uint16_t comparand ) {
+<a name="l00238"></a>00238 #ifdef __TBB_CompareAndSwap2
+<a name="l00239"></a>00239 <span class="keywordflow">return</span> __TBB_CompareAndSwap2(ptr,value,comparand);
+<a name="l00240"></a>00240 <span class="preprocessor">#else</span>
+<a name="l00241"></a>00241 <span class="preprocessor"></span> <span class="keywordflow">return</span> __TBB_MaskedCompareAndSwap<2,uint16_t>((<span class="keyword">volatile</span> uint16_t *)ptr,value,comparand);
+<a name="l00242"></a>00242 <span class="preprocessor">#endif</span>
+<a name="l00243"></a>00243 <span class="preprocessor"></span>}
+<a name="l00244"></a>00244
+<a name="l00245"></a>00245 <span class="keyword">template</span><>
+<a name="l00246"></a>00246 <span class="keyword">inline</span> uint32_t __TBB_CompareAndSwapGeneric <4,uint32_t> (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, uint32_t value, uint32_t comparand ) {
+<a name="l00247"></a>00247 <span class="keywordflow">return</span> __TBB_CompareAndSwap4(ptr,value,comparand);
+<a name="l00248"></a>00248 }
+<a name="l00249"></a>00249
+<a name="l00250"></a>00250 <span class="keyword">template</span><>
+<a name="l00251"></a>00251 <span class="keyword">inline</span> uint64_t __TBB_CompareAndSwapGeneric <8,uint64_t> (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, uint64_t value, uint64_t comparand ) {
+<a name="l00252"></a>00252 <span class="keywordflow">return</span> __TBB_CompareAndSwap8(ptr,value,comparand);
<a name="l00253"></a>00253 }
<a name="l00254"></a>00254
<a name="l00255"></a>00255 <span class="keyword">template</span><size_t S, <span class="keyword">typename</span> T>
-<a name="l00256"></a>00256 <span class="keyword">inline</span> T __TBB_FetchAndStoreGeneric (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, T value) {
+<a name="l00256"></a>00256 <span class="keyword">inline</span> T __TBB_FetchAndAddGeneric (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, T addend) {
<a name="l00257"></a>00257 atomic_backoff b;
<a name="l00258"></a>00258 T result;
<a name="l00259"></a>00259 <span class="keywordflow">for</span>(;;) {
<a name="l00260"></a>00260 result = *reinterpret_cast<volatile T *>(ptr);
-<a name="l00261"></a>00261 <span class="comment">// __TBB_CompareAndSwapGeneric presumed to have full fence.</span>
-<a name="l00262"></a>00262 <span class="keywordflow">if</span>( __TBB_CompareAndSwapGeneric<S,T> ( ptr, value, result )==result )
+<a name="l00261"></a>00261 <span class="comment">// __TBB_CompareAndSwapGeneric presumed to have full fence. </span>
+<a name="l00262"></a>00262 <span class="keywordflow">if</span>( __TBB_CompareAndSwapGeneric<S,T> ( ptr, result+addend, result )==result )
<a name="l00263"></a>00263 <span class="keywordflow">break</span>;
<a name="l00264"></a>00264 b.pause();
<a name="l00265"></a>00265 }
<a name="l00266"></a>00266 <span class="keywordflow">return</span> result;
<a name="l00267"></a>00267 }
<a name="l00268"></a>00268
-<a name="l00269"></a>00269 <span class="comment">// Macro __TBB_TypeWithAlignmentAtLeastAsStrict(T) should be a type with alignment at least as </span>
-<a name="l00270"></a>00270 <span class="comment">// strict as type T. Type type should have a trivial default constructor and destructor, so that</span>
-<a name="l00271"></a>00271 <span class="comment">// arrays of that type can be declared without initializers. </span>
-<a name="l00272"></a>00272 <span class="comment">// It is correct (but perhaps a waste of space) if __TBB_TypeWithAlignmentAtLeastAsStrict(T) expands</span>
-<a name="l00273"></a>00273 <span class="comment">// to a type bigger than T.</span>
-<a name="l00274"></a>00274 <span class="comment">// The default definition here works on machines where integers are naturally aligned and the</span>
-<a name="l00275"></a>00275 <span class="comment">// strictest alignment is 16.</span>
-<a name="l00276"></a>00276 <span class="preprocessor">#ifndef __TBB_TypeWithAlignmentAtLeastAsStrict</span>
-<a name="l00277"></a>00277 <span class="preprocessor"></span>
-<a name="l00278"></a>00278 <span class="preprocessor">#if __GNUC__ || __SUNPRO_CC</span>
-<a name="l00279"></a>00279 <span class="preprocessor"></span><span class="keyword">struct </span>__TBB_machine_type_with_strictest_alignment {
-<a name="l00280"></a>00280 <span class="keywordtype">int</span> member[4];
-<a name="l00281"></a>00281 } __attribute__((aligned(16)));
-<a name="l00282"></a>00282 <span class="preprocessor">#elif _MSC_VER</span>
-<a name="l00283"></a>00283 <span class="preprocessor"></span>__declspec(align(16)) struct __TBB_machine_type_with_strictest_alignment {
-<a name="l00284"></a>00284 <span class="keywordtype">int</span> member[4];
-<a name="l00285"></a>00285 };
-<a name="l00286"></a>00286 <span class="preprocessor">#else</span>
-<a name="l00287"></a>00287 <span class="preprocessor"></span><span class="preprocessor">#error Must define __TBB_TypeWithAlignmentAtLeastAsStrict(T) or __TBB_machine_type_with_strictest_alignment</span>
-<a name="l00288"></a>00288 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00289"></a>00289 <span class="preprocessor"></span>
-<a name="l00290"></a>00290 <span class="keyword">template</span><size_t N> <span class="keyword">struct </span>type_with_alignment {__TBB_machine_type_with_strictest_alignment member;};
-<a name="l00291"></a>00291 <span class="keyword">template</span><> <span class="keyword">struct </span>type_with_alignment<1> { <span class="keywordtype">char</span> member; };
-<a name="l00292"></a>00292 <span class="keyword">template</span><> <span class="keyword">struct </span>type_with_alignment<2> { uint16_t member; };
-<a name="l00293"></a>00293 <span class="keyword">template</span><> <span class="keyword">struct </span>type_with_alignment<4> { uint32_t member; };
-<a name="l00294"></a>00294 <span class="keyword">template</span><> <span class="keyword">struct </span>type_with_alignment<8> { uint64_t member; };
-<a name="l00295"></a>00295
-<a name="l00296"></a>00296 <span class="preprocessor">#if _MSC_VER||defined(__GNUC__)&&__GNUC__==3 && __GNUC_MINOR__<=2 </span>
-<a name="l00298"></a>00298 <span class="preprocessor"></span>
-<a name="l00300"></a>00300 <span class="preprocessor">template<size_t Size, typename T> </span>
-<a name="l00301"></a><a class="code" href="a00212.html">00301</a> <span class="preprocessor"></span><span class="keyword">struct </span><a class="code" href="a00212.html">work_around_alignment_bug</a> {
-<a name="l00302"></a>00302 <span class="preprocessor">#if _MSC_VER</span>
-<a name="l00303"></a>00303 <span class="preprocessor"></span> <span class="keyword">static</span> <span class="keyword">const</span> size_t alignment = __alignof(T);
-<a name="l00304"></a>00304 <span class="preprocessor">#else</span>
-<a name="l00305"></a>00305 <span class="preprocessor"></span> <span class="keyword">static</span> <span class="keyword">const</span> size_t alignment = __alignof__(T);
-<a name="l00306"></a>00306 <span class="preprocessor">#endif</span>
-<a name="l00307"></a>00307 <span class="preprocessor"></span>};
-<a name="l00308"></a>00308 <span class="preprocessor">#define __TBB_TypeWithAlignmentAtLeastAsStrict(T) tbb::internal::type_with_alignment<tbb::internal::work_around_alignment_bug<sizeof(T),T>::alignment></span>
-<a name="l00309"></a>00309 <span class="preprocessor"></span><span class="preprocessor">#elif __GNUC__ || __SUNPRO_CC</span>
-<a name="l00310"></a>00310 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_TypeWithAlignmentAtLeastAsStrict(T) tbb::internal::type_with_alignment<__alignof__(T)></span>
-<a name="l00311"></a>00311 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00312"></a>00312 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_TypeWithAlignmentAtLeastAsStrict(T) __TBB_machine_type_with_strictest_alignment</span>
-<a name="l00313"></a>00313 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00314"></a>00314 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* ____TBB_TypeWithAlignmentAtLeastAsStrict */</span>
-<a name="l00315"></a>00315
-<a name="l00316"></a>00316 <span class="comment">// Template class here is to avoid instantiation of the static data for modules that don't use it</span>
-<a name="l00317"></a>00317 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00318"></a>00318 <span class="keyword">struct </span>reverse {
-<a name="l00319"></a>00319 <span class="keyword">static</span> <span class="keyword">const</span> T byte_table[256];
-<a name="l00320"></a>00320 };
-<a name="l00321"></a>00321 <span class="comment">// An efficient implementation of the reverse function utilizes a 2^8 lookup table holding the bit-reversed</span>
-<a name="l00322"></a>00322 <span class="comment">// values of [0..2^8 - 1]. Those values can also be computed on the fly at a slightly higher cost.</span>
-<a name="l00323"></a>00323 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00324"></a>00324 <span class="keyword">const</span> T reverse<T>::byte_table[256] = {
-<a name="l00325"></a>00325 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
-<a name="l00326"></a>00326 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
-<a name="l00327"></a>00327 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
-<a name="l00328"></a>00328 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
-<a name="l00329"></a>00329 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
-<a name="l00330"></a>00330 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
-<a name="l00331"></a>00331 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
-<a name="l00332"></a>00332 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
-<a name="l00333"></a>00333 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
-<a name="l00334"></a>00334 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
-<a name="l00335"></a>00335 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
-<a name="l00336"></a>00336 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
-<a name="l00337"></a>00337 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
-<a name="l00338"></a>00338 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
-<a name="l00339"></a>00339 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
-<a name="l00340"></a>00340 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
-<a name="l00341"></a>00341 };
-<a name="l00342"></a>00342
-<a name="l00343"></a>00343 } <span class="comment">// namespace internal</span>
-<a name="l00344"></a>00344 } <span class="comment">// namespace tbb</span>
-<a name="l00345"></a>00345
-<a name="l00346"></a>00346 <span class="preprocessor">#ifndef __TBB_CompareAndSwap1</span>
-<a name="l00347"></a>00347 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap1 tbb::internal::__TBB_CompareAndSwapGeneric<1,uint8_t></span>
-<a name="l00348"></a>00348 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00349"></a>00349 <span class="preprocessor"></span>
-<a name="l00350"></a>00350 <span class="preprocessor">#ifndef __TBB_CompareAndSwap2 </span>
-<a name="l00351"></a>00351 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap2 tbb::internal::__TBB_CompareAndSwapGeneric<2,uint16_t></span>
-<a name="l00352"></a>00352 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00353"></a>00353 <span class="preprocessor"></span>
-<a name="l00354"></a>00354 <span class="preprocessor">#ifndef __TBB_CompareAndSwapW</span>
-<a name="l00355"></a>00355 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwapW tbb::internal::__TBB_CompareAndSwapGeneric<sizeof(ptrdiff_t),ptrdiff_t></span>
-<a name="l00356"></a>00356 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00357"></a>00357 <span class="preprocessor"></span>
-<a name="l00358"></a>00358 <span class="preprocessor">#ifndef __TBB_FetchAndAdd1</span>
-<a name="l00359"></a>00359 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd1 tbb::internal::__TBB_FetchAndAddGeneric<1,uint8_t></span>
-<a name="l00360"></a>00360 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00361"></a>00361 <span class="preprocessor"></span>
-<a name="l00362"></a>00362 <span class="preprocessor">#ifndef __TBB_FetchAndAdd2</span>
-<a name="l00363"></a>00363 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd2 tbb::internal::__TBB_FetchAndAddGeneric<2,uint16_t></span>
-<a name="l00364"></a>00364 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00365"></a>00365 <span class="preprocessor"></span>
-<a name="l00366"></a>00366 <span class="preprocessor">#ifndef __TBB_FetchAndAdd4</span>
-<a name="l00367"></a>00367 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd4 tbb::internal::__TBB_FetchAndAddGeneric<4,uint32_t></span>
-<a name="l00368"></a>00368 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00369"></a>00369 <span class="preprocessor"></span>
-<a name="l00370"></a>00370 <span class="preprocessor">#ifndef __TBB_FetchAndAdd8</span>
-<a name="l00371"></a>00371 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd8 tbb::internal::__TBB_FetchAndAddGeneric<8,uint64_t></span>
-<a name="l00372"></a>00372 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00373"></a>00373 <span class="preprocessor"></span>
-<a name="l00374"></a>00374 <span class="preprocessor">#ifndef __TBB_FetchAndAddW</span>
-<a name="l00375"></a>00375 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAddW tbb::internal::__TBB_FetchAndAddGeneric<sizeof(ptrdiff_t),ptrdiff_t></span>
-<a name="l00376"></a>00376 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00377"></a>00377 <span class="preprocessor"></span>
-<a name="l00378"></a>00378 <span class="preprocessor">#ifndef __TBB_FetchAndStore1</span>
-<a name="l00379"></a>00379 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore1 tbb::internal::__TBB_FetchAndStoreGeneric<1,uint8_t></span>
-<a name="l00380"></a>00380 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00381"></a>00381 <span class="preprocessor"></span>
-<a name="l00382"></a>00382 <span class="preprocessor">#ifndef __TBB_FetchAndStore2</span>
-<a name="l00383"></a>00383 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore2 tbb::internal::__TBB_FetchAndStoreGeneric<2,uint16_t></span>
-<a name="l00384"></a>00384 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00385"></a>00385 <span class="preprocessor"></span>
-<a name="l00386"></a>00386 <span class="preprocessor">#ifndef __TBB_FetchAndStore4</span>
-<a name="l00387"></a>00387 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore4 tbb::internal::__TBB_FetchAndStoreGeneric<4,uint32_t></span>
-<a name="l00388"></a>00388 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00389"></a>00389 <span class="preprocessor"></span>
-<a name="l00390"></a>00390 <span class="preprocessor">#ifndef __TBB_FetchAndStore8</span>
-<a name="l00391"></a>00391 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore8 tbb::internal::__TBB_FetchAndStoreGeneric<8,uint64_t></span>
-<a name="l00392"></a>00392 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00393"></a>00393 <span class="preprocessor"></span>
-<a name="l00394"></a>00394 <span class="preprocessor">#ifndef __TBB_FetchAndStoreW</span>
-<a name="l00395"></a>00395 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStoreW tbb::internal::__TBB_FetchAndStoreGeneric<sizeof(ptrdiff_t),ptrdiff_t></span>
-<a name="l00396"></a>00396 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00397"></a>00397 <span class="preprocessor"></span>
-<a name="l00398"></a>00398 <span class="preprocessor">#if __TBB_DECL_FENCED_ATOMICS</span>
+<a name="l00269"></a>00269 <span class="keyword">template</span><size_t S, <span class="keyword">typename</span> T>
+<a name="l00270"></a>00270 <span class="keyword">inline</span> T __TBB_FetchAndStoreGeneric (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, T value) {
+<a name="l00271"></a>00271 atomic_backoff b;
+<a name="l00272"></a>00272 T result;
+<a name="l00273"></a>00273 <span class="keywordflow">for</span>(;;) {
+<a name="l00274"></a>00274 result = *reinterpret_cast<volatile T *>(ptr);
+<a name="l00275"></a>00275 <span class="comment">// __TBB_CompareAndSwapGeneric presumed to have full fence.</span>
+<a name="l00276"></a>00276 <span class="keywordflow">if</span>( __TBB_CompareAndSwapGeneric<S,T> ( ptr, value, result )==result )
+<a name="l00277"></a>00277 <span class="keywordflow">break</span>;
+<a name="l00278"></a>00278 b.pause();
+<a name="l00279"></a>00279 }
+<a name="l00280"></a>00280 <span class="keywordflow">return</span> result;
+<a name="l00281"></a>00281 }
+<a name="l00282"></a>00282
+<a name="l00283"></a>00283 <span class="comment">// Macro __TBB_TypeWithAlignmentAtLeastAsStrict(T) should be a type with alignment at least as </span>
+<a name="l00284"></a>00284 <span class="comment">// strict as type T. Type type should have a trivial default constructor and destructor, so that</span>
+<a name="l00285"></a>00285 <span class="comment">// arrays of that type can be declared without initializers. </span>
+<a name="l00286"></a>00286 <span class="comment">// It is correct (but perhaps a waste of space) if __TBB_TypeWithAlignmentAtLeastAsStrict(T) expands</span>
+<a name="l00287"></a>00287 <span class="comment">// to a type bigger than T.</span>
+<a name="l00288"></a>00288 <span class="comment">// The default definition here works on machines where integers are naturally aligned and the</span>
+<a name="l00289"></a>00289 <span class="comment">// strictest alignment is 16.</span>
+<a name="l00290"></a>00290 <span class="preprocessor">#ifndef __TBB_TypeWithAlignmentAtLeastAsStrict</span>
+<a name="l00291"></a>00291 <span class="preprocessor"></span>
+<a name="l00292"></a>00292 <span class="preprocessor">#if __GNUC__ || __SUNPRO_CC</span>
+<a name="l00293"></a>00293 <span class="preprocessor"></span><span class="keyword">struct </span>__TBB_machine_type_with_strictest_alignment {
+<a name="l00294"></a>00294 <span class="keywordtype">int</span> member[4];
+<a name="l00295"></a>00295 } __attribute__((aligned(16)));
+<a name="l00296"></a>00296 <span class="preprocessor">#elif _MSC_VER</span>
+<a name="l00297"></a>00297 <span class="preprocessor"></span>__declspec(align(16)) struct __TBB_machine_type_with_strictest_alignment {
+<a name="l00298"></a>00298 <span class="keywordtype">int</span> member[4];
+<a name="l00299"></a>00299 };
+<a name="l00300"></a>00300 <span class="preprocessor">#else</span>
+<a name="l00301"></a>00301 <span class="preprocessor"></span><span class="preprocessor">#error Must define __TBB_TypeWithAlignmentAtLeastAsStrict(T) or __TBB_machine_type_with_strictest_alignment</span>
+<a name="l00302"></a>00302 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00303"></a>00303 <span class="preprocessor"></span>
+<a name="l00304"></a>00304 <span class="keyword">template</span><size_t N> <span class="keyword">struct </span>type_with_alignment {__TBB_machine_type_with_strictest_alignment member;};
+<a name="l00305"></a>00305 <span class="keyword">template</span><> <span class="keyword">struct </span>type_with_alignment<1> { <span class="keywordtype">char</span> member; };
+<a name="l00306"></a>00306 <span class="keyword">template</span><> <span class="keyword">struct </span>type_with_alignment<2> { uint16_t member; };
+<a name="l00307"></a>00307 <span class="keyword">template</span><> <span class="keyword">struct </span>type_with_alignment<4> { uint32_t member; };
+<a name="l00308"></a>00308 <span class="keyword">template</span><> <span class="keyword">struct </span>type_with_alignment<8> { uint64_t member; };
+<a name="l00309"></a>00309
+<a name="l00310"></a>00310 <span class="preprocessor">#if _MSC_VER||defined(__GNUC__)&&__GNUC__==3 && __GNUC_MINOR__<=2 </span>
+<a name="l00312"></a>00312 <span class="preprocessor"></span>
+<a name="l00314"></a>00314 <span class="preprocessor">template<size_t Size, typename T> </span>
+<a name="l00315"></a><a class="code" href="a00212.html">00315</a> <span class="preprocessor"></span><span class="keyword">struct </span><a class="code" href="a00212.html">work_around_alignment_bug</a> {
+<a name="l00316"></a>00316 <span class="preprocessor">#if _MSC_VER</span>
+<a name="l00317"></a>00317 <span class="preprocessor"></span> <span class="keyword">static</span> <span class="keyword">const</span> size_t alignment = __alignof(T);
+<a name="l00318"></a>00318 <span class="preprocessor">#else</span>
+<a name="l00319"></a>00319 <span class="preprocessor"></span> <span class="keyword">static</span> <span class="keyword">const</span> size_t alignment = __alignof__(T);
+<a name="l00320"></a>00320 <span class="preprocessor">#endif</span>
+<a name="l00321"></a>00321 <span class="preprocessor"></span>};
+<a name="l00322"></a>00322 <span class="preprocessor">#define __TBB_TypeWithAlignmentAtLeastAsStrict(T) tbb::internal::type_with_alignment<tbb::internal::work_around_alignment_bug<sizeof(T),T>::alignment></span>
+<a name="l00323"></a>00323 <span class="preprocessor"></span><span class="preprocessor">#elif __GNUC__ || __SUNPRO_CC</span>
+<a name="l00324"></a>00324 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_TypeWithAlignmentAtLeastAsStrict(T) tbb::internal::type_with_alignment<__alignof__(T)></span>
+<a name="l00325"></a>00325 <span class="preprocessor"></span><span class="preprocessor">#else</span>
+<a name="l00326"></a>00326 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_TypeWithAlignmentAtLeastAsStrict(T) __TBB_machine_type_with_strictest_alignment</span>
+<a name="l00327"></a>00327 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00328"></a>00328 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* ____TBB_TypeWithAlignmentAtLeastAsStrict */</span>
+<a name="l00329"></a>00329
+<a name="l00330"></a>00330 <span class="comment">// Template class here is to avoid instantiation of the static data for modules that don't use it</span>
+<a name="l00331"></a>00331 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00332"></a>00332 <span class="keyword">struct </span>reverse {
+<a name="l00333"></a>00333 <span class="keyword">static</span> <span class="keyword">const</span> T byte_table[256];
+<a name="l00334"></a>00334 };
+<a name="l00335"></a>00335 <span class="comment">// An efficient implementation of the reverse function utilizes a 2^8 lookup table holding the bit-reversed</span>
+<a name="l00336"></a>00336 <span class="comment">// values of [0..2^8 - 1]. Those values can also be computed on the fly at a slightly higher cost.</span>
+<a name="l00337"></a>00337 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00338"></a>00338 <span class="keyword">const</span> T reverse<T>::byte_table[256] = {
+<a name="l00339"></a>00339 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
+<a name="l00340"></a>00340 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
+<a name="l00341"></a>00341 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
+<a name="l00342"></a>00342 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
+<a name="l00343"></a>00343 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
+<a name="l00344"></a>00344 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
+<a name="l00345"></a>00345 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
+<a name="l00346"></a>00346 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
+<a name="l00347"></a>00347 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
+<a name="l00348"></a>00348 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
+<a name="l00349"></a>00349 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
+<a name="l00350"></a>00350 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
+<a name="l00351"></a>00351 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
+<a name="l00352"></a>00352 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
+<a name="l00353"></a>00353 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
+<a name="l00354"></a>00354 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
+<a name="l00355"></a>00355 };
+<a name="l00356"></a>00356
+<a name="l00357"></a>00357 } <span class="comment">// namespace internal</span>
+<a name="l00358"></a>00358 } <span class="comment">// namespace tbb</span>
+<a name="l00359"></a>00359
+<a name="l00360"></a>00360 <span class="preprocessor">#ifndef __TBB_CompareAndSwap1</span>
+<a name="l00361"></a>00361 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap1 tbb::internal::__TBB_CompareAndSwapGeneric<1,uint8_t></span>
+<a name="l00362"></a>00362 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00363"></a>00363 <span class="preprocessor"></span>
+<a name="l00364"></a>00364 <span class="preprocessor">#ifndef __TBB_CompareAndSwap2 </span>
+<a name="l00365"></a>00365 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap2 tbb::internal::__TBB_CompareAndSwapGeneric<2,uint16_t></span>
+<a name="l00366"></a>00366 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00367"></a>00367 <span class="preprocessor"></span>
+<a name="l00368"></a>00368 <span class="preprocessor">#ifndef __TBB_CompareAndSwapW</span>
+<a name="l00369"></a>00369 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwapW tbb::internal::__TBB_CompareAndSwapGeneric<sizeof(ptrdiff_t),ptrdiff_t></span>
+<a name="l00370"></a>00370 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00371"></a>00371 <span class="preprocessor"></span>
+<a name="l00372"></a>00372 <span class="preprocessor">#ifndef __TBB_FetchAndAdd1</span>
+<a name="l00373"></a>00373 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd1 tbb::internal::__TBB_FetchAndAddGeneric<1,uint8_t></span>
+<a name="l00374"></a>00374 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00375"></a>00375 <span class="preprocessor"></span>
+<a name="l00376"></a>00376 <span class="preprocessor">#ifndef __TBB_FetchAndAdd2</span>
+<a name="l00377"></a>00377 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd2 tbb::internal::__TBB_FetchAndAddGeneric<2,uint16_t></span>
+<a name="l00378"></a>00378 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00379"></a>00379 <span class="preprocessor"></span>
+<a name="l00380"></a>00380 <span class="preprocessor">#ifndef __TBB_FetchAndAdd4</span>
+<a name="l00381"></a>00381 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd4 tbb::internal::__TBB_FetchAndAddGeneric<4,uint32_t></span>
+<a name="l00382"></a>00382 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00383"></a>00383 <span class="preprocessor"></span>
+<a name="l00384"></a>00384 <span class="preprocessor">#ifndef __TBB_FetchAndAdd8</span>
+<a name="l00385"></a>00385 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd8 tbb::internal::__TBB_FetchAndAddGeneric<8,uint64_t></span>
+<a name="l00386"></a>00386 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00387"></a>00387 <span class="preprocessor"></span>
+<a name="l00388"></a>00388 <span class="preprocessor">#ifndef __TBB_FetchAndAddW</span>
+<a name="l00389"></a>00389 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAddW tbb::internal::__TBB_FetchAndAddGeneric<sizeof(ptrdiff_t),ptrdiff_t></span>
+<a name="l00390"></a>00390 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00391"></a>00391 <span class="preprocessor"></span>
+<a name="l00392"></a>00392 <span class="preprocessor">#ifndef __TBB_FetchAndStore1</span>
+<a name="l00393"></a>00393 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore1 tbb::internal::__TBB_FetchAndStoreGeneric<1,uint8_t></span>
+<a name="l00394"></a>00394 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00395"></a>00395 <span class="preprocessor"></span>
+<a name="l00396"></a>00396 <span class="preprocessor">#ifndef __TBB_FetchAndStore2</span>
+<a name="l00397"></a>00397 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore2 tbb::internal::__TBB_FetchAndStoreGeneric<2,uint16_t></span>
+<a name="l00398"></a>00398 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00399"></a>00399 <span class="preprocessor"></span>
-<a name="l00400"></a>00400 <span class="preprocessor">#ifndef __TBB_CompareAndSwap1__TBB_full_fence</span>
-<a name="l00401"></a>00401 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap1__TBB_full_fence __TBB_CompareAndSwap1</span>
-<a name="l00402"></a>00402 <span class="preprocessor"></span><span class="preprocessor">#endif </span>
-<a name="l00403"></a>00403 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap1acquire</span>
-<a name="l00404"></a>00404 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap1acquire __TBB_CompareAndSwap1__TBB_full_fence</span>
-<a name="l00405"></a>00405 <span class="preprocessor"></span><span class="preprocessor">#endif </span>
-<a name="l00406"></a>00406 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap1release</span>
-<a name="l00407"></a>00407 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap1release __TBB_CompareAndSwap1__TBB_full_fence</span>
-<a name="l00408"></a>00408 <span class="preprocessor"></span><span class="preprocessor">#endif </span>
-<a name="l00409"></a>00409 <span class="preprocessor"></span>
-<a name="l00410"></a>00410 <span class="preprocessor">#ifndef __TBB_CompareAndSwap2__TBB_full_fence</span>
-<a name="l00411"></a>00411 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap2__TBB_full_fence __TBB_CompareAndSwap2</span>
-<a name="l00412"></a>00412 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00413"></a>00413 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap2acquire</span>
-<a name="l00414"></a>00414 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap2acquire __TBB_CompareAndSwap2__TBB_full_fence</span>
-<a name="l00415"></a>00415 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00416"></a>00416 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap2release</span>
-<a name="l00417"></a>00417 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap2release __TBB_CompareAndSwap2__TBB_full_fence</span>
-<a name="l00418"></a>00418 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00419"></a>00419 <span class="preprocessor"></span>
-<a name="l00420"></a>00420 <span class="preprocessor">#ifndef __TBB_CompareAndSwap4__TBB_full_fence</span>
-<a name="l00421"></a>00421 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap4__TBB_full_fence __TBB_CompareAndSwap4</span>
+<a name="l00400"></a>00400 <span class="preprocessor">#ifndef __TBB_FetchAndStore4</span>
+<a name="l00401"></a>00401 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore4 tbb::internal::__TBB_FetchAndStoreGeneric<4,uint32_t></span>
+<a name="l00402"></a>00402 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00403"></a>00403 <span class="preprocessor"></span>
+<a name="l00404"></a>00404 <span class="preprocessor">#ifndef __TBB_FetchAndStore8</span>
+<a name="l00405"></a>00405 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore8 tbb::internal::__TBB_FetchAndStoreGeneric<8,uint64_t></span>
+<a name="l00406"></a>00406 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00407"></a>00407 <span class="preprocessor"></span>
+<a name="l00408"></a>00408 <span class="preprocessor">#ifndef __TBB_FetchAndStoreW</span>
+<a name="l00409"></a>00409 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStoreW tbb::internal::__TBB_FetchAndStoreGeneric<sizeof(ptrdiff_t),ptrdiff_t></span>
+<a name="l00410"></a>00410 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00411"></a>00411 <span class="preprocessor"></span>
+<a name="l00412"></a>00412 <span class="preprocessor">#if __TBB_DECL_FENCED_ATOMICS</span>
+<a name="l00413"></a>00413 <span class="preprocessor"></span>
+<a name="l00414"></a>00414 <span class="preprocessor">#ifndef __TBB_CompareAndSwap1__TBB_full_fence</span>
+<a name="l00415"></a>00415 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap1__TBB_full_fence __TBB_CompareAndSwap1</span>
+<a name="l00416"></a>00416 <span class="preprocessor"></span><span class="preprocessor">#endif </span>
+<a name="l00417"></a>00417 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap1acquire</span>
+<a name="l00418"></a>00418 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap1acquire __TBB_CompareAndSwap1__TBB_full_fence</span>
+<a name="l00419"></a>00419 <span class="preprocessor"></span><span class="preprocessor">#endif </span>
+<a name="l00420"></a>00420 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap1release</span>
+<a name="l00421"></a>00421 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap1release __TBB_CompareAndSwap1__TBB_full_fence</span>
<a name="l00422"></a>00422 <span class="preprocessor"></span><span class="preprocessor">#endif </span>
-<a name="l00423"></a>00423 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap4acquire</span>
-<a name="l00424"></a>00424 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap4acquire __TBB_CompareAndSwap4__TBB_full_fence</span>
-<a name="l00425"></a>00425 <span class="preprocessor"></span><span class="preprocessor">#endif </span>
-<a name="l00426"></a>00426 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap4release</span>
-<a name="l00427"></a>00427 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap4release __TBB_CompareAndSwap4__TBB_full_fence</span>
-<a name="l00428"></a>00428 <span class="preprocessor"></span><span class="preprocessor">#endif </span>
-<a name="l00429"></a>00429 <span class="preprocessor"></span>
-<a name="l00430"></a>00430 <span class="preprocessor">#ifndef __TBB_CompareAndSwap8__TBB_full_fence</span>
-<a name="l00431"></a>00431 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap8__TBB_full_fence __TBB_CompareAndSwap8</span>
+<a name="l00423"></a>00423 <span class="preprocessor"></span>
+<a name="l00424"></a>00424 <span class="preprocessor">#ifndef __TBB_CompareAndSwap2__TBB_full_fence</span>
+<a name="l00425"></a>00425 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap2__TBB_full_fence __TBB_CompareAndSwap2</span>
+<a name="l00426"></a>00426 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00427"></a>00427 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap2acquire</span>
+<a name="l00428"></a>00428 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap2acquire __TBB_CompareAndSwap2__TBB_full_fence</span>
+<a name="l00429"></a>00429 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00430"></a>00430 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap2release</span>
+<a name="l00431"></a>00431 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap2release __TBB_CompareAndSwap2__TBB_full_fence</span>
<a name="l00432"></a>00432 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00433"></a>00433 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap8acquire</span>
-<a name="l00434"></a>00434 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap8acquire __TBB_CompareAndSwap8__TBB_full_fence</span>
-<a name="l00435"></a>00435 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00436"></a>00436 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap8release</span>
-<a name="l00437"></a>00437 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap8release __TBB_CompareAndSwap8__TBB_full_fence</span>
-<a name="l00438"></a>00438 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00439"></a>00439 <span class="preprocessor"></span>
-<a name="l00440"></a>00440 <span class="preprocessor">#ifndef __TBB_FetchAndAdd1__TBB_full_fence</span>
-<a name="l00441"></a>00441 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd1__TBB_full_fence __TBB_FetchAndAdd1</span>
-<a name="l00442"></a>00442 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00443"></a>00443 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd1acquire</span>
-<a name="l00444"></a>00444 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd1acquire __TBB_FetchAndAdd1__TBB_full_fence</span>
-<a name="l00445"></a>00445 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00446"></a>00446 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd1release</span>
-<a name="l00447"></a>00447 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd1release __TBB_FetchAndAdd1__TBB_full_fence</span>
-<a name="l00448"></a>00448 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00449"></a>00449 <span class="preprocessor"></span>
-<a name="l00450"></a>00450 <span class="preprocessor">#ifndef __TBB_FetchAndAdd2__TBB_full_fence</span>
-<a name="l00451"></a>00451 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd2__TBB_full_fence __TBB_FetchAndAdd2</span>
+<a name="l00433"></a>00433 <span class="preprocessor"></span>
+<a name="l00434"></a>00434 <span class="preprocessor">#ifndef __TBB_CompareAndSwap4__TBB_full_fence</span>
+<a name="l00435"></a>00435 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap4__TBB_full_fence __TBB_CompareAndSwap4</span>
+<a name="l00436"></a>00436 <span class="preprocessor"></span><span class="preprocessor">#endif </span>
+<a name="l00437"></a>00437 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap4acquire</span>
+<a name="l00438"></a>00438 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap4acquire __TBB_CompareAndSwap4__TBB_full_fence</span>
+<a name="l00439"></a>00439 <span class="preprocessor"></span><span class="preprocessor">#endif </span>
+<a name="l00440"></a>00440 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap4release</span>
+<a name="l00441"></a>00441 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap4release __TBB_CompareAndSwap4__TBB_full_fence</span>
+<a name="l00442"></a>00442 <span class="preprocessor"></span><span class="preprocessor">#endif </span>
+<a name="l00443"></a>00443 <span class="preprocessor"></span>
+<a name="l00444"></a>00444 <span class="preprocessor">#ifndef __TBB_CompareAndSwap8__TBB_full_fence</span>
+<a name="l00445"></a>00445 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap8__TBB_full_fence __TBB_CompareAndSwap8</span>
+<a name="l00446"></a>00446 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00447"></a>00447 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap8acquire</span>
+<a name="l00448"></a>00448 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap8acquire __TBB_CompareAndSwap8__TBB_full_fence</span>
+<a name="l00449"></a>00449 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00450"></a>00450 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap8release</span>
+<a name="l00451"></a>00451 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap8release __TBB_CompareAndSwap8__TBB_full_fence</span>
<a name="l00452"></a>00452 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00453"></a>00453 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd2acquire</span>
-<a name="l00454"></a>00454 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd2acquire __TBB_FetchAndAdd2__TBB_full_fence</span>
-<a name="l00455"></a>00455 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00456"></a>00456 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd2release</span>
-<a name="l00457"></a>00457 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd2release __TBB_FetchAndAdd2__TBB_full_fence</span>
-<a name="l00458"></a>00458 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00459"></a>00459 <span class="preprocessor"></span>
-<a name="l00460"></a>00460 <span class="preprocessor">#ifndef __TBB_FetchAndAdd4__TBB_full_fence</span>
-<a name="l00461"></a>00461 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd4__TBB_full_fence __TBB_FetchAndAdd4</span>
+<a name="l00453"></a>00453 <span class="preprocessor"></span>
+<a name="l00454"></a>00454 <span class="preprocessor">#ifndef __TBB_FetchAndAdd1__TBB_full_fence</span>
+<a name="l00455"></a>00455 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd1__TBB_full_fence __TBB_FetchAndAdd1</span>
+<a name="l00456"></a>00456 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00457"></a>00457 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd1acquire</span>
+<a name="l00458"></a>00458 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd1acquire __TBB_FetchAndAdd1__TBB_full_fence</span>
+<a name="l00459"></a>00459 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00460"></a>00460 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd1release</span>
+<a name="l00461"></a>00461 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd1release __TBB_FetchAndAdd1__TBB_full_fence</span>
<a name="l00462"></a>00462 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00463"></a>00463 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd4acquire</span>
-<a name="l00464"></a>00464 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd4acquire __TBB_FetchAndAdd4__TBB_full_fence</span>
-<a name="l00465"></a>00465 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00466"></a>00466 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd4release</span>
-<a name="l00467"></a>00467 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd4release __TBB_FetchAndAdd4__TBB_full_fence</span>
-<a name="l00468"></a>00468 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00469"></a>00469 <span class="preprocessor"></span>
-<a name="l00470"></a>00470 <span class="preprocessor">#ifndef __TBB_FetchAndAdd8__TBB_full_fence</span>
-<a name="l00471"></a>00471 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd8__TBB_full_fence __TBB_FetchAndAdd8</span>
+<a name="l00463"></a>00463 <span class="preprocessor"></span>
+<a name="l00464"></a>00464 <span class="preprocessor">#ifndef __TBB_FetchAndAdd2__TBB_full_fence</span>
+<a name="l00465"></a>00465 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd2__TBB_full_fence __TBB_FetchAndAdd2</span>
+<a name="l00466"></a>00466 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00467"></a>00467 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd2acquire</span>
+<a name="l00468"></a>00468 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd2acquire __TBB_FetchAndAdd2__TBB_full_fence</span>
+<a name="l00469"></a>00469 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00470"></a>00470 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd2release</span>
+<a name="l00471"></a>00471 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd2release __TBB_FetchAndAdd2__TBB_full_fence</span>
<a name="l00472"></a>00472 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00473"></a>00473 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd8acquire</span>
-<a name="l00474"></a>00474 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd8acquire __TBB_FetchAndAdd8__TBB_full_fence</span>
-<a name="l00475"></a>00475 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00476"></a>00476 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd8release</span>
-<a name="l00477"></a>00477 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd8release __TBB_FetchAndAdd8__TBB_full_fence</span>
-<a name="l00478"></a>00478 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00479"></a>00479 <span class="preprocessor"></span>
-<a name="l00480"></a>00480 <span class="preprocessor">#ifndef __TBB_FetchAndStore1__TBB_full_fence</span>
-<a name="l00481"></a>00481 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore1__TBB_full_fence __TBB_FetchAndStore1</span>
+<a name="l00473"></a>00473 <span class="preprocessor"></span>
+<a name="l00474"></a>00474 <span class="preprocessor">#ifndef __TBB_FetchAndAdd4__TBB_full_fence</span>
+<a name="l00475"></a>00475 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd4__TBB_full_fence __TBB_FetchAndAdd4</span>
+<a name="l00476"></a>00476 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00477"></a>00477 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd4acquire</span>
+<a name="l00478"></a>00478 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd4acquire __TBB_FetchAndAdd4__TBB_full_fence</span>
+<a name="l00479"></a>00479 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00480"></a>00480 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd4release</span>
+<a name="l00481"></a>00481 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd4release __TBB_FetchAndAdd4__TBB_full_fence</span>
<a name="l00482"></a>00482 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00483"></a>00483 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore1acquire</span>
-<a name="l00484"></a>00484 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore1acquire __TBB_FetchAndStore1__TBB_full_fence</span>
-<a name="l00485"></a>00485 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00486"></a>00486 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore1release</span>
-<a name="l00487"></a>00487 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore1release __TBB_FetchAndStore1__TBB_full_fence</span>
-<a name="l00488"></a>00488 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00489"></a>00489 <span class="preprocessor"></span>
-<a name="l00490"></a>00490 <span class="preprocessor">#ifndef __TBB_FetchAndStore2__TBB_full_fence</span>
-<a name="l00491"></a>00491 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore2__TBB_full_fence __TBB_FetchAndStore2</span>
+<a name="l00483"></a>00483 <span class="preprocessor"></span>
+<a name="l00484"></a>00484 <span class="preprocessor">#ifndef __TBB_FetchAndAdd8__TBB_full_fence</span>
+<a name="l00485"></a>00485 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd8__TBB_full_fence __TBB_FetchAndAdd8</span>
+<a name="l00486"></a>00486 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00487"></a>00487 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd8acquire</span>
+<a name="l00488"></a>00488 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd8acquire __TBB_FetchAndAdd8__TBB_full_fence</span>
+<a name="l00489"></a>00489 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00490"></a>00490 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd8release</span>
+<a name="l00491"></a>00491 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd8release __TBB_FetchAndAdd8__TBB_full_fence</span>
<a name="l00492"></a>00492 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00493"></a>00493 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore2acquire</span>
-<a name="l00494"></a>00494 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore2acquire __TBB_FetchAndStore2__TBB_full_fence</span>
-<a name="l00495"></a>00495 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00496"></a>00496 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore2release</span>
-<a name="l00497"></a>00497 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore2release __TBB_FetchAndStore2__TBB_full_fence</span>
-<a name="l00498"></a>00498 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00499"></a>00499 <span class="preprocessor"></span>
-<a name="l00500"></a>00500 <span class="preprocessor">#ifndef __TBB_FetchAndStore4__TBB_full_fence</span>
-<a name="l00501"></a>00501 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore4__TBB_full_fence __TBB_FetchAndStore4</span>
+<a name="l00493"></a>00493 <span class="preprocessor"></span>
+<a name="l00494"></a>00494 <span class="preprocessor">#ifndef __TBB_FetchAndStore1__TBB_full_fence</span>
+<a name="l00495"></a>00495 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore1__TBB_full_fence __TBB_FetchAndStore1</span>
+<a name="l00496"></a>00496 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00497"></a>00497 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore1acquire</span>
+<a name="l00498"></a>00498 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore1acquire __TBB_FetchAndStore1__TBB_full_fence</span>
+<a name="l00499"></a>00499 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00500"></a>00500 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore1release</span>
+<a name="l00501"></a>00501 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore1release __TBB_FetchAndStore1__TBB_full_fence</span>
<a name="l00502"></a>00502 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00503"></a>00503 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore4acquire</span>
-<a name="l00504"></a>00504 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore4acquire __TBB_FetchAndStore4__TBB_full_fence</span>
-<a name="l00505"></a>00505 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00506"></a>00506 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore4release</span>
-<a name="l00507"></a>00507 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore4release __TBB_FetchAndStore4__TBB_full_fence</span>
-<a name="l00508"></a>00508 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00509"></a>00509 <span class="preprocessor"></span>
-<a name="l00510"></a>00510 <span class="preprocessor">#ifndef __TBB_FetchAndStore8__TBB_full_fence</span>
-<a name="l00511"></a>00511 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore8__TBB_full_fence __TBB_FetchAndStore8</span>
+<a name="l00503"></a>00503 <span class="preprocessor"></span>
+<a name="l00504"></a>00504 <span class="preprocessor">#ifndef __TBB_FetchAndStore2__TBB_full_fence</span>
+<a name="l00505"></a>00505 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore2__TBB_full_fence __TBB_FetchAndStore2</span>
+<a name="l00506"></a>00506 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00507"></a>00507 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore2acquire</span>
+<a name="l00508"></a>00508 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore2acquire __TBB_FetchAndStore2__TBB_full_fence</span>
+<a name="l00509"></a>00509 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00510"></a>00510 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore2release</span>
+<a name="l00511"></a>00511 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore2release __TBB_FetchAndStore2__TBB_full_fence</span>
<a name="l00512"></a>00512 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00513"></a>00513 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore8acquire</span>
-<a name="l00514"></a>00514 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore8acquire __TBB_FetchAndStore8__TBB_full_fence</span>
-<a name="l00515"></a>00515 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00516"></a>00516 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore8release</span>
-<a name="l00517"></a>00517 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore8release __TBB_FetchAndStore8__TBB_full_fence</span>
-<a name="l00518"></a>00518 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00519"></a>00519 <span class="preprocessor"></span>
-<a name="l00520"></a>00520 <span class="preprocessor">#endif // __TBB_DECL_FENCED_ATOMICS</span>
-<a name="l00521"></a>00521 <span class="preprocessor"></span>
-<a name="l00522"></a>00522 <span class="comment">// Special atomic functions</span>
-<a name="l00523"></a>00523 <span class="preprocessor">#ifndef __TBB_FetchAndAddWrelease</span>
-<a name="l00524"></a>00524 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAddWrelease __TBB_FetchAndAddW</span>
-<a name="l00525"></a>00525 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00526"></a>00526 <span class="preprocessor"></span>
-<a name="l00527"></a>00527 <span class="preprocessor">#ifndef __TBB_FetchAndIncrementWacquire</span>
-<a name="l00528"></a>00528 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndIncrementWacquire(P) __TBB_FetchAndAddW(P,1)</span>
+<a name="l00513"></a>00513 <span class="preprocessor"></span>
+<a name="l00514"></a>00514 <span class="preprocessor">#ifndef __TBB_FetchAndStore4__TBB_full_fence</span>
+<a name="l00515"></a>00515 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore4__TBB_full_fence __TBB_FetchAndStore4</span>
+<a name="l00516"></a>00516 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00517"></a>00517 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore4acquire</span>
+<a name="l00518"></a>00518 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore4acquire __TBB_FetchAndStore4__TBB_full_fence</span>
+<a name="l00519"></a>00519 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00520"></a>00520 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore4release</span>
+<a name="l00521"></a>00521 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore4release __TBB_FetchAndStore4__TBB_full_fence</span>
+<a name="l00522"></a>00522 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00523"></a>00523 <span class="preprocessor"></span>
+<a name="l00524"></a>00524 <span class="preprocessor">#ifndef __TBB_FetchAndStore8__TBB_full_fence</span>
+<a name="l00525"></a>00525 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore8__TBB_full_fence __TBB_FetchAndStore8</span>
+<a name="l00526"></a>00526 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00527"></a>00527 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore8acquire</span>
+<a name="l00528"></a>00528 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore8acquire __TBB_FetchAndStore8__TBB_full_fence</span>
<a name="l00529"></a>00529 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00530"></a>00530 <span class="preprocessor"></span>
-<a name="l00531"></a>00531 <span class="preprocessor">#ifndef __TBB_FetchAndDecrementWrelease</span>
-<a name="l00532"></a>00532 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndDecrementWrelease(P) __TBB_FetchAndAddW(P,(-1))</span>
-<a name="l00533"></a>00533 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00534"></a>00534 <span class="preprocessor"></span>
-<a name="l00535"></a>00535 <span class="preprocessor">#if __TBB_WORDSIZE==4</span>
-<a name="l00536"></a>00536 <span class="preprocessor"></span><span class="comment">// On 32-bit platforms, "atomic.h" requires definition of __TBB_Store8 and __TBB_Load8</span>
-<a name="l00537"></a>00537 <span class="preprocessor">#ifndef __TBB_Store8</span>
-<a name="l00538"></a>00538 <span class="preprocessor"></span><span class="keyword">inline</span> <span class="keywordtype">void</span> __TBB_Store8 (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, int64_t value) {
-<a name="l00539"></a>00539 <a class="code" href="a00145.html">tbb::internal::atomic_backoff</a> b;
-<a name="l00540"></a>00540 <span class="keywordflow">for</span>(;;) {
-<a name="l00541"></a>00541 int64_t result = *(int64_t *)ptr;
-<a name="l00542"></a>00542 <span class="keywordflow">if</span>( __TBB_CompareAndSwap8(ptr,value,result)==result ) <span class="keywordflow">break</span>;
-<a name="l00543"></a>00543 b.<a class="code" href="a00145.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>();
-<a name="l00544"></a>00544 }
-<a name="l00545"></a>00545 }
-<a name="l00546"></a>00546 <span class="preprocessor">#endif</span>
-<a name="l00547"></a>00547 <span class="preprocessor"></span>
-<a name="l00548"></a>00548 <span class="preprocessor">#ifndef __TBB_Load8</span>
-<a name="l00549"></a>00549 <span class="preprocessor"></span><span class="keyword">inline</span> int64_t __TBB_Load8 (<span class="keyword">const</span> <span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr) {
-<a name="l00550"></a>00550 int64_t result = *(int64_t *)ptr;
-<a name="l00551"></a>00551 result = __TBB_CompareAndSwap8((<span class="keyword">volatile</span> <span class="keywordtype">void</span> *)ptr,result,result);
-<a name="l00552"></a>00552 <span class="keywordflow">return</span> result;
-<a name="l00553"></a>00553 }
-<a name="l00554"></a>00554 <span class="preprocessor">#endif</span>
-<a name="l00555"></a>00555 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_WORDSIZE==4 */</span>
-<a name="l00556"></a>00556
-<a name="l00557"></a>00557 <span class="preprocessor">#ifndef __TBB_Log2</span>
-<a name="l00558"></a>00558 <span class="preprocessor"></span><span class="keyword">inline</span> intptr_t __TBB_Log2( uintptr_t x ) {
-<a name="l00559"></a>00559 <span class="keywordflow">if</span>( x==0 ) <span class="keywordflow">return</span> -1;
-<a name="l00560"></a>00560 intptr_t result = 0;
-<a name="l00561"></a>00561 uintptr_t tmp;
-<a name="l00562"></a>00562 <span class="preprocessor">#if __TBB_WORDSIZE>=8</span>
-<a name="l00563"></a>00563 <span class="preprocessor"></span> <span class="keywordflow">if</span>( (tmp = x>>32) ) { x=tmp; result += 32; }
-<a name="l00564"></a>00564 <span class="preprocessor">#endif</span>
-<a name="l00565"></a>00565 <span class="preprocessor"></span> <span class="keywordflow">if</span>( (tmp = x>>16) ) { x=tmp; result += 16; }
-<a name="l00566"></a>00566 <span class="keywordflow">if</span>( (tmp = x>>8) ) { x=tmp; result += 8; }
-<a name="l00567"></a>00567 <span class="keywordflow">if</span>( (tmp = x>>4) ) { x=tmp; result += 4; }
-<a name="l00568"></a>00568 <span class="keywordflow">if</span>( (tmp = x>>2) ) { x=tmp; result += 2; }
-<a name="l00569"></a>00569 <span class="keywordflow">return</span> (x&2)? result+1: result;
-<a name="l00570"></a>00570 }
-<a name="l00571"></a>00571 <span class="preprocessor">#endif</span>
-<a name="l00572"></a>00572 <span class="preprocessor"></span>
-<a name="l00573"></a>00573 <span class="preprocessor">#ifndef __TBB_AtomicOR</span>
-<a name="l00574"></a>00574 <span class="preprocessor"></span><span class="keyword">inline</span> <span class="keywordtype">void</span> __TBB_AtomicOR( <span class="keyword">volatile</span> <span class="keywordtype">void</span> *operand, uintptr_t addend ) {
-<a name="l00575"></a>00575 <a class="code" href="a00145.html">tbb::internal::atomic_backoff</a> b;
-<a name="l00576"></a>00576 <span class="keywordflow">for</span>(;;) {
-<a name="l00577"></a>00577 uintptr_t tmp = *(<span class="keyword">volatile</span> uintptr_t *)operand;
-<a name="l00578"></a>00578 uintptr_t result = __TBB_CompareAndSwapW(operand, tmp|addend, tmp);
-<a name="l00579"></a>00579 <span class="keywordflow">if</span>( result==tmp ) <span class="keywordflow">break</span>;
-<a name="l00580"></a>00580 b.<a class="code" href="a00145.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>();
-<a name="l00581"></a>00581 }
-<a name="l00582"></a>00582 }
-<a name="l00583"></a>00583 <span class="preprocessor">#endif</span>
-<a name="l00584"></a>00584 <span class="preprocessor"></span>
-<a name="l00585"></a>00585 <span class="preprocessor">#ifndef __TBB_AtomicAND</span>
-<a name="l00586"></a>00586 <span class="preprocessor"></span><span class="keyword">inline</span> <span class="keywordtype">void</span> __TBB_AtomicAND( <span class="keyword">volatile</span> <span class="keywordtype">void</span> *operand, uintptr_t addend ) {
-<a name="l00587"></a>00587 <a class="code" href="a00145.html">tbb::internal::atomic_backoff</a> b;
-<a name="l00588"></a>00588 <span class="keywordflow">for</span>(;;) {
-<a name="l00589"></a>00589 uintptr_t tmp = *(<span class="keyword">volatile</span> uintptr_t *)operand;
-<a name="l00590"></a>00590 uintptr_t result = __TBB_CompareAndSwapW(operand, tmp&addend, tmp);
-<a name="l00591"></a>00591 <span class="keywordflow">if</span>( result==tmp ) <span class="keywordflow">break</span>;
-<a name="l00592"></a>00592 b.<a class="code" href="a00145.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>();
-<a name="l00593"></a>00593 }
-<a name="l00594"></a>00594 }
-<a name="l00595"></a>00595 <span class="preprocessor">#endif</span>
-<a name="l00596"></a>00596 <span class="preprocessor"></span>
-<a name="l00597"></a>00597 <span class="preprocessor">#ifndef __TBB_TryLockByte</span>
-<a name="l00598"></a>00598 <span class="preprocessor"></span><span class="keyword">inline</span> <span class="keywordtype">bool</span> __TBB_TryLockByte( <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> &flag ) {
-<a name="l00599"></a>00599 <span class="keywordflow">return</span> __TBB_CompareAndSwap1(&flag,1,0)==0;
-<a name="l00600"></a>00600 }
-<a name="l00601"></a>00601 <span class="preprocessor">#endif</span>
-<a name="l00602"></a>00602 <span class="preprocessor"></span>
-<a name="l00603"></a>00603 <span class="preprocessor">#ifndef __TBB_LockByte</span>
-<a name="l00604"></a>00604 <span class="preprocessor"></span><span class="keyword">inline</span> uintptr_t __TBB_LockByte( <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>& flag ) {
-<a name="l00605"></a>00605 <span class="keywordflow">if</span> ( !__TBB_TryLockByte(flag) ) {
-<a name="l00606"></a>00606 <a class="code" href="a00145.html">tbb::internal::atomic_backoff</a> b;
-<a name="l00607"></a>00607 <span class="keywordflow">do</span> {
-<a name="l00608"></a>00608 b.<a class="code" href="a00145.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>();
-<a name="l00609"></a>00609 } <span class="keywordflow">while</span> ( !__TBB_TryLockByte(flag) );
-<a name="l00610"></a>00610 }
-<a name="l00611"></a>00611 <span class="keywordflow">return</span> 0;
-<a name="l00612"></a>00612 }
-<a name="l00613"></a>00613 <span class="preprocessor">#endif</span>
-<a name="l00614"></a>00614 <span class="preprocessor"></span>
-<a name="l00615"></a>00615 <span class="preprocessor">#ifndef __TBB_ReverseByte</span>
-<a name="l00616"></a>00616 <span class="preprocessor"></span><span class="keyword">inline</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> __TBB_ReverseByte(<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> src) {
-<a name="l00617"></a>00617 <span class="keywordflow">return</span> tbb::internal::reverse<unsigned char>::byte_table[src];
-<a name="l00618"></a>00618 }
-<a name="l00619"></a>00619 <span class="preprocessor">#endif</span>
-<a name="l00620"></a>00620 <span class="preprocessor"></span>
-<a name="l00621"></a>00621 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00622"></a>00622 T __TBB_ReverseBits(T src)
-<a name="l00623"></a>00623 {
-<a name="l00624"></a>00624 T dst;
-<a name="l00625"></a>00625 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *original = (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) &src;
-<a name="l00626"></a>00626 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *reversed = (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) &dst;
-<a name="l00627"></a>00627
-<a name="l00628"></a>00628 <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i = <span class="keyword">sizeof</span>(T)-1; i >= 0; i-- )
-<a name="l00629"></a>00629 reversed[i] = __TBB_ReverseByte( original[<span class="keyword">sizeof</span>(T)-i-1] );
-<a name="l00630"></a>00630
-<a name="l00631"></a>00631 <span class="keywordflow">return</span> dst;
+<a name="l00530"></a>00530 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore8release</span>
+<a name="l00531"></a>00531 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore8release __TBB_FetchAndStore8__TBB_full_fence</span>
+<a name="l00532"></a>00532 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00533"></a>00533 <span class="preprocessor"></span>
+<a name="l00534"></a>00534 <span class="preprocessor">#endif // __TBB_DECL_FENCED_ATOMICS</span>
+<a name="l00535"></a>00535 <span class="preprocessor"></span>
+<a name="l00536"></a>00536 <span class="comment">// Special atomic functions</span>
+<a name="l00537"></a>00537 <span class="preprocessor">#ifndef __TBB_FetchAndAddWrelease</span>
+<a name="l00538"></a>00538 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAddWrelease __TBB_FetchAndAddW</span>
+<a name="l00539"></a>00539 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00540"></a>00540 <span class="preprocessor"></span>
+<a name="l00541"></a>00541 <span class="preprocessor">#ifndef __TBB_FetchAndIncrementWacquire</span>
+<a name="l00542"></a>00542 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndIncrementWacquire(P) __TBB_FetchAndAddW(P,1)</span>
+<a name="l00543"></a>00543 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00544"></a>00544 <span class="preprocessor"></span>
+<a name="l00545"></a>00545 <span class="preprocessor">#ifndef __TBB_FetchAndDecrementWrelease</span>
+<a name="l00546"></a>00546 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndDecrementWrelease(P) __TBB_FetchAndAddW(P,(-1))</span>
+<a name="l00547"></a>00547 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00548"></a>00548 <span class="preprocessor"></span>
+<a name="l00549"></a>00549 <span class="preprocessor">#if __TBB_WORDSIZE==4</span>
+<a name="l00550"></a>00550 <span class="preprocessor"></span><span class="comment">// On 32-bit platforms, "atomic.h" requires definition of __TBB_Store8 and __TBB_Load8</span>
+<a name="l00551"></a>00551 <span class="preprocessor">#ifndef __TBB_Store8</span>
+<a name="l00552"></a>00552 <span class="preprocessor"></span><span class="keyword">inline</span> <span class="keywordtype">void</span> __TBB_Store8 (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, int64_t value) {
+<a name="l00553"></a>00553 <a class="code" href="a00144.html">tbb::internal::atomic_backoff</a> b;
+<a name="l00554"></a>00554 <span class="keywordflow">for</span>(;;) {
+<a name="l00555"></a>00555 int64_t result = *(int64_t *)ptr;
+<a name="l00556"></a>00556 <span class="keywordflow">if</span>( __TBB_CompareAndSwap8(ptr,value,result)==result ) <span class="keywordflow">break</span>;
+<a name="l00557"></a>00557 b.<a class="code" href="a00144.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>();
+<a name="l00558"></a>00558 }
+<a name="l00559"></a>00559 }
+<a name="l00560"></a>00560 <span class="preprocessor">#endif</span>
+<a name="l00561"></a>00561 <span class="preprocessor"></span>
+<a name="l00562"></a>00562 <span class="preprocessor">#ifndef __TBB_Load8</span>
+<a name="l00563"></a>00563 <span class="preprocessor"></span><span class="keyword">inline</span> int64_t __TBB_Load8 (<span class="keyword">const</span> <span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr) {
+<a name="l00564"></a>00564 int64_t result = *(int64_t *)ptr;
+<a name="l00565"></a>00565 result = __TBB_CompareAndSwap8((<span class="keyword">volatile</span> <span class="keywordtype">void</span> *)ptr,result,result);
+<a name="l00566"></a>00566 <span class="keywordflow">return</span> result;
+<a name="l00567"></a>00567 }
+<a name="l00568"></a>00568 <span class="preprocessor">#endif</span>
+<a name="l00569"></a>00569 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_WORDSIZE==4 */</span>
+<a name="l00570"></a>00570
+<a name="l00571"></a>00571 <span class="preprocessor">#ifndef __TBB_Log2</span>
+<a name="l00572"></a>00572 <span class="preprocessor"></span><span class="keyword">inline</span> intptr_t __TBB_Log2( uintptr_t x ) {
+<a name="l00573"></a>00573 <span class="keywordflow">if</span>( x==0 ) <span class="keywordflow">return</span> -1;
+<a name="l00574"></a>00574 intptr_t result = 0;
+<a name="l00575"></a>00575 uintptr_t tmp;
+<a name="l00576"></a>00576 <span class="preprocessor">#if __TBB_WORDSIZE>=8</span>
+<a name="l00577"></a>00577 <span class="preprocessor"></span> <span class="keywordflow">if</span>( (tmp = x>>32) ) { x=tmp; result += 32; }
+<a name="l00578"></a>00578 <span class="preprocessor">#endif</span>
+<a name="l00579"></a>00579 <span class="preprocessor"></span> <span class="keywordflow">if</span>( (tmp = x>>16) ) { x=tmp; result += 16; }
+<a name="l00580"></a>00580 <span class="keywordflow">if</span>( (tmp = x>>8) ) { x=tmp; result += 8; }
+<a name="l00581"></a>00581 <span class="keywordflow">if</span>( (tmp = x>>4) ) { x=tmp; result += 4; }
+<a name="l00582"></a>00582 <span class="keywordflow">if</span>( (tmp = x>>2) ) { x=tmp; result += 2; }
+<a name="l00583"></a>00583 <span class="keywordflow">return</span> (x&2)? result+1: result;
+<a name="l00584"></a>00584 }
+<a name="l00585"></a>00585 <span class="preprocessor">#endif</span>
+<a name="l00586"></a>00586 <span class="preprocessor"></span>
+<a name="l00587"></a>00587 <span class="preprocessor">#ifndef __TBB_AtomicOR</span>
+<a name="l00588"></a>00588 <span class="preprocessor"></span><span class="keyword">inline</span> <span class="keywordtype">void</span> __TBB_AtomicOR( <span class="keyword">volatile</span> <span class="keywordtype">void</span> *operand, uintptr_t addend ) {
+<a name="l00589"></a>00589 <a class="code" href="a00144.html">tbb::internal::atomic_backoff</a> b;
+<a name="l00590"></a>00590 <span class="keywordflow">for</span>(;;) {
+<a name="l00591"></a>00591 uintptr_t tmp = *(<span class="keyword">volatile</span> uintptr_t *)operand;
+<a name="l00592"></a>00592 uintptr_t result = __TBB_CompareAndSwapW(operand, tmp|addend, tmp);
+<a name="l00593"></a>00593 <span class="keywordflow">if</span>( result==tmp ) <span class="keywordflow">break</span>;
+<a name="l00594"></a>00594 b.<a class="code" href="a00144.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>();
+<a name="l00595"></a>00595 }
+<a name="l00596"></a>00596 }
+<a name="l00597"></a>00597 <span class="preprocessor">#endif</span>
+<a name="l00598"></a>00598 <span class="preprocessor"></span>
+<a name="l00599"></a>00599 <span class="preprocessor">#ifndef __TBB_AtomicAND</span>
+<a name="l00600"></a>00600 <span class="preprocessor"></span><span class="keyword">inline</span> <span class="keywordtype">void</span> __TBB_AtomicAND( <span class="keyword">volatile</span> <span class="keywordtype">void</span> *operand, uintptr_t addend ) {
+<a name="l00601"></a>00601 <a class="code" href="a00144.html">tbb::internal::atomic_backoff</a> b;
+<a name="l00602"></a>00602 <span class="keywordflow">for</span>(;;) {
+<a name="l00603"></a>00603 uintptr_t tmp = *(<span class="keyword">volatile</span> uintptr_t *)operand;
+<a name="l00604"></a>00604 uintptr_t result = __TBB_CompareAndSwapW(operand, tmp&addend, tmp);
+<a name="l00605"></a>00605 <span class="keywordflow">if</span>( result==tmp ) <span class="keywordflow">break</span>;
+<a name="l00606"></a>00606 b.<a class="code" href="a00144.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>();
+<a name="l00607"></a>00607 }
+<a name="l00608"></a>00608 }
+<a name="l00609"></a>00609 <span class="preprocessor">#endif</span>
+<a name="l00610"></a>00610 <span class="preprocessor"></span>
+<a name="l00611"></a>00611 <span class="preprocessor">#ifndef __TBB_TryLockByte</span>
+<a name="l00612"></a>00612 <span class="preprocessor"></span><span class="keyword">inline</span> <span class="keywordtype">bool</span> __TBB_TryLockByte( <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> &flag ) {
+<a name="l00613"></a>00613 <span class="keywordflow">return</span> __TBB_CompareAndSwap1(&flag,1,0)==0;
+<a name="l00614"></a>00614 }
+<a name="l00615"></a>00615 <span class="preprocessor">#endif</span>
+<a name="l00616"></a>00616 <span class="preprocessor"></span>
+<a name="l00617"></a>00617 <span class="preprocessor">#ifndef __TBB_LockByte</span>
+<a name="l00618"></a>00618 <span class="preprocessor"></span><span class="keyword">inline</span> uintptr_t __TBB_LockByte( <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>& flag ) {
+<a name="l00619"></a>00619 <span class="keywordflow">if</span> ( !__TBB_TryLockByte(flag) ) {
+<a name="l00620"></a>00620 <a class="code" href="a00144.html">tbb::internal::atomic_backoff</a> b;
+<a name="l00621"></a>00621 <span class="keywordflow">do</span> {
+<a name="l00622"></a>00622 b.<a class="code" href="a00144.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>();
+<a name="l00623"></a>00623 } <span class="keywordflow">while</span> ( !__TBB_TryLockByte(flag) );
+<a name="l00624"></a>00624 }
+<a name="l00625"></a>00625 <span class="keywordflow">return</span> 0;
+<a name="l00626"></a>00626 }
+<a name="l00627"></a>00627 <span class="preprocessor">#endif</span>
+<a name="l00628"></a>00628 <span class="preprocessor"></span>
+<a name="l00629"></a>00629 <span class="preprocessor">#ifndef __TBB_ReverseByte</span>
+<a name="l00630"></a>00630 <span class="preprocessor"></span><span class="keyword">inline</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> __TBB_ReverseByte(<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> src) {
+<a name="l00631"></a>00631 <span class="keywordflow">return</span> tbb::internal::reverse<unsigned char>::byte_table[src];
<a name="l00632"></a>00632 }
-<a name="l00633"></a>00633
-<a name="l00634"></a>00634 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_machine_H */</span>
+<a name="l00633"></a>00633 <span class="preprocessor">#endif</span>
+<a name="l00634"></a>00634 <span class="preprocessor"></span>
+<a name="l00635"></a>00635 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00636"></a>00636 T __TBB_ReverseBits(T src)
+<a name="l00637"></a>00637 {
+<a name="l00638"></a>00638 T dst;
+<a name="l00639"></a>00639 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *original = (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) &src;
+<a name="l00640"></a>00640 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *reversed = (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) &dst;
+<a name="l00641"></a>00641
+<a name="l00642"></a>00642 <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i = <span class="keyword">sizeof</span>(T)-1; i >= 0; i-- )
+<a name="l00643"></a>00643 reversed[i] = __TBB_ReverseByte( original[<span class="keyword">sizeof</span>(T)-i-1] );
+<a name="l00644"></a>00644
+<a name="l00645"></a>00645 <span class="keywordflow">return</span> dst;
+<a name="l00646"></a>00646 }
+<a name="l00647"></a>00647
+<a name="l00648"></a>00648 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_machine_H */</span>
</pre></div><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00458.html b/doc/html/a00464.html
similarity index 100%
copy from doc/html/a00458.html
copy to doc/html/a00464.html
diff --git a/doc/html/a00459.html b/doc/html/a00465.html
similarity index 89%
copy from doc/html/a00459.html
copy to doc/html/a00465.html
index 2eb8a4a..3dc7ddf 100644
--- a/doc/html/a00459.html
+++ b/doc/html/a00465.html
@@ -200,44 +200,51 @@
<a name="l00262"></a>00262 <span class="keyword">inline</span> <span class="keywordtype">void</span> poison_pointer( T* ) {<span class="comment">/*do nothing*/</span>}
<a name="l00263"></a>00263 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
<a name="l00264"></a>00264
-<a name="l00266"></a>00266 <span class="keyword">class </span>no_assign {
-<a name="l00267"></a>00267 <span class="comment">// Deny assignment</span>
-<a name="l00268"></a>00268 <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> no_assign& );
-<a name="l00269"></a>00269 <span class="keyword">public</span>:
-<a name="l00270"></a>00270 <span class="preprocessor">#if __GNUC__</span>
-<a name="l00272"></a>00272 <span class="preprocessor"> no_assign() {}</span>
-<a name="l00273"></a>00273 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __GNUC__ */</span>
-<a name="l00274"></a>00274 };
-<a name="l00275"></a>00275
-<a name="l00277"></a>00277 <span class="keyword">class </span>no_copy: no_assign {
-<a name="l00279"></a>00279 no_copy( <span class="keyword">const</span> no_copy& );
-<a name="l00280"></a>00280 <span class="keyword">public</span>:
-<a name="l00282"></a>00282 no_copy() {}
+<a name="l00266"></a>00266
+<a name="l00268"></a>00268 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00269"></a>00269 <span class="keyword">inline</span> T punned_cast( U* ptr ) {
+<a name="l00270"></a>00270 uintptr_t x = reinterpret_cast<uintptr_t>(ptr);
+<a name="l00271"></a>00271 <span class="keywordflow">return</span> reinterpret_cast<T>(x);
+<a name="l00272"></a>00272 }
+<a name="l00273"></a>00273
+<a name="l00275"></a>00275 <span class="keyword">class </span>no_assign {
+<a name="l00276"></a>00276 <span class="comment">// Deny assignment</span>
+<a name="l00277"></a>00277 <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> no_assign& );
+<a name="l00278"></a>00278 <span class="keyword">public</span>:
+<a name="l00279"></a>00279 <span class="preprocessor">#if __GNUC__</span>
+<a name="l00281"></a>00281 <span class="preprocessor"> no_assign() {}</span>
+<a name="l00282"></a>00282 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __GNUC__ */</span>
<a name="l00283"></a>00283 };
<a name="l00284"></a>00284
-<a name="l00286"></a>00286 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00287"></a>00287 <span class="keyword">struct </span>allocator_type {
-<a name="l00288"></a>00288 <span class="keyword">typedef</span> T value_type;
-<a name="l00289"></a>00289 };
-<a name="l00290"></a>00290
-<a name="l00291"></a>00291 <span class="preprocessor">#if _MSC_VER</span>
-<a name="l00293"></a>00293 <span class="preprocessor">template<typename T></span>
-<a name="l00294"></a>00294 <span class="preprocessor"></span><span class="keyword">struct </span>allocator_type<const T> {
-<a name="l00295"></a>00295 <span class="keyword">typedef</span> T value_type;
-<a name="l00296"></a>00296 };
-<a name="l00297"></a>00297 <span class="preprocessor">#endif</span>
-<a name="l00298"></a>00298 <span class="preprocessor"></span>
-<a name="l00299"></a>00299 <span class="comment">// Struct to be used as a version tag for inline functions.</span>
-<a name="l00302"></a>00302 <span class="comment"></span><span class="keyword">struct </span>version_tag_v3 {};
-<a name="l00303"></a>00303
-<a name="l00304"></a>00304 <span class="keyword">typedef</span> version_tag_v3 version_tag;
-<a name="l00305"></a>00305
-<a name="l00306"></a>00306 } <span class="comment">// internal</span>
-<a name="l00308"></a>00308 <span class="comment"></span>
-<a name="l00309"></a>00309 } <span class="comment">// tbb</span>
-<a name="l00310"></a>00310
-<a name="l00311"></a>00311 <span class="preprocessor">#endif </span><span class="comment">/* RC_INVOKED */</span>
-<a name="l00312"></a>00312 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_tbb_stddef_H */</span>
+<a name="l00286"></a>00286 <span class="keyword">class </span>no_copy: no_assign {
+<a name="l00288"></a>00288 no_copy( <span class="keyword">const</span> no_copy& );
+<a name="l00289"></a>00289 <span class="keyword">public</span>:
+<a name="l00291"></a>00291 no_copy() {}
+<a name="l00292"></a>00292 };
+<a name="l00293"></a>00293
+<a name="l00295"></a>00295 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00296"></a>00296 <span class="keyword">struct </span>allocator_type {
+<a name="l00297"></a>00297 <span class="keyword">typedef</span> T value_type;
+<a name="l00298"></a>00298 };
+<a name="l00299"></a>00299
+<a name="l00300"></a>00300 <span class="preprocessor">#if _MSC_VER</span>
+<a name="l00302"></a>00302 <span class="preprocessor">template<typename T></span>
+<a name="l00303"></a>00303 <span class="preprocessor"></span><span class="keyword">struct </span>allocator_type<const T> {
+<a name="l00304"></a>00304 <span class="keyword">typedef</span> T value_type;
+<a name="l00305"></a>00305 };
+<a name="l00306"></a>00306 <span class="preprocessor">#endif</span>
+<a name="l00307"></a>00307 <span class="preprocessor"></span>
+<a name="l00308"></a>00308 <span class="comment">// Struct to be used as a version tag for inline functions.</span>
+<a name="l00311"></a>00311 <span class="comment"></span><span class="keyword">struct </span>version_tag_v3 {};
+<a name="l00312"></a>00312
+<a name="l00313"></a>00313 <span class="keyword">typedef</span> version_tag_v3 version_tag;
+<a name="l00314"></a>00314
+<a name="l00315"></a>00315 } <span class="comment">// internal</span>
+<a name="l00317"></a>00317 <span class="comment"></span>
+<a name="l00318"></a>00318 } <span class="comment">// tbb</span>
+<a name="l00319"></a>00319
+<a name="l00320"></a>00320 <span class="preprocessor">#endif </span><span class="comment">/* RC_INVOKED */</span>
+<a name="l00321"></a>00321 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_tbb_stddef_H */</span>
</pre></div><hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00466.html b/doc/html/a00472.html
similarity index 100%
rename from doc/html/a00466.html
rename to doc/html/a00472.html
diff --git a/doc/html/a00474.html b/doc/html/a00480.html
similarity index 100%
rename from doc/html/a00474.html
rename to doc/html/a00480.html
diff --git a/doc/html/a00476.html b/doc/html/a00482.html
similarity index 100%
rename from doc/html/a00476.html
rename to doc/html/a00482.html
diff --git a/doc/html/annotated.html b/doc/html/annotated.html
index 92e7cbc..bb8e3f7 100644
--- a/doc/html/annotated.html
+++ b/doc/html/annotated.html
@@ -21,33 +21,34 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<h1>Class List</h1>Here are the classes, structs, unions and interfaces with brief descriptions:<table>
- <tr><td class="indexkey"><a class="el" href="a00141.html">tbb::affinity_partitioner</a></td><td class="indexvalue">An affinity partitioner </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00142.html">tbb::aligned_space< T, N ></a></td><td class="indexvalue">Block of space aligned sufficiently to construct an array T with N elements </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00143.html">tbb::atomic< T ></a></td><td class="indexvalue">Primary template for atomic </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00144.html">tbb::atomic< void * ></a></td><td class="indexvalue">Specialization for <a class="el" href="a00144.html">atomic<void*></a>, for sake of not allowing arithmetic or operator-> </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00145.html">tbb::internal::atomic_backoff</a></td><td class="indexvalue">Class that implements exponential backoff </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00146.html">tbb::auto_partitioner</a></td><td class="indexvalue">An auto partitioner </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00147.html">tbb::bad_last_alloc</a></td><td class="indexvalue">Exception for concurrent containers </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00148.html">tbb::blocked_range< Value ></a></td><td class="indexvalue">A range over which to iterate </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00149.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td class="indexvalue">A 2-dimensional range that models the Range concept </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00150.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td class="indexvalue">A 3-dimensional range that models the Range concept </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00151.html">tbb::cache_aligned_allocator< T ></a></td><td class="indexvalue">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5 </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00152.html">tbb::cache_aligned_allocator< void ></a></td><td class="indexvalue">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1 </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00153.html">tbb::captured_exception</a></td><td class="indexvalue">This class is used by TBB to propagate information about unhandled exceptions into the root thread </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00154.html">tbb::combinable< T ></a></td><td class="indexvalue">Thread-local storage with optional reduction </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a></td><td class="indexvalue">A high-performance thread-safe blocking concurrent bounded queue </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td class="indexvalue">Unordered map from Key to T </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00157.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a></td><td class="indexvalue">Allows write access to elements and combines data access, locking, and garbage collection </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00158.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a></td><td class="indexvalue">Bucket accessor is to find, rehash, acquire a lock, and access a bucket </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00159.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td class="indexvalue">Combines data access, locking, and garbage collection </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td class="indexvalue">A high-performance thread-safe non-blocking concurrent queue </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00161.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td class="indexvalue">A high-performance thread-safe blocking concurrent bounded queue </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a></td><td class="indexvalue">Concurrent vector container </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00163.html">tbb::empty_task</a></td><td class="indexvalue">Task that does nothing. Useful for synchronization </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td class="indexvalue">The <a class="el" href="a00164.html">enumerable_thread_specific</a> container </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00165.html">tbb::filter</a></td><td class="indexvalue">A stage in a pipeline </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00166.html">tbb::interface5::filter_t< T, U ></a></td><td class="indexvalue">Class representing a chain of type-safe pipeline filters </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00167.html">tbb::final_scan_tag</a></td><td class="indexvalue">Used to indicate that the final scan is being performed </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00140.html">tbb::affinity_partitioner</a></td><td class="indexvalue">An affinity partitioner </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00141.html">tbb::aligned_space< T, N ></a></td><td class="indexvalue">Block of space aligned sufficiently to construct an array T with N elements </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00142.html">tbb::atomic< T ></a></td><td class="indexvalue">Primary template for atomic </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00143.html">tbb::atomic< void * ></a></td><td class="indexvalue">Specialization for <a class="el" href="a00143.html">atomic<void*></a>, for sake of not allowing arithmetic or operator-> </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00144.html">tbb::internal::atomic_backoff</a></td><td class="indexvalue">Class that implements exponential backoff </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00145.html">tbb::auto_partitioner</a></td><td class="indexvalue">An auto partitioner </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00146.html">tbb::bad_last_alloc</a></td><td class="indexvalue">Exception for concurrent containers </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00147.html">tbb::blocked_range< Value ></a></td><td class="indexvalue">A range over which to iterate </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00148.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td class="indexvalue">A 2-dimensional range that models the Range concept </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00149.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td class="indexvalue">A 3-dimensional range that models the Range concept </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00150.html">tbb::cache_aligned_allocator< T ></a></td><td class="indexvalue">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5 </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00151.html">tbb::cache_aligned_allocator< void ></a></td><td class="indexvalue">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1 </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00152.html">tbb::captured_exception</a></td><td class="indexvalue">This class is used by TBB to propagate information about unhandled exceptions into the root thread </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00153.html">tbb::combinable< T ></a></td><td class="indexvalue">Thread-local storage with optional reduction </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a></td><td class="indexvalue">A high-performance thread-safe blocking concurrent bounded queue </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td class="indexvalue">Unordered map from Key to T </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a></td><td class="indexvalue">Allows write access to elements and combines data access, locking, and garbage collection </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00157.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a></td><td class="indexvalue">Bucket accessor is to find, rehash, acquire a lock, and access a bucket </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00158.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td class="indexvalue">Combines data access, locking, and garbage collection </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00159.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td class="indexvalue">A high-performance thread-safe non-blocking concurrent queue </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00160.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td class="indexvalue">A high-performance thread-safe blocking concurrent bounded queue </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a></td><td class="indexvalue">Concurrent vector container </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00162.html">tbb::empty_task</a></td><td class="indexvalue">Task that does nothing. Useful for synchronization </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td class="indexvalue">The <a class="el" href="a00163.html">enumerable_thread_specific</a> container </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00164.html">tbb::filter</a></td><td class="indexvalue">A stage in a pipeline </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00165.html">tbb::interface5::filter_t< T, U ></a></td><td class="indexvalue">Class representing a chain of type-safe pipeline filters </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00166.html">tbb::final_scan_tag</a></td><td class="indexvalue">Used to indicate that the final scan is being performed </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00167.html">tbb::interface5::flow_control</a></td><td class="indexvalue">Input_filter control to signal end-of-input for parallel_pipeline </td></tr>
<tr><td class="indexkey"><a class="el" href="a00168.html">tbb::improper_lock</a></td><td class="indexvalue">Exception for PPL locks </td></tr>
<tr><td class="indexkey"><a class="el" href="a00169.html">tbb::invalid_multiple_scheduling</a></td><td class="indexvalue">Exception for repeated scheduling of the same task_handle </td></tr>
<tr><td class="indexkey"><a class="el" href="a00170.html">tbb::missing_wait</a></td><td class="indexvalue">Exception for missing wait on structured_task_group </td></tr>
@@ -60,7 +61,7 @@
<tr><td class="indexkey"><a class="el" href="a00177.html">tbb::null_rw_mutex::scoped_lock</a></td><td class="indexvalue">Represents acquisition of a mutex </td></tr>
<tr><td class="indexkey"><a class="el" href="a00178.html">tbb::parallel_do_feeder< Item ></a></td><td class="indexvalue">Class the user supplied algorithm body uses to add new tasks </td></tr>
<tr><td class="indexkey"><a class="el" href="a00179.html">tbb::parallel_while< Body ></a></td><td class="indexvalue">Parallel iteration over a stream, with optional addition of more work </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00180.html">tbb::pipeline</a></td><td class="indexvalue">A processing pipeling that applies filters to items </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00180.html">tbb::pipeline</a></td><td class="indexvalue">A processing pipeline that applies filters to items </td></tr>
<tr><td class="indexkey"><a class="el" href="a00181.html">tbb::pre_scan_tag</a></td><td class="indexvalue">Used to indicate that the initial scan is being performed </td></tr>
<tr><td class="indexkey"><a class="el" href="a00182.html">tbb::queuing_mutex</a></td><td class="indexvalue">Queuing lock with local-only spinning </td></tr>
<tr><td class="indexkey"><a class="el" href="a00183.html">tbb::queuing_mutex::scoped_lock</a></td><td class="indexvalue">The scoped locking pattern </td></tr>
diff --git a/doc/html/deprecated.html b/doc/html/deprecated.html
index 64f4a72..e1f5336 100644
--- a/doc/html/deprecated.html
+++ b/doc/html/deprecated.html
@@ -15,7 +15,7 @@
<li><a href="pages.html"><span>Related Pages</span></a></li>
</ul></div>
<h1><a class="anchor" name="deprecated">Deprecated List</a></h1><a class="anchor" name="_deprecated000001"></a> <dl>
-<dt>Member <a class="el" href="a00161.html#48da3536245318af6cb5fd58bac78039">tbb::deprecated::concurrent_queue::pop_if_present</a> (T &destination) </dt>
+<dt>Member <a class="el" href="a00160.html#48da3536245318af6cb5fd58bac78039">tbb::deprecated::concurrent_queue::pop_if_present</a> (T &destination) </dt>
<dd>Use try_pop() </dd>
</dl>
<hr>
diff --git a/doc/html/files.html b/doc/html/files.html
index 35b0b7f..73144ce 100644
--- a/doc/html/files.html
+++ b/doc/html/files.html
@@ -20,57 +20,57 @@
<li><a href="globals.html"><span>File Members</span></a></li>
</ul></div>
<h1>File List</h1>Here is a list of all documented files with brief descriptions:<table>
- <tr><td class="indexkey"><b>_concurrent_queue_internal.h</b> <a href="a00280.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>_concurrent_unordered_internal.h</b> <a href="a00298.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>_tbb_windef.h</b> <a href="a00308.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>aligned_space.h</b> <a href="a00310.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>atomic.h</b> <a href="a00311.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>blocked_range.h</b> <a href="a00319.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>blocked_range2d.h</b> <a href="a00320.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>blocked_range3d.h</b> <a href="a00321.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>cache_aligned_allocator.h</b> <a href="a00322.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>combinable.h</b> <a href="a00324.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>concurrent_hash_map.h</b> <a href="a00325.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>concurrent_queue.h</b> <a href="a00335.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>concurrent_unordered_map.h</b> <a href="a00336.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>concurrent_vector.h</b> <a href="a00341.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>critical_section.h</b> <a href="a00350.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>enumerable_thread_specific.h</b> <a href="a00353.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>mutex.h</b> <a href="a00362.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>null_mutex.h</b> <a href="a00364.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>null_rw_mutex.h</b> <a href="a00365.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>parallel_do.h</b> <a href="a00366.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>parallel_for.h</b> <a href="a00375.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>parallel_for_each.h</b> <a href="a00379.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>parallel_invoke.h</b> <a href="a00381.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>parallel_reduce.h</b> <a href="a00387.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>parallel_scan.h</b> <a href="a00391.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>parallel_sort.h</b> <a href="a00396.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>parallel_while.h</b> <a href="a00400.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>partitioner.h</b> <a href="a00404.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>pipeline.h</b> <a href="a00409.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>queuing_mutex.h</b> <a href="a00420.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>queuing_rw_mutex.h</b> <a href="a00421.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>reader_writer_lock.h</b> <a href="a00422.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>recursive_mutex.h</b> <a href="a00423.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><a class="el" href="a00248.html">scalable_allocator.h</a> <a href="a00424.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>spin_mutex.h</b> <a href="a00425.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>spin_rw_mutex.h</b> <a href="a00426.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>task.h</b> <a href="a00427.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>task_group.h</b> <a href="a00436.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>task_scheduler_init.h</b> <a href="a00443.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>task_scheduler_observer.h</b> <a href="a00444.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>tbb.h</b> <a href="a00446.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>tbb_allocator.h</b> <a href="a00447.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>tbb_config.h</b> <a href="a00451.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>tbb_config_lrb.h</b> <a href="a00452.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>tbb_exception.h</b> <a href="a00453.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>tbb_machine.h</b> <a href="a00454.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>tbb_profiling.h</b> <a href="a00458.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>tbb_stddef.h</b> <a href="a00459.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>tbb_thread.h</b> <a href="a00466.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>tbbmalloc_proxy.h</b> <a href="a00474.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>tick_count.h</b> <a href="a00476.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>_concurrent_queue_internal.h</b> <a href="a00281.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>_concurrent_unordered_internal.h</b> <a href="a00299.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>_tbb_windef.h</b> <a href="a00309.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>aligned_space.h</b> <a href="a00311.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>atomic.h</b> <a href="a00312.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>blocked_range.h</b> <a href="a00320.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>blocked_range2d.h</b> <a href="a00321.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>blocked_range3d.h</b> <a href="a00322.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>cache_aligned_allocator.h</b> <a href="a00323.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>combinable.h</b> <a href="a00325.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>concurrent_hash_map.h</b> <a href="a00326.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>concurrent_queue.h</b> <a href="a00336.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>concurrent_unordered_map.h</b> <a href="a00337.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>concurrent_vector.h</b> <a href="a00342.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>critical_section.h</b> <a href="a00351.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>enumerable_thread_specific.h</b> <a href="a00354.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>mutex.h</b> <a href="a00367.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>null_mutex.h</b> <a href="a00369.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>null_rw_mutex.h</b> <a href="a00370.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>parallel_do.h</b> <a href="a00371.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>parallel_for.h</b> <a href="a00380.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>parallel_for_each.h</b> <a href="a00384.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>parallel_invoke.h</b> <a href="a00386.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>parallel_reduce.h</b> <a href="a00392.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>parallel_scan.h</b> <a href="a00396.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>parallel_sort.h</b> <a href="a00401.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>parallel_while.h</b> <a href="a00405.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>partitioner.h</b> <a href="a00409.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>pipeline.h</b> <a href="a00414.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>queuing_mutex.h</b> <a href="a00426.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>queuing_rw_mutex.h</b> <a href="a00427.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>reader_writer_lock.h</b> <a href="a00428.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>recursive_mutex.h</b> <a href="a00429.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00248.html">scalable_allocator.h</a> <a href="a00430.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>spin_mutex.h</b> <a href="a00431.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>spin_rw_mutex.h</b> <a href="a00432.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>task.h</b> <a href="a00433.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>task_group.h</b> <a href="a00442.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>task_scheduler_init.h</b> <a href="a00449.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>task_scheduler_observer.h</b> <a href="a00450.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>tbb.h</b> <a href="a00452.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>tbb_allocator.h</b> <a href="a00453.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>tbb_config.h</b> <a href="a00457.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>tbb_config_lrb.h</b> <a href="a00458.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>tbb_exception.h</b> <a href="a00459.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>tbb_machine.h</b> <a href="a00460.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>tbb_profiling.h</b> <a href="a00464.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>tbb_stddef.h</b> <a href="a00465.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>tbb_thread.h</b> <a href="a00472.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>tbbmalloc_proxy.h</b> <a href="a00480.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>tick_count.h</b> <a href="a00482.html">[code]</a></td><td class="indexvalue"></td></tr>
</table>
<hr>
<p></p>
diff --git a/doc/html/functions.html b/doc/html/functions.html
index 70fd895..7985ebe 100644
--- a/doc/html/functions.html
+++ b/doc/html/functions.html
@@ -62,152 +62,153 @@ Here is a list of all documented class members with links to the class documenta
<p>
<h3><a class="anchor" name="index_a">- a -</a></h3><ul>
<li>acquire()
-: <a class="el" href="a00197.html#b0b646ec5be02a127d159bbb7ca65353">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00195.html#3ee3c338732b1f64b0b32a757807a30d">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00190.html#7fb04da37cccf8c99b1f9102d9074f9a">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00185.html#a8dd5ab8686e76de21587544dbb681e0">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00183.html#533e4fc8355ee321206a0609c42d909d">tbb::qu [...]
+: <a class="el" href="a00197.html#b0b646ec5be02a127d159bbb7ca65353">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00195.html#3ee3c338732b1f64b0b32a757807a30d">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00190.html#7fb04da37cccf8c99b1f9102d9074f9a">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00185.html#a8dd5ab8686e76de21587544dbb681e0">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00183.html#533e4fc8355ee321206a0609c42d909d">tbb::qu [...]
: <a class="el" href="a00179.html#e131c560057a58229992b61eb8dba4c6">tbb::parallel_while< Body ></a>, <a class="el" href="a00178.html#40baaf0f6856f4491dd0adf896c93516">tbb::parallel_do_feeder< Item ></a><li>add_filter()
: <a class="el" href="a00180.html#38fb5c9c8395dd6f89a4ae2011a83e0d">tbb::pipeline</a><li>affinity()
: <a class="el" href="a00199.html#3a920a56b0bcf2801518fb45b2c9d2be">tbb::task</a><li>affinity_id
: <a class="el" href="a00199.html#d61bb32389d3857bf7511d69beaafb76">tbb::task</a><li>allocate()
-: <a class="el" href="a00207.html#c35e5db8e9cdff5d1387db5b0bad2e4a">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00204.html#f6cb487b1bdce0b581f265a77dca6d53">tbb::tbb_allocator< T ></a>, <a class="el" href="a00191.html#726b1586d05d44665a36e1c7b2699bfd">tbb::scalable_allocator< T ></a>, <a class="el" href="a00151.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">tbb::cache_aligned_allocator< T ></a><li>allocate_child()
+: <a class="el" href="a00207.html#c35e5db8e9cdff5d1387db5b0bad2e4a">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00204.html#f6cb487b1bdce0b581f265a77dca6d53">tbb::tbb_allocator< T ></a>, <a class="el" href="a00191.html#726b1586d05d44665a36e1c7b2699bfd">tbb::scalable_allocator< T ></a>, <a class="el" href="a00150.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">tbb::cache_aligned_allocator< T ></a><li>allocate_child()
: <a class="el" href="a00199.html#1ff794f7053cd9148d5f280fbf07377f">tbb::task</a><li>allocate_continuation()
: <a class="el" href="a00199.html#1434c79a5138993269d034008bff7329">tbb::task</a><li>allocate_root()
: <a class="el" href="a00199.html#8ccc518caf31075a3e073996d2d240a4">tbb::task</a><li>allocated
: <a class="el" href="a00199.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">tbb::task</a><li>allocator_type
-: <a class="el" href="a00204.html#78701e7454ef8e1a25b5acd364367080">tbb::tbb_allocator< T ></a>, <a class="el" href="a00164.html#da7721b6c35d333ec89a37b63d0d82d3">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00160.html#5a3956341728eaa558d8827063718cac">tbb::strict_ppl::concurrent_queue< T, A ></a><li>assign()
-: <a class="el" href="a00162.html#93a06b3112cb804f42f40efb5e7387b4">tbb::concurrent_vector< T, A ></a><li>at()
-: <a class="el" href="a00162.html#23e14a38af748edff96a7adc3a0f1c58">tbb::concurrent_vector< T, A ></a><li>automatic
+: <a class="el" href="a00204.html#78701e7454ef8e1a25b5acd364367080">tbb::tbb_allocator< T ></a>, <a class="el" href="a00163.html#3c03eb40955b933b01987222722ac4bd">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00154.html#2e2726fccf6d975dc1071608cc0bbf90">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00159.html#5a3956341728eaa558d8827063718cac">tbb::strict_ppl::concurrent_queue< T, A ></a><li>assign()
+: <a class="el" href="a00161.html#93a06b3112cb804f42f40efb5e7387b4">tbb::concurrent_vector< T, A ></a><li>at()
+: <a class="el" href="a00161.html#23e14a38af748edff96a7adc3a0f1c58">tbb::concurrent_vector< T, A ></a><li>automatic
: <a class="el" href="a00203.html#8f5988e2b0fbb2d533fcbb7f2583743f">tbb::task_scheduler_init</a></ul>
<h3><a class="anchor" name="index_b">- b -</a></h3><ul>
<li>back()
-: <a class="el" href="a00162.html#bd518e204107d07fd08d0ec5bdfd383d">tbb::concurrent_vector< T, A ></a><li>begin()
-: <a class="el" href="a00164.html#5f94cdb3a743e8b57c70dcb1041cfdf9">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00162.html#78a06182276ff758788d4c0623ae0d71">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00148.html#18d2258400756ac1446dac7676b18df3">tbb::blocked_range< Value ></a>, <a class="el" href="a00142.html#0d702fc6b9e9d061ace3501b3c861cdf">tbb::aligned_space< T, N ></a><li>blocked_range()
-: <a class="el" href="a00148.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">tbb::blocked_range< Value ></a><li>bucket_count()
-: <a class="el" href="a00156.html#414d15033d36c63aa3a40666dc4d6f5e">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
+: <a class="el" href="a00161.html#bd518e204107d07fd08d0ec5bdfd383d">tbb::concurrent_vector< T, A ></a><li>begin()
+: <a class="el" href="a00163.html#84afb3906a39e399cde1c950d6351300">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00161.html#78a06182276ff758788d4c0623ae0d71">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00147.html#18d2258400756ac1446dac7676b18df3">tbb::blocked_range< Value ></a>, <a class="el" href="a00141.html#0d702fc6b9e9d061ace3501b3c861cdf">tbb::aligned_space< T, N ></a><li>blocked_range()
+: <a class="el" href="a00147.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">tbb::blocked_range< Value ></a><li>bucket_count()
+: <a class="el" href="a00155.html#414d15033d36c63aa3a40666dc4d6f5e">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
<h3><a class="anchor" name="index_c">- c -</a></h3><ul>
<li>cancel_group_execution()
: <a class="el" href="a00199.html#0f3fb4aac549ab642022450a4bd13326">tbb::task</a>, <a class="el" href="a00201.html#8bcdfdf4e6bfb76125b6de15c00b571d">tbb::task_group_context</a><li>capacity()
-: <a class="el" href="a00162.html#3ed6b9ae7217af5103d974045b6f5cd5">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00155.html#b2888b3e4e837d7e03f2c731963a402b">tbb::concurrent_bounded_queue< T, A ></a><li>cbegin()
-: <a class="el" href="a00162.html#f88fcf1c920693c39bd9709db33c199f">tbb::concurrent_vector< T, A ></a><li>cend()
-: <a class="el" href="a00162.html#0c15a5d0f1cf75d687dabba07da1d46b">tbb::concurrent_vector< T, A ></a><li>clear()
-: <a class="el" href="a00202.html#fce446ee13e025969945328f3ff59b95">tbb::task_list</a>, <a class="el" href="a00180.html#2c84aef5b834b555ee220b176e25931e">tbb::pipeline</a>, <a class="el" href="a00164.html#e7be0d504ba71ae6c7479eb373a361ab">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00162.html#26f937a359a66b6aae904c3cd9a3c444">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00155.html#90b31e2954c6e4596c7900435a5f [...]
-: <a class="el" href="a00150.html#3336ba9480fd6c43e158f9beb024c050">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00149.html#392a46759af2c884957115771affa7f4">tbb::blocked_range2d< RowValue, ColValue ></a><li>compact()
-: <a class="el" href="a00162.html#1693d1da41b1a8235871be9c6633be35">tbb::concurrent_vector< T, A ></a><li>concurrent_bounded_queue()
-: <a class="el" href="a00155.html#a5e04dcd7db9fd9b583b4e7df832246a">tbb::concurrent_bounded_queue< T, A ></a><li>concurrent_hash_map()
-: <a class="el" href="a00156.html#3bfe75fcb350ce39cf610c164f233edc">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>concurrent_queue()
-: <a class="el" href="a00161.html#9102b897776bd2d9e908e6604ff16b5f">tbb::deprecated::concurrent_queue< T, A ></a>, <a class="el" href="a00160.html#8a6b98ea11a867db8ac868f0113ca429">tbb::strict_ppl::concurrent_queue< T, A ></a><li>concurrent_vector()
-: <a class="el" href="a00162.html#4450de83c5862ea4bcd9443fd7e67419">tbb::concurrent_vector< T, A ></a><li>const_accessor()
-: <a class="el" href="a00159.html#a9ead65cca68d4c49c7ef64d7899a4c8">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>const_iterator
-: <a class="el" href="a00148.html#1a8d05842c2b3dfc177bc4d347e4cef7">tbb::blocked_range< Value ></a><li>const_reference
-: <a class="el" href="a00155.html#796713d0b9ba93a4721cbe13e4474068">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00160.html#4d48e7ff93f81636bca2c74f7da34750">tbb::strict_ppl::concurrent_queue< T, A ></a><li>construct()
-: <a class="el" href="a00204.html#ab228ab9e324ed041c2226e1d717df5f">tbb::tbb_allocator< T ></a>, <a class="el" href="a00151.html#958ee8745c86c275bfc9533af565e017">tbb::cache_aligned_allocator< T ></a><li>context()
+: <a class="el" href="a00161.html#3ed6b9ae7217af5103d974045b6f5cd5">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00154.html#b2888b3e4e837d7e03f2c731963a402b">tbb::concurrent_bounded_queue< T, A ></a><li>cbegin()
+: <a class="el" href="a00161.html#f88fcf1c920693c39bd9709db33c199f">tbb::concurrent_vector< T, A ></a><li>cend()
+: <a class="el" href="a00161.html#0c15a5d0f1cf75d687dabba07da1d46b">tbb::concurrent_vector< T, A ></a><li>clear()
+: <a class="el" href="a00202.html#fce446ee13e025969945328f3ff59b95">tbb::task_list</a>, <a class="el" href="a00180.html#2c84aef5b834b555ee220b176e25931e">tbb::pipeline</a>, <a class="el" href="a00163.html#a8764176d4b6014c5d65f1051851abc8">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00161.html#26f937a359a66b6aae904c3cd9a3c444">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00154.html#90b31e2954c6e4596c7900435a5f [...]
+: <a class="el" href="a00149.html#3336ba9480fd6c43e158f9beb024c050">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00148.html#392a46759af2c884957115771affa7f4">tbb::blocked_range2d< RowValue, ColValue ></a><li>compact()
+: <a class="el" href="a00161.html#1693d1da41b1a8235871be9c6633be35">tbb::concurrent_vector< T, A ></a><li>concurrent_bounded_queue()
+: <a class="el" href="a00154.html#a5e04dcd7db9fd9b583b4e7df832246a">tbb::concurrent_bounded_queue< T, A ></a><li>concurrent_hash_map()
+: <a class="el" href="a00155.html#3bfe75fcb350ce39cf610c164f233edc">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>concurrent_queue()
+: <a class="el" href="a00160.html#9102b897776bd2d9e908e6604ff16b5f">tbb::deprecated::concurrent_queue< T, A ></a>, <a class="el" href="a00159.html#8a6b98ea11a867db8ac868f0113ca429">tbb::strict_ppl::concurrent_queue< T, A ></a><li>concurrent_vector()
+: <a class="el" href="a00161.html#4450de83c5862ea4bcd9443fd7e67419">tbb::concurrent_vector< T, A ></a><li>const_accessor()
+: <a class="el" href="a00158.html#a9ead65cca68d4c49c7ef64d7899a4c8">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>const_iterator
+: <a class="el" href="a00147.html#1a8d05842c2b3dfc177bc4d347e4cef7">tbb::blocked_range< Value ></a><li>const_reference
+: <a class="el" href="a00154.html#796713d0b9ba93a4721cbe13e4474068">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00159.html#4d48e7ff93f81636bca2c74f7da34750">tbb::strict_ppl::concurrent_queue< T, A ></a><li>construct()
+: <a class="el" href="a00204.html#ab228ab9e324ed041c2226e1d717df5f">tbb::tbb_allocator< T ></a>, <a class="el" href="a00150.html#958ee8745c86c275bfc9533af565e017">tbb::cache_aligned_allocator< T ></a><li>context()
: <a class="el" href="a00199.html#d8c36a93f3972590fbb65ff1cef3173b">tbb::task</a><li>count()
-: <a class="el" href="a00156.html#74f5ef06a06c5e619f156a1c76c04969">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>crbegin()
-: <a class="el" href="a00162.html#db78a1d28c9c966050e8a2926d834a33">tbb::concurrent_vector< T, A ></a><li>crend()
-: <a class="el" href="a00162.html#fff9cece89438587997ebedf93c5e962">tbb::concurrent_vector< T, A ></a></ul>
+: <a class="el" href="a00155.html#74f5ef06a06c5e619f156a1c76c04969">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>crbegin()
+: <a class="el" href="a00161.html#db78a1d28c9c966050e8a2926d834a33">tbb::concurrent_vector< T, A ></a><li>crend()
+: <a class="el" href="a00161.html#fff9cece89438587997ebedf93c5e962">tbb::concurrent_vector< T, A ></a></ul>
<h3><a class="anchor" name="index_d">- d -</a></h3><ul>
<li>deallocate()
-: <a class="el" href="a00204.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">tbb::tbb_allocator< T ></a>, <a class="el" href="a00191.html#f806a238c18cbcfb531e1e0a0d2ec59d">tbb::scalable_allocator< T ></a>, <a class="el" href="a00151.html#3d4eadf188f7d85d3805ae534e0b8e1c">tbb::cache_aligned_allocator< T ></a><li>decrement_ref_count()
+: <a class="el" href="a00204.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">tbb::tbb_allocator< T ></a>, <a class="el" href="a00191.html#f806a238c18cbcfb531e1e0a0d2ec59d">tbb::scalable_allocator< T ></a>, <a class="el" href="a00150.html#3d4eadf188f7d85d3805ae534e0b8e1c">tbb::cache_aligned_allocator< T ></a><li>decrement_ref_count()
: <a class="el" href="a00199.html#ef4680f5c148020c5e7e43ddef44cd5d">tbb::task</a><li>default_num_threads()
: <a class="el" href="a00203.html#ba00714c33a41a3c2216f48613971cab">tbb::task_scheduler_init</a><li>deferred
: <a class="el" href="a00203.html#e6c860f1e559026ff3ef4599c0d6c514">tbb::task_scheduler_init</a><li>destroy()
-: <a class="el" href="a00207.html#921875bbacd2c8a5f324c7da7a415262">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00171.html#7a46873119d9f85a7b0009c13e41a258">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00153.html#93d875d3555502ff6f18513525de204c">tbb::captured_exception</a>, <a class="el" href="a00206.html#66c94938eca8bf88b76f3eccaaf215d8">tbb::tbb_exception</a>, <a class="el" href="a00204.html#ef133522bf55f05a605bee0763208281">tbb::tbb_allocator [...]
-: <a class="el" href="a00155.html#4b45c91297e69515d83d5eef85ae1f49">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00160.html#068576d16c7e4e05d52f9db7a45b5b65">tbb::strict_ppl::concurrent_queue< T, A ></a><li>downgrade_to_reader()
+: <a class="el" href="a00207.html#921875bbacd2c8a5f324c7da7a415262">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00171.html#7a46873119d9f85a7b0009c13e41a258">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00152.html#93d875d3555502ff6f18513525de204c">tbb::captured_exception</a>, <a class="el" href="a00206.html#66c94938eca8bf88b76f3eccaaf215d8">tbb::tbb_exception</a>, <a class="el" href="a00204.html#ef133522bf55f05a605bee0763208281">tbb::tbb_allocator [...]
+: <a class="el" href="a00154.html#4b45c91297e69515d83d5eef85ae1f49">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00159.html#068576d16c7e4e05d52f9db7a45b5b65">tbb::strict_ppl::concurrent_queue< T, A ></a><li>downgrade_to_reader()
: <a class="el" href="a00197.html#c2c2c38a08cb9080e87099fac3e5bc94">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00185.html#0d2f93edf7b15ec4bcee138823220c52">tbb::queuing_rw_mutex::scoped_lock</a></ul>
<h3><a class="anchor" name="index_e">- e -</a></h3><ul>
<li>empty()
-: <a class="el" href="a00202.html#f3ac31e092814b90929f81bb30441959">tbb::task_list</a>, <a class="el" href="a00164.html#af91306d8e10e093226788a733ee59b4">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00162.html#c6426cb93cf20d3af40f3c90f1f0481a">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00155.html#f64924f2ee9225c368a270fc3c394db9">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00160.htm [...]
-: <a class="el" href="a00164.html#9909c01ec91ef10908c5155d6350db2d">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00162.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00148.html#8b929d93ddc13f148b11bceef3a3bdf8">tbb::blocked_range< Value ></a>, <a class="el" href="a00142.html#024be075c23c0394c9a2518d993bcd9e">tbb::aligned_space< T, N ></a><li>enqueue()
+: <a class="el" href="a00202.html#f3ac31e092814b90929f81bb30441959">tbb::task_list</a>, <a class="el" href="a00163.html#72595886d0ac8fd0543f90038570510d">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00161.html#c6426cb93cf20d3af40f3c90f1f0481a">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00154.html#f64924f2ee9225c368a270fc3c394db9">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00159.htm [...]
+: <a class="el" href="a00163.html#cb448bb4977ce366ceb7344085cc7050">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00161.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00147.html#8b929d93ddc13f148b11bceef3a3bdf8">tbb::blocked_range< Value ></a>, <a class="el" href="a00141.html#024be075c23c0394c9a2518d993bcd9e">tbb::aligned_space< T, N ></a><li>enqueue()
: <a class="el" href="a00199.html#8365d063c0cc9d7bd616bca47256b93c">tbb::task</a><li>enumerable_thread_specific()
-: <a class="el" href="a00164.html#105a6487c8c4113ba89891b75243780c">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>erase()
-: <a class="el" href="a00156.html#0f500842d0cf791f8fa61662edb1b311">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>exclude()
-: <a class="el" href="a00156.html#faad2108bd2be75e52293486af59f11e">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>execute()
+: <a class="el" href="a00163.html#7bce6829981c9efe3f59cae2355e383e">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>erase()
+: <a class="el" href="a00155.html#0f500842d0cf791f8fa61662edb1b311">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>exclude()
+: <a class="el" href="a00155.html#faad2108bd2be75e52293486af59f11e">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>execute()
: <a class="el" href="a00199.html#22c298cd40937a431a06777423f002f6">tbb::task</a><li>executing
: <a class="el" href="a00199.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">tbb::task</a></ul>
<h3><a class="anchor" name="index_f">- f -</a></h3><ul>
<li>finalize()
-: <a class="el" href="a00165.html#56275eb889c77c4807967133e21401bd">tbb::filter</a><li>find()
-: <a class="el" href="a00156.html#bce7bdf46435115a95cca2aa73c5da83">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>freed
+: <a class="el" href="a00164.html#56275eb889c77c4807967133e21401bd">tbb::filter</a><li>find()
+: <a class="el" href="a00155.html#bce7bdf46435115a95cca2aa73c5da83">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>freed
: <a class="el" href="a00199.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">tbb::task</a><li>front()
-: <a class="el" href="a00162.html#502615a858eb9fa0390ee59169065e90">tbb::concurrent_vector< T, A ></a></ul>
+: <a class="el" href="a00161.html#502615a858eb9fa0390ee59169065e90">tbb::concurrent_vector< T, A ></a></ul>
<h3><a class="anchor" name="index_g">- g -</a></h3><ul>
<li>get_allocator()
-: <a class="el" href="a00162.html#2fdba8e90de6a4d2300222236d46758e">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00155.html#415eb87e53b1c6a266de06ecbc490d16">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00160.html#f034f70caef445fe8abc9113ec926a8d">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00156.html#199208eed6f09e200cda364f906be0fe">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><l [...]
-: <a class="el" href="a00148.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">tbb::blocked_range< Value ></a><li>grow_by()
-: <a class="el" href="a00162.html#473a59a4c9308b93411b898b3110d26c">tbb::concurrent_vector< T, A ></a><li>grow_to_at_least()
-: <a class="el" href="a00162.html#a7e3b67c8ccab16d0aecc80899ae799d">tbb::concurrent_vector< T, A ></a></ul>
+: <a class="el" href="a00161.html#2fdba8e90de6a4d2300222236d46758e">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00154.html#415eb87e53b1c6a266de06ecbc490d16">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00159.html#f034f70caef445fe8abc9113ec926a8d">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00155.html#199208eed6f09e200cda364f906be0fe">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><l [...]
+: <a class="el" href="a00147.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">tbb::blocked_range< Value ></a><li>grow_by()
+: <a class="el" href="a00161.html#473a59a4c9308b93411b898b3110d26c">tbb::concurrent_vector< T, A ></a><li>grow_to_at_least()
+: <a class="el" href="a00161.html#a7e3b67c8ccab16d0aecc80899ae799d">tbb::concurrent_vector< T, A ></a></ul>
<h3><a class="anchor" name="index_i">- i -</a></h3><ul>
<li>increment_ref_count()
: <a class="el" href="a00199.html#f5fb43c7ad0de5a4b95703cebc39e345">tbb::task</a><li>init()
: <a class="el" href="a00201.html#49a55352084fd44b8863d182e839e6dc">tbb::task_group_context</a><li>initialize()
: <a class="el" href="a00203.html#d5ed214a8bb53b0466ed91ff4734b9a3">tbb::task_scheduler_init</a><li>insert()
-: <a class="el" href="a00156.html#cfe172677e5987004ef4a03e22fa338a">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_copy()
-: <a class="el" href="a00156.html#3c27779fe66b79505390d084310d997e">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_equal_range()
-: <a class="el" href="a00156.html#976c57edfb7f22b9f91a2e11f141eb4a">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_fast_find()
-: <a class="el" href="a00156.html#2f76ed101a0ccc8875b846c2f747897e">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>interval_t()
+: <a class="el" href="a00155.html#cfe172677e5987004ef4a03e22fa338a">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_copy()
+: <a class="el" href="a00155.html#3c27779fe66b79505390d084310d997e">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_equal_range()
+: <a class="el" href="a00155.html#976c57edfb7f22b9f91a2e11f141eb4a">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_fast_find()
+: <a class="el" href="a00155.html#2f76ed101a0ccc8875b846c2f747897e">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>interval_t()
: <a class="el" href="a00211.html#1a21a428e00cced2e6a49e0f5f2258bf">tbb::tick_count::interval_t</a><li>is_active()
: <a class="el" href="a00203.html#12752282977029f23416642bc03e8b74">tbb::task_scheduler_init</a><li>is_bound()
-: <a class="el" href="a00165.html#15c29cae5d237e6d63dbfe5c94af89d5">tbb::filter</a><li>is_cancelled()
+: <a class="el" href="a00164.html#15c29cae5d237e6d63dbfe5c94af89d5">tbb::filter</a><li>is_cancelled()
: <a class="el" href="a00199.html#025f18118c057c4c8db87ff2ce8df975">tbb::task</a><li>is_divisible()
-: <a class="el" href="a00150.html#39d69191721c488e737ae5d9c5336b9c">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00149.html#ad36a9b38e4fef26d376f99552ce2d92">tbb::blocked_range2d< RowValue, ColValue ></a>, <a class="el" href="a00148.html#41a58b703d574b6e1ca155df3576f578">tbb::blocked_range< Value ></a><li>is_group_execution_cancelled()
+: <a class="el" href="a00149.html#39d69191721c488e737ae5d9c5336b9c">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00148.html#ad36a9b38e4fef26d376f99552ce2d92">tbb::blocked_range2d< RowValue, ColValue ></a>, <a class="el" href="a00147.html#41a58b703d574b6e1ca155df3576f578">tbb::blocked_range< Value ></a><li>is_group_execution_cancelled()
: <a class="el" href="a00201.html#4db72f16210b0a991b2c134d6763a4cc">tbb::task_group_context</a><li>is_ordered()
-: <a class="el" href="a00165.html#cd53206c4795ef2df5df26b795caf692">tbb::filter</a><li>is_owned_by_current_thread()
+: <a class="el" href="a00164.html#cd53206c4795ef2df5df26b795caf692">tbb::filter</a><li>is_owned_by_current_thread()
: <a class="el" href="a00199.html#c26718b3b247cd13deb1a741902e7105">tbb::task</a><li>is_serial()
-: <a class="el" href="a00165.html#fcfec27656a69ff2072802ac001e936f">tbb::filter</a><li>is_stolen_task()
+: <a class="el" href="a00164.html#fcfec27656a69ff2072802ac001e936f">tbb::filter</a><li>is_stolen_task()
: <a class="el" href="a00199.html#f9169402702f56bf519448aaf34450aa">tbb::task</a><li>is_writer()
-: <a class="el" href="a00158.html#fc194e3a186dc935a5fb513cc9f8e898">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a></ul>
+: <a class="el" href="a00157.html#fc194e3a186dc935a5fb513cc9f8e898">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a></ul>
<h3><a class="anchor" name="index_l">- l -</a></h3><ul>
<li>local()
-: <a class="el" href="a00164.html#34423652c3add42563b1d5d44ca78158">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>lock()
+: <a class="el" href="a00163.html#7dc79058d2832f7447de8e691c3455ea">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>lock()
: <a class="el" href="a00196.html#4007d6e1523dbc3c2bb7f889ab789a8a">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00194.html#4f748989e19b6045e3a2d2ee73626a28">tbb::spin_mutex</a>, <a class="el" href="a00189.html#4c342c69d47f4bb0b393535dee4015d6">tbb::recursive_mutex</a>, <a class="el" href="a00186.html#2653d1a2d560059a51219a8ceab3ade9">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00172.html#4470e61c24c129a0299ca6c17240adbb">tbb::mutex</a><li>lock_read()
: <a class="el" href="a00196.html#13f799708ac4ca437a16be202e263e18">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00186.html#d9d16a24d9f6c3dada73c6b9ff214f5b">tbb::interface5::reader_writer_lock</a><li>lookup()
-: <a class="el" href="a00156.html#1f22480a290ddc6c145888d8f985531a">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
+: <a class="el" href="a00155.html#1f22480a290ddc6c145888d8f985531a">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
<h3><a class="anchor" name="index_m">- m -</a></h3><ul>
-<li>malloc_type
+<li>make_filter
+: <a class="el" href="a00165.html#85c2892eff1fddcd06e28911e75838bd">tbb::interface5::filter_t< T, U ></a><li>malloc_type
: <a class="el" href="a00204.html#09a7f81fb2c3055aaecf058b11538544">tbb::tbb_allocator< T ></a><li>max_size()
-: <a class="el" href="a00204.html#f059ca2c96243024f0d562ee3a87a3a5">tbb::tbb_allocator< T ></a>, <a class="el" href="a00191.html#880e766f1d913988c21973dbdd874fd5">tbb::scalable_allocator< T ></a>, <a class="el" href="a00162.html#2c248a017f0576df3e7cd99627836fd6">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00156.html#1e45d3cbd1e2ae06f365f1b48e0df0b5">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>, <a class="el" href="a00151. [...]
-: <a class="el" href="a00171.html#1aea0ad179d6f0481fe7f3495f66adf9">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00153.html#837a50b8f6a800bda225c39d1699643f">tbb::captured_exception</a>, <a class="el" href="a00206.html#3e3482bf264d4ca4dde046cd9c02c766">tbb::tbb_exception</a><li>mutex()
+: <a class="el" href="a00204.html#f059ca2c96243024f0d562ee3a87a3a5">tbb::tbb_allocator< T ></a>, <a class="el" href="a00191.html#880e766f1d913988c21973dbdd874fd5">tbb::scalable_allocator< T ></a>, <a class="el" href="a00161.html#2c248a017f0576df3e7cd99627836fd6">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00155.html#1e45d3cbd1e2ae06f365f1b48e0df0b5">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>, <a class="el" href="a00150. [...]
+: <a class="el" href="a00171.html#1aea0ad179d6f0481fe7f3495f66adf9">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00152.html#837a50b8f6a800bda225c39d1699643f">tbb::captured_exception</a>, <a class="el" href="a00206.html#3e3482bf264d4ca4dde046cd9c02c766">tbb::tbb_exception</a><li>mutex()
: <a class="el" href="a00172.html#05313cb77d4f85213103d4dab74ed454">tbb::mutex</a><li>my_exception_data
: <a class="el" href="a00171.html#a8c0ae2089ae784b28907cf748b89416">tbb::movable_exception< ExceptionData ></a></ul>
<h3><a class="anchor" name="index_n">- n -</a></h3><ul>
<li>name()
-: <a class="el" href="a00171.html#bc5f5c4739b17ac5211ac58226c2f5a5">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00153.html#5af82fd677449c5ca727fa1d7e16f9f5">tbb::captured_exception</a>, <a class="el" href="a00206.html#d00f6497e552fee978a02bfcbebf46e2">tbb::tbb_exception</a><li>native_handle_type
+: <a class="el" href="a00171.html#bc5f5c4739b17ac5211ac58226c2f5a5">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00152.html#5af82fd677449c5ca727fa1d7e16f9f5">tbb::captured_exception</a>, <a class="el" href="a00206.html#d00f6497e552fee978a02bfcbebf46e2">tbb::tbb_exception</a><li>native_handle_type
: <a class="el" href="a00189.html#889fa8cc32dd707eef7c0f52dda09c0d">tbb::recursive_mutex</a>, <a class="el" href="a00172.html#9f1ec84d5815263ceae853f06ddb4cac">tbb::mutex</a><li>note_affinity()
: <a class="el" href="a00199.html#713c338c8eeaebdc5a6b10a69c039b06">tbb::task</a><li>now()
: <a class="el" href="a00210.html#fb7f78ca61cf28398645ace66e284473">tbb::tick_count</a></ul>
<h3><a class="anchor" name="index_o">- o -</a></h3><ul>
<li>operator *()
-: <a class="el" href="a00157.html#e8938f0cd1211e88a1d73527ed3636c4">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, <a class="el" href="a00159.html#30f31106840700a4c3664b9cb1c31ca7">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>operator delete()
+: <a class="el" href="a00156.html#e8938f0cd1211e88a1d73527ed3636c4">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, <a class="el" href="a00158.html#30f31106840700a4c3664b9cb1c31ca7">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>operator delete()
: <a class="el" href="a00206.html#3f2da7f3d8a6e4c1df522af1213afb5a">tbb::tbb_exception</a><li>operator()()
-: <a class="el" href="a00165.html#fa1b3dc1f4f47563ccab7f4d92f5b543">tbb::filter</a>, <a class="el" href="a00158.html#57c6110bd20e95c06de5a199de988941">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a><li>operator+
+: <a class="el" href="a00164.html#fa1b3dc1f4f47563ccab7f4d92f5b543">tbb::filter</a>, <a class="el" href="a00157.html#57c6110bd20e95c06de5a199de988941">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a><li>operator+
: <a class="el" href="a00211.html#5871ead1ca230efbe52a5008470e6428">tbb::tick_count::interval_t</a><li>operator+=()
: <a class="el" href="a00211.html#cd9814947902e26463a69a111530f81b">tbb::tick_count::interval_t</a><li>operator-
: <a class="el" href="a00210.html#09dde78a4100800c11bb883d6204b586">tbb::tick_count</a>, <a class="el" href="a00211.html#fa509691e1d689830931e36edd274f76">tbb::tick_count::interval_t</a><li>operator-=()
: <a class="el" href="a00211.html#35ff7eaf7c2031b4a991402ac9ecb940">tbb::tick_count::interval_t</a><li>operator->()
-: <a class="el" href="a00157.html#fcebc32c020202cc37e60eadef157569">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, <a class="el" href="a00159.html#3d03a48ecb8cd9549bd8be64b09c9b0d">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>operator=()
-: <a class="el" href="a00162.html#19f4ab88a01b0fd056af3bba463e7bd6">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00156.html#2c0c42a2e1b5282b6739157df9ce2304">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>operator[]()
-: <a class="el" href="a00162.html#c6fade5c732cc95274d1d8277ea619d1">tbb::concurrent_vector< T, A ></a></ul>
+: <a class="el" href="a00156.html#fcebc32c020202cc37e60eadef157569">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, <a class="el" href="a00158.html#3d03a48ecb8cd9549bd8be64b09c9b0d">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>operator=()
+: <a class="el" href="a00161.html#19f4ab88a01b0fd056af3bba463e7bd6">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00155.html#2c0c42a2e1b5282b6739157df9ce2304">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>operator[]()
+: <a class="el" href="a00161.html#c6fade5c732cc95274d1d8277ea619d1">tbb::concurrent_vector< T, A ></a></ul>
<h3><a class="anchor" name="index_p">- p -</a></h3><ul>
<li>page_range_type
-: <a class="el" href="a00150.html#b8ebf17a552ba47825e9b3887855b719">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a><li>pages()
-: <a class="el" href="a00150.html#cf971430aa12361d3ed245344b7c6764">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a><li>parallel_while()
+: <a class="el" href="a00149.html#b8ebf17a552ba47825e9b3887855b719">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a><li>pages()
+: <a class="el" href="a00149.html#cf971430aa12361d3ed245344b7c6764">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a><li>parallel_while()
: <a class="el" href="a00179.html#36e26ba3880c7bcf804a97ba0cbe133f">tbb::parallel_while< Body ></a><li>parent()
: <a class="el" href="a00199.html#314e98ee4347ccec83efcb9ee22e8596">tbb::task</a><li>pause()
-: <a class="el" href="a00145.html#a174ea93e3bd3d5cce82389c2f28d037">tbb::internal::atomic_backoff</a><li>pipeline()
+: <a class="el" href="a00144.html#a174ea93e3bd3d5cce82389c2f28d037">tbb::internal::atomic_backoff</a><li>pipeline()
: <a class="el" href="a00180.html#596dc3beba27099c4c8581cb419e1a59">tbb::pipeline</a><li>pop()
-: <a class="el" href="a00155.html#41f4c6bd7a82ab070e840bbf81b0b123">tbb::concurrent_bounded_queue< T, A ></a><li>pop_front()
+: <a class="el" href="a00154.html#41f4c6bd7a82ab070e840bbf81b0b123">tbb::concurrent_bounded_queue< T, A ></a><li>pop_front()
: <a class="el" href="a00202.html#5fe85df5ed524418389d34051750347d">tbb::task_list</a><li>pop_if_present()
-: <a class="el" href="a00161.html#48da3536245318af6cb5fd58bac78039">tbb::deprecated::concurrent_queue< T, A ></a><li>process_item()
+: <a class="el" href="a00160.html#48da3536245318af6cb5fd58bac78039">tbb::deprecated::concurrent_queue< T, A ></a><li>process_item()
: <a class="el" href="a00209.html#5e726bdc7fbd924c0b07bd558b1d4d5d">tbb::thread_bound_filter</a><li>push()
-: <a class="el" href="a00155.html#ceb08c743b11ba88c878e73fff8af20b">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00160.html#73c47563ffcc4c2f6452f25a04ebe2e2">tbb::strict_ppl::concurrent_queue< T, A ></a><li>push_back()
-: <a class="el" href="a00202.html#4cd34756bc4763dafb8c84838a0124ff">tbb::task_list</a>, <a class="el" href="a00162.html#e94e038f915c0268fdf2d3d7f87d81b8">tbb::concurrent_vector< T, A ></a><li>push_if_not_full()
-: <a class="el" href="a00161.html#7c45561bafe71107d09b2bc1b8f4e681">tbb::deprecated::concurrent_queue< T, A ></a></ul>
+: <a class="el" href="a00154.html#ceb08c743b11ba88c878e73fff8af20b">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00159.html#73c47563ffcc4c2f6452f25a04ebe2e2">tbb::strict_ppl::concurrent_queue< T, A ></a><li>push_back()
+: <a class="el" href="a00202.html#4cd34756bc4763dafb8c84838a0124ff">tbb::task_list</a>, <a class="el" href="a00161.html#e94e038f915c0268fdf2d3d7f87d81b8">tbb::concurrent_vector< T, A ></a><li>push_if_not_full()
+: <a class="el" href="a00160.html#7c45561bafe71107d09b2bc1b8f4e681">tbb::deprecated::concurrent_queue< T, A ></a></ul>
<h3><a class="anchor" name="index_q">- q -</a></h3><ul>
<li>queuing_mutex()
: <a class="el" href="a00182.html#b389ad9c4db7293e4bdb5b8cda69ec04">tbb::queuing_mutex</a><li>queuing_rw_mutex()
: <a class="el" href="a00184.html#85c90877c3447690ac4e2ac4ff8dea5e">tbb::queuing_rw_mutex</a></ul>
<h3><a class="anchor" name="index_r">- r -</a></h3><ul>
<li>range()
-: <a class="el" href="a00164.html#48f5ab20db3c77faa7219deb28076e6c">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00162.html#3d09ccfb581b879ae64203741035e193">tbb::concurrent_vector< T, A ></a><li>rbegin()
-: <a class="el" href="a00162.html#9f9c103e18d5f212703805354074ad44">tbb::concurrent_vector< T, A ></a><li>reader_writer_lock()
+: <a class="el" href="a00163.html#3b068000cf4dbf9b40f8bb7e3fc53e0b">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00161.html#3d09ccfb581b879ae64203741035e193">tbb::concurrent_vector< T, A ></a><li>rbegin()
+: <a class="el" href="a00161.html#9f9c103e18d5f212703805354074ad44">tbb::concurrent_vector< T, A ></a><li>reader_writer_lock()
: <a class="el" href="a00186.html#c1431c4293e777efd9aab9a95c2a46e1">tbb::interface5::reader_writer_lock</a><li>ready
: <a class="el" href="a00199.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">tbb::task</a><li>recursive_mutex()
: <a class="el" href="a00189.html#d2fceb7f95c24a8cd1457d4527e4b8c6">tbb::recursive_mutex</a><li>recycle
@@ -218,16 +219,16 @@ Here is a list of all documented class members with links to the class documenta
: <a class="el" href="a00199.html#4f1be9bbcdb487830dbe298b68d85144">tbb::task</a><li>reexecute
: <a class="el" href="a00199.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">tbb::task</a><li>ref_count()
: <a class="el" href="a00199.html#ad774f55eaec008ae02b236423209ced">tbb::task</a><li>reference
-: <a class="el" href="a00155.html#dcd44ca6a88c0dc7a847a47a10811f0c">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00160.html#a8d725c50a9834bb7af5b67c0aff92b8">tbb::strict_ppl::concurrent_queue< T, A ></a><li>register_pending_exception()
+: <a class="el" href="a00154.html#dcd44ca6a88c0dc7a847a47a10811f0c">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00159.html#a8d725c50a9834bb7af5b67c0aff92b8">tbb::strict_ppl::concurrent_queue< T, A ></a><li>register_pending_exception()
: <a class="el" href="a00201.html#d97c8a03615594b71b4ef06ff75cf561">tbb::task_group_context</a><li>rehash()
-: <a class="el" href="a00156.html#13f3f2e8de7564be03882c31559493c9">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>release()
-: <a class="el" href="a00197.html#61b14d00a78185c9b2d206ebfc379124">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00195.html#eeb615e68e963e6bf8d9c11402d0ce8e">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00190.html#ac480ea0e9d5ea0345a67d57008b6263">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00185.html#67ae221109ddc69510ab593874e435d4">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00183.html#3bf2b8c87ff22115be9b2eac179f2d30">tbb::qu [...]
-: <a class="el" href="a00162.html#d438b9b32ea3a8ffb703015b6dce055b">tbb::concurrent_vector< T, A ></a><li>reserve()
-: <a class="el" href="a00162.html#5a0ce05026994b010018f72cfdeb72c1">tbb::concurrent_vector< T, A ></a><li>reset()
+: <a class="el" href="a00155.html#13f3f2e8de7564be03882c31559493c9">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>release()
+: <a class="el" href="a00197.html#61b14d00a78185c9b2d206ebfc379124">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00195.html#eeb615e68e963e6bf8d9c11402d0ce8e">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00190.html#ac480ea0e9d5ea0345a67d57008b6263">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00185.html#67ae221109ddc69510ab593874e435d4">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00183.html#3bf2b8c87ff22115be9b2eac179f2d30">tbb::qu [...]
+: <a class="el" href="a00161.html#d438b9b32ea3a8ffb703015b6dce055b">tbb::concurrent_vector< T, A ></a><li>reserve()
+: <a class="el" href="a00161.html#5a0ce05026994b010018f72cfdeb72c1">tbb::concurrent_vector< T, A ></a><li>reset()
: <a class="el" href="a00201.html#6d30d16bf1cd22f86c6afaf29c2b430c">tbb::task_group_context</a><li>resize()
-: <a class="el" href="a00162.html#98ce6b2c6d2622f0c030b46dfac3880c">tbb::concurrent_vector< T, A ></a><li>row_range_type
-: <a class="el" href="a00149.html#a807a22fe658ec38b8edfd69521d0383">tbb::blocked_range2d< RowValue, ColValue ></a><li>rows()
-: <a class="el" href="a00150.html#1584623e59ff32a8aa82006827508be4">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00149.html#f496e7348a82652fba581203477cc07c">tbb::blocked_range2d< RowValue, ColValue ></a><li>run()
+: <a class="el" href="a00161.html#98ce6b2c6d2622f0c030b46dfac3880c">tbb::concurrent_vector< T, A ></a><li>row_range_type
+: <a class="el" href="a00148.html#a807a22fe658ec38b8edfd69521d0383">tbb::blocked_range2d< RowValue, ColValue ></a><li>rows()
+: <a class="el" href="a00149.html#1584623e59ff32a8aa82006827508be4">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00148.html#f496e7348a82652fba581203477cc07c">tbb::blocked_range2d< RowValue, ColValue ></a><li>run()
: <a class="el" href="a00180.html#93d7fec8cd607b803dd2d79fb46bd260">tbb::pipeline</a>, <a class="el" href="a00179.html#b32a0a6e5e09ebb7fad3e6652c19afe5">tbb::parallel_while< Body ></a></ul>
<h3><a class="anchor" name="index_s">- s -</a></h3><ul>
<li>scoped_lock()
@@ -236,12 +237,12 @@ Here is a list of all documented class members with links to the class documenta
: <a class="el" href="a00211.html#d5d8429c0bc59cf6131b2abc7929fa59">tbb::tick_count::interval_t</a><li>self()
: <a class="el" href="a00199.html#bd43e8d6249738efafd12d6a4c72c5e3">tbb::task</a><li>set_affinity()
: <a class="el" href="a00199.html#dca19d7a45487a7d67a0db517e2b57c9">tbb::task</a><li>set_capacity()
-: <a class="el" href="a00155.html#f3c6c934f85fd02aedbc83a16943193b">tbb::concurrent_bounded_queue< T, A ></a><li>set_ref_count()
+: <a class="el" href="a00154.html#f3c6c934f85fd02aedbc83a16943193b">tbb::concurrent_bounded_queue< T, A ></a><li>set_ref_count()
: <a class="el" href="a00199.html#06a4206a57e8e12a439b14d6d41cfd92">tbb::task</a><li>set_state()
: <a class="el" href="a00172.html#795649a185b0d6af6dc81c5f378616dd">tbb::mutex</a><li>shrink_to_fit()
-: <a class="el" href="a00162.html#03c6f4cf66532bf4cc907ee738a9a186">tbb::concurrent_vector< T, A ></a><li>size()
-: <a class="el" href="a00164.html#101ecd32efae3ce1331c3d8a791c645b">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00162.html#715fe313c4a9c22731cc404dd80c9ec9">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00155.html#7dc14d1a579a4cccda9f857585e1768d">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00156.html#17fd8c5fe8c6a86075f34aa4e8412ba3">tbb::interface4::concurrent_hash_map< Key, T, H [...]
-: <a class="el" href="a00155.html#a80e4c11dbb324e4b92a24a77bbcde68">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00160.html#8fc30e93f8342a1960357f71e4fe8a2b">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00148.html#f5707bffea38eee5c9680f37358afb8e">tbb::blocked_range< Value ></a><li>spawn_and_wait_for_all()
+: <a class="el" href="a00161.html#03c6f4cf66532bf4cc907ee738a9a186">tbb::concurrent_vector< T, A ></a><li>size()
+: <a class="el" href="a00163.html#33fd6593da1ed14340f10f67d5a69130">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00161.html#715fe313c4a9c22731cc404dd80c9ec9">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00154.html#7dc14d1a579a4cccda9f857585e1768d">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00155.html#17fd8c5fe8c6a86075f34aa4e8412ba3">tbb::interface4::concurrent_hash_map< Key, T, H [...]
+: <a class="el" href="a00154.html#a80e4c11dbb324e4b92a24a77bbcde68">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00159.html#8fc30e93f8342a1960357f71e4fe8a2b">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00147.html#f5707bffea38eee5c9680f37358afb8e">tbb::blocked_range< Value ></a><li>spawn_and_wait_for_all()
: <a class="el" href="a00199.html#894ab68378e502776d8220eea7ce9fa1">tbb::task</a><li>spawn_root_and_wait()
: <a class="el" href="a00199.html#c33c7edbaec67aa8a56f48986a9dc69f">tbb::task</a><li>spin_mutex()
: <a class="el" href="a00194.html#3d8fb44644fd8d41ada1fbeba7409be3">tbb::spin_mutex</a><li>spin_rw_mutex_v3()
@@ -249,7 +250,7 @@ Here is a list of all documented class members with links to the class documenta
: <a class="el" href="a00199.html#0af7b2d7e6e8b4333b2accfce3dfb374">tbb::task</a><li>state_type
: <a class="el" href="a00199.html#4a3c415562d17905390ea5b49d12293e">tbb::task</a><li>status_t
: <a class="el" href="a00186.html#6f921f0d7c1812ceb5674418c8b6ccaf">tbb::interface5::reader_writer_lock</a><li>swap()
-: <a class="el" href="a00162.html#96c9c4bd968ed3edb8dd276854d2dae0">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00156.html#eddb0d2efe0b4f25a85c059e1c3dac15">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
+: <a class="el" href="a00161.html#96c9c4bd968ed3edb8dd276854d2dae0">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00155.html#eddb0d2efe0b4f25a85c059e1c3dac15">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
<h3><a class="anchor" name="index_t">- t -</a></h3><ul>
<li>task()
: <a class="el" href="a00199.html#2bce8ec6e44706e70128f5cf91b76e67">tbb::task</a><li>task_group_context()
@@ -257,36 +258,36 @@ Here is a list of all documented class members with links to the class documenta
: <a class="el" href="a00202.html#416341c2047eaef50417b41eaf7e9de6">tbb::task_list</a><li>task_scheduler_init()
: <a class="el" href="a00203.html#421600bf9bf9338bcf937063f2ff0e90">tbb::task_scheduler_init</a><li>terminate()
: <a class="el" href="a00203.html#f73257e04cb7fb9bd5be2b635d9016f1">tbb::task_scheduler_init</a><li>throw_self()
-: <a class="el" href="a00207.html#292832fd5c523e3d8081a22247840a1d">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00171.html#17cffba35811c92b7e65d63506b69602">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00153.html#2dd1be66ab32fa27e0ddef5707fa67ef">tbb::captured_exception</a>, <a class="el" href="a00206.html#8588e07fa49692f4d734e4f2e4f048f4">tbb::tbb_exception</a><li>tick_count()
+: <a class="el" href="a00207.html#292832fd5c523e3d8081a22247840a1d">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00171.html#17cffba35811c92b7e65d63506b69602">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00152.html#2dd1be66ab32fa27e0ddef5707fa67ef">tbb::captured_exception</a>, <a class="el" href="a00206.html#8588e07fa49692f4d734e4f2e4f048f4">tbb::tbb_exception</a><li>tick_count()
: <a class="el" href="a00210.html#34593326ae4191e02a13c7cbdab9de4c">tbb::tick_count</a><li>try_acquire()
: <a class="el" href="a00197.html#9879626968d9b9a04cd2ec0fb2e84ae1">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00195.html#9297ec188534b45dc0ca48f2f39a0501">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00190.html#36bfc3e93e3ef6340abef4901444d340">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00185.html#2e4ff6c9ec2fee6682f95290d1f42baa">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00183.html#e5a014fb817599386a87170cf2cf51a9">tbb::qu [...]
: <a class="el" href="a00196.html#088bb256be794cc47d3b83791632fdfc">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00194.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">tbb::spin_mutex</a>, <a class="el" href="a00189.html#86e719b0afee25704af11ab97694d240">tbb::recursive_mutex</a>, <a class="el" href="a00186.html#721eb173e154ab38292273e9266a9b07">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00172.html#4331652c79dea1c1131bd59ab161b234">tbb::mutex</a><li>try_lock_read()
: <a class="el" href="a00196.html#b8667415869013f840d976aa406d385a">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00186.html#595fb23952e3b89426b1f7938dea9b11">tbb::interface5::reader_writer_lock</a><li>try_pop()
-: <a class="el" href="a00155.html#0ca487019bbb00a196442aff78a1e4f7">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00160.html#ae31ca0db34ef96ef1e74aa0d28c95f8">tbb::strict_ppl::concurrent_queue< T, A ></a><li>try_process_item()
+: <a class="el" href="a00154.html#0ca487019bbb00a196442aff78a1e4f7">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00159.html#ae31ca0db34ef96ef1e74aa0d28c95f8">tbb::strict_ppl::concurrent_queue< T, A ></a><li>try_process_item()
: <a class="el" href="a00209.html#c4f90f2c771bce748beb9be734fa286c">tbb::thread_bound_filter</a><li>try_push()
-: <a class="el" href="a00155.html#2bd6232531279fb3ccbd296bea23066b">tbb::concurrent_bounded_queue< T, A ></a></ul>
+: <a class="el" href="a00154.html#2bd6232531279fb3ccbd296bea23066b">tbb::concurrent_bounded_queue< T, A ></a></ul>
<h3><a class="anchor" name="index_u">- u -</a></h3><ul>
<li>unlock()
: <a class="el" href="a00196.html#f9f52ead2098eb5fb12da59d5ae53b55">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00194.html#0e843ee6265f57f27d228ba91e7308ef">tbb::spin_mutex</a>, <a class="el" href="a00189.html#f0a96e26b7f074588dc31e32524856ae">tbb::recursive_mutex</a>, <a class="el" href="a00186.html#5113b32689305599b2c36b5831547704">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00172.html#5fc9ef443ae75d966695546be399cc6b">tbb::mutex</a><li>unsafe_size()
-: <a class="el" href="a00160.html#eaa35a5274606779802e9a669a706260">tbb::strict_ppl::concurrent_queue< T, A ></a><li>upgrade_to_writer()
+: <a class="el" href="a00159.html#eaa35a5274606779802e9a669a706260">tbb::strict_ppl::concurrent_queue< T, A ></a><li>upgrade_to_writer()
: <a class="el" href="a00197.html#3f0b1e3f2efab63336400348bd070226">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00185.html#11ba1da4a722c9e6f73339a52c487e82">tbb::queuing_rw_mutex::scoped_lock</a></ul>
<h3><a class="anchor" name="index_v">- v -</a></h3><ul>
<li>value_type
-: <a class="el" href="a00179.html#fa297e53d3af2a101e712bc200233e9c">tbb::parallel_while< Body ></a>, <a class="el" href="a00155.html#98245517a931e5893f6601e66c51fc75">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00160.html#682c3978d5cb0620000994f11c44a476">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00157.html#49eec74f272bab187d176c0d9d16a7fe">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accesso [...]
+: <a class="el" href="a00179.html#fa297e53d3af2a101e712bc200233e9c">tbb::parallel_while< Body ></a>, <a class="el" href="a00154.html#98245517a931e5893f6601e66c51fc75">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00159.html#682c3978d5cb0620000994f11c44a476">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00156.html#49eec74f272bab187d176c0d9d16a7fe">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accesso [...]
<h3><a class="anchor" name="index_w">- w -</a></h3><ul>
<li>wait_for_all()
: <a class="el" href="a00199.html#53d2615ad9c38859b4c8080936600283">tbb::task</a><li>what()
-: <a class="el" href="a00171.html#b33a89bccf0c63106f1270c7bfaaf54f">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00153.html#6b5988ef74a1fe2a58998d110b3633e0">tbb::captured_exception</a>, <a class="el" href="a00206.html#e8157689ecb66bc6c72d3618bf3cc371">tbb::tbb_exception</a></ul>
+: <a class="el" href="a00171.html#b33a89bccf0c63106f1270c7bfaaf54f">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00152.html#6b5988ef74a1fe2a58998d110b3633e0">tbb::captured_exception</a>, <a class="el" href="a00206.html#e8157689ecb66bc6c72d3618bf3cc371">tbb::tbb_exception</a></ul>
<h3><a class="anchor" name="index_~">- ~ -</a></h3><ul>
<li>~combinable()
-: <a class="el" href="a00154.html#2c87e79ae98588a5780f708773388843">tbb::combinable< T ></a><li>~concurrent_bounded_queue()
-: <a class="el" href="a00155.html#acaf5b510dc0dfc7780b8c956cf773cf">tbb::concurrent_bounded_queue< T, A ></a><li>~concurrent_hash_map()
-: <a class="el" href="a00156.html#a1ac58997d8fbf242b266e3691573481">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>~concurrent_queue()
-: <a class="el" href="a00160.html#830b33753d6b149c366344e29b2edd8c">tbb::strict_ppl::concurrent_queue< T, A ></a><li>~concurrent_vector()
-: <a class="el" href="a00162.html#da2444b28bb840d38f60d0030333a5fc">tbb::concurrent_vector< T, A ></a><li>~const_accessor()
-: <a class="el" href="a00159.html#752b0c1ec74b94786403a75e42917d01">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>~enumerable_thread_specific()
-: <a class="el" href="a00164.html#7f6e5b3654712ea003cbb7ebaffa8dd9">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>~filter()
-: <a class="el" href="a00165.html#66d159f362293e3964ba3da8bc1d2604">tbb::filter</a><li>~parallel_while()
+: <a class="el" href="a00153.html#2c87e79ae98588a5780f708773388843">tbb::combinable< T ></a><li>~concurrent_bounded_queue()
+: <a class="el" href="a00154.html#acaf5b510dc0dfc7780b8c956cf773cf">tbb::concurrent_bounded_queue< T, A ></a><li>~concurrent_hash_map()
+: <a class="el" href="a00155.html#a1ac58997d8fbf242b266e3691573481">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>~concurrent_queue()
+: <a class="el" href="a00159.html#830b33753d6b149c366344e29b2edd8c">tbb::strict_ppl::concurrent_queue< T, A ></a><li>~concurrent_vector()
+: <a class="el" href="a00161.html#da2444b28bb840d38f60d0030333a5fc">tbb::concurrent_vector< T, A ></a><li>~const_accessor()
+: <a class="el" href="a00158.html#752b0c1ec74b94786403a75e42917d01">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>~enumerable_thread_specific()
+: <a class="el" href="a00163.html#5a7907d9e3e5b18e7a7b55211ef3213f">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>~filter()
+: <a class="el" href="a00164.html#66d159f362293e3964ba3da8bc1d2604">tbb::filter</a><li>~parallel_while()
: <a class="el" href="a00179.html#6fcfc973cc56b79c6d0fbb8a31be7e84">tbb::parallel_while< Body ></a><li>~pipeline()
: <a class="el" href="a00180.html#49513c6c24f9d5bbbb27edca5efe01c9">tbb::pipeline</a><li>~queuing_rw_mutex()
: <a class="el" href="a00184.html#1ba73e3d95cfdf8323880bc623af9099">tbb::queuing_rw_mutex</a><li>~reader_writer_lock()
diff --git a/doc/html/functions_func.html b/doc/html/functions_func.html
index c7261f4..8855797 100644
--- a/doc/html/functions_func.html
+++ b/doc/html/functions_func.html
@@ -61,137 +61,137 @@
<p>
<h3><a class="anchor" name="index_a">- a -</a></h3><ul>
<li>acquire()
-: <a class="el" href="a00197.html#b0b646ec5be02a127d159bbb7ca65353">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00195.html#3ee3c338732b1f64b0b32a757807a30d">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00190.html#7fb04da37cccf8c99b1f9102d9074f9a">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00185.html#a8dd5ab8686e76de21587544dbb681e0">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00183.html#533e4fc8355ee321206a0609c42d909d">tbb::qu [...]
+: <a class="el" href="a00197.html#b0b646ec5be02a127d159bbb7ca65353">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00195.html#3ee3c338732b1f64b0b32a757807a30d">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00190.html#7fb04da37cccf8c99b1f9102d9074f9a">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00185.html#a8dd5ab8686e76de21587544dbb681e0">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00183.html#533e4fc8355ee321206a0609c42d909d">tbb::qu [...]
: <a class="el" href="a00179.html#e131c560057a58229992b61eb8dba4c6">tbb::parallel_while< Body ></a>, <a class="el" href="a00178.html#40baaf0f6856f4491dd0adf896c93516">tbb::parallel_do_feeder< Item ></a><li>add_filter()
: <a class="el" href="a00180.html#38fb5c9c8395dd6f89a4ae2011a83e0d">tbb::pipeline</a><li>affinity()
: <a class="el" href="a00199.html#3a920a56b0bcf2801518fb45b2c9d2be">tbb::task</a><li>allocate()
-: <a class="el" href="a00207.html#c35e5db8e9cdff5d1387db5b0bad2e4a">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00204.html#f6cb487b1bdce0b581f265a77dca6d53">tbb::tbb_allocator< T ></a>, <a class="el" href="a00191.html#726b1586d05d44665a36e1c7b2699bfd">tbb::scalable_allocator< T ></a>, <a class="el" href="a00151.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">tbb::cache_aligned_allocator< T ></a><li>allocate_child()
+: <a class="el" href="a00207.html#c35e5db8e9cdff5d1387db5b0bad2e4a">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00204.html#f6cb487b1bdce0b581f265a77dca6d53">tbb::tbb_allocator< T ></a>, <a class="el" href="a00191.html#726b1586d05d44665a36e1c7b2699bfd">tbb::scalable_allocator< T ></a>, <a class="el" href="a00150.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">tbb::cache_aligned_allocator< T ></a><li>allocate_child()
: <a class="el" href="a00199.html#1ff794f7053cd9148d5f280fbf07377f">tbb::task</a><li>allocate_continuation()
: <a class="el" href="a00199.html#1434c79a5138993269d034008bff7329">tbb::task</a><li>allocate_root()
: <a class="el" href="a00199.html#8ccc518caf31075a3e073996d2d240a4">tbb::task</a><li>allocator_type()
-: <a class="el" href="a00204.html#78701e7454ef8e1a25b5acd364367080">tbb::tbb_allocator< T ></a>, <a class="el" href="a00164.html#da7721b6c35d333ec89a37b63d0d82d3">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00160.html#5a3956341728eaa558d8827063718cac">tbb::strict_ppl::concurrent_queue< T, A ></a><li>assign()
-: <a class="el" href="a00162.html#93a06b3112cb804f42f40efb5e7387b4">tbb::concurrent_vector< T, A ></a><li>at()
-: <a class="el" href="a00162.html#23e14a38af748edff96a7adc3a0f1c58">tbb::concurrent_vector< T, A ></a></ul>
+: <a class="el" href="a00204.html#78701e7454ef8e1a25b5acd364367080">tbb::tbb_allocator< T ></a>, <a class="el" href="a00163.html#3c03eb40955b933b01987222722ac4bd">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00154.html#2e2726fccf6d975dc1071608cc0bbf90">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00159.html#5a3956341728eaa558d8827063718cac">tbb::strict_ppl::concurrent_queue< T, A ></a><li>assign()
+: <a class="el" href="a00161.html#93a06b3112cb804f42f40efb5e7387b4">tbb::concurrent_vector< T, A ></a><li>at()
+: <a class="el" href="a00161.html#23e14a38af748edff96a7adc3a0f1c58">tbb::concurrent_vector< T, A ></a></ul>
<h3><a class="anchor" name="index_b">- b -</a></h3><ul>
<li>back()
-: <a class="el" href="a00162.html#bd518e204107d07fd08d0ec5bdfd383d">tbb::concurrent_vector< T, A ></a><li>begin()
-: <a class="el" href="a00164.html#5f94cdb3a743e8b57c70dcb1041cfdf9">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00162.html#78a06182276ff758788d4c0623ae0d71">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00148.html#18d2258400756ac1446dac7676b18df3">tbb::blocked_range< Value ></a>, <a class="el" href="a00142.html#0d702fc6b9e9d061ace3501b3c861cdf">tbb::aligned_space< T, N ></a><li>blocked_range()
-: <a class="el" href="a00148.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">tbb::blocked_range< Value ></a><li>bucket_count()
-: <a class="el" href="a00156.html#414d15033d36c63aa3a40666dc4d6f5e">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
+: <a class="el" href="a00161.html#bd518e204107d07fd08d0ec5bdfd383d">tbb::concurrent_vector< T, A ></a><li>begin()
+: <a class="el" href="a00163.html#84afb3906a39e399cde1c950d6351300">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00161.html#78a06182276ff758788d4c0623ae0d71">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00147.html#18d2258400756ac1446dac7676b18df3">tbb::blocked_range< Value ></a>, <a class="el" href="a00141.html#0d702fc6b9e9d061ace3501b3c861cdf">tbb::aligned_space< T, N ></a><li>blocked_range()
+: <a class="el" href="a00147.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">tbb::blocked_range< Value ></a><li>bucket_count()
+: <a class="el" href="a00155.html#414d15033d36c63aa3a40666dc4d6f5e">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
<h3><a class="anchor" name="index_c">- c -</a></h3><ul>
<li>cancel_group_execution()
: <a class="el" href="a00199.html#0f3fb4aac549ab642022450a4bd13326">tbb::task</a>, <a class="el" href="a00201.html#8bcdfdf4e6bfb76125b6de15c00b571d">tbb::task_group_context</a><li>capacity()
-: <a class="el" href="a00162.html#3ed6b9ae7217af5103d974045b6f5cd5">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00155.html#b2888b3e4e837d7e03f2c731963a402b">tbb::concurrent_bounded_queue< T, A ></a><li>cbegin()
-: <a class="el" href="a00162.html#f88fcf1c920693c39bd9709db33c199f">tbb::concurrent_vector< T, A ></a><li>cend()
-: <a class="el" href="a00162.html#0c15a5d0f1cf75d687dabba07da1d46b">tbb::concurrent_vector< T, A ></a><li>clear()
-: <a class="el" href="a00202.html#fce446ee13e025969945328f3ff59b95">tbb::task_list</a>, <a class="el" href="a00180.html#2c84aef5b834b555ee220b176e25931e">tbb::pipeline</a>, <a class="el" href="a00164.html#e7be0d504ba71ae6c7479eb373a361ab">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00162.html#26f937a359a66b6aae904c3cd9a3c444">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00155.html#90b31e2954c6e4596c7900435a5f [...]
-: <a class="el" href="a00150.html#3336ba9480fd6c43e158f9beb024c050">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00149.html#392a46759af2c884957115771affa7f4">tbb::blocked_range2d< RowValue, ColValue ></a><li>compact()
-: <a class="el" href="a00162.html#1693d1da41b1a8235871be9c6633be35">tbb::concurrent_vector< T, A ></a><li>concurrent_bounded_queue()
-: <a class="el" href="a00155.html#a5e04dcd7db9fd9b583b4e7df832246a">tbb::concurrent_bounded_queue< T, A ></a><li>concurrent_hash_map()
-: <a class="el" href="a00156.html#3bfe75fcb350ce39cf610c164f233edc">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>concurrent_queue()
-: <a class="el" href="a00161.html#9102b897776bd2d9e908e6604ff16b5f">tbb::deprecated::concurrent_queue< T, A ></a>, <a class="el" href="a00160.html#8a6b98ea11a867db8ac868f0113ca429">tbb::strict_ppl::concurrent_queue< T, A ></a><li>concurrent_vector()
-: <a class="el" href="a00162.html#4450de83c5862ea4bcd9443fd7e67419">tbb::concurrent_vector< T, A ></a><li>const_accessor()
-: <a class="el" href="a00159.html#a9ead65cca68d4c49c7ef64d7899a4c8">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>construct()
-: <a class="el" href="a00204.html#ab228ab9e324ed041c2226e1d717df5f">tbb::tbb_allocator< T ></a>, <a class="el" href="a00151.html#958ee8745c86c275bfc9533af565e017">tbb::cache_aligned_allocator< T ></a><li>context()
+: <a class="el" href="a00161.html#3ed6b9ae7217af5103d974045b6f5cd5">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00154.html#b2888b3e4e837d7e03f2c731963a402b">tbb::concurrent_bounded_queue< T, A ></a><li>cbegin()
+: <a class="el" href="a00161.html#f88fcf1c920693c39bd9709db33c199f">tbb::concurrent_vector< T, A ></a><li>cend()
+: <a class="el" href="a00161.html#0c15a5d0f1cf75d687dabba07da1d46b">tbb::concurrent_vector< T, A ></a><li>clear()
+: <a class="el" href="a00202.html#fce446ee13e025969945328f3ff59b95">tbb::task_list</a>, <a class="el" href="a00180.html#2c84aef5b834b555ee220b176e25931e">tbb::pipeline</a>, <a class="el" href="a00163.html#a8764176d4b6014c5d65f1051851abc8">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00161.html#26f937a359a66b6aae904c3cd9a3c444">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00154.html#90b31e2954c6e4596c7900435a5f [...]
+: <a class="el" href="a00149.html#3336ba9480fd6c43e158f9beb024c050">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00148.html#392a46759af2c884957115771affa7f4">tbb::blocked_range2d< RowValue, ColValue ></a><li>compact()
+: <a class="el" href="a00161.html#1693d1da41b1a8235871be9c6633be35">tbb::concurrent_vector< T, A ></a><li>concurrent_bounded_queue()
+: <a class="el" href="a00154.html#a5e04dcd7db9fd9b583b4e7df832246a">tbb::concurrent_bounded_queue< T, A ></a><li>concurrent_hash_map()
+: <a class="el" href="a00155.html#3bfe75fcb350ce39cf610c164f233edc">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>concurrent_queue()
+: <a class="el" href="a00160.html#9102b897776bd2d9e908e6604ff16b5f">tbb::deprecated::concurrent_queue< T, A ></a>, <a class="el" href="a00159.html#8a6b98ea11a867db8ac868f0113ca429">tbb::strict_ppl::concurrent_queue< T, A ></a><li>concurrent_vector()
+: <a class="el" href="a00161.html#4450de83c5862ea4bcd9443fd7e67419">tbb::concurrent_vector< T, A ></a><li>const_accessor()
+: <a class="el" href="a00158.html#a9ead65cca68d4c49c7ef64d7899a4c8">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>construct()
+: <a class="el" href="a00204.html#ab228ab9e324ed041c2226e1d717df5f">tbb::tbb_allocator< T ></a>, <a class="el" href="a00150.html#958ee8745c86c275bfc9533af565e017">tbb::cache_aligned_allocator< T ></a><li>context()
: <a class="el" href="a00199.html#d8c36a93f3972590fbb65ff1cef3173b">tbb::task</a><li>count()
-: <a class="el" href="a00156.html#74f5ef06a06c5e619f156a1c76c04969">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>crbegin()
-: <a class="el" href="a00162.html#db78a1d28c9c966050e8a2926d834a33">tbb::concurrent_vector< T, A ></a><li>crend()
-: <a class="el" href="a00162.html#fff9cece89438587997ebedf93c5e962">tbb::concurrent_vector< T, A ></a></ul>
+: <a class="el" href="a00155.html#74f5ef06a06c5e619f156a1c76c04969">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>crbegin()
+: <a class="el" href="a00161.html#db78a1d28c9c966050e8a2926d834a33">tbb::concurrent_vector< T, A ></a><li>crend()
+: <a class="el" href="a00161.html#fff9cece89438587997ebedf93c5e962">tbb::concurrent_vector< T, A ></a></ul>
<h3><a class="anchor" name="index_d">- d -</a></h3><ul>
<li>deallocate()
-: <a class="el" href="a00204.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">tbb::tbb_allocator< T ></a>, <a class="el" href="a00191.html#f806a238c18cbcfb531e1e0a0d2ec59d">tbb::scalable_allocator< T ></a>, <a class="el" href="a00151.html#3d4eadf188f7d85d3805ae534e0b8e1c">tbb::cache_aligned_allocator< T ></a><li>decrement_ref_count()
+: <a class="el" href="a00204.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">tbb::tbb_allocator< T ></a>, <a class="el" href="a00191.html#f806a238c18cbcfb531e1e0a0d2ec59d">tbb::scalable_allocator< T ></a>, <a class="el" href="a00150.html#3d4eadf188f7d85d3805ae534e0b8e1c">tbb::cache_aligned_allocator< T ></a><li>decrement_ref_count()
: <a class="el" href="a00199.html#ef4680f5c148020c5e7e43ddef44cd5d">tbb::task</a><li>default_num_threads()
: <a class="el" href="a00203.html#ba00714c33a41a3c2216f48613971cab">tbb::task_scheduler_init</a><li>destroy()
-: <a class="el" href="a00207.html#921875bbacd2c8a5f324c7da7a415262">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00171.html#7a46873119d9f85a7b0009c13e41a258">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00153.html#93d875d3555502ff6f18513525de204c">tbb::captured_exception</a>, <a class="el" href="a00206.html#66c94938eca8bf88b76f3eccaaf215d8">tbb::tbb_exception</a>, <a class="el" href="a00204.html#ef133522bf55f05a605bee0763208281">tbb::tbb_allocator [...]
+: <a class="el" href="a00207.html#921875bbacd2c8a5f324c7da7a415262">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00171.html#7a46873119d9f85a7b0009c13e41a258">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00152.html#93d875d3555502ff6f18513525de204c">tbb::captured_exception</a>, <a class="el" href="a00206.html#66c94938eca8bf88b76f3eccaaf215d8">tbb::tbb_exception</a>, <a class="el" href="a00204.html#ef133522bf55f05a605bee0763208281">tbb::tbb_allocator [...]
: <a class="el" href="a00197.html#c2c2c38a08cb9080e87099fac3e5bc94">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00185.html#0d2f93edf7b15ec4bcee138823220c52">tbb::queuing_rw_mutex::scoped_lock</a></ul>
<h3><a class="anchor" name="index_e">- e -</a></h3><ul>
<li>empty()
-: <a class="el" href="a00202.html#f3ac31e092814b90929f81bb30441959">tbb::task_list</a>, <a class="el" href="a00164.html#af91306d8e10e093226788a733ee59b4">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00162.html#c6426cb93cf20d3af40f3c90f1f0481a">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00155.html#f64924f2ee9225c368a270fc3c394db9">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00160.htm [...]
-: <a class="el" href="a00164.html#9909c01ec91ef10908c5155d6350db2d">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00162.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00148.html#8b929d93ddc13f148b11bceef3a3bdf8">tbb::blocked_range< Value ></a>, <a class="el" href="a00142.html#024be075c23c0394c9a2518d993bcd9e">tbb::aligned_space< T, N ></a><li>enqueue()
+: <a class="el" href="a00202.html#f3ac31e092814b90929f81bb30441959">tbb::task_list</a>, <a class="el" href="a00163.html#72595886d0ac8fd0543f90038570510d">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00161.html#c6426cb93cf20d3af40f3c90f1f0481a">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00154.html#f64924f2ee9225c368a270fc3c394db9">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00159.htm [...]
+: <a class="el" href="a00163.html#cb448bb4977ce366ceb7344085cc7050">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00161.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00147.html#8b929d93ddc13f148b11bceef3a3bdf8">tbb::blocked_range< Value ></a>, <a class="el" href="a00141.html#024be075c23c0394c9a2518d993bcd9e">tbb::aligned_space< T, N ></a><li>enqueue()
: <a class="el" href="a00199.html#8365d063c0cc9d7bd616bca47256b93c">tbb::task</a><li>enumerable_thread_specific()
-: <a class="el" href="a00164.html#105a6487c8c4113ba89891b75243780c">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>erase()
-: <a class="el" href="a00156.html#0f500842d0cf791f8fa61662edb1b311">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>exclude()
-: <a class="el" href="a00156.html#faad2108bd2be75e52293486af59f11e">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>execute()
+: <a class="el" href="a00163.html#7bce6829981c9efe3f59cae2355e383e">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>erase()
+: <a class="el" href="a00155.html#0f500842d0cf791f8fa61662edb1b311">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>exclude()
+: <a class="el" href="a00155.html#faad2108bd2be75e52293486af59f11e">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>execute()
: <a class="el" href="a00199.html#22c298cd40937a431a06777423f002f6">tbb::task</a></ul>
<h3><a class="anchor" name="index_f">- f -</a></h3><ul>
<li>finalize()
-: <a class="el" href="a00165.html#56275eb889c77c4807967133e21401bd">tbb::filter</a><li>find()
-: <a class="el" href="a00156.html#bce7bdf46435115a95cca2aa73c5da83">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>front()
-: <a class="el" href="a00162.html#502615a858eb9fa0390ee59169065e90">tbb::concurrent_vector< T, A ></a></ul>
+: <a class="el" href="a00164.html#56275eb889c77c4807967133e21401bd">tbb::filter</a><li>find()
+: <a class="el" href="a00155.html#bce7bdf46435115a95cca2aa73c5da83">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>front()
+: <a class="el" href="a00161.html#502615a858eb9fa0390ee59169065e90">tbb::concurrent_vector< T, A ></a></ul>
<h3><a class="anchor" name="index_g">- g -</a></h3><ul>
<li>get_allocator()
-: <a class="el" href="a00162.html#2fdba8e90de6a4d2300222236d46758e">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00155.html#415eb87e53b1c6a266de06ecbc490d16">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00160.html#f034f70caef445fe8abc9113ec926a8d">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00156.html#199208eed6f09e200cda364f906be0fe">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><l [...]
-: <a class="el" href="a00148.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">tbb::blocked_range< Value ></a><li>grow_by()
-: <a class="el" href="a00162.html#473a59a4c9308b93411b898b3110d26c">tbb::concurrent_vector< T, A ></a><li>grow_to_at_least()
-: <a class="el" href="a00162.html#a7e3b67c8ccab16d0aecc80899ae799d">tbb::concurrent_vector< T, A ></a></ul>
+: <a class="el" href="a00161.html#2fdba8e90de6a4d2300222236d46758e">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00154.html#415eb87e53b1c6a266de06ecbc490d16">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00159.html#f034f70caef445fe8abc9113ec926a8d">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00155.html#199208eed6f09e200cda364f906be0fe">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><l [...]
+: <a class="el" href="a00147.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">tbb::blocked_range< Value ></a><li>grow_by()
+: <a class="el" href="a00161.html#473a59a4c9308b93411b898b3110d26c">tbb::concurrent_vector< T, A ></a><li>grow_to_at_least()
+: <a class="el" href="a00161.html#a7e3b67c8ccab16d0aecc80899ae799d">tbb::concurrent_vector< T, A ></a></ul>
<h3><a class="anchor" name="index_i">- i -</a></h3><ul>
<li>increment_ref_count()
: <a class="el" href="a00199.html#f5fb43c7ad0de5a4b95703cebc39e345">tbb::task</a><li>init()
: <a class="el" href="a00201.html#49a55352084fd44b8863d182e839e6dc">tbb::task_group_context</a><li>initialize()
: <a class="el" href="a00203.html#d5ed214a8bb53b0466ed91ff4734b9a3">tbb::task_scheduler_init</a><li>insert()
-: <a class="el" href="a00156.html#cfe172677e5987004ef4a03e22fa338a">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_copy()
-: <a class="el" href="a00156.html#3c27779fe66b79505390d084310d997e">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_equal_range()
-: <a class="el" href="a00156.html#976c57edfb7f22b9f91a2e11f141eb4a">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_fast_find()
-: <a class="el" href="a00156.html#2f76ed101a0ccc8875b846c2f747897e">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>interval_t()
+: <a class="el" href="a00155.html#cfe172677e5987004ef4a03e22fa338a">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_copy()
+: <a class="el" href="a00155.html#3c27779fe66b79505390d084310d997e">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_equal_range()
+: <a class="el" href="a00155.html#976c57edfb7f22b9f91a2e11f141eb4a">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_fast_find()
+: <a class="el" href="a00155.html#2f76ed101a0ccc8875b846c2f747897e">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>interval_t()
: <a class="el" href="a00211.html#1a21a428e00cced2e6a49e0f5f2258bf">tbb::tick_count::interval_t</a><li>is_active()
: <a class="el" href="a00203.html#12752282977029f23416642bc03e8b74">tbb::task_scheduler_init</a><li>is_bound()
-: <a class="el" href="a00165.html#15c29cae5d237e6d63dbfe5c94af89d5">tbb::filter</a><li>is_cancelled()
+: <a class="el" href="a00164.html#15c29cae5d237e6d63dbfe5c94af89d5">tbb::filter</a><li>is_cancelled()
: <a class="el" href="a00199.html#025f18118c057c4c8db87ff2ce8df975">tbb::task</a><li>is_divisible()
-: <a class="el" href="a00150.html#39d69191721c488e737ae5d9c5336b9c">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00149.html#ad36a9b38e4fef26d376f99552ce2d92">tbb::blocked_range2d< RowValue, ColValue ></a>, <a class="el" href="a00148.html#41a58b703d574b6e1ca155df3576f578">tbb::blocked_range< Value ></a><li>is_group_execution_cancelled()
+: <a class="el" href="a00149.html#39d69191721c488e737ae5d9c5336b9c">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00148.html#ad36a9b38e4fef26d376f99552ce2d92">tbb::blocked_range2d< RowValue, ColValue ></a>, <a class="el" href="a00147.html#41a58b703d574b6e1ca155df3576f578">tbb::blocked_range< Value ></a><li>is_group_execution_cancelled()
: <a class="el" href="a00201.html#4db72f16210b0a991b2c134d6763a4cc">tbb::task_group_context</a><li>is_ordered()
-: <a class="el" href="a00165.html#cd53206c4795ef2df5df26b795caf692">tbb::filter</a><li>is_owned_by_current_thread()
+: <a class="el" href="a00164.html#cd53206c4795ef2df5df26b795caf692">tbb::filter</a><li>is_owned_by_current_thread()
: <a class="el" href="a00199.html#c26718b3b247cd13deb1a741902e7105">tbb::task</a><li>is_serial()
-: <a class="el" href="a00165.html#fcfec27656a69ff2072802ac001e936f">tbb::filter</a><li>is_stolen_task()
+: <a class="el" href="a00164.html#fcfec27656a69ff2072802ac001e936f">tbb::filter</a><li>is_stolen_task()
: <a class="el" href="a00199.html#f9169402702f56bf519448aaf34450aa">tbb::task</a><li>is_writer()
-: <a class="el" href="a00158.html#fc194e3a186dc935a5fb513cc9f8e898">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a></ul>
+: <a class="el" href="a00157.html#fc194e3a186dc935a5fb513cc9f8e898">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a></ul>
<h3><a class="anchor" name="index_l">- l -</a></h3><ul>
<li>local()
-: <a class="el" href="a00164.html#34423652c3add42563b1d5d44ca78158">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>lock()
+: <a class="el" href="a00163.html#7dc79058d2832f7447de8e691c3455ea">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>lock()
: <a class="el" href="a00196.html#4007d6e1523dbc3c2bb7f889ab789a8a">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00194.html#4f748989e19b6045e3a2d2ee73626a28">tbb::spin_mutex</a>, <a class="el" href="a00189.html#4c342c69d47f4bb0b393535dee4015d6">tbb::recursive_mutex</a>, <a class="el" href="a00186.html#2653d1a2d560059a51219a8ceab3ade9">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00172.html#4470e61c24c129a0299ca6c17240adbb">tbb::mutex</a><li>lock_read()
: <a class="el" href="a00196.html#13f799708ac4ca437a16be202e263e18">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00186.html#d9d16a24d9f6c3dada73c6b9ff214f5b">tbb::interface5::reader_writer_lock</a><li>lookup()
-: <a class="el" href="a00156.html#1f22480a290ddc6c145888d8f985531a">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
+: <a class="el" href="a00155.html#1f22480a290ddc6c145888d8f985531a">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
<h3><a class="anchor" name="index_m">- m -</a></h3><ul>
<li>max_size()
-: <a class="el" href="a00204.html#f059ca2c96243024f0d562ee3a87a3a5">tbb::tbb_allocator< T ></a>, <a class="el" href="a00191.html#880e766f1d913988c21973dbdd874fd5">tbb::scalable_allocator< T ></a>, <a class="el" href="a00162.html#2c248a017f0576df3e7cd99627836fd6">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00156.html#1e45d3cbd1e2ae06f365f1b48e0df0b5">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>, <a class="el" href="a00151. [...]
-: <a class="el" href="a00171.html#1aea0ad179d6f0481fe7f3495f66adf9">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00153.html#837a50b8f6a800bda225c39d1699643f">tbb::captured_exception</a>, <a class="el" href="a00206.html#3e3482bf264d4ca4dde046cd9c02c766">tbb::tbb_exception</a><li>mutex()
+: <a class="el" href="a00204.html#f059ca2c96243024f0d562ee3a87a3a5">tbb::tbb_allocator< T ></a>, <a class="el" href="a00191.html#880e766f1d913988c21973dbdd874fd5">tbb::scalable_allocator< T ></a>, <a class="el" href="a00161.html#2c248a017f0576df3e7cd99627836fd6">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00155.html#1e45d3cbd1e2ae06f365f1b48e0df0b5">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>, <a class="el" href="a00150. [...]
+: <a class="el" href="a00171.html#1aea0ad179d6f0481fe7f3495f66adf9">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00152.html#837a50b8f6a800bda225c39d1699643f">tbb::captured_exception</a>, <a class="el" href="a00206.html#3e3482bf264d4ca4dde046cd9c02c766">tbb::tbb_exception</a><li>mutex()
: <a class="el" href="a00172.html#05313cb77d4f85213103d4dab74ed454">tbb::mutex</a></ul>
<h3><a class="anchor" name="index_n">- n -</a></h3><ul>
<li>name()
-: <a class="el" href="a00171.html#bc5f5c4739b17ac5211ac58226c2f5a5">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00153.html#5af82fd677449c5ca727fa1d7e16f9f5">tbb::captured_exception</a>, <a class="el" href="a00206.html#d00f6497e552fee978a02bfcbebf46e2">tbb::tbb_exception</a><li>note_affinity()
+: <a class="el" href="a00171.html#bc5f5c4739b17ac5211ac58226c2f5a5">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00152.html#5af82fd677449c5ca727fa1d7e16f9f5">tbb::captured_exception</a>, <a class="el" href="a00206.html#d00f6497e552fee978a02bfcbebf46e2">tbb::tbb_exception</a><li>note_affinity()
: <a class="el" href="a00199.html#713c338c8eeaebdc5a6b10a69c039b06">tbb::task</a><li>now()
: <a class="el" href="a00210.html#fb7f78ca61cf28398645ace66e284473">tbb::tick_count</a></ul>
<h3><a class="anchor" name="index_o">- o -</a></h3><ul>
<li>operator *()
-: <a class="el" href="a00157.html#e8938f0cd1211e88a1d73527ed3636c4">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, <a class="el" href="a00159.html#30f31106840700a4c3664b9cb1c31ca7">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>operator delete()
+: <a class="el" href="a00156.html#e8938f0cd1211e88a1d73527ed3636c4">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, <a class="el" href="a00158.html#30f31106840700a4c3664b9cb1c31ca7">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>operator delete()
: <a class="el" href="a00206.html#3f2da7f3d8a6e4c1df522af1213afb5a">tbb::tbb_exception</a><li>operator()()
-: <a class="el" href="a00165.html#fa1b3dc1f4f47563ccab7f4d92f5b543">tbb::filter</a>, <a class="el" href="a00158.html#57c6110bd20e95c06de5a199de988941">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a><li>operator+=()
+: <a class="el" href="a00164.html#fa1b3dc1f4f47563ccab7f4d92f5b543">tbb::filter</a>, <a class="el" href="a00157.html#57c6110bd20e95c06de5a199de988941">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a><li>operator+=()
: <a class="el" href="a00211.html#cd9814947902e26463a69a111530f81b">tbb::tick_count::interval_t</a><li>operator-=()
: <a class="el" href="a00211.html#35ff7eaf7c2031b4a991402ac9ecb940">tbb::tick_count::interval_t</a><li>operator->()
-: <a class="el" href="a00157.html#fcebc32c020202cc37e60eadef157569">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, <a class="el" href="a00159.html#3d03a48ecb8cd9549bd8be64b09c9b0d">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>operator=()
-: <a class="el" href="a00162.html#19f4ab88a01b0fd056af3bba463e7bd6">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00156.html#2c0c42a2e1b5282b6739157df9ce2304">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>operator[]()
-: <a class="el" href="a00162.html#c6fade5c732cc95274d1d8277ea619d1">tbb::concurrent_vector< T, A ></a></ul>
+: <a class="el" href="a00156.html#fcebc32c020202cc37e60eadef157569">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, <a class="el" href="a00158.html#3d03a48ecb8cd9549bd8be64b09c9b0d">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>operator=()
+: <a class="el" href="a00161.html#19f4ab88a01b0fd056af3bba463e7bd6">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00155.html#2c0c42a2e1b5282b6739157df9ce2304">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>operator[]()
+: <a class="el" href="a00161.html#c6fade5c732cc95274d1d8277ea619d1">tbb::concurrent_vector< T, A ></a></ul>
<h3><a class="anchor" name="index_p">- p -</a></h3><ul>
<li>pages()
-: <a class="el" href="a00150.html#cf971430aa12361d3ed245344b7c6764">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a><li>parallel_while()
+: <a class="el" href="a00149.html#cf971430aa12361d3ed245344b7c6764">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a><li>parallel_while()
: <a class="el" href="a00179.html#36e26ba3880c7bcf804a97ba0cbe133f">tbb::parallel_while< Body ></a><li>parent()
: <a class="el" href="a00199.html#314e98ee4347ccec83efcb9ee22e8596">tbb::task</a><li>pause()
-: <a class="el" href="a00145.html#a174ea93e3bd3d5cce82389c2f28d037">tbb::internal::atomic_backoff</a><li>pipeline()
+: <a class="el" href="a00144.html#a174ea93e3bd3d5cce82389c2f28d037">tbb::internal::atomic_backoff</a><li>pipeline()
: <a class="el" href="a00180.html#596dc3beba27099c4c8581cb419e1a59">tbb::pipeline</a><li>pop()
-: <a class="el" href="a00155.html#41f4c6bd7a82ab070e840bbf81b0b123">tbb::concurrent_bounded_queue< T, A ></a><li>pop_front()
+: <a class="el" href="a00154.html#41f4c6bd7a82ab070e840bbf81b0b123">tbb::concurrent_bounded_queue< T, A ></a><li>pop_front()
: <a class="el" href="a00202.html#5fe85df5ed524418389d34051750347d">tbb::task_list</a><li>pop_if_present()
-: <a class="el" href="a00161.html#48da3536245318af6cb5fd58bac78039">tbb::deprecated::concurrent_queue< T, A ></a><li>process_item()
+: <a class="el" href="a00160.html#48da3536245318af6cb5fd58bac78039">tbb::deprecated::concurrent_queue< T, A ></a><li>process_item()
: <a class="el" href="a00209.html#5e726bdc7fbd924c0b07bd558b1d4d5d">tbb::thread_bound_filter</a><li>push()
-: <a class="el" href="a00155.html#ceb08c743b11ba88c878e73fff8af20b">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00160.html#73c47563ffcc4c2f6452f25a04ebe2e2">tbb::strict_ppl::concurrent_queue< T, A ></a><li>push_back()
-: <a class="el" href="a00202.html#4cd34756bc4763dafb8c84838a0124ff">tbb::task_list</a>, <a class="el" href="a00162.html#e94e038f915c0268fdf2d3d7f87d81b8">tbb::concurrent_vector< T, A ></a><li>push_if_not_full()
-: <a class="el" href="a00161.html#7c45561bafe71107d09b2bc1b8f4e681">tbb::deprecated::concurrent_queue< T, A ></a></ul>
+: <a class="el" href="a00154.html#ceb08c743b11ba88c878e73fff8af20b">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00159.html#73c47563ffcc4c2f6452f25a04ebe2e2">tbb::strict_ppl::concurrent_queue< T, A ></a><li>push_back()
+: <a class="el" href="a00202.html#4cd34756bc4763dafb8c84838a0124ff">tbb::task_list</a>, <a class="el" href="a00161.html#e94e038f915c0268fdf2d3d7f87d81b8">tbb::concurrent_vector< T, A ></a><li>push_if_not_full()
+: <a class="el" href="a00160.html#7c45561bafe71107d09b2bc1b8f4e681">tbb::deprecated::concurrent_queue< T, A ></a></ul>
<h3><a class="anchor" name="index_q">- q -</a></h3><ul>
<li>queuing_mutex()
: <a class="el" href="a00182.html#b389ad9c4db7293e4bdb5b8cda69ec04">tbb::queuing_mutex</a><li>queuing_rw_mutex()
: <a class="el" href="a00184.html#85c90877c3447690ac4e2ac4ff8dea5e">tbb::queuing_rw_mutex</a></ul>
<h3><a class="anchor" name="index_r">- r -</a></h3><ul>
<li>range()
-: <a class="el" href="a00164.html#48f5ab20db3c77faa7219deb28076e6c">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00162.html#3d09ccfb581b879ae64203741035e193">tbb::concurrent_vector< T, A ></a><li>rbegin()
-: <a class="el" href="a00162.html#9f9c103e18d5f212703805354074ad44">tbb::concurrent_vector< T, A ></a><li>reader_writer_lock()
+: <a class="el" href="a00163.html#3b068000cf4dbf9b40f8bb7e3fc53e0b">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00161.html#3d09ccfb581b879ae64203741035e193">tbb::concurrent_vector< T, A ></a><li>rbegin()
+: <a class="el" href="a00161.html#9f9c103e18d5f212703805354074ad44">tbb::concurrent_vector< T, A ></a><li>reader_writer_lock()
: <a class="el" href="a00186.html#c1431c4293e777efd9aab9a95c2a46e1">tbb::interface5::reader_writer_lock</a><li>recursive_mutex()
: <a class="el" href="a00189.html#d2fceb7f95c24a8cd1457d4527e4b8c6">tbb::recursive_mutex</a><li>recycle_as_child_of()
: <a class="el" href="a00199.html#db399855177438bbc9cc61d508dae8d2">tbb::task</a><li>recycle_as_continuation()
@@ -200,13 +200,13 @@
: <a class="el" href="a00199.html#4f1be9bbcdb487830dbe298b68d85144">tbb::task</a><li>ref_count()
: <a class="el" href="a00199.html#ad774f55eaec008ae02b236423209ced">tbb::task</a><li>register_pending_exception()
: <a class="el" href="a00201.html#d97c8a03615594b71b4ef06ff75cf561">tbb::task_group_context</a><li>rehash()
-: <a class="el" href="a00156.html#13f3f2e8de7564be03882c31559493c9">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>release()
-: <a class="el" href="a00197.html#61b14d00a78185c9b2d206ebfc379124">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00195.html#eeb615e68e963e6bf8d9c11402d0ce8e">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00190.html#ac480ea0e9d5ea0345a67d57008b6263">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00185.html#67ae221109ddc69510ab593874e435d4">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00183.html#3bf2b8c87ff22115be9b2eac179f2d30">tbb::qu [...]
-: <a class="el" href="a00162.html#d438b9b32ea3a8ffb703015b6dce055b">tbb::concurrent_vector< T, A ></a><li>reserve()
-: <a class="el" href="a00162.html#5a0ce05026994b010018f72cfdeb72c1">tbb::concurrent_vector< T, A ></a><li>reset()
+: <a class="el" href="a00155.html#13f3f2e8de7564be03882c31559493c9">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>release()
+: <a class="el" href="a00197.html#61b14d00a78185c9b2d206ebfc379124">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00195.html#eeb615e68e963e6bf8d9c11402d0ce8e">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00190.html#ac480ea0e9d5ea0345a67d57008b6263">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00185.html#67ae221109ddc69510ab593874e435d4">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00183.html#3bf2b8c87ff22115be9b2eac179f2d30">tbb::qu [...]
+: <a class="el" href="a00161.html#d438b9b32ea3a8ffb703015b6dce055b">tbb::concurrent_vector< T, A ></a><li>reserve()
+: <a class="el" href="a00161.html#5a0ce05026994b010018f72cfdeb72c1">tbb::concurrent_vector< T, A ></a><li>reset()
: <a class="el" href="a00201.html#6d30d16bf1cd22f86c6afaf29c2b430c">tbb::task_group_context</a><li>resize()
-: <a class="el" href="a00162.html#98ce6b2c6d2622f0c030b46dfac3880c">tbb::concurrent_vector< T, A ></a><li>rows()
-: <a class="el" href="a00150.html#1584623e59ff32a8aa82006827508be4">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00149.html#f496e7348a82652fba581203477cc07c">tbb::blocked_range2d< RowValue, ColValue ></a><li>run()
+: <a class="el" href="a00161.html#98ce6b2c6d2622f0c030b46dfac3880c">tbb::concurrent_vector< T, A ></a><li>rows()
+: <a class="el" href="a00149.html#1584623e59ff32a8aa82006827508be4">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00148.html#f496e7348a82652fba581203477cc07c">tbb::blocked_range2d< RowValue, ColValue ></a><li>run()
: <a class="el" href="a00180.html#93d7fec8cd607b803dd2d79fb46bd260">tbb::pipeline</a>, <a class="el" href="a00179.html#b32a0a6e5e09ebb7fad3e6652c19afe5">tbb::parallel_while< Body ></a></ul>
<h3><a class="anchor" name="index_s">- s -</a></h3><ul>
<li>scoped_lock()
@@ -215,17 +215,17 @@
: <a class="el" href="a00211.html#d5d8429c0bc59cf6131b2abc7929fa59">tbb::tick_count::interval_t</a><li>self()
: <a class="el" href="a00199.html#bd43e8d6249738efafd12d6a4c72c5e3">tbb::task</a><li>set_affinity()
: <a class="el" href="a00199.html#dca19d7a45487a7d67a0db517e2b57c9">tbb::task</a><li>set_capacity()
-: <a class="el" href="a00155.html#f3c6c934f85fd02aedbc83a16943193b">tbb::concurrent_bounded_queue< T, A ></a><li>set_ref_count()
+: <a class="el" href="a00154.html#f3c6c934f85fd02aedbc83a16943193b">tbb::concurrent_bounded_queue< T, A ></a><li>set_ref_count()
: <a class="el" href="a00199.html#06a4206a57e8e12a439b14d6d41cfd92">tbb::task</a><li>set_state()
: <a class="el" href="a00172.html#795649a185b0d6af6dc81c5f378616dd">tbb::mutex</a><li>shrink_to_fit()
-: <a class="el" href="a00162.html#03c6f4cf66532bf4cc907ee738a9a186">tbb::concurrent_vector< T, A ></a><li>size()
-: <a class="el" href="a00164.html#101ecd32efae3ce1331c3d8a791c645b">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00162.html#715fe313c4a9c22731cc404dd80c9ec9">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00155.html#7dc14d1a579a4cccda9f857585e1768d">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00156.html#17fd8c5fe8c6a86075f34aa4e8412ba3">tbb::interface4::concurrent_hash_map< Key, T, H [...]
+: <a class="el" href="a00161.html#03c6f4cf66532bf4cc907ee738a9a186">tbb::concurrent_vector< T, A ></a><li>size()
+: <a class="el" href="a00163.html#33fd6593da1ed14340f10f67d5a69130">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00161.html#715fe313c4a9c22731cc404dd80c9ec9">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00154.html#7dc14d1a579a4cccda9f857585e1768d">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00155.html#17fd8c5fe8c6a86075f34aa4e8412ba3">tbb::interface4::concurrent_hash_map< Key, T, H [...]
: <a class="el" href="a00199.html#894ab68378e502776d8220eea7ce9fa1">tbb::task</a><li>spawn_root_and_wait()
: <a class="el" href="a00199.html#c33c7edbaec67aa8a56f48986a9dc69f">tbb::task</a><li>spin_mutex()
: <a class="el" href="a00194.html#3d8fb44644fd8d41ada1fbeba7409be3">tbb::spin_mutex</a><li>spin_rw_mutex_v3()
: <a class="el" href="a00196.html#61332b2756de89f3f5f69310cbb6e70c">tbb::spin_rw_mutex_v3</a><li>state()
: <a class="el" href="a00199.html#0af7b2d7e6e8b4333b2accfce3dfb374">tbb::task</a><li>swap()
-: <a class="el" href="a00162.html#96c9c4bd968ed3edb8dd276854d2dae0">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00156.html#eddb0d2efe0b4f25a85c059e1c3dac15">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
+: <a class="el" href="a00161.html#96c9c4bd968ed3edb8dd276854d2dae0">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00155.html#eddb0d2efe0b4f25a85c059e1c3dac15">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
<h3><a class="anchor" name="index_t">- t -</a></h3><ul>
<li>task()
: <a class="el" href="a00199.html#2bce8ec6e44706e70128f5cf91b76e67">tbb::task</a><li>task_group_context()
@@ -233,33 +233,33 @@
: <a class="el" href="a00202.html#416341c2047eaef50417b41eaf7e9de6">tbb::task_list</a><li>task_scheduler_init()
: <a class="el" href="a00203.html#421600bf9bf9338bcf937063f2ff0e90">tbb::task_scheduler_init</a><li>terminate()
: <a class="el" href="a00203.html#f73257e04cb7fb9bd5be2b635d9016f1">tbb::task_scheduler_init</a><li>throw_self()
-: <a class="el" href="a00207.html#292832fd5c523e3d8081a22247840a1d">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00171.html#17cffba35811c92b7e65d63506b69602">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00153.html#2dd1be66ab32fa27e0ddef5707fa67ef">tbb::captured_exception</a>, <a class="el" href="a00206.html#8588e07fa49692f4d734e4f2e4f048f4">tbb::tbb_exception</a><li>tick_count()
+: <a class="el" href="a00207.html#292832fd5c523e3d8081a22247840a1d">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00171.html#17cffba35811c92b7e65d63506b69602">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00152.html#2dd1be66ab32fa27e0ddef5707fa67ef">tbb::captured_exception</a>, <a class="el" href="a00206.html#8588e07fa49692f4d734e4f2e4f048f4">tbb::tbb_exception</a><li>tick_count()
: <a class="el" href="a00210.html#34593326ae4191e02a13c7cbdab9de4c">tbb::tick_count</a><li>try_acquire()
: <a class="el" href="a00197.html#9879626968d9b9a04cd2ec0fb2e84ae1">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00195.html#9297ec188534b45dc0ca48f2f39a0501">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00190.html#36bfc3e93e3ef6340abef4901444d340">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00185.html#2e4ff6c9ec2fee6682f95290d1f42baa">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00183.html#e5a014fb817599386a87170cf2cf51a9">tbb::qu [...]
: <a class="el" href="a00196.html#088bb256be794cc47d3b83791632fdfc">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00194.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">tbb::spin_mutex</a>, <a class="el" href="a00189.html#86e719b0afee25704af11ab97694d240">tbb::recursive_mutex</a>, <a class="el" href="a00186.html#721eb173e154ab38292273e9266a9b07">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00172.html#4331652c79dea1c1131bd59ab161b234">tbb::mutex</a><li>try_lock_read()
: <a class="el" href="a00196.html#b8667415869013f840d976aa406d385a">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00186.html#595fb23952e3b89426b1f7938dea9b11">tbb::interface5::reader_writer_lock</a><li>try_pop()
-: <a class="el" href="a00155.html#0ca487019bbb00a196442aff78a1e4f7">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00160.html#ae31ca0db34ef96ef1e74aa0d28c95f8">tbb::strict_ppl::concurrent_queue< T, A ></a><li>try_process_item()
+: <a class="el" href="a00154.html#0ca487019bbb00a196442aff78a1e4f7">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00159.html#ae31ca0db34ef96ef1e74aa0d28c95f8">tbb::strict_ppl::concurrent_queue< T, A ></a><li>try_process_item()
: <a class="el" href="a00209.html#c4f90f2c771bce748beb9be734fa286c">tbb::thread_bound_filter</a><li>try_push()
-: <a class="el" href="a00155.html#2bd6232531279fb3ccbd296bea23066b">tbb::concurrent_bounded_queue< T, A ></a></ul>
+: <a class="el" href="a00154.html#2bd6232531279fb3ccbd296bea23066b">tbb::concurrent_bounded_queue< T, A ></a></ul>
<h3><a class="anchor" name="index_u">- u -</a></h3><ul>
<li>unlock()
: <a class="el" href="a00196.html#f9f52ead2098eb5fb12da59d5ae53b55">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00194.html#0e843ee6265f57f27d228ba91e7308ef">tbb::spin_mutex</a>, <a class="el" href="a00189.html#f0a96e26b7f074588dc31e32524856ae">tbb::recursive_mutex</a>, <a class="el" href="a00186.html#5113b32689305599b2c36b5831547704">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00172.html#5fc9ef443ae75d966695546be399cc6b">tbb::mutex</a><li>unsafe_size()
-: <a class="el" href="a00160.html#eaa35a5274606779802e9a669a706260">tbb::strict_ppl::concurrent_queue< T, A ></a><li>upgrade_to_writer()
+: <a class="el" href="a00159.html#eaa35a5274606779802e9a669a706260">tbb::strict_ppl::concurrent_queue< T, A ></a><li>upgrade_to_writer()
: <a class="el" href="a00197.html#3f0b1e3f2efab63336400348bd070226">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00185.html#11ba1da4a722c9e6f73339a52c487e82">tbb::queuing_rw_mutex::scoped_lock</a></ul>
<h3><a class="anchor" name="index_w">- w -</a></h3><ul>
<li>wait_for_all()
: <a class="el" href="a00199.html#53d2615ad9c38859b4c8080936600283">tbb::task</a><li>what()
-: <a class="el" href="a00171.html#b33a89bccf0c63106f1270c7bfaaf54f">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00153.html#6b5988ef74a1fe2a58998d110b3633e0">tbb::captured_exception</a>, <a class="el" href="a00206.html#e8157689ecb66bc6c72d3618bf3cc371">tbb::tbb_exception</a></ul>
+: <a class="el" href="a00171.html#b33a89bccf0c63106f1270c7bfaaf54f">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00152.html#6b5988ef74a1fe2a58998d110b3633e0">tbb::captured_exception</a>, <a class="el" href="a00206.html#e8157689ecb66bc6c72d3618bf3cc371">tbb::tbb_exception</a></ul>
<h3><a class="anchor" name="index_~">- ~ -</a></h3><ul>
<li>~combinable()
-: <a class="el" href="a00154.html#2c87e79ae98588a5780f708773388843">tbb::combinable< T ></a><li>~concurrent_bounded_queue()
-: <a class="el" href="a00155.html#acaf5b510dc0dfc7780b8c956cf773cf">tbb::concurrent_bounded_queue< T, A ></a><li>~concurrent_hash_map()
-: <a class="el" href="a00156.html#a1ac58997d8fbf242b266e3691573481">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>~concurrent_queue()
-: <a class="el" href="a00160.html#830b33753d6b149c366344e29b2edd8c">tbb::strict_ppl::concurrent_queue< T, A ></a><li>~concurrent_vector()
-: <a class="el" href="a00162.html#da2444b28bb840d38f60d0030333a5fc">tbb::concurrent_vector< T, A ></a><li>~const_accessor()
-: <a class="el" href="a00159.html#752b0c1ec74b94786403a75e42917d01">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>~enumerable_thread_specific()
-: <a class="el" href="a00164.html#7f6e5b3654712ea003cbb7ebaffa8dd9">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>~filter()
-: <a class="el" href="a00165.html#66d159f362293e3964ba3da8bc1d2604">tbb::filter</a><li>~parallel_while()
+: <a class="el" href="a00153.html#2c87e79ae98588a5780f708773388843">tbb::combinable< T ></a><li>~concurrent_bounded_queue()
+: <a class="el" href="a00154.html#acaf5b510dc0dfc7780b8c956cf773cf">tbb::concurrent_bounded_queue< T, A ></a><li>~concurrent_hash_map()
+: <a class="el" href="a00155.html#a1ac58997d8fbf242b266e3691573481">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>~concurrent_queue()
+: <a class="el" href="a00159.html#830b33753d6b149c366344e29b2edd8c">tbb::strict_ppl::concurrent_queue< T, A ></a><li>~concurrent_vector()
+: <a class="el" href="a00161.html#da2444b28bb840d38f60d0030333a5fc">tbb::concurrent_vector< T, A ></a><li>~const_accessor()
+: <a class="el" href="a00158.html#752b0c1ec74b94786403a75e42917d01">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>~enumerable_thread_specific()
+: <a class="el" href="a00163.html#5a7907d9e3e5b18e7a7b55211ef3213f">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>~filter()
+: <a class="el" href="a00164.html#66d159f362293e3964ba3da8bc1d2604">tbb::filter</a><li>~parallel_while()
: <a class="el" href="a00179.html#6fcfc973cc56b79c6d0fbb8a31be7e84">tbb::parallel_while< Body ></a><li>~pipeline()
: <a class="el" href="a00180.html#49513c6c24f9d5bbbb27edca5efe01c9">tbb::pipeline</a><li>~queuing_rw_mutex()
: <a class="el" href="a00184.html#1ba73e3d95cfdf8323880bc623af9099">tbb::queuing_rw_mutex</a><li>~reader_writer_lock()
diff --git a/doc/html/functions_rela.html b/doc/html/functions_rela.html
index 0499987..40a47cb 100644
--- a/doc/html/functions_rela.html
+++ b/doc/html/functions_rela.html
@@ -34,7 +34,8 @@
<p>
<ul>
-<li>operator+
+<li>make_filter
+: <a class="el" href="a00165.html#85c2892eff1fddcd06e28911e75838bd">tbb::interface5::filter_t< T, U ></a><li>operator+
: <a class="el" href="a00211.html#5871ead1ca230efbe52a5008470e6428">tbb::tick_count::interval_t</a><li>operator-
: <a class="el" href="a00210.html#09dde78a4100800c11bb883d6204b586">tbb::tick_count</a>, <a class="el" href="a00211.html#fa509691e1d689830931e36edd274f76">tbb::tick_count::interval_t</a></ul>
<hr>
diff --git a/doc/html/functions_type.html b/doc/html/functions_type.html
index 20895b7..e12219b 100644
--- a/doc/html/functions_type.html
+++ b/doc/html/functions_type.html
@@ -36,16 +36,16 @@
<ul>
<li>affinity_id
: <a class="el" href="a00199.html#d61bb32389d3857bf7511d69beaafb76">tbb::task</a><li>allocator_type
-: <a class="el" href="a00204.html#78701e7454ef8e1a25b5acd364367080">tbb::tbb_allocator< T ></a>, <a class="el" href="a00164.html#da7721b6c35d333ec89a37b63d0d82d3">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00160.html#5a3956341728eaa558d8827063718cac">tbb::strict_ppl::concurrent_queue< T, A ></a><li>co [...]
-: <a class="el" href="a00148.html#1a8d05842c2b3dfc177bc4d347e4cef7">tbb::blocked_range< Value ></a><li>const_reference
-: <a class="el" href="a00155.html#796713d0b9ba93a4721cbe13e4474068">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00160.html#4d48e7ff93f81636bca2c74f7da34750">tbb::strict_ppl::concurrent_queue< T, A ></a><li>difference_type
-: <a class="el" href="a00155.html#4b45c91297e69515d83d5eef85ae1f49">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00160.html#068576d16c7e4e05d52f9db7a45b5b65">tbb::strict_ppl::concurrent_queue< T, A ></a><li>native_handle_type
+: <a class="el" href="a00204.html#78701e7454ef8e1a25b5acd364367080">tbb::tbb_allocator< T ></a>, <a class="el" href="a00163.html#3c03eb40955b933b01987222722ac4bd">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00154.html#2e2726fccf6d975dc1071608cc0bbf90">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00159.html#5a3956341728eaa558d8827063718cac">tbb::strict_ppl::concurrent_queue< T, A ></a><li>co [...]
+: <a class="el" href="a00147.html#1a8d05842c2b3dfc177bc4d347e4cef7">tbb::blocked_range< Value ></a><li>const_reference
+: <a class="el" href="a00154.html#796713d0b9ba93a4721cbe13e4474068">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00159.html#4d48e7ff93f81636bca2c74f7da34750">tbb::strict_ppl::concurrent_queue< T, A ></a><li>difference_type
+: <a class="el" href="a00154.html#4b45c91297e69515d83d5eef85ae1f49">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00159.html#068576d16c7e4e05d52f9db7a45b5b65">tbb::strict_ppl::concurrent_queue< T, A ></a><li>native_handle_type
: <a class="el" href="a00189.html#889fa8cc32dd707eef7c0f52dda09c0d">tbb::recursive_mutex</a>, <a class="el" href="a00172.html#9f1ec84d5815263ceae853f06ddb4cac">tbb::mutex</a><li>page_range_type
-: <a class="el" href="a00150.html#b8ebf17a552ba47825e9b3887855b719">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a><li>reference
-: <a class="el" href="a00155.html#dcd44ca6a88c0dc7a847a47a10811f0c">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00160.html#a8d725c50a9834bb7af5b67c0aff92b8">tbb::strict_ppl::concurrent_queue< T, A ></a><li>row_range_type
-: <a class="el" href="a00149.html#a807a22fe658ec38b8edfd69521d0383">tbb::blocked_range2d< RowValue, ColValue ></a><li>size_type
-: <a class="el" href="a00155.html#a80e4c11dbb324e4b92a24a77bbcde68">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00160.html#8fc30e93f8342a1960357f71e4fe8a2b">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00148.html#f5707bffea38eee5c9680f37358afb8e">tbb::blocked_range< Value ></a><li>value_type
-: <a class="el" href="a00179.html#fa297e53d3af2a101e712bc200233e9c">tbb::parallel_while< Body ></a>, <a class="el" href="a00155.html#98245517a931e5893f6601e66c51fc75">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00160.html#682c3978d5cb0620000994f11c44a476">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00157.html#49eec74f272bab187d176c0d9d16a7fe">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accesso [...]
+: <a class="el" href="a00149.html#b8ebf17a552ba47825e9b3887855b719">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a><li>reference
+: <a class="el" href="a00154.html#dcd44ca6a88c0dc7a847a47a10811f0c">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00159.html#a8d725c50a9834bb7af5b67c0aff92b8">tbb::strict_ppl::concurrent_queue< T, A ></a><li>row_range_type
+: <a class="el" href="a00148.html#a807a22fe658ec38b8edfd69521d0383">tbb::blocked_range2d< RowValue, ColValue ></a><li>size_type
+: <a class="el" href="a00154.html#a80e4c11dbb324e4b92a24a77bbcde68">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00159.html#8fc30e93f8342a1960357f71e4fe8a2b">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00147.html#f5707bffea38eee5c9680f37358afb8e">tbb::blocked_range< Value ></a><li>value_type
+: <a class="el" href="a00179.html#fa297e53d3af2a101e712bc200233e9c">tbb::parallel_while< Body ></a>, <a class="el" href="a00154.html#98245517a931e5893f6601e66c51fc75">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00159.html#682c3978d5cb0620000994f11c44a476">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00156.html#49eec74f272bab187d176c0d9d16a7fe">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accesso [...]
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/globals.html b/doc/html/globals.html
index a799f1d..e8feca6 100644
--- a/doc/html/globals.html
+++ b/doc/html/globals.html
@@ -29,15 +29,15 @@ Here is a list of all documented file members with links to the documentation:
<p>
<ul>
<li>scalable_aligned_free()
-: <a class="el" href="a00276.html#g65a20e812012f15ec7442d5b45d0cba5">scalable_allocator.h</a><li>scalable_aligned_malloc()
-: <a class="el" href="a00276.html#gc1c7aaa1fe85c17ba5a3a96f7e8d89e7">scalable_allocator.h</a><li>scalable_aligned_realloc()
-: <a class="el" href="a00276.html#gbaea91376be80dfabd7c93eaffd9abaa">scalable_allocator.h</a><li>scalable_calloc()
-: <a class="el" href="a00276.html#g3f5a2fde0bcaa3eda35be32c8658f444">scalable_allocator.h</a><li>scalable_free()
-: <a class="el" href="a00276.html#gca3579c21244dba9f0c351e5984d4565">scalable_allocator.h</a><li>scalable_malloc()
-: <a class="el" href="a00276.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_allocator.h</a><li>scalable_msize()
-: <a class="el" href="a00276.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_allocator.h</a><li>scalable_posix_memalign()
-: <a class="el" href="a00276.html#g05dcec987480bb2c82ecdead6a085899">scalable_allocator.h</a><li>scalable_realloc()
-: <a class="el" href="a00276.html#g951bbbbd2d041acb59ba5fa910b52543">scalable_allocator.h</a></ul>
+: <a class="el" href="a00277.html#g65a20e812012f15ec7442d5b45d0cba5">scalable_allocator.h</a><li>scalable_aligned_malloc()
+: <a class="el" href="a00277.html#gc1c7aaa1fe85c17ba5a3a96f7e8d89e7">scalable_allocator.h</a><li>scalable_aligned_realloc()
+: <a class="el" href="a00277.html#gbaea91376be80dfabd7c93eaffd9abaa">scalable_allocator.h</a><li>scalable_calloc()
+: <a class="el" href="a00277.html#g3f5a2fde0bcaa3eda35be32c8658f444">scalable_allocator.h</a><li>scalable_free()
+: <a class="el" href="a00277.html#gca3579c21244dba9f0c351e5984d4565">scalable_allocator.h</a><li>scalable_malloc()
+: <a class="el" href="a00277.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_allocator.h</a><li>scalable_msize()
+: <a class="el" href="a00277.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_allocator.h</a><li>scalable_posix_memalign()
+: <a class="el" href="a00277.html#g05dcec987480bb2c82ecdead6a085899">scalable_allocator.h</a><li>scalable_realloc()
+: <a class="el" href="a00277.html#g951bbbbd2d041acb59ba5fa910b52543">scalable_allocator.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/globals_func.html b/doc/html/globals_func.html
index 853ac56..5322a98 100644
--- a/doc/html/globals_func.html
+++ b/doc/html/globals_func.html
@@ -29,15 +29,15 @@
<p>
<ul>
<li>scalable_aligned_free()
-: <a class="el" href="a00276.html#g65a20e812012f15ec7442d5b45d0cba5">scalable_allocator.h</a><li>scalable_aligned_malloc()
-: <a class="el" href="a00276.html#gc1c7aaa1fe85c17ba5a3a96f7e8d89e7">scalable_allocator.h</a><li>scalable_aligned_realloc()
-: <a class="el" href="a00276.html#gbaea91376be80dfabd7c93eaffd9abaa">scalable_allocator.h</a><li>scalable_calloc()
-: <a class="el" href="a00276.html#g3f5a2fde0bcaa3eda35be32c8658f444">scalable_allocator.h</a><li>scalable_free()
-: <a class="el" href="a00276.html#gca3579c21244dba9f0c351e5984d4565">scalable_allocator.h</a><li>scalable_malloc()
-: <a class="el" href="a00276.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_allocator.h</a><li>scalable_msize()
-: <a class="el" href="a00276.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_allocator.h</a><li>scalable_posix_memalign()
-: <a class="el" href="a00276.html#g05dcec987480bb2c82ecdead6a085899">scalable_allocator.h</a><li>scalable_realloc()
-: <a class="el" href="a00276.html#g951bbbbd2d041acb59ba5fa910b52543">scalable_allocator.h</a></ul>
+: <a class="el" href="a00277.html#g65a20e812012f15ec7442d5b45d0cba5">scalable_allocator.h</a><li>scalable_aligned_malloc()
+: <a class="el" href="a00277.html#gc1c7aaa1fe85c17ba5a3a96f7e8d89e7">scalable_allocator.h</a><li>scalable_aligned_realloc()
+: <a class="el" href="a00277.html#gbaea91376be80dfabd7c93eaffd9abaa">scalable_allocator.h</a><li>scalable_calloc()
+: <a class="el" href="a00277.html#g3f5a2fde0bcaa3eda35be32c8658f444">scalable_allocator.h</a><li>scalable_free()
+: <a class="el" href="a00277.html#gca3579c21244dba9f0c351e5984d4565">scalable_allocator.h</a><li>scalable_malloc()
+: <a class="el" href="a00277.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_allocator.h</a><li>scalable_msize()
+: <a class="el" href="a00277.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_allocator.h</a><li>scalable_posix_memalign()
+: <a class="el" href="a00277.html#g05dcec987480bb2c82ecdead6a085899">scalable_allocator.h</a><li>scalable_realloc()
+: <a class="el" href="a00277.html#g951bbbbd2d041acb59ba5fa910b52543">scalable_allocator.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2010 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/hierarchy.html b/doc/html/hierarchy.html
index 152759b..e8416f8 100644
--- a/doc/html/hierarchy.html
+++ b/doc/html/hierarchy.html
@@ -21,39 +21,40 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<h1>Class Hierarchy</h1>This inheritance list is sorted roughly, but not completely, alphabetically:<ul>
-<li><a class="el" href="a00141.html">tbb::affinity_partitioner</a>
-<li><a class="el" href="a00142.html">tbb::aligned_space< T, N ></a>
-<li><a class="el" href="a00143.html">tbb::atomic< T ></a>
-<li><a class="el" href="a00144.html">tbb::atomic< void * ></a>
-<li><a class="el" href="a00145.html">tbb::internal::atomic_backoff</a>
-<li><a class="el" href="a00146.html">tbb::auto_partitioner</a>
-<li><a class="el" href="a00147.html">tbb::bad_last_alloc</a>
-<li><a class="el" href="a00148.html">tbb::blocked_range< Value ></a>
-<li><a class="el" href="a00149.html">tbb::blocked_range2d< RowValue, ColValue ></a>
-<li><a class="el" href="a00150.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>
-<li><a class="el" href="a00148.html">tbb::blocked_range< I ></a>
-<li><a class="el" href="a00151.html">tbb::cache_aligned_allocator< T ></a>
-<li><a class="el" href="a00152.html">tbb::cache_aligned_allocator< void ></a>
-<li><a class="el" href="a00154.html">tbb::combinable< T ></a>
-<li><a class="el" href="a00155.html">tbb::concurrent_bounded_queue< T, A ></a>
+<li><a class="el" href="a00140.html">tbb::affinity_partitioner</a>
+<li><a class="el" href="a00141.html">tbb::aligned_space< T, N ></a>
+<li><a class="el" href="a00142.html">tbb::atomic< T ></a>
+<li><a class="el" href="a00143.html">tbb::atomic< void * ></a>
+<li><a class="el" href="a00144.html">tbb::internal::atomic_backoff</a>
+<li><a class="el" href="a00145.html">tbb::auto_partitioner</a>
+<li><a class="el" href="a00146.html">tbb::bad_last_alloc</a>
+<li><a class="el" href="a00147.html">tbb::blocked_range< Value ></a>
+<li><a class="el" href="a00148.html">tbb::blocked_range2d< RowValue, ColValue ></a>
+<li><a class="el" href="a00149.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>
+<li><a class="el" href="a00147.html">tbb::blocked_range< I ></a>
+<li><a class="el" href="a00150.html">tbb::cache_aligned_allocator< T ></a>
+<li><a class="el" href="a00151.html">tbb::cache_aligned_allocator< void ></a>
+<li><a class="el" href="a00153.html">tbb::combinable< T ></a>
+<li><a class="el" href="a00154.html">tbb::concurrent_bounded_queue< T, A ></a>
<ul>
-<li><a class="el" href="a00161.html">tbb::deprecated::concurrent_queue< T, A ></a>
+<li><a class="el" href="a00160.html">tbb::deprecated::concurrent_queue< T, A ></a>
</ul>
-<li><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>
-<li><a class="el" href="a00158.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>
-<li><a class="el" href="a00159.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>
+<li><a class="el" href="a00155.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>
+<li><a class="el" href="a00157.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>
+<li><a class="el" href="a00158.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>
<ul>
-<li><a class="el" href="a00157.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>
+<li><a class="el" href="a00156.html">tbb::interface4::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>
</ul>
-<li><a class="el" href="a00160.html">tbb::strict_ppl::concurrent_queue< T, A ></a>
-<li><a class="el" href="a00162.html">tbb::concurrent_vector< T, A ></a>
-<li><a class="el" href="a00164.html">tbb::interface5::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>
-<li><a class="el" href="a00165.html">tbb::filter</a>
+<li><a class="el" href="a00159.html">tbb::strict_ppl::concurrent_queue< T, A ></a>
+<li><a class="el" href="a00161.html">tbb::concurrent_vector< T, A ></a>
+<li><a class="el" href="a00163.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>
+<li><a class="el" href="a00164.html">tbb::filter</a>
<ul>
<li><a class="el" href="a00209.html">tbb::thread_bound_filter</a>
</ul>
-<li><a class="el" href="a00166.html">tbb::interface5::filter_t< T, U ></a>
-<li><a class="el" href="a00167.html">tbb::final_scan_tag</a>
+<li><a class="el" href="a00165.html">tbb::interface5::filter_t< T, U ></a>
+<li><a class="el" href="a00166.html">tbb::final_scan_tag</a>
+<li><a class="el" href="a00167.html">tbb::interface5::flow_control</a>
<li><a class="el" href="a00168.html">tbb::improper_lock</a>
<li><b>atomic_impl</b><li><a class="el" href="a00169.html">tbb::invalid_multiple_scheduling</a>
<li><a class="el" href="a00170.html">tbb::missing_wait</a>
@@ -86,7 +87,7 @@
<li><a class="el" href="a00198.html">tbb::split</a>
<li><a class="el" href="a00199.html">tbb::task</a>
<ul>
-<li><a class="el" href="a00163.html">tbb::empty_task</a>
+<li><a class="el" href="a00162.html">tbb::empty_task</a>
</ul>
<li><a class="el" href="a00200.html">tbb::interface5::internal::task_base</a>
<li><a class="el" href="a00201.html">tbb::task_group_context</a>
@@ -96,7 +97,7 @@
<li><a class="el" href="a00205.html">tbb::tbb_allocator< void ></a>
<li><a class="el" href="a00206.html">tbb::tbb_exception</a>
<ul>
-<li><a class="el" href="a00153.html">tbb::captured_exception</a>
+<li><a class="el" href="a00152.html">tbb::captured_exception</a>
<li><a class="el" href="a00171.html">tbb::movable_exception< ExceptionData ></a>
</ul>
<li><a class="el" href="a00207.html">tbb::internal::tbb_exception_ptr</a>
diff --git a/doc/html/modules.html b/doc/html/modules.html
index 8f3371d..6401481 100644
--- a/doc/html/modules.html
+++ b/doc/html/modules.html
@@ -15,12 +15,12 @@
<li><a href="pages.html"><span>Related Pages</span></a></li>
</ul></div>
<h1>Modules</h1>Here is a list of all modules:<ul>
-<li><a class="el" href="a00274.html">Algorithms</a>
-<li><a class="el" href="a00275.html">Containers</a>
-<li><a class="el" href="a00276.html">Memory Allocation</a>
-<li><a class="el" href="a00277.html">Synchronization</a>
-<li><a class="el" href="a00278.html">Timing</a>
-<li><a class="el" href="a00279.html">Task Scheduling</a>
+<li><a class="el" href="a00275.html">Algorithms</a>
+<li><a class="el" href="a00276.html">Containers</a>
+<li><a class="el" href="a00277.html">Memory Allocation</a>
+<li><a class="el" href="a00278.html">Synchronization</a>
+<li><a class="el" href="a00279.html">Timing</a>
+<li><a class="el" href="a00280.html">Task Scheduling</a>
</ul>
<hr>
<p></p>
diff --git a/doc/html/namespacemembers.html b/doc/html/namespacemembers.html
index 7886652..4f7a719 100644
--- a/doc/html/namespacemembers.html
+++ b/doc/html/namespacemembers.html
@@ -39,13 +39,13 @@ Here is a list of all documented namespace members with links to the namespaces
: <a class="el" href="a00267.html#ed375248ff6019a70ca0f9da528e5d0b">tbb</a><li>ets_key_usage_type
: <a class="el" href="a00267.html#a8622ae61b7e7737dac26542e181178e">tbb</a><li>memory_semantics
: <a class="el" href="a00267.html#a8686246bb5d3664bd07563749970fef">tbb</a><li>parallel_do()
-: <a class="el" href="a00274.html#g2617dc9b88b3285a7212599d49f74228">tbb</a><li>parallel_for()
-: <a class="el" href="a00273.html#490399525b1e690ec31d6db964c6b272">tbb::strict_ppl</a>, <a class="el" href="a00274.html#g04b4696b67370c01353ff5974c8f1196">tbb</a><li>parallel_for_each()
-: <a class="el" href="a00274.html#gc2d710ca573f0a9bd94379cba3772def">tbb</a><li>parallel_invoke()
-: <a class="el" href="a00274.html#gd3e2998f171494f94c2103f4eb924084">tbb</a><li>parallel_reduce()
-: <a class="el" href="a00274.html#g496bd7eadb3b97495ccb5655ef90319e">tbb</a><li>parallel_scan()
-: <a class="el" href="a00274.html#g62fde400a37bbca1a2fddc8e3d22f556">tbb</a><li>parallel_sort()
-: <a class="el" href="a00274.html#gc7576f82fdedc8a701a6c17ad9415926">tbb</a><li>release
+: <a class="el" href="a00275.html#g2617dc9b88b3285a7212599d49f74228">tbb</a><li>parallel_for()
+: <a class="el" href="a00274.html#490399525b1e690ec31d6db964c6b272">tbb::strict_ppl</a>, <a class="el" href="a00275.html#g04b4696b67370c01353ff5974c8f1196">tbb</a><li>parallel_for_each()
+: <a class="el" href="a00275.html#gc2d710ca573f0a9bd94379cba3772def">tbb</a><li>parallel_invoke()
+: <a class="el" href="a00275.html#gd3e2998f171494f94c2103f4eb924084">tbb</a><li>parallel_reduce()
+: <a class="el" href="a00275.html#g496bd7eadb3b97495ccb5655ef90319e">tbb</a><li>parallel_scan()
+: <a class="el" href="a00275.html#g62fde400a37bbca1a2fddc8e3d22f556">tbb</a><li>parallel_sort()
+: <a class="el" href="a00275.html#gc7576f82fdedc8a701a6c17ad9415926">tbb</a><li>release
: <a class="el" href="a00267.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">tbb</a><li>set_assertion_handler()
: <a class="el" href="a00267.html#823fa1c15dd829d1d9167157450ddcd9">tbb</a><li>TBB_runtime_interface_version()
: <a class="el" href="a00267.html#a6858b22e90041c9c4669674ff39b056">tbb</a></ul>
diff --git a/doc/html/namespacemembers_func.html b/doc/html/namespacemembers_func.html
index 1408889..fe506d0 100644
--- a/doc/html/namespacemembers_func.html
+++ b/doc/html/namespacemembers_func.html
@@ -34,13 +34,13 @@
<li>__TBB_DECL_ATOMIC_ALT()
: <a class="el" href="a00267.html#ad165cf61abbe349d413df2589679add">tbb</a><li>assertion_failure()
: <a class="el" href="a00267.html#3d1252787be39b4aef311f1cadaff9e8">tbb</a><li>parallel_do()
-: <a class="el" href="a00274.html#g2617dc9b88b3285a7212599d49f74228">tbb</a><li>parallel_for()
-: <a class="el" href="a00273.html#490399525b1e690ec31d6db964c6b272">tbb::strict_ppl</a>, <a class="el" href="a00274.html#g04b4696b67370c01353ff5974c8f1196">tbb</a><li>parallel_for_each()
-: <a class="el" href="a00274.html#gc2d710ca573f0a9bd94379cba3772def">tbb</a><li>parallel_invoke()
-: <a class="el" href="a00274.html#gd3e2998f171494f94c2103f4eb924084">tbb</a><li>parallel_reduce()
-: <a class="el" href="a00274.html#g496bd7eadb3b97495ccb5655ef90319e">tbb</a><li>parallel_scan()
-: <a class="el" href="a00274.html#g62fde400a37bbca1a2fddc8e3d22f556">tbb</a><li>parallel_sort()
-: <a class="el" href="a00274.html#gc7576f82fdedc8a701a6c17ad9415926">tbb</a><li>set_assertion_handler()
+: <a class="el" href="a00275.html#g2617dc9b88b3285a7212599d49f74228">tbb</a><li>parallel_for()
+: <a class="el" href="a00274.html#490399525b1e690ec31d6db964c6b272">tbb::strict_ppl</a>, <a class="el" href="a00275.html#g04b4696b67370c01353ff5974c8f1196">tbb</a><li>parallel_for_each()
+: <a class="el" href="a00275.html#gc2d710ca573f0a9bd94379cba3772def">tbb</a><li>parallel_invoke()
+: <a class="el" href="a00275.html#gd3e2998f171494f94c2103f4eb924084">tbb</a><li>parallel_reduce()
+: <a class="el" href="a00275.html#g496bd7eadb3b97495ccb5655ef90319e">tbb</a><li>parallel_scan()
+: <a class="el" href="a00275.html#g62fde400a37bbca1a2fddc8e3d22f556">tbb</a><li>parallel_sort()
+: <a class="el" href="a00275.html#gc7576f82fdedc8a701a6c17ad9415926">tbb</a><li>set_assertion_handler()
: <a class="el" href="a00267.html#823fa1c15dd829d1d9167157450ddcd9">tbb</a><li>TBB_runtime_interface_version()
: <a class="el" href="a00267.html#a6858b22e90041c9c4669674ff39b056">tbb</a></ul>
<hr>
diff --git a/doc/html/namespaces.html b/doc/html/namespaces.html
index 0fa11d7..a2b9cd2 100644
--- a/doc/html/namespaces.html
+++ b/doc/html/namespaces.html
@@ -21,7 +21,7 @@
</ul></div>
<h1>Namespace List</h1>Here is a list of all documented namespaces with brief descriptions:<table>
<tr><td class="indexkey"><a class="el" href="a00267.html">tbb</a></td><td class="indexvalue">The namespace tbb contains all components of the library </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00273.html">tbb::strict_ppl</a></td><td class="indexvalue">For internal use only </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00274.html">tbb::strict_ppl</a></td><td class="indexvalue">For internal use only </td></tr>
</table>
<hr>
<p></p>
diff --git a/examples/common/copy_libraries.bat b/examples/common/copy_libraries.bat
index 2fd9e75..3201273 100644
--- a/examples/common/copy_libraries.bat
+++ b/examples/common/copy_libraries.bat
@@ -36,8 +36,9 @@ if ("%2") == ("debug") set postfix=_debug
set output_dir=%3
:: Getting vs folders in case vc_mt binaries are not provided
-if ("%VS80COMNTOOLS%") NEQ ("") set vc_dir=vc8
-if ("%VS90COMNTOOLS%") NEQ ("") set vc_dir=vc9
+if ("%VS80COMNTOOLS%") NEQ ("") set vc_dir=vc8
+if ("%VS90COMNTOOLS%") NEQ ("") set vc_dir=vc9
+if ("%VS100COMNTOOLS%") NEQ ("") set vc_dir=vc10
:: Are we standalone/oss or inside compiler?
if exist "%TBB30_INSTALL_DIR%\bin\%arch%\vc8\tbb%postfix%.dll" set interim_path=bin\%arch%
diff --git a/examples/parallel_for/polygon_overlay/polymain.cpp b/examples/parallel_for/polygon_overlay/polymain.cpp
index e4e6def..e70e9e7 100644
--- a/examples/parallel_for/polygon_overlay/polymain.cpp
+++ b/examples/parallel_for/polygon_overlay/polymain.cpp
@@ -341,8 +341,7 @@ bool GenerateMap(Polygon_map_t **newMap, int xSize, int ySize, int gNPolygons, c
// *newMap = new vector<RPolygon>;
*newMap = new Polygon_map_t;
(*newMap)->reserve(gNPolygons + 1); // how much bigger does this need to be on average?
- newPoly = RPolygon::alloc_RPolygon(0,0,xSize-1, ySize-1);
- (*newMap)->push_back(newPoly);
+ (*newMap)->push_back(RPolygon(0,0,xSize-1, ySize-1));
for(int i=0; i < gNPolygons; i++) {
int nX;
int nY;
@@ -353,8 +352,7 @@ bool GenerateMap(Polygon_map_t **newMap, int xSize, int ySize, int gNPolygons, c
int nR = (maxR * NextRan(1000)) / 999;
int nG = (maxG * NextRan(1000)) / 999;
int nB = (maxB * NextRan(1000)) / 999;
- newPoly = RPolygon::alloc_RPolygon(nX,nY,nX,nY,nR,nG,nB);
- (*newMap)->push_back(newPoly);
+ (*newMap)->push_back(RPolygon(nX,nY,nX,nY,nR,nG,nB));
tempMap[nX * ySize + nY] = i+1; // index of this polygon + 1
}
// now have to grow polygons to fill the space.
@@ -374,7 +372,7 @@ bool GenerateMap(Polygon_map_t **newMap, int xSize, int ySize, int gNPolygons, c
int checkSide = validSide[indx];
int xlow, xhigh, ylow, yhigh;
int xlnew, xhnew, ylnew, yhnew;
- (**newMap)[polyIndx]->get(&xlow,&ylow,&xhigh,&yhigh);
+ (**newMap)[polyIndx].get(&xlow,&ylow,&xhigh,&yhigh);
xlnew = xlow;
xhnew = xhigh;
ylnew = ylow;
@@ -409,7 +407,7 @@ bool GenerateMap(Polygon_map_t **newMap, int xSize, int ySize, int gNPolygons, c
}
}
if(okay_to_extend) {
- (**newMap)[polyIndx]->set(xlnew,ylnew,xhnew,yhnew);
+ (**newMap)[polyIndx].set(xlnew,ylnew,xhnew,yhnew);
for(int ii = xlow; ii <= xhigh; ii++) {
for(int jj=ylow; jj <= yhigh && okay_to_extend; jj++) {
tempMap[ii*ySize + jj] = polyIndx;
@@ -450,8 +448,7 @@ bool GenerateMap(Polygon_map_t **newMap, int xSize, int ySize, int gNPolygons, c
int nR = (maxR * NextRan(1000)) / 999;
int nG = (maxG * NextRan(1000)) / 999;
int nB = (maxB * NextRan(1000)) / 999;
- newPoly = RPolygon::alloc_RPolygon(i,j,ilen,jlen,nR,nG,nB);
- (*newMap)->push_back(newPoly);
+ (*newMap)->push_back(RPolygon(i,j,ilen,jlen,nR,nG,nB));
gNPolygons++;
for(int ii=i; ii<=ilen;ii++) {
for(int jj=j;jj<=jlen;jj++) {
@@ -502,7 +499,7 @@ void CheckPolygonMap(Polygon_map_t *checkMap) {
// mapXhigh and mapYhigh are inclusive, that is, if the map is 5x5, those values would be 4.
int mapXhigh, mapYhigh, mapLowX, mapLowY;
int gMapXSize, gMapYSize;
- checkMap->at(0)->get(&mapLowX, &mapLowY, &mapXhigh, &mapYhigh);
+ (*checkMap)[0].get(&mapLowX, &mapLowY, &mapXhigh, &mapYhigh);
if((mapLowX !=0) || (mapLowY != 0)) {
cout << "checkMap error: map origin not (0,0) (X=" << mapLowX << ", Y=" << mapLowY << ")" << std::endl;
anError = true;
@@ -525,7 +522,7 @@ void CheckPolygonMap(Polygon_map_t *checkMap) {
int xlow, xhigh, ylow, yhigh;
for(int p=1; p < int(checkMap->size()) && !anError; p++) {
- checkMap->at(p)->get(&xlow, &ylow, &xhigh, &yhigh);
+ (*checkMap)[p].get(&xlow, &ylow, &xhigh, &yhigh);
xRangeCheck("xlow", xlow);
yRangeCheck("ylow", ylow);
xRangeCheck("xhigh", xhigh);
@@ -559,11 +556,11 @@ void CheckPolygonMap(Polygon_map_t *checkMap) {
free(cArray);
}
-bool CompOnePolygon(RPolygon *p1, RPolygon *p2) {
+bool CompOnePolygon(RPolygon &p1, RPolygon &p2) {
int xl1, xh1, yl1, yh1;
int xl2, xh2, yl2, yh2;
- p1->get(&xl1, &yl1, &xh1, &yh1);
- p2->get(&xl2, &yl2, &xh2, &yh2);
+ p1.get(&xl1, &yl1, &xh1, &yh1);
+ p2.get(&xl2, &yl2, &xh2, &yh2);
if(yl1>yl2) return true;
if(yl1<yl2) return false;
return (xl1 > xl2);
@@ -593,16 +590,16 @@ bool ComparePolygonMaps(Polygon_map_t *map1, Polygon_map_t *map2) {
t2->push_back(map2->at(i));
}
// sort the two created maps by (xlow, ylow)
- sort(t1->begin(), t1->end(), CompOnePolygon);
- sort(t2->begin(), t2->end(), CompOnePolygon);
+ sort(t1->begin(), t1->end());
+ sort(t2->begin(), t2->end());
// compare each element of both maps.
if(t1->size() != t2->size()) {
cout << "Error: maps not the same size ( " << int(t1->size()) << " vs " << int(t2->size()) << ")." << std::endl;
}
int maxSize = (int)((t1->size() < t2->size()) ? t1->size() : t2->size());
for(int i=0; i < maxSize; i++) {
- if(!PolygonsEqual(t1->at(i), t2->at(i))) {
- cout << "Error: polygons unequal (" << *(t1->at(i)) << " vs " << (*t2->at(i)) << std::endl;
+ if(!PolygonsEqual(&((*t1)[i]), &((*t2)[i]))) {
+ cout << "Error: polygons unequal (" << (*t1)[i] << " vs " << (*t2)[i] << std::endl;
is_ok = false;
}
}
diff --git a/examples/parallel_for/polygon_overlay/polyover.cpp b/examples/parallel_for/polygon_overlay/polyover.cpp
index 99ddfdd..47bbdc9 100644
--- a/examples/parallel_for/polygon_overlay/polyover.cpp
+++ b/examples/parallel_for/polygon_overlay/polyover.cpp
@@ -61,7 +61,7 @@ void OverlayOnePolygonWithMap(Polygon_map_t *resultMap, RPolygon *myPoly, Polygo
int myb=0;
int p1Area = myPoly->area();
for(unsigned int j=1; (j < map2->size()) && (p1Area > 0); j++) {
- RPolygon *p2 = (*map2)[j];
+ RPolygon *p2 = &((*map2)[j]);
RPolygon *pnew;
int newxMin, newxMax, newyMin, newyMax;
myPoly->getColor(&r1, &g1, &b1);
@@ -70,20 +70,13 @@ void OverlayOnePolygonWithMap(Polygon_map_t *resultMap, RPolygon *myPoly, Polygo
myr = r1 + r2;
myg = g1 + g2;
myb = b1 + b2;
- pnew = RPolygon::alloc_RPolygon(newxMin, newyMin, newxMax, newyMax, myr, myg, myb);
- p1Area -= pnew->area(); // when all the area of the polygon is accounted for, we can quit.
+ p1Area -= (newxMax-newxMin+1)*(newyMax - newyMin + 1);
if(rMutex) {
tbb::spin_mutex::scoped_lock lock(*rMutex);
-#if _DEBUG
- pnew->print(int(resultMap->size()));
-#endif
- resultMap->push_back(pnew);
+ resultMap->push_back(RPolygon(newxMin, newyMin, newxMax, newyMax, myr, myg, myb));
}
else {
-#ifdef _DEBUG
- pnew->print(int(resultMap->size()));
-#endif
- resultMap->push_back(pnew);
+ resultMap->push_back(RPolygon(newxMin, newyMin, newxMax, newyMax, myr, myg, myb));
}
}
}
@@ -99,15 +92,14 @@ void SerialOverlayMaps(Polygon_map_t **resultMap, Polygon_map_t *map1, Polygon_m
cout << "SerialOverlayMaps called" << std::endl;
*resultMap = new Polygon_map_t;
- RPolygon *p0 = (*map1)[0];
+ RPolygon *p0 = &((*map1)[0]);
int mapxSize, mapySize, ignore1, ignore2;
p0->get(&ignore1, &ignore2, &mapxSize, &mapySize);
(*resultMap)->reserve(mapxSize*mapySize); // can't be any bigger than this
// push the map size as the first polygon,
- p0 = RPolygon::alloc_RPolygon(0,0,mapxSize, mapySize);
- (*resultMap)->push_back(p0);
+ (*resultMap)->push_back(RPolygon(0,0,mapxSize, mapySize));
for(unsigned int i=1; i < map1->size(); i++) {
- RPolygon *p1 = (*map1)[i];
+ RPolygon *p1 = &((*map1)[i]);
OverlayOnePolygonWithMap(*resultMap, p1, map2, NULL);
}
}
@@ -127,7 +119,7 @@ public:
void operator()( const tbb::blocked_range<int> & r) const {
PRINT_DEBUG("From " << r.begin() << " to " << r.end());
for(int i=r.begin(); i != r.end(); i++) {
- RPolygon *myPoly = (*m_map1)[i];
+ RPolygon *myPoly = &((*m_map1)[i]);
OverlayOnePolygonWithMap(m_resultMap, myPoly, m_map2, m_rMutex);
}
}
@@ -151,7 +143,7 @@ void NaiveParallelOverlay(Polygon_map_t *&result_map, Polygon_map_t &polymap1, P
}
result_map = new Polygon_map_t;
- RPolygon *p0 = polymap1[0];
+ RPolygon *p0 = &(polymap1[0]);
int mapxSize, mapySize, ignore1, ignore2;
p0->get(&ignore1, &ignore2, &mapxSize, &mapySize);
result_map->reserve(mapxSize*mapySize); // can't be any bigger than this
@@ -162,12 +154,11 @@ void NaiveParallelOverlay(Polygon_map_t *&result_map, Polygon_map_t &polymap1, P
for(int nthreads = gThreadsLow; nthreads <= gThreadsHigh; nthreads++) {
tbb::task_scheduler_init init(nthreads);
if(gIsGraphicalVersion) {
- RPolygon *xp = RPolygon::alloc_RPolygon(0, 0, gMapXSize-1, gMapYSize-1, 0, 0, 0); // Clear the output space
- RPolygon::free_RPolygon( xp );
+ RPolygon *xp = new RPolygon(0, 0, gMapXSize-1, gMapYSize-1, 0, 0, 0); // Clear the output space
+ delete xp;
}
// put size polygon in result map
- p0 = RPolygon::alloc_RPolygon(0,0,mapxSize, mapySize);
- result_map->push_back(p0);
+ result_map->push_back(RPolygon(0,0,mapxSize, mapySize));
tbb::tick_count t0 = tbb::tick_count::now();
tbb::parallel_for (tbb::blocked_range<int>(1,(int)(polymap1.size()),grain_size), ApplyOverlay(result_map, &polymap1, &polymap2, resultMutex));
@@ -186,9 +177,6 @@ void NaiveParallelOverlay(Polygon_map_t *&result_map, Polygon_map_t &polymap1, P
CheckPolygonMap(result_map);
ComparePolygonMaps(result_map, gResultMap);
#endif
- for(int i=0; i<int(result_map->size());i++) {
- RPolygon::free_RPolygon(result_map->at(i));
- }
result_map->clear();
}
delete resultMutex;
@@ -198,11 +186,116 @@ void NaiveParallelOverlay(Polygon_map_t *&result_map, Polygon_map_t &polymap1, P
// -----------------------------------
}
+template<typename T>
+void split_at( Flagged_map_t& in_map, Flagged_map_t &left_out, Flagged_map_t &right_out, const T median) {
+ left_out.reserve(in_map.size());
+ right_out.reserve(in_map.size());
+ for(Flagged_map_t::iterator i = in_map.begin(); i != in_map.end(); ++i ) {
+ RPolygon *p = i->p();
+ if(p->xmax() < median) {
+ // in left map
+ left_out.push_back(*i);
+ }
+ else if(p->xmin() >= median) {
+ right_out.push_back(*i);
+ // in right map
+ }
+ else {
+ // in both maps.
+ left_out.push_back(*i);
+ right_out.push_back(RPolygon_flagged(p, true));
+ }
+ }
+}
+
+// range that splits the maps as well as the range. the flagged_map_t are
+// vectors of pointers, and each range owns its maps (has to free them on destruction.)
+template <typename T>
+class blocked_range_with_maps {
+
+ typedef blocked_range<T> my_range_type;
+
+private:
+
+ my_range_type my_range;
+ Flagged_map_t my_map1;
+ Flagged_map_t my_map2;
+
+public:
+
+ blocked_range_with_maps(
+ T begin, T end, typename my_range_type::size_type my_grainsize,
+ Polygon_map_t *p1, Polygon_map_t *p2
+ )
+ : my_range(begin, end, my_grainsize)
+ {
+ my_map1.reserve(p1->size());
+ my_map2.reserve(p2->size());
+ for(int i=1; i < p1->size(); ++i) {
+ my_map1.push_back(RPolygon_flagged(&((*p1)[i]), false));
+ }
+ for(int i=1; i < p2->size(); ++i) {
+ my_map2.push_back(RPolygon_flagged(&(p2->at(i)), false));
+ }
+ }
+
+ // copy-constructor required for deep copy of flagged maps. One copy is done at the start of the
+ // parallel for.
+ blocked_range_with_maps(const blocked_range_with_maps& other): my_range(other.my_range), my_map1(other.my_map1), my_map2(other.my_map2) { }
+ bool empty() const { return my_range.empty(); }
+ bool is_divisible() const { return my_range.is_divisible(); }
+
+#if _DEBUG
+ void check_my_map() {
+ assert(my_range.begin() <= my_range.end());
+ for(Flagged_map_t::iterator ci = my_map1.begin(); ci != my_map1.end(); ++ci) {
+ RPolygon *rp = ci->p();
+ assert(rp->xmax() >= my_range.begin());
+ assert(rp->xmin() < my_range.end());
+ }
+ for(Flagged_map_t::iterator ci = my_map2.begin(); ci != my_map2.end(); ++ci) {
+ RPolygon *rp = ci->p();
+ assert(rp->xmax() >= my_range.begin());
+ assert(rp->xmin() < my_range.end());
+ }
+ }
+
+ void dump_map( Flagged_map_t& mapx) {
+ cout << " ** MAP **\n";
+ for( Flagged_map_t::iterator ci = mapx.begin(); ci != mapx.end(); ++ci) {
+ cout << *(ci->p());
+ if(ci->isDuplicate()) {
+ cout << " -- is_duplicate";
+ }
+ cout << "\n";
+ }
+ cout << "\n";
+ }
+#endif
+
+ blocked_range_with_maps(blocked_range_with_maps& lhs_r, split ) : my_range(my_range_type(lhs_r.my_range, split())) {
+ // lhs_r.my_range makes my_range from [median, high) and rhs_r.my_range from [low, median)
+ Flagged_map_t original_map1 = lhs_r.my_map1;
+ Flagged_map_t original_map2 = lhs_r.my_map2;
+ lhs_r.my_map1.clear();
+ lhs_r.my_map2.clear();
+ split_at(original_map1, lhs_r.my_map1, my_map1, my_range.begin());
+ split_at(original_map2, lhs_r.my_map2, my_map2, my_range.begin());
+#if _DEBUG
+ this->check_my_map();
+ lhs_r.check_my_map();
+#endif
+ }
+
+ const my_range_type& range() const { return my_range; }
+ Flagged_map_t& map1() { return my_map1; }
+ Flagged_map_t& map2() { return my_map2; }
+};
+
/*!
* @class ApplySplitOverlay
* @brief parallel by columnar strip
*/
-
class ApplySplitOverlay {
Polygon_map_t *m_map1, *m_map2, *m_resultMap;
tbb::spin_mutex *m_rMutex;
@@ -211,89 +304,24 @@ public:
* @brief functor for columnar parallel version
* @param[in] r range of map to be operated on
*/
- void operator()(const tbb::blocked_range<int> & r) const {
+ void operator()(/*const*/ blocked_range_with_maps<int> & r) const {
#ifdef _DEBUG
// if we are debugging, serialize the method. That way we can
// see what is happening in each strip without the interleaving
// confusing things.
tbb::spin_mutex::scoped_lock lock(*m_rMutex);
- cout << unitbuf << "From " << r.begin() << " to " << r.end()-1 << std::endl;
+ cout << unitbuf << "From " << r.range().begin() << " to " << r.range().end()-1 << std::endl;
#endif
- // instead of handing out subsets of polygons from map1 to intersect
- // with the polygons in map2, we are handed a strip of the map from
- // [(r.begin(),0)-(r.end()-1,yMapSize)].
- //
- // make a polygon with those values, and intersect with all the polygons
- // in map1 and map2, creating flagged polygon lists fmap1 and fmap2.
- // There are four possiblities:
- //
- // 1) a polygon is contained entirely within the strip. We just
- // add the polygon to our flagged map.
- // 2) the polygon will be partly contained in our strip, and partly
- // in the strip to our right (higher x values). Add the polygon
- // to our flagged map.
- // 3) the polygon is partly contained in our map, and partly in the
- // strip to our left. Add the polygon to our map, but flag it as
- // a duplicate.
- // 4) the polygons do not intersect. Don't add to flagged map.
- //
-
// get yMapSize
int r1, g1, b1, r2, g2, b2;
int myr=-1;
int myg=-1;
int myb=-1;
int i1, i2, i3, yMapSize;
- m_map1->at(0)->get(&i1, &i2, &i3, &yMapSize);
- RPolygon *slicePolygon = RPolygon::alloc_RPolygon(r.begin(), 0, r.end() - 1, yMapSize);
-
- Flagged_map_t *fmap1, *fmap2;
- fmap1 = new std::vector<RPolygon_flagged>;
- fmap1->reserve(m_map1->size());
- fmap2 = new Flagged_map_t;
- fmap2->reserve(m_map2->size());
-
- PRINT_DEBUG(std::endl << "Map1 -------------------");
- for(unsigned int i=1; i<m_map1->size(); i++) {
- int xl, yl, xh, yh;
- RPolygon *px = m_map1->at(i);
- if(PolygonsOverlap(slicePolygon, px, xl, yl, xh, yh)) {
- bool is_duplicate = false;
- int pxl, pyl, pxh, pyh;
- int indx = (int)(fmap1->size());
- fmap1->resize(indx+1);
- fmap1->at(indx).setp(px);
- px->get(&pxl, &pyl, &pxh, &pyh);
- if(pxl < xl) {
- is_duplicate = true;
- }
- //fmap1->at(indx).setp(px);
- fmap1->at(indx).setDuplicate(is_duplicate);
- PRINT_DEBUG(" Polygon " << *px << " is in map, is_duplicate=" << is_duplicate);
+ (*m_map1)[0].get(&i1, &i2, &i3, &yMapSize);
- }
- }
-
- PRINT_DEBUG(std::endl << "Map2 -------------------");
-
- for(unsigned int i=1; i<m_map2->size(); i++) {
- int xl, yl, xh, yh;
- RPolygon *px = m_map2->at(i);
-
- if(PolygonsOverlap(slicePolygon, px, xl, yl, xh, yh)) {
- bool is_duplicate = false;
- int pxl, pyl, pxh, pyh;
- int indx = (int)(fmap2->size());
- fmap2->resize(indx+1);
- fmap2->at(indx).setp(px);
- px->get(&pxl, &pyl, &pxh, &pyh);
- if(pxl < xl) {
- is_duplicate = true;
- }
- fmap2->at(indx).setDuplicate(is_duplicate);
- PRINT_DEBUG(" Polygon " << *px << " is in map, is_duplicate=" << is_duplicate);
- }
- }
+ Flagged_map_t &fmap1 = r.map1();
+ Flagged_map_t &fmap2 = r.map2();
// When intersecting polygons from fmap1 and fmap2, if BOTH are flagged
// as duplicate, don't add the result to the output map. We can still
@@ -301,35 +329,30 @@ public:
// is left over from intersecting, and quitting when the polygon is
// used up.
- for(unsigned int ii=0; ii < fmap1->size(); ii++) {
- RPolygon *p1 = fmap1->at(ii).p();
- bool is_dup = fmap1->at(ii).isDuplicate();
+ for(unsigned int ii=0; ii < fmap1.size(); ii++) {
+ RPolygon *p1 = fmap1[ii].p();
+ bool is_dup = fmap1[ii].isDuplicate();
int parea = p1->area();
p1->getColor(&r1, &g1, &b1);
- for(unsigned int jj=0;(jj < fmap2->size()) && (parea > 0); jj++) {
+ for(unsigned int jj=0;(jj < fmap2.size()) && (parea > 0); jj++) {
int xl, yl, xh, yh;
- RPolygon *p2 = fmap2->at(jj).p();
+ RPolygon *p2 = fmap2[jj].p();
if(PolygonsOverlap(p1, p2, xl, yl, xh, yh)) {
- if(!(is_dup && fmap2->at(jj).isDuplicate())) {
+ if(!(is_dup && fmap2[jj].isDuplicate())) {
p2->getColor(&r2, &g2, &b2);
myr = r1 + r2;
myg = g1 + g2;
myb = b1 + b2;
- RPolygon *pnew = RPolygon::alloc_RPolygon(xl, yl, xh, yh, myr, myg, myb);
#ifdef _DEBUG
#else
tbb::spin_mutex::scoped_lock lock(*m_rMutex);
#endif
- (*m_resultMap).push_back(pnew);
+ (*m_resultMap).push_back(RPolygon(xl, yl, xh, yh, myr, myg, myb));
}
parea -= (xh-xl+1)*(yh-yl+1);
}
}
}
-
- delete fmap1;
- delete fmap2;
- RPolygon::free_RPolygon( slicePolygon );
}
ApplySplitOverlay(Polygon_map_t *resultMap, Polygon_map_t *map1, Polygon_map_t *map2, tbb::spin_mutex *rmutex) :
@@ -356,7 +379,7 @@ void SplitParallelOverlay(Polygon_map_t **result_map, Polygon_map_t *polymap1, P
}
*result_map = new Polygon_map_t;
- RPolygon *p0 = (*polymap1)[0];
+ RPolygon *p0 = &((*polymap1)[0]);
int mapxSize, mapySize, ignore1, ignore2;
p0->get(&ignore1, &ignore2, &mapxSize, &mapySize);
(*result_map)->reserve(mapxSize*mapySize); // can't be any bigger than this
@@ -368,18 +391,16 @@ void SplitParallelOverlay(Polygon_map_t **result_map, Polygon_map_t *polymap1, P
#else
grain_size = gGrainSize;
#endif
-
for(nthreads = gThreadsLow; nthreads <= gThreadsHigh; nthreads++) {
tbb::task_scheduler_init init(nthreads);
if(gIsGraphicalVersion) {
- RPolygon *xp = RPolygon::alloc_RPolygon(0, 0, gMapXSize-1, gMapYSize-1, 0, 0, 0); // Clear the output space
- RPolygon::free_RPolygon( xp );
+ RPolygon *xp = new RPolygon(0, 0, gMapXSize-1, gMapYSize-1, 0, 0, 0); // Clear the output space
+ delete xp;
}
// push the map size as the first polygon,
- p0 = RPolygon::alloc_RPolygon(0,0,mapxSize, mapySize);
- (*result_map)->push_back(p0);
+ (*result_map)->push_back(RPolygon(0,0,mapxSize, mapySize));
t0 = tbb::tick_count::now();
- tbb::parallel_for (tbb::blocked_range<int>(0,(int)(mapxSize+1),grain_size), ApplySplitOverlay((*result_map), polymap1, polymap2, resultMutex));
+ tbb::parallel_for (blocked_range_with_maps<int>(0,(int)(mapxSize+1),grain_size, polymap1, polymap2), ApplySplitOverlay((*result_map), polymap1, polymap2, resultMutex));
t1 = tbb::tick_count::now();
domainSplitParallelTime = (t1-t0).seconds()*1000;
cout << "Splitting parallel with spin lock and ";
@@ -394,9 +415,6 @@ void SplitParallelOverlay(Polygon_map_t **result_map, Polygon_map_t *polymap1, P
CheckPolygonMap(*result_map);
ComparePolygonMaps(*result_map, gResultMap);
#endif
- for(int i=0; i<int((*result_map)->size());i++) {
- RPolygon::free_RPolygon((*result_map)->at(i));
- }
(*result_map)->clear();
}
@@ -404,5 +422,255 @@ void SplitParallelOverlay(Polygon_map_t **result_map, Polygon_map_t *polymap1, P
if(gCsvFile.is_open()) {
gCsvFile << std::endl;
}
+}
+
+class ApplySplitOverlayCV {
+ Polygon_map_t *m_map1, *m_map2;
+ concurrent_Polygon_map_t *m_resultMap;
+public:
+ /*!
+ * @brief functor for columnar parallel version
+ * @param[in] r range of map to be operated on
+ */
+ void operator()(blocked_range_with_maps<int> & r) const {
+ // get yMapSize
+ int r1, g1, b1, r2, g2, b2;
+ int myr=-1;
+ int myg=-1;
+ int myb=-1;
+ int i1, i2, i3, yMapSize;
+ (*m_map1)[0].get(&i1, &i2, &i3, &yMapSize);
+
+ Flagged_map_t &fmap1 = r.map1();
+ Flagged_map_t &fmap2 = r.map2();
+
+ // When intersecting polygons from fmap1 and fmap2, if BOTH are flagged
+ // as duplicate, don't add the result to the output map. We can still
+ // intersect them, because we are keeping track of how much of the polygon
+ // is left over from intersecting, and quitting when the polygon is
+ // used up.
+
+ for(unsigned int ii=0; ii < fmap1.size(); ii++) {
+ RPolygon *p1 = fmap1[ii].p();
+ bool is_dup = fmap1[ii].isDuplicate();
+ int parea = p1->area();
+ p1->getColor(&r1, &g1, &b1);
+ for(unsigned int jj=0;(jj < fmap2.size()) && (parea > 0); jj++) {
+ int xl, yl, xh, yh;
+ RPolygon *p2 = fmap2[jj].p();
+ if(PolygonsOverlap(p1, p2, xl, yl, xh, yh)) {
+ if(!(is_dup && fmap2[jj].isDuplicate())) {
+ p2->getColor(&r2, &g2, &b2);
+ myr = r1 + r2;
+ myg = g1 + g2;
+ myb = b1 + b2;
+ (*m_resultMap).push_back(RPolygon(xl, yl, xh, yh, myr, myg, myb));
+ }
+ parea -= (xh-xl+1)*(yh-yl+1);
+ }
+ }
+ }
+ }
+
+ ApplySplitOverlayCV(concurrent_Polygon_map_t *resultMap, Polygon_map_t *map1, Polygon_map_t *map2 ) :
+ m_resultMap(resultMap), m_map1(map1), m_map2(map2) {}
+};
+
+
+/*!
+* @brief intersects two maps strip-wise, accumulating into a concurrent_vector
+*
+* @param[out] resultMap output map (must be allocated)
+* @param[in] polymap1 map to be intersected
+* @param[in] polymap2 map to be intersected
+*/
+void SplitParallelOverlayCV(concurrent_Polygon_map_t **result_map, Polygon_map_t *polymap1, Polygon_map_t *polymap2) {
+ int nthreads;
+ bool automatic_threadcount = false;
+ double domainSplitParallelTime;
+ tbb::tick_count t0, t1;
+ if(gThreadsLow == THREADS_UNSET || gThreadsLow == tbb::task_scheduler_init::automatic ) {
+ gThreadsLow = gThreadsHigh = tbb::task_scheduler_init::automatic;
+ automatic_threadcount = true;
+ }
+ *result_map = new concurrent_Polygon_map_t;
+
+ RPolygon *p0 = &((*polymap1)[0]);
+ int mapxSize, mapySize, ignore1, ignore2;
+ p0->get(&ignore1, &ignore2, &mapxSize, &mapySize);
+ // (*result_map)->reserve(mapxSize*mapySize); // can't be any bigger than this
+
+ int grain_size;
+#ifdef _DEBUG
+ grain_size = gMapXSize / 4;
+#else
+ grain_size = gGrainSize;
+#endif
+ for(nthreads = gThreadsLow; nthreads <= gThreadsHigh; nthreads++) {
+ tbb::task_scheduler_init init(nthreads);
+ if(gIsGraphicalVersion) {
+ RPolygon *xp = new RPolygon(0, 0, gMapXSize-1, gMapYSize-1, 0, 0, 0); // Clear the output space
+ delete xp;
+ }
+ // push the map size as the first polygon,
+ (*result_map)->push_back(RPolygon(0,0,mapxSize, mapySize));
+ t0 = tbb::tick_count::now();
+ tbb::parallel_for (blocked_range_with_maps<int>(0,(int)(mapxSize+1),grain_size, polymap1, polymap2), ApplySplitOverlayCV((*result_map), polymap1, polymap2));
+ t1 = tbb::tick_count::now();
+ domainSplitParallelTime = (t1-t0).seconds()*1000;
+ cout << "Splitting parallel with concurrent_vector and ";
+ if(automatic_threadcount) cout << "automatic";
+ else cout << nthreads;
+ cout << ((nthreads == 1) ? " thread" : " threads");
+ cout << " took " << domainSplitParallelTime << " msec : speedup over serial " << (gSerialTime / domainSplitParallelTime) << std::endl;
+ if(gCsvFile.is_open()) {
+ gCsvFile << "," << domainSplitParallelTime;
+ }
+#if _DEBUG
+ {
+
+ Polygon_map_t s_result_map;
+ for(concurrent_Polygon_map_t::const_iterator ci = (*result_map)->begin(); ci != (*result_map)->end(); ++ci) {
+ s_result_map.push_back(*ci);
+ }
+ CheckPolygonMap(&s_result_map);
+ ComparePolygonMaps(&s_result_map, gResultMap);
+ }
+#endif
+ (*result_map)->clear();
+
+ }
+
+ if(gCsvFile.is_open()) {
+ gCsvFile << std::endl;
+ }
+
+}
+
+// ------------------------------------------------------
+
+class ApplySplitOverlayETS {
+ Polygon_map_t *m_map1, *m_map2;
+ ETS_Polygon_map_t *m_resultMap;
+public:
+ /*!
+ * @brief functor for columnar parallel version
+ * @param[in] r range of map to be operated on
+ */
+ void operator()(blocked_range_with_maps<int> & r) const {
+ // get yMapSize
+ int r1, g1, b1, r2, g2, b2;
+ int myr=-1;
+ int myg=-1;
+ int myb=-1;
+ int i1, i2, i3, yMapSize;
+ (*m_map1)[0].get(&i1, &i2, &i3, &yMapSize);
+
+ Flagged_map_t &fmap1 = r.map1();
+ Flagged_map_t &fmap2 = r.map2();
+
+ // When intersecting polygons from fmap1 and fmap2, if BOTH are flagged
+ // as duplicate, don't add the result to the output map. We can still
+ // intersect them, because we are keeping track of how much of the polygon
+ // is left over from intersecting, and quitting when the polygon is
+ // used up.
+
+ for(unsigned int ii=0; ii < fmap1.size(); ii++) {
+ RPolygon *p1 = fmap1[ii].p();
+ bool is_dup = fmap1[ii].isDuplicate();
+ int parea = p1->area();
+ p1->getColor(&r1, &g1, &b1);
+ for(unsigned int jj=0;(jj < fmap2.size()) && (parea > 0); jj++) {
+ int xl, yl, xh, yh;
+ RPolygon *p2 = fmap2[jj].p();
+ if(PolygonsOverlap(p1, p2, xl, yl, xh, yh)) {
+ if(!(is_dup && fmap2[jj].isDuplicate())) {
+ p2->getColor(&r2, &g2, &b2);
+ myr = r1 + r2;
+ myg = g1 + g2;
+ myb = b1 + b2;
+ (*m_resultMap).local().push_back(RPolygon(xl, yl, xh, yh, myr, myg, myb));
+ }
+ parea -= (xh-xl+1)*(yh-yl+1);
+ }
+ }
+ }
+ }
+
+ ApplySplitOverlayETS(ETS_Polygon_map_t *resultMap, Polygon_map_t *map1, Polygon_map_t *map2 ) :
+ m_resultMap(resultMap), m_map1(map1), m_map2(map2) {}
+};
+
+
+/*!
+* @brief intersects two maps strip-wise, accumulating into an ets variable
+*
+* @param[out] resultMap output map (must be allocated)
+* @param[in] polymap1 map to be intersected
+* @param[in] polymap2 map to be intersected
+*/
+void SplitParallelOverlayETS(ETS_Polygon_map_t **result_map, Polygon_map_t *polymap1, Polygon_map_t *polymap2) {
+ int nthreads;
+ bool automatic_threadcount = false;
+ double domainSplitParallelTime;
+ tbb::tick_count t0, t1;
+ if(gThreadsLow == THREADS_UNSET || gThreadsLow == tbb::task_scheduler_init::automatic ) {
+ gThreadsLow = gThreadsHigh = tbb::task_scheduler_init::automatic;
+ automatic_threadcount = true;
+ }
+ *result_map = new ETS_Polygon_map_t;
+
+ RPolygon *p0 = &((*polymap1)[0]);
+ int mapxSize, mapySize, ignore1, ignore2;
+ p0->get(&ignore1, &ignore2, &mapxSize, &mapySize);
+ // (*result_map)->reserve(mapxSize*mapySize); // can't be any bigger than this
+
+ int grain_size;
+#ifdef _DEBUG
+ grain_size = gMapXSize / 4;
+#else
+ grain_size = gGrainSize;
+#endif
+ for(nthreads = gThreadsLow; nthreads <= gThreadsHigh; nthreads++) {
+ tbb::task_scheduler_init init(nthreads);
+ if(gIsGraphicalVersion) {
+ RPolygon *xp = new RPolygon(0, 0, gMapXSize-1, gMapYSize-1, 0, 0, 0); // Clear the output space
+ delete xp;
+ }
+ // push the map size as the first polygon,
+ // This polygon needs to be first, so we can push it at the start of a combine.
+ // (*result_map)->local.push_back(RPolygon(0,0,mapxSize, mapySize));
+ t0 = tbb::tick_count::now();
+ tbb::parallel_for (blocked_range_with_maps<int>(0,(int)(mapxSize+1),grain_size, polymap1, polymap2), ApplySplitOverlayETS((*result_map), polymap1, polymap2));
+ t1 = tbb::tick_count::now();
+ domainSplitParallelTime = (t1-t0).seconds()*1000;
+ cout << "Splitting parallel with ETS and ";
+ if(automatic_threadcount) cout << "automatic";
+ else cout << nthreads;
+ cout << ((nthreads == 1) ? " thread" : " threads");
+ cout << " took " << domainSplitParallelTime << " msec : speedup over serial " << (gSerialTime / domainSplitParallelTime) << std::endl;
+ if(gCsvFile.is_open()) {
+ gCsvFile << "," << domainSplitParallelTime;
+ }
+#if _DEBUG
+ {
+
+ Polygon_map_t s_result_map;
+ flattened2d<ETS_Polygon_map_t> psv = flatten2d(**result_map);
+ s_result_map.push_back(RPolygon(0,0,mapxSize, mapySize));
+ for(flattened2d<ETS_Polygon_map_t>::const_iterator ci = psv.begin(); ci != psv.end(); ++ci) {
+ s_result_map.push_back(*ci);
+ }
+ CheckPolygonMap(&s_result_map);
+ ComparePolygonMaps(&s_result_map, gResultMap);
+ }
+#endif
+ (*result_map)->clear();
+
+ }
+
+ if(gCsvFile.is_open()) {
+ gCsvFile << std::endl;
+ }
}
diff --git a/examples/parallel_for/polygon_overlay/polyover.h b/examples/parallel_for/polygon_overlay/polyover.h
index f36c886..cca20f6 100644
--- a/examples/parallel_for/polygon_overlay/polyover.h
+++ b/examples/parallel_for/polygon_overlay/polyover.h
@@ -41,6 +41,8 @@ extern void SerialOverlayMaps(Polygon_map_t **resultMap, Polygon_map_t *map1, Po
extern void NaiveParallelOverlay(Polygon_map_t *&result_map, Polygon_map_t &polymap1, Polygon_map_t &polymap2);
extern void SplitParallelOverlay(Polygon_map_t **result_map, Polygon_map_t *polymap1, Polygon_map_t *polymap2);
+extern void SplitParallelOverlayCV(concurrent_Polygon_map_t **result_map, Polygon_map_t *polymap1, Polygon_map_t *polymap2);
+extern void SplitParallelOverlayETS(ETS_Polygon_map_t **result_map, Polygon_map_t *polymap1, Polygon_map_t *polymap2);
extern void CheckPolygonMap(Polygon_map_t *checkMap);
extern bool ComparePolygonMaps(Polygon_map_t *map1, Polygon_map_t *map2);
diff --git a/examples/parallel_for/polygon_overlay/pover_video.cpp b/examples/parallel_for/polygon_overlay/pover_video.cpp
index d1e2b7d..abcb9a1 100644
--- a/examples/parallel_for/polygon_overlay/pover_video.cpp
+++ b/examples/parallel_for/polygon_overlay/pover_video.cpp
@@ -92,12 +92,12 @@ void pover_video::on_process() {
gDrawXOffset = map1XLoc;
gDrawYOffset = map1YLoc;
for(int i=0; i < int(gPolymap1->size()); i++) {
- gPolymap1->at(i)->drawPoly();
+ (*gPolymap1)[i].drawPoly();
}
gDrawXOffset = map2XLoc;
gDrawYOffset = map2YLoc;
for(int i=0; i < int(gPolymap2->size()) ;i++) {
- gPolymap2->at(i)->drawPoly();
+ (*gPolymap2)[i].drawPoly();
}
gDoDraw = true;
@@ -105,8 +105,8 @@ void pover_video::on_process() {
gDrawXOffset = maprXLoc;
gDrawYOffset = maprYLoc;
{
- RPolygon *xp = RPolygon::alloc_RPolygon(0, 0, gMapXSize-1, gMapYSize-1, 0, 0, 0); // Clear the output space
- RPolygon::free_RPolygon( xp );
+ RPolygon *xp = new RPolygon(0, 0, gMapXSize-1, gMapYSize-1, 0, 0, 0); // Clear the output space
+ delete xp;
t0 = tbb::tick_count::now();
SerialOverlayMaps(&gResultMap, gPolymap1, gPolymap2);
t1 = tbb::tick_count::now();
@@ -116,9 +116,6 @@ void pover_video::on_process() {
CheckPolygonMap(gResultMap);
// keep the map for comparison purposes.
#else
- for(int i=0; i<int(gResultMap->size());i++) {
- RPolygon::free_RPolygon(gResultMap->at(i));
- }
delete gResultMap;
#endif
if(gCsvFile.is_open()) {
@@ -155,6 +152,27 @@ void pover_video::on_process() {
}
SplitParallelOverlay(&resultMap, gPolymap1, gPolymap2);
delete resultMap;
- if(gIsGraphicalVersion) rt_sleep(10000);
+ if(gIsGraphicalVersion) rt_sleep(2000);
+ }
+ // split, accumulating into concurrent vector
+ {
+ concurrent_Polygon_map_t *cresultMap;
+ if(gCsvFile.is_open()) {
+ gCsvFile << "Split CV time";
+ }
+ SplitParallelOverlayCV(&cresultMap, gPolymap1, gPolymap2);
+ delete cresultMap;
+ if(gIsGraphicalVersion) rt_sleep(2000);
+ }
+ // split, accumulating into ETS
+ {
+ ETS_Polygon_map_t *cresultMap;
+ if(gCsvFile.is_open()) {
+ gCsvFile << "Split ETS time";
+ }
+ SplitParallelOverlayETS(&cresultMap, gPolymap1, gPolymap2);
+ delete cresultMap;
+ if(gIsGraphicalVersion) rt_sleep(2000);
}
+ if(gIsGraphicalVersion) rt_sleep(8000);
}
diff --git a/examples/parallel_for/polygon_overlay/rpolygon.h b/examples/parallel_for/polygon_overlay/rpolygon.h
index 3616b94..ff70bf3 100644
--- a/examples/parallel_for/polygon_overlay/rpolygon.h
+++ b/examples/parallel_for/polygon_overlay/rpolygon.h
@@ -35,6 +35,8 @@
#include "pover_video.h"
#include "tbb/scalable_allocator.h"
+#include "tbb/concurrent_vector.h"
+#include "tbb/enumerable_thread_specific.h"
using namespace std;
@@ -63,38 +65,6 @@ public:
}
}
- static RPolygon *alloc_RPolygon(int xMin, int yMin, int xMax, int yMax, int r=-1, int g=-1, int b=-1) {
- switch(gMBehavior) {
- case UseScalableAllocator: {
- RPolygon *my_p = rAlloc.allocate(1);
- my_p->set_nodraw(xMin,yMin,xMax,yMax);
- my_p->setColor(r,g,b);
- if( r >= 0 && gDoDraw) {
- my_p->drawPoly();
- }
- return my_p;
- }
- case UseMalloc: {
- RPolygon *my_p = new RPolygon(xMin,yMin,xMax,yMax,r,g,b);
- return my_p;
- }
- }
- return NULL;
- }
-
- static void free_RPolygon(RPolygon *p) {
- switch(gMBehavior) {
- case UseScalableAllocator: {
- rAlloc.deallocate(p, 1);
- break;
- }
- case UseMalloc: {
- delete p;
- break;
- }
- }
- }
-
void set_nodraw(int xMin, int yMin, int xMax, int yMax) {m_XMin=xMin; m_YMin=yMin; m_XMax=xMax; m_YMax=yMax;}
RPolygon &intersect(RPolygon &otherPoly);
@@ -105,6 +75,10 @@ public:
}
}
void get(int *xMin, int *yMin, int *xMax, int *yMax) const {*xMin=m_XMin;*yMin=m_YMin;*xMax=m_XMax;*yMax=m_YMax;}
+ int xmax() const { return m_XMax; }
+ int xmin() const { return m_XMin; }
+ int ymax() const { return m_YMax; }
+ int ymin() const { return m_YMin; }
void setColor(colorcomp_t newr, colorcomp_t newg, colorcomp_t newb) {m_r = newr; m_g=newg; m_b=newb;}
void getColor(int *myr, int *myg, int *myb) {*myr=m_r; *myg=m_g; *myb=m_b;}
color_t myColor() {return gVideo->get_color(m_r, m_g, m_b);}
@@ -126,6 +100,7 @@ public:
}
}
}
+
int area() {return ((m_XMax-m_XMin+1)*(m_YMax-m_YMin+1));}
void print(int i) { cout << "RPolygon " << i << " (" << m_XMin << ", " << m_YMin << ")-(" << m_XMax << ", " << m_YMax << ") " << endl; fflush(stdout);}
private:
@@ -138,6 +113,16 @@ private:
colorcomp_t m_b;
};
+#if _MAIN_C_
+bool operator<(const RPolygon& a, const RPolygon& b) {
+ if(a.ymin() > b.ymin()) return false;
+ if(a.ymin() < b.ymin()) return true;
+ return a.xmin() < b.xmin();
+}
+#else
+extern bool operator<(const RPolygon& a, const RPolygon& b);
+#endif
+
extern ostream& operator<<(ostream& s, const RPolygon &p);
class RPolygon_flagged {
@@ -145,14 +130,17 @@ class RPolygon_flagged {
bool is_duplicate;
public:
RPolygon_flagged() {myPoly = NULL; is_duplicate = false;}
+ RPolygon_flagged(RPolygon* _p, bool _is_duplicate) : myPoly(_p), is_duplicate(_is_duplicate) { }
bool isDuplicate() {return is_duplicate;}
void setDuplicate(bool newValue) {is_duplicate = newValue;}
RPolygon *p() {return myPoly;}
void setp(RPolygon *newp) {myPoly = newp;}
};
-typedef class vector<RPolygon *> Polygon_map_t;
-typedef class vector<RPolygon_flagged> Flagged_map_t; // we'll make shallow copies
+typedef class vector<RPolygon, RPolygon_allocator> Polygon_map_t;
+typedef class concurrent_vector<RPolygon, RPolygon_allocator> concurrent_Polygon_map_t;
+typedef class enumerable_thread_specific<Polygon_map_t> ETS_Polygon_map_t;
+typedef class vector<RPolygon_flagged, scalable_allocator<RPolygon_flagged> > Flagged_map_t; // we'll make shallow copies
inline bool PolygonsOverlap(RPolygon *p1, RPolygon *p2, int &xl, int &yl, int &xh, int &yh) {
int xl1, yl1, xh1, yh1, xl2, yl2, xh2, yh2;
diff --git a/examples/pipeline/square/square.cpp b/examples/pipeline/square/square.cpp
index 65cf2d2..53a87ad 100644
--- a/examples/pipeline/square/square.cpp
+++ b/examples/pipeline/square/square.cpp
@@ -236,7 +236,7 @@ int run_pipeline( int nthreads )
MyInputFilter input_filter( input_file );
pipeline.add_filter( input_filter );
- // Create capitalization stage and add it to the pipeline
+ // Create squaring stage and add it to the pipeline
MyTransformFilter transform_filter;
pipeline.add_filter( transform_filter );
diff --git a/examples/task_group/sudoku/index.html b/examples/task_group/sudoku/index.html
index 2ab25dc..110820f 100644
--- a/examples/task_group/sudoku/index.html
+++ b/examples/task_group/sudoku/index.html
@@ -41,6 +41,7 @@ General build directions can be found <A HREF=../../index.html#build>here</A>.
<H2>Usage</H2>
<DL>
+<DT><TT>sudoku [<I>N</I>]</TT>
<DT><TT>sudoku <I>inputfile</I> <I>N</I> <I>S</I> [<I>-p</I>]</TT>
<DD><I>N</I> is the number of threads to be used.
<I>S</I> is the number of solutions to find: 1 finds the first, any other number will find all solutions.
diff --git a/examples/task_group/sudoku/msvs/sudoku.vcproj b/examples/task_group/sudoku/msvs/sudoku.vcproj
index ac1edcb..9aa1f53 100644
--- a/examples/task_group/sudoku/msvs/sudoku.vcproj
+++ b/examples/task_group/sudoku/msvs/sudoku.vcproj
@@ -1,356 +1,356 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8,00"
- Name="sudoku"
- ProjectGUID="{C931C7A2-074E-4150-9E7A-39A03250411E}"
- RootNamespace="sudoku"
- Keyword="Win32Proj"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib tbbmalloc.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
- PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib tbbmalloc.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- FixedBaseAddress="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\sudoku.cpp"
- >
- </File>
- </Filter>
- <File
- RelativePath="..\index.html"
- >
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="sudoku"
+ ProjectGUID="{C931C7A2-074E-4150-9E7A-39A03250411E}"
+ RootNamespace="sudoku"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb.lib tbbmalloc.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="tbb.lib tbbmalloc.lib"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying DLLs and PDBs"
+ CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\sudoku.cpp"
+ >
+ </File>
+ </Filter>
+ <File
+ RelativePath="..\index.html"
+ >
+ </File>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/examples/task_group/sudoku/msvs/sudoku_cl.sln b/examples/task_group/sudoku/msvs/sudoku_cl.sln
index 8b5504a..176854b 100644
--- a/examples/task_group/sudoku/msvs/sudoku_cl.sln
+++ b/examples/task_group/sudoku/msvs/sudoku_cl.sln
@@ -1,25 +1,25 @@
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sudoku", "sudoku.vcproj", "{C931C7A2-074E-4150-9E7A-39A03250411E}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Win32 = Debug|Win32
- Debug|x64 = Debug|x64
- Release|Win32 = Release|Win32
- Release|x64 = Release|x64
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {C931C7A2-074E-4150-9E7A-39A03250411E}.Debug|Win32.ActiveCfg = Debug|Win32
- {C931C7A2-074E-4150-9E7A-39A03250411E}.Debug|Win32.Build.0 = Debug|Win32
- {C931C7A2-074E-4150-9E7A-39A03250411E}.Debug|x64.ActiveCfg = Debug|x64
- {C931C7A2-074E-4150-9E7A-39A03250411E}.Debug|x64.Build.0 = Debug|x64
- {C931C7A2-074E-4150-9E7A-39A03250411E}.Release|Win32.ActiveCfg = Release|Win32
- {C931C7A2-074E-4150-9E7A-39A03250411E}.Release|Win32.Build.0 = Release|Win32
- {C931C7A2-074E-4150-9E7A-39A03250411E}.Release|x64.ActiveCfg = Release|x64
- {C931C7A2-074E-4150-9E7A-39A03250411E}.Release|x64.Build.0 = Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sudoku", "sudoku.vcproj", "{C931C7A2-074E-4150-9E7A-39A03250411E}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Debug|x64 = Debug|x64
+ Release|Win32 = Release|Win32
+ Release|x64 = Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {C931C7A2-074E-4150-9E7A-39A03250411E}.Debug|Win32.ActiveCfg = Debug|Win32
+ {C931C7A2-074E-4150-9E7A-39A03250411E}.Debug|Win32.Build.0 = Debug|Win32
+ {C931C7A2-074E-4150-9E7A-39A03250411E}.Debug|x64.ActiveCfg = Debug|x64
+ {C931C7A2-074E-4150-9E7A-39A03250411E}.Debug|x64.Build.0 = Debug|x64
+ {C931C7A2-074E-4150-9E7A-39A03250411E}.Release|Win32.ActiveCfg = Release|Win32
+ {C931C7A2-074E-4150-9E7A-39A03250411E}.Release|Win32.Build.0 = Release|Win32
+ {C931C7A2-074E-4150-9E7A-39A03250411E}.Release|x64.ActiveCfg = Release|x64
+ {C931C7A2-074E-4150-9E7A-39A03250411E}.Release|x64.Build.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/examples/task_group/sudoku/sudoku.cpp b/examples/task_group/sudoku/sudoku.cpp
index 0949e36..3ba2fa1 100644
--- a/examples/task_group/sudoku/sudoku.cpp
+++ b/examples/task_group/sudoku/sudoku.cpp
@@ -46,7 +46,7 @@ using namespace std;
atomic<unsigned> nSols;
unsigned NThreads, NSolutions;
bool Verbose=false;
-unsigned short init_values[BOARD_SIZE];
+unsigned short init_values[BOARD_SIZE] = {1,0,0,9,0,0,0,8,0,0,8,0,2,0,0,0,0,0,0,0,5,0,0,0,7,0,0,0,5,2,1,0,0,4,0,0,0,0,0,0,0,5,0,0,7,4,0,0,7,0,0,0,3,0,0,3,0,0,0,2,0,0,5,0,0,0,0,0,0,1,0,0,5,0,0,0,1,0,0,0,0};
task_group *g;
typedef struct {
@@ -58,6 +58,10 @@ void read_board(char *filename) {
FILE *fp;
int input;
fp = fopen(filename, "r");
+ if (!fp) {
+ fprintf(stderr, "sudoku: Could not open input file '%s'.\n", filename);
+ exit(1);
+ }
for (unsigned i=0; i<BOARD_SIZE; ++i) {
if (fscanf(fp, "%d", &input))
init_values[i] = input;
@@ -243,19 +247,27 @@ void partial_solve(board_element *b, unsigned first_potential_set) {
}
void ParseCommandLine(int argc, char *argv[]) {
- if (argc < 4) {
+ NThreads = 4;
+ Verbose = true;
+ NSolutions = 2;
+ if (argc != 4 && argc != 5 && argc != 2 && argc != 1) {
fprintf(stderr,
- "Usage: sudoku <inputfilename> <nthreads> <nSolutions> [-p]\n"
- " nSolutions=1 stops after finding first solution\n"
- " and any other value finds all solutions; \n"
- " -p prints the first solution.\n");
+ "Usage: sudoku [<nthreads>]\n"
+ " sudoku <inputfilename> <nthreads> <nSolutions> [-p]\n"
+ " where: nSolutions=1 stops after finding first solution\n"
+ " and any other value finds all solutions; \n"
+ " -p prints the first solution.\n");
exit(1);
}
- else {
+ if (argc == 2) {
+ sscanf(argv[1], "%d", &NThreads);
+ }
+ else if (argc > 3) {
sscanf(argv[2], "%d", &NThreads);
sscanf(argv[3], "%d", &NSolutions);
+ if (argc!=5) Verbose = false;
+ read_board(argv[1]);
}
- if (argc==5) Verbose = true;
}
int main(int argc, char *argv[]) {
@@ -264,7 +276,6 @@ int main(int argc, char *argv[]) {
NThreads = 1;
nSols = 0;
ParseCommandLine(argc, argv);
- read_board(argv[1]);
init_board(start_board, init_values);
task_scheduler_init init(NThreads);
g = new task_group;
diff --git a/include/tbb/_concurrent_unordered_internal.h b/include/tbb/_concurrent_unordered_internal.h
index 66b0b97..1348d61 100644
--- a/include/tbb/_concurrent_unordered_internal.h
+++ b/include/tbb/_concurrent_unordered_internal.h
@@ -50,7 +50,7 @@
#pragma warning (pop)
#endif
-#include "tbb_machine.h"
+#include "atomic.h"
#include "tbb_exception.h"
#include "tbb_allocator.h"
@@ -690,9 +690,11 @@ protected:
// Constructors/Destructors
concurrent_unordered_base(size_type n_of_buckets = initial_bucket_number,
const hash_compare& hc = hash_compare(), const allocator_type& a = allocator_type())
- : Traits(hc), my_number_of_buckets(n_of_buckets), my_solist(a),
+ : Traits(hc), my_solist(a),
my_allocator(a), my_maximum_bucket_size((float) initial_bucket_load)
{
+ __TBB_ASSERT( n_of_buckets, "number of buckets must be greater than 0");
+ my_number_of_buckets = 1<<__TBB_Log2((uintptr_t)n_of_buckets*2-1); // round up to power of 2
internal_init();
}
@@ -921,7 +923,7 @@ public:
}
std::pair<const_iterator, const_iterator> equal_range(const key_type& key) const {
- return internal_equal_range(key);
+ return const_cast<self_type*>(this)->internal_equal_range(key);
}
// Bucket interface - for debugging
@@ -1031,12 +1033,9 @@ public:
// reflected next time this bucket is touched.
void rehash(size_type buckets) {
size_type current_buckets = my_number_of_buckets;
-
- if (current_buckets > buckets)
+ if (current_buckets >= buckets)
return;
- else if ( (buckets & (buckets-1)) != 0 )
- tbb::internal::throw_exception(tbb::internal::eid_invalid_buckets_number);
- my_number_of_buckets = buckets;
+ my_number_of_buckets = 1<<__TBB_Log2((uintptr_t)buckets*2-1); // round up to power of 2
}
private:
@@ -1261,41 +1260,6 @@ private:
return pairii_t(end(), end());
}
- // Return the [begin, end) pair of const iterators with the same key values.
- // This operation makes sense only if mapping is many-to-one.
- paircc_t internal_equal_range(const key_type& key) const
- {
- sokey_t order_key = (sokey_t) my_hash_compare(key);
- size_type bucket = order_key % my_number_of_buckets;
-
- // If bucket is empty, initialize it first
- if (!is_initialized(bucket))
- return paircc_t(end(), end());
-
- order_key = split_order_key_regular(order_key);
- raw_const_iterator end_it = my_solist.raw_end();
-
- for (raw_const_iterator it = get_bucket(bucket); it != end_it; ++it)
- {
- if (solist_t::get_order_key(it) > order_key)
- {
- // There is no element with the given key
- return paircc_t(end(), end());
- }
- else if (solist_t::get_order_key(it) == order_key && !my_hash_compare(get_key(*it), key))
- {
- const_iterator first = my_solist.get_iterator(it);
- const_iterator last = first;
-
- while( last != end() && !my_hash_compare(get_key(*last), key ) )
- ++last;
- return paircc_t(first, last);
- }
- }
-
- return paircc_t(end(), end());
- }
-
// Bucket APIs
void init_bucket(size_type bucket)
{
@@ -1399,11 +1363,11 @@ private:
}
// Shared variables
- size_type my_number_of_buckets; // Current table size
+ atomic<size_type> my_number_of_buckets; // Current table size
solist_t my_solist; // List where all the elements are kept
typename allocator_type::template rebind<raw_iterator>::other my_allocator; // Allocator object for segments
float my_maximum_bucket_size; // Maximum size of the bucket
- raw_iterator *my_buckets[pointers_per_table]; // The segment table
+ atomic<raw_iterator*> my_buckets[pointers_per_table]; // The segment table
};
#if _MSC_VER
#pragma warning(pop) // warning 4127 -- while (true) has a constant expression in it
diff --git a/include/tbb/aligned_space.h b/include/tbb/aligned_space.h
index c4b58e5..0d76b3f 100644
--- a/include/tbb/aligned_space.h
+++ b/include/tbb/aligned_space.h
@@ -44,7 +44,7 @@ private:
element_type array[(sizeof(T)*N+sizeof(element_type)-1)/sizeof(element_type)];
public:
//! Pointer to beginning of array
- T* begin() {return reinterpret_cast<T*>(this);}
+ T* begin() {return internal::punned_cast<T*>(this);}
//! Pointer to one past last element in array.
T* end() {return begin()+N;}
diff --git a/include/tbb/concurrent_hash_map.h b/include/tbb/concurrent_hash_map.h
index 117d0c7..4c01bde 100644
--- a/include/tbb/concurrent_hash_map.h
+++ b/include/tbb/concurrent_hash_map.h
@@ -133,7 +133,7 @@ namespace interface4 {
typedef bucket *segment_ptr_t;
//! Segment pointers table type
typedef segment_ptr_t segments_table_t[pointers_per_table];
- //! Hash mask = sum of allocated segments sizes - 1
+ //! Hash mask = sum of allocated segment sizes - 1
atomic<hashcode_t> my_mask;
//! Segment pointers table. Also prevents false sharing between my_mask and my_size
segments_table_t my_table;
@@ -410,10 +410,10 @@ namespace interface4 {
hash_map_iterator& operator++();
//! Post increment
- Value* operator++(int) {
- Value* result = &operator*();
+ hash_map_iterator operator++(int) {
+ hash_map_iterator old(*this);
operator++();
- return result;
+ return old;
}
};
diff --git a/include/tbb/enumerable_thread_specific.h b/include/tbb/enumerable_thread_specific.h
index 668c353..d8d9a23 100644
--- a/include/tbb/enumerable_thread_specific.h
+++ b/include/tbb/enumerable_thread_specific.h
@@ -32,6 +32,7 @@
#include "concurrent_vector.h"
#include "tbb_thread.h"
#include "cache_aligned_allocator.h"
+#include "aligned_space.h"
#if __SUNPRO_CC
#include <string.h> // for memcpy
#endif
@@ -47,7 +48,7 @@ namespace tbb {
//! enum for selecting between single key and key-per-instance versions
enum ets_key_usage_type { ets_key_per_instance, ets_no_key };
-namespace interface5 {
+namespace interface6 {
//! @cond
namespace internal {
@@ -84,10 +85,7 @@ namespace interface5 {
bool match( key_type k ) const {return key==k;}
bool claim( key_type k ) {
__TBB_ASSERT(sizeof(tbb::atomic<key_type>)==sizeof(key_type), NULL);
- __TBB_ASSERT(sizeof(void*)==sizeof(tbb::atomic<key_type>*), NULL);
- union { void* space; tbb::atomic<key_type>* key_atomic; } helper;
- helper.space = &key;
- return helper.key_atomic->compare_and_swap(k,0)==0;
+ return tbb::internal::punned_cast<tbb::atomic<key_type>*>(&key)->compare_and_swap(k,0)==0;
}
};
#if __TBB_GCC_3_3_PROTECTED_BROKEN
@@ -232,7 +230,7 @@ namespace interface5 {
}
}
}
- };
+ }
//! Specialization that exploits native TLS
template <>
@@ -578,46 +576,73 @@ namespace interface5 {
return !(i==j);
}
+ template<typename T>
+ struct destruct_only: tbb::internal::no_copy {
+ tbb::aligned_space<T,1> value;
+ ~destruct_only() {value.begin()[0].~T();}
+ };
+
+ template<typename T>
+ struct construct_by_default: tbb::internal::no_assign {
+ void construct(void*where) {new(where) T();} // C++ note: the () in T() ensure zero initialization.
+ construct_by_default( int ) {}
+ };
+
+ template<typename T>
+ struct construct_by_exemplar: tbb::internal::no_assign {
+ const T exemplar;
+ void construct(void*where) {new(where) T(exemplar);}
+ construct_by_exemplar( const T& t ) : exemplar(t) {}
+ };
+
+ template<typename T, typename Finit>
+ struct construct_by_finit: tbb::internal::no_assign {
+ Finit f;
+ void construct(void* where) {new(where) T(f());}
+ construct_by_finit( const Finit& f_ ) : f(f_) {}
+ };
+
// storage for initialization function pointer
template<typename T>
- struct callback_base {
- virtual T apply( ) = 0;
- virtual void destroy( ) = 0;
- // need to be able to create copies of callback_base for copy constructor
- virtual callback_base* make_copy() = 0;
- // need virtual destructor to satisfy GCC compiler warning
+ class callback_base {
+ public:
+ // Clone *this
+ virtual callback_base* clone() = 0;
+ // Destruct and free *this
+ virtual void destroy() = 0;
+ // Need virtual destructor to satisfy GCC compiler warning
virtual ~callback_base() { }
+ // Construct T at where
+ virtual void construct(void* where) = 0;
};
- template <typename T, typename Functor>
- struct callback_leaf : public callback_base<T>, public tbb::internal::no_copy {
- typedef Functor my_callback_type;
- typedef callback_leaf<T,Functor> my_type;
- typedef my_type* callback_pointer;
- typedef typename tbb::tbb_allocator<my_type> my_allocator_type;
- Functor f;
- callback_leaf( const Functor& f_) : f(f_) {
- }
+ template <typename T, typename Constructor>
+ class callback_leaf: public callback_base<T>, Constructor {
+ template<typename X> callback_leaf( const X& x ) : Constructor(x) {}
+
+ typedef typename tbb::tbb_allocator<callback_leaf> my_allocator_type;
- static callback_pointer new_callback(const Functor& f_ ) {
- void* new_void = my_allocator_type().allocate(1);
- callback_pointer new_cb = new (new_void) callback_leaf<T,Functor>(f_); // placement new
- return new_cb;
+ /*override*/ callback_base<T>* clone() {
+ void* where = my_allocator_type().allocate(1);
+ return new(where) callback_leaf(*this);
}
- /* override */ callback_pointer make_copy() {
- return new_callback( f );
+ /*override*/ void destroy() {
+ my_allocator_type().destroy(this);
+ my_allocator_type().deallocate(this,1);
}
- /* override */ void destroy( ) {
- callback_pointer my_ptr = this;
- my_allocator_type().destroy(my_ptr);
- my_allocator_type().deallocate(my_ptr,1);
- }
- /* override */ T apply() { return f(); } // does copy construction of returned value.
+ /*override*/ void construct(void* where) {
+ Constructor::construct(where);
+ }
+ public:
+ template<typename X>
+ static callback_base<T>* make( const X& x ) {
+ void* where = my_allocator_type().allocate(1);
+ return new(where) callback_leaf(x);
+ }
};
-
//! Template for adding padding in order to avoid false sharing
/** ModularSize should be sizeof(U) modulo the cache line size.
All maintenance of the space will be done explicitly on push_back,
@@ -626,27 +651,9 @@ namespace interface5 {
*/
template<typename U, size_t ModularSize>
struct ets_element {
- char value[sizeof(U) + tbb::internal::NFS_MaxLineSize-ModularSize];
+ char value[ModularSize==0 ? sizeof(U) : sizeof(U)+(tbb::internal::NFS_MaxLineSize-ModularSize)];
void unconstruct() {
- // "reinterpret_cast<U*>(&value)->~U();" causes type-punning warning with gcc 4.4,
- // "U* u = reinterpret_cast<U*>(&value); u->~U();" causes unused variable warning with VS2010.
- // Thus another "casting via union" hack.
- __TBB_ASSERT(sizeof(void*)==sizeof(U*),NULL);
- union { void* space; U* val; } helper;
- helper.space = &value;
- helper.val->~U();
- }
- };
-
- //! Partial specialization for case where no padding is needed.
- template<typename U>
- struct ets_element<U,0> {
- char value[sizeof(U)];
- void unconstruct() { // Same implementation as in general case
- __TBB_ASSERT(sizeof(void*)==sizeof(U*),NULL);
- union { void* space; U* val; } helper;
- helper.space = &value;
- helper.val->~U();
+ tbb::internal::punned_cast<U*>(&value)->~U();
}
};
@@ -700,32 +707,7 @@ namespace interface5 {
typedef typename Allocator::template rebind< padded_element >::other padded_allocator_type;
typedef tbb::concurrent_vector< padded_element, padded_allocator_type > internal_collection_type;
- internal::callback_base<T> *my_finit_callback;
-
- // need to use a pointed-to exemplar because T may not be assignable.
- // using tbb_allocator instead of padded_element_allocator because we may be
- // copying an exemplar from one instantiation of ETS to another with a different
- // allocator.
- typedef typename tbb::tbb_allocator<padded_element > exemplar_allocator_type;
- static padded_element * create_exemplar(const T& my_value) {
- padded_element *new_exemplar = reinterpret_cast<padded_element *>(exemplar_allocator_type().allocate(1));
- new(new_exemplar->value) T(my_value);
- return new_exemplar;
- }
-
- static padded_element *create_exemplar( ) {
- padded_element *new_exemplar = reinterpret_cast<padded_element *>(exemplar_allocator_type().allocate(1));
- new(new_exemplar->value) T( );
- return new_exemplar;
- }
-
- static void free_exemplar(padded_element *my_ptr) {
- my_ptr->unconstruct();
- exemplar_allocator_type().destroy(my_ptr);
- exemplar_allocator_type().deallocate(my_ptr,1);
- }
-
- padded_element* my_exemplar_ptr;
+ internal::callback_base<T> *my_construct_callback;
internal_collection_type my_locals;
@@ -735,14 +717,7 @@ namespace interface5 {
#else
void* lref = &*my_locals.push_back(padded_element());
#endif
- if(my_finit_callback) {
- new(lref) T(my_finit_callback->apply());
- } else if(my_exemplar_ptr) {
- pointer t_exemp = reinterpret_cast<T *>(&(my_exemplar_ptr->value));
- new(lref) T(*t_exemp);
- } else {
- new(lref) T();
- }
+ my_construct_callback->construct(lref);
return lref;
}
@@ -785,33 +760,25 @@ namespace interface5 {
typedef generic_range_type< iterator > range_type;
typedef generic_range_type< const_iterator > const_range_type;
- //! Default constructor, which leads to default construction of local copies
- enumerable_thread_specific() : my_finit_callback(0) {
- my_exemplar_ptr = 0;
- }
+ //! Default constructor. Each local instance of T is default constructed.
+ enumerable_thread_specific() :
+ my_construct_callback( internal::callback_leaf<T,internal::construct_by_default<T> >::make(/*dummy argument*/0) )
+ {}
- //! construction with initializer method
- // Finit should be a function taking 0 parameters and returning a T
+ //! Constructor with initializer functor. Each local instance of T is constructed by T(finit()).
template <typename Finit>
- enumerable_thread_specific( Finit _finit )
- {
- my_finit_callback = internal::callback_leaf<T,Finit>::new_callback( _finit );
- my_exemplar_ptr = 0; // don't need exemplar if function is provided
- }
+ enumerable_thread_specific( Finit finit ) :
+ my_construct_callback( internal::callback_leaf<T,internal::construct_by_finit<T,Finit> >::make( finit ) )
+ {}
- //! Constuction with exemplar, which leads to copy construction of local copies
- enumerable_thread_specific(const T &_exemplar) : my_finit_callback(0) {
- my_exemplar_ptr = create_exemplar(_exemplar);
- }
+ //! Constuctor with exemplar. Each local instance of T is copied-constructed from the exemplar.
+ enumerable_thread_specific(const T& exemplar) :
+ my_construct_callback( internal::callback_leaf<T,internal::construct_by_exemplar<T> >::make( exemplar ) )
+ {}
//! Destructor
~enumerable_thread_specific() {
- if(my_finit_callback) {
- my_finit_callback->destroy();
- }
- if(my_exemplar_ptr) {
- free_exemplar(my_exemplar_ptr);
- }
+ my_construct_callback->destroy();
this->clear(); // deallocation before the derived class is finished destructing
// So free(array *) is still accessible
}
@@ -886,14 +853,8 @@ namespace interface5 {
internal_assign(const enumerable_thread_specific<U, A2, C2>& other) {
if(static_cast<void *>( this ) != static_cast<const void *>( &other )) {
this->clear();
- if(my_finit_callback) {
- my_finit_callback->destroy();
- my_finit_callback = 0;
- }
- if(my_exemplar_ptr) {
- free_exemplar(my_exemplar_ptr);
- my_exemplar_ptr = 0;
- }
+ my_construct_callback->destroy();
+ my_construct_callback = 0;
internal_copy( other );
}
return *this;
@@ -916,11 +877,9 @@ namespace interface5 {
template <typename combine_func_t>
T combine(combine_func_t f_combine) {
if(begin() == end()) {
- if(my_finit_callback) {
- return my_finit_callback->apply();
- }
- pointer local_ref = reinterpret_cast<T*>((my_exemplar_ptr->value));
- return T(*local_ref);
+ internal::destruct_only<T> location;
+ my_construct_callback->construct(location.value.begin());
+ return *location.value.begin();
}
const_iterator ci = begin();
T my_result = *ci;
@@ -939,10 +898,12 @@ namespace interface5 {
}; // enumerable_thread_specific
-
template <typename T, typename Allocator, ets_key_usage_type ETS_key_type>
template<typename U, typename A2, ets_key_usage_type C2>
void enumerable_thread_specific<T,Allocator,ETS_key_type>::internal_copy( const enumerable_thread_specific<U, A2, C2>& other) {
+ // Initialize my_construct_callback first, so that it is valid even if rest of this routine throws an exception.
+ my_construct_callback = other.my_construct_callback->clone();
+
typedef internal::ets_base<ets_no_key> base;
__TBB_ASSERT(my_locals.size()==0,NULL);
this->table_reserve_for_copy( other );
@@ -965,17 +926,6 @@ namespace interface5 {
}
}
}
- if(other.my_finit_callback) {
- my_finit_callback = other.my_finit_callback->make_copy();
- } else {
- my_finit_callback = 0;
- }
- if(other.my_exemplar_ptr) {
- pointer local_ref = reinterpret_cast<U*>(other.my_exemplar_ptr->value);
- my_exemplar_ptr = create_exemplar(*local_ref);
- } else {
- my_exemplar_ptr = 0;
- }
}
template< typename Container >
@@ -1036,15 +986,15 @@ namespace interface5 {
return flattened2d<Container>(c);
}
-} // interface5
+} // interface6
namespace internal {
-using interface5::internal::segmented_iterator;
+using interface6::internal::segmented_iterator;
}
-using interface5::enumerable_thread_specific;
-using interface5::flattened2d;
-using interface5::flatten2d;
+using interface6::enumerable_thread_specific;
+using interface6::flattened2d;
+using interface6::flatten2d;
} // namespace tbb
diff --git a/include/tbb/machine/linux_ia32.h b/include/tbb/machine/linux_ia32.h
index e0041a1..e247a12 100644
--- a/include/tbb/machine/linux_ia32.h
+++ b/include/tbb/machine/linux_ia32.h
@@ -38,8 +38,7 @@
#define __TBB_BIG_ENDIAN 0
#define __TBB_release_consistency_helper() __asm__ __volatile__("": : :"memory")
-
-inline void __TBB_rel_acq_fence() { __asm__ __volatile__("mfence": : :"memory"); }
+#define __TBB_full_memory_fence() __asm__ __volatile__("mfence": : :"memory")
#if __TBB_ICC_ASM_VOLATILE_BROKEN
#define __TBB_VOLATILE
diff --git a/include/tbb/machine/linux_ia64.h b/include/tbb/machine/linux_ia64.h
index cd788fe..4f3801e 100644
--- a/include/tbb/machine/linux_ia64.h
+++ b/include/tbb/machine/linux_ia64.h
@@ -143,10 +143,10 @@ extern "C" {
it sometimes moves loads over the acquire fence. The
fences defined here stop such incorrect code motion. */
#define __TBB_release_consistency_helper() __asm__ __volatile__("": : :"memory")
-#define __TBB_rel_acq_fence() __asm__ __volatile__("mf": : :"memory")
+#define __TBB_full_memory_fence() __asm__ __volatile__("mf": : :"memory")
#else
#define __TBB_release_consistency_helper()
-#define __TBB_rel_acq_fence() __mf()
+#define __TBB_full_memory_fence() __mf()
#endif /* __INTEL_COMPILER */
// Special atomic functions
diff --git a/include/tbb/machine/linux_intel64.h b/include/tbb/machine/linux_intel64.h
index aa8472c..44b3606 100644
--- a/include/tbb/machine/linux_intel64.h
+++ b/include/tbb/machine/linux_intel64.h
@@ -37,8 +37,9 @@
#define __TBB_release_consistency_helper() __asm__ __volatile__("": : :"memory")
-#ifndef __TBB_rel_acq_fence
-inline void __TBB_rel_acq_fence() { __asm__ __volatile__("mfence": : :"memory"); }
+// __TBB_full_memory_fence can be predefined
+#ifndef __TBB_full_memory_fence
+#define __TBB_full_memory_fence() __asm__ __volatile__("mfence": : :"memory")
#endif
#define __MACHINE_DECL_ATOMICS(S,T,X) \
diff --git a/include/tbb/machine/mac_ppc.h b/include/tbb/machine/mac_ppc.h
index 2487d21..ea935f2 100644
--- a/include/tbb/machine/mac_ppc.h
+++ b/include/tbb/machine/mac_ppc.h
@@ -39,13 +39,13 @@ inline int32_t __TBB_machine_cmpswp4 (volatile void *ptr, int32_t value, int32_t
{
int32_t result;
- __asm__ __volatile__("sync\n"
+ __asm__ __volatile__("lwsync\n"
"0: lwarx %0,0,%2\n\t" /* load w/ reservation */
"cmpw %0,%4\n\t" /* compare against comparand */
"bne- 1f\n\t" /* exit if not same */
"stwcx. %3,0,%2\n\t" /* store new_value */
"bne- 0b\n" /* retry if reservation lost */
- "1: sync" /* the exit */
+ "1: lwsync" /* the exit */
: "=&r"(result), "=m"(* (int32_t*) ptr)
: "r"(ptr), "r"(value), "r"(comparand), "m"(* (int32_t*) ptr)
: "cr0");
@@ -55,13 +55,13 @@ inline int32_t __TBB_machine_cmpswp4 (volatile void *ptr, int32_t value, int32_t
inline int64_t __TBB_machine_cmpswp8 (volatile void *ptr, int64_t value, int64_t comparand )
{
int64_t result;
- __asm__ __volatile__("sync\n"
+ __asm__ __volatile__("lwsync\n"
"0: ldarx %0,0,%2\n\t" /* load w/ reservation */
"cmpd %0,%4\n\t" /* compare against comparand */
"bne- 1f\n\t" /* exit if not same */
"stdcx. %3,0,%2\n\t" /* store new_value */
"bne- 0b\n" /* retry if reservation lost */
- "1: sync" /* the exit */
+ "1: lwsync" /* the exit */
: "=&b"(result), "=m"(* (int64_t*) ptr)
: "r"(ptr), "r"(value), "r"(comparand), "m"(* (int64_t*) ptr)
: "cr0");
@@ -81,5 +81,5 @@ inline int64_t __TBB_machine_cmpswp8 (volatile void *ptr, int64_t value, int64_t
#define __TBB_CompareAndSwap4(P,V,C) __TBB_machine_cmpswp4(P,V,C)
#define __TBB_CompareAndSwap8(P,V,C) __TBB_machine_cmpswp8(P,V,C)
#define __TBB_Yield() sched_yield()
-#define __TBB_rel_acq_fence() __asm__ __volatile__("lwsync": : :"memory")
-#define __TBB_release_consistency_helper() __TBB_rel_acq_fence()
+#define __TBB_full_memory_fence() __asm__ __volatile__("sync": : :"memory")
+#define __TBB_release_consistency_helper() __asm__ __volatile__("lwsync": : :"memory")
diff --git a/include/tbb/machine/sunos_sparc.h b/include/tbb/machine/sunos_sparc.h
index cf90a92..d4cfa7e 100644
--- a/include/tbb/machine/sunos_sparc.h
+++ b/include/tbb/machine/sunos_sparc.h
@@ -40,8 +40,7 @@
#define __TBB_BIG_ENDIAN 1
#define __TBB_release_consistency_helper() __asm__ __volatile__ ("": : :"memory")
-
-inline void __TBB_rel_acq_fence() { __asm__ __volatile__("membar #LoadLoad|#LoadStore|#StoreStore|#StoreLoad": : : "memory"); }
+#define __TBB_full_memory_fence() __asm__ __volatile__("membar #LoadLoad|#LoadStore|#StoreStore|#StoreLoad": : : "memory")
//--------------------------------------------------
// Compare and swap
diff --git a/include/tbb/machine/windows_ia32.h b/include/tbb/machine/windows_ia32.h
index e6e3fc1..1ef4de4 100644
--- a/include/tbb/machine/windows_ia32.h
+++ b/include/tbb/machine/windows_ia32.h
@@ -40,7 +40,7 @@ extern "C" void _ReadWriteBarrier();
#error Unsupported compiler - need to define __TBB_release_consistency_helper to support it
#endif
-inline void __TBB_rel_acq_fence() { __asm { __asm mfence } }
+#define __TBB_full_memory_fence() __asm { __asm mfence }
#define __TBB_WORDSIZE 4
#define __TBB_BIG_ENDIAN 0
diff --git a/include/tbb/machine/windows_intel64.h b/include/tbb/machine/windows_intel64.h
index 8f9b746..1da213b 100644
--- a/include/tbb/machine/windows_intel64.h
+++ b/include/tbb/machine/windows_intel64.h
@@ -44,13 +44,13 @@
#if defined(__INTEL_COMPILER)
#define __TBB_release_consistency_helper() __asm { __asm nop }
-inline void __TBB_rel_acq_fence() { __asm { __asm mfence } }
+#define __TBB_full_memory_fence() __asm { __asm mfence }
#elif _MSC_VER >= 1300
extern "C" void _ReadWriteBarrier();
#pragma intrinsic(_ReadWriteBarrier)
#define __TBB_release_consistency_helper() _ReadWriteBarrier()
#pragma intrinsic(_mm_mfence)
-inline void __TBB_rel_acq_fence() { _mm_mfence(); }
+#define __TBB_full_memory_fence() _mm_mfence()
#endif
#define __TBB_WORDSIZE 8
diff --git a/include/tbb/machine/xbox360_ppc.h b/include/tbb/machine/xbox360_ppc.h
index 0a3b2ef..85c2933 100644
--- a/include/tbb/machine/xbox360_ppc.h
+++ b/include/tbb/machine/xbox360_ppc.h
@@ -36,12 +36,12 @@
#include "ppcintrinsics.h"
#if _MSC_VER >= 1300
-extern "C" void _ReadWriteBarrier();
-#pragma intrinsic(_ReadWriteBarrier)
-#define __TBB_release_consistency_helper() _ReadWriteBarrier()
+extern "C" void _MemoryBarrier();
+#pragma intrinsic(_MemoryBarrier)
+#define __TBB_release_consistency_helper() _MemoryBarrier()
#endif
-inline void __TBB_rel_acq_fence() { __lwsync(); }
+#define __TBB_full_memory_fence() __sync()
#define __TBB_WORDSIZE 4
#define __TBB_BIG_ENDIAN 1
diff --git a/include/tbb/pipeline.h b/include/tbb/pipeline.h
index 508c0e4..04aee63 100644
--- a/include/tbb/pipeline.h
+++ b/include/tbb/pipeline.h
@@ -31,6 +31,7 @@
#include "atomic.h"
#include "task.h"
+#include "tbb_allocator.h"
#include <cstddef>
namespace tbb {
@@ -216,7 +217,7 @@ private:
result_type internal_process_item(bool is_blocking);
};
-//! A processing pipeling that applies filters to items.
+//! A processing pipeline that applies filters to items.
/** @ingroup algorithms */
class pipeline {
public:
@@ -292,6 +293,7 @@ namespace internal {
template<typename T, typename U, typename Body> class concrete_filter;
}
+//! input_filter control to signal end-of-input for parallel_pipeline
class flow_control {
bool is_pipeline_stopped;
flow_control() { is_pipeline_stopped = false; }
@@ -305,13 +307,18 @@ namespace internal {
template<typename T, typename U, typename Body>
class concrete_filter: public tbb::filter {
- Body my_body;
+ const Body& my_body;
+
+ typedef typename tbb::tbb_allocator<U> u_allocator;
+ typedef typename tbb::tbb_allocator<T> t_allocator;
/*override*/ void* operator()(void* input) {
T* temp_input = (T*)input;
// Call user's operator()() here
- void* output = (void*) new U(my_body(*temp_input));
- delete temp_input;
+ U* output_u = u_allocator().allocate(1);
+ void* output = (void*) new (output_u) U(my_body(*temp_input));
+ t_allocator().destroy(temp_input);
+ t_allocator().deallocate(temp_input,1);
return output;
}
@@ -321,13 +328,20 @@ public:
template<typename U, typename Body>
class concrete_filter<void,U,Body>: public filter {
- Body my_body;
+ const Body& my_body;
+
+ typedef typename tbb::tbb_allocator<U> u_allocator;
/*override*/void* operator()(void*) {
flow_control control;
- U temp_output = my_body(control);
- void* output = control.is_pipeline_stopped ? NULL : (void*) new U(temp_output);
- return output;
+ U* output_u = u_allocator().allocate(1);
+ (void) new (output_u) U(my_body(control));
+ if(control.is_pipeline_stopped) {
+ u_allocator().destroy(output_u);
+ u_allocator().deallocate(output_u,1);
+ output_u = NULL;
+ }
+ return (void*)output_u;
}
public:
concrete_filter(tbb::filter::mode filter_mode, const Body& body) : filter(filter_mode), my_body(body) {}
@@ -335,12 +349,15 @@ public:
template<typename T, typename Body>
class concrete_filter<T,void,Body>: public filter {
- Body my_body;
+ const Body& my_body;
+ typedef typename tbb::tbb_allocator<T> t_allocator;
+
/*override*/ void* operator()(void* input) {
T* temp_input = (T*)input;
my_body(*temp_input);
- delete temp_input;
+ t_allocator().destroy(temp_input);
+ t_allocator().deallocate(temp_input,1);
return NULL;
}
public:
@@ -349,7 +366,7 @@ public:
template<typename Body>
class concrete_filter<void,void,Body>: public filter {
- Body my_body;
+ const Body& my_body;
/** Override privately because it is always called virtually */
/*override*/ void* operator()(void*) {
@@ -409,7 +426,7 @@ public:
template<typename T, typename U, typename Body>
class filter_node_leaf: public filter_node {
const tbb::filter::mode mode;
- const Body& body;
+ const Body body;
/*override*/void add_to( pipeline& p ) {
concrete_filter<T,U,Body>* f = new concrete_filter<T,U,Body>(mode,body);
p.add_filter( *f );
@@ -441,6 +458,7 @@ public:
} // namespace internal
//! @endcond
+//! Create a filter to participate in parallel_pipeline
template<typename T, typename U, typename Body>
filter_t<T,U> make_filter(tbb::filter::mode mode, const Body& body) {
return new internal::filter_node_leaf<T,U,Body>(mode, body);
diff --git a/include/tbb/tbb_config.h b/include/tbb/tbb_config.h
index 6f26e47..1e11988 100644
--- a/include/tbb/tbb_config.h
+++ b/include/tbb/tbb_config.h
@@ -178,6 +178,12 @@
#define __TBB_GCC_3_3_PROTECTED_BROKEN 1
#endif
+#if __MINGW32__ && (__GNUC__<4 || __GNUC__==4 && __GNUC_MINOR__<2)
+ /** MinGW has a bug with stack alignment for routines invoked from MS RTLs.
+ Since GCC 4.2, the bug can be worked around via a special attribute. **/
+ #define __TBB_SSE_STACK_ALIGNMENT_BROKEN 1
+#endif
+
#if __FreeBSD__
/** A bug in FreeBSD 8.0 results in kernel panic when there is contention
on a mutex created with this attribute. **/
diff --git a/include/tbb/tbb_exception.h b/include/tbb/tbb_exception.h
index 3e1eecd..c16be5e 100644
--- a/include/tbb/tbb_exception.h
+++ b/include/tbb/tbb_exception.h
@@ -94,7 +94,7 @@ enum exception_id {
eid_operation_not_permitted,
eid_condvar_wait_failed,
eid_invalid_load_factor,
- eid_invalid_buckets_number,
+ eid_reserved, // free slot for backward compatibility, can be reused.
eid_invalid_swap,
eid_reservation_length_error,
eid_invalid_key,
diff --git a/include/tbb/tbb_machine.h b/include/tbb/tbb_machine.h
index aa13065..961f88b 100644
--- a/include/tbb/tbb_machine.h
+++ b/include/tbb/tbb_machine.h
@@ -93,9 +93,23 @@ extern "C" __declspec(dllimport) int __stdcall SwitchToThread( void );
#endif
+//! Prerequisites for each architecture port
+/** There are no generic implementation for these macros so they have to be implemented
+ in each machine architecture specific header.
+
+ __TBB_full_memory_fence must prevent all memory operations from being reordered
+ across the fence. And all such fences must be totally ordered (or sequentially
+ consistent). These fence must affect both compiler and hardware.
+
+ __TBB_release_consistency_helper is used to enforce guarantees of acquire or
+ release semantics in generic implementations of __TBB_load_with_acquire and
+ __TBB_store_with_release below. Depending on the particular combination of
+ architecture+compiler it can be a hardware fence, a compiler fence, both or
+ nothing. **/
#if !defined(__TBB_CompareAndSwap4) \
|| !defined(__TBB_CompareAndSwap8) \
|| !defined(__TBB_Yield) \
+ || !defined(__TBB_full_memory_fence) \
|| !defined(__TBB_release_consistency_helper)
#error Minimal requirements for tbb_machine.h not satisfied
#endif
diff --git a/include/tbb/tbb_stddef.h b/include/tbb/tbb_stddef.h
index a4c938e..5230d01 100644
--- a/include/tbb/tbb_stddef.h
+++ b/include/tbb/tbb_stddef.h
@@ -270,6 +270,15 @@ template<typename T>
inline void poison_pointer( T* ) {/*do nothing*/}
#endif /* TBB_USE_ASSERT */
+//! Cast pointer from U* to T.
+/** This method should be used sparingly as a last resort for dealing with
+ situations that inherently break strict ISO C++ aliasing rules. */
+template<typename T, typename U>
+inline T punned_cast( U* ptr ) {
+ uintptr_t x = reinterpret_cast<uintptr_t>(ptr);
+ return reinterpret_cast<T>(x);
+}
+
//! Base class for types that should not be assigned.
class no_assign {
// Deny assignment
diff --git a/src/old/test_task_v2.cpp b/src/old/test_task_v2.cpp
deleted file mode 100644
index fc724cd..0000000
--- a/src/old/test_task_v2.cpp
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- Copyright 2005-2010 Intel Corporation. All Rights Reserved.
-
- This file is part of Threading Building Blocks.
-
- Threading Building Blocks is free software; you can redistribute it
- and/or modify it under the terms of the GNU General Public License
- version 2 as published by the Free Software Foundation.
-
- Threading Building Blocks is distributed in the hope that it will be
- useful, but WITHOUT ANY WARRANTY; without even the implied warranty
- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Threading Building Blocks; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
- As a special exception, you may use this file as part of a free software
- library without restriction. Specifically, if other files instantiate
- templates or use macros or inline functions from this file, or you compile
- this file and link it with other files to produce an executable, this
- file does not by itself cause the resulting executable to be covered by
- the GNU General Public License. This exception does not however
- invalidate any other reasons why the executable file might be covered by
- the GNU General Public License.
-*/
-
-// Tests that methods of class task that changed from non-static to static between
-// TBB 2.2 and TBB 3.0 still work when TBB_DEPRECATED_TASK_INTERFACE is defined.
-
-#define TBB_DEPRECATED_TASK_INTERFACE 1
-#include "tbb/task.h"
-#include "tbb/atomic.h"
-#include "../test/harness_assert.h"
-
-tbb::atomic<int> Sum;
-tbb::atomic<int> DummyCount;
-
-class DummyTask: public tbb::task {
- tbb::task* execute() {
- ASSERT(false,"DummyTask should never execute");
- return NULL;
- }
-public:
- //! Used to verify that right task was destroyed
- bool can_destroy;
- DummyTask() : can_destroy(false) {
- ++DummyCount;
- }
- ~DummyTask() {
- ASSERT(can_destroy,"destroyed wrong task?");
- --DummyCount;
- }
-};
-
-class ChildTask: public tbb::task {
-public:
- const int addend;
- ChildTask( int addend_ ) : addend(addend_) {}
- tbb::task* execute() {
- Sum+=addend;
- return NULL;
- }
-};
-
-void TestFormallyNonstaticMethods() {
- // Check signatures
- void (tbb::task::*d)( tbb::task& ) = &tbb::task::destroy;
- void (tbb::task::*s)( tbb::task& ) = &tbb::task::spawn;
- void (tbb::task::*slist)( tbb::task_list& ) = &tbb::task::spawn;
-
- DummyTask& root = *new( tbb::task::allocate_root() ) DummyTask;
-
- for( int use_list=0; use_list<2; ++use_list ) {
- // Note: the cases n=0 is important to check, because spawn(task_list)
- // has different logic for the empty case.
- for( int n=0; n<1000; n=n<5 ? n+1 : n=n+n/5 ) {
- Sum=0;
- root.set_ref_count(n+1);
- if( use_list ) {
- tbb::task_list list;
- for( int i=0; i<n; ++i ) {
- tbb::task& child = *new( root.allocate_child() ) ChildTask(i+1);
- list.push_back(child);
- }
- // Spawn the children
- (root.*slist)(list);
- } else {
- // Do spawning without a list
- for( int i=0; i<n; ++i ) {
- tbb::task& child = *new( root.allocate_child() ) ChildTask(i+1);
- // Spawn one child
- (root.*s)(child);
- }
- }
- root.wait_for_all();
- // Check that children ran.
- ASSERT( Sum==n*(n+1)/2, "child did not run?" );
- }
- }
-
- //! Check method destroy.
- root.set_ref_count(1);
- DummyTask& child = *new( root.allocate_child() ) DummyTask;
- child.can_destroy=true;
- (root.*d)( child );
- ASSERT( root.ref_count()==0, NULL );
- root.can_destroy=true;
- (root.*d)( root );
- ASSERT( !DummyCount, "constructor/destructor mismatch" );
-}
-
-#include "tbb/task_scheduler_init.h"
-#include "../test/harness.h"
-
-int TestMain () {
- for( int p=MinThread; p<=MaxThread; ++p ) {
- tbb::task_scheduler_init init(p);
- TestFormallyNonstaticMethods();
- }
- return Harness::Done;
-}
diff --git a/src/perf/time_hash_map.cpp b/src/perf/time_hash_map.cpp
index 800a803..10205d5 100644
--- a/src/perf/time_hash_map.cpp
+++ b/src/perf/time_hash_map.cpp
@@ -27,19 +27,22 @@
*/
// configuration:
+#define TBB_USE_THREADING_TOOLS 0
//! enable/disable std::map tests
-#define STDTABLE 1
+#define STDTABLE 0
//! enable/disable old implementation tests (correct include file also)
#define OLDTABLE 0
-#define OLDTABLEHEADER "tbb/concurrent_hash_map-4078.h"//-4329
+#define OLDTABLEHEADER "tbb/concurrent_hash_map-5468.h"//-4329
//! enable/disable experimental implementation tests (correct include file also)
-
-#define TESTTABLE 0
+#define TESTTABLE 1
#define TESTTABLEHEADER "tbb/concurrent_unordered_map.h"
+//! avoid erase()
+#define TEST_ERASE 0
+
//////////////////////////////////////////////////////////////////////////////////
#include <cstdlib>
@@ -57,6 +60,7 @@
#include "tbb/spin_rw_mutex.h"
#include "tbb/aligned_space.h"
#include "tbb/atomic.h"
+#include "tbb/_concurrent_unordered_internal.h"
// for test
#include "tbb/spin_mutex.h"
#include "time_framework.h"
@@ -74,43 +78,44 @@ struct IntHashCompare {
namespace version_current {
namespace tbb { using namespace ::tbb; namespace internal { using namespace ::tbb::internal; } }
+ namespace tbb { namespace interface5 { using namespace ::tbb::interface5; namespace internal { using namespace ::tbb::interface5::internal; } } }
#include "tbb/concurrent_hash_map.h"
}
-typedef version_current::tbb::concurrent_hash_map<int,int,IntHashCompare> IntTable;
+typedef version_current::tbb::concurrent_hash_map<int,int> IntTable;
#if OLDTABLE
#undef __TBB_concurrent_hash_map_H
namespace version_base {
namespace tbb { using namespace ::tbb; namespace internal { using namespace ::tbb::internal; } }
+ namespace tbb { namespace interface5 { using namespace ::tbb::interface5; namespace internal { using namespace ::tbb::interface5::internal; } } }
#include OLDTABLEHEADER
}
-typedef version_base::tbb::concurrent_hash_map<int,int,IntHashCompare> OldTable;
+typedef version_base::tbb::concurrent_hash_map<int,int> OldTable;
#endif
#if TESTTABLE
#undef __TBB_concurrent_hash_map_H
namespace version_new {
namespace tbb { using namespace ::tbb; namespace internal { using namespace ::tbb::internal; } }
+ namespace tbb { namespace interface5 { using namespace ::tbb::interface5; namespace internal { using namespace ::tbb::interface5::internal; } } }
#include TESTTABLEHEADER
}
-typedef version_new::tbb::concurrent_unordered_map<int,int,IntHashCompare,IntHashCompare> TestTable;
+typedef version_new::tbb::concurrent_unordered_map<int,int> TestTable;
#define TESTTABLE 1
#endif
///////////////////////////////////////
static const char *map_testnames[] = {
- "1.insert", "2.count(w/rehash)", "3.find/wr", "4.erase"
+ "1.insert", "2.count1st", "3.count2nd", "4.insert existing", "5.erase"
};
template<typename TableType>
struct TestTBBMap : TesterBase {
- typedef typename TableType::accessor accessor;
- typedef typename TableType::const_accessor const_accessor;
TableType Table;
int n_items;
- TestTBBMap() : TesterBase(4) {}
+ TestTBBMap() : TesterBase(4+TEST_ERASE), Table(MaxThread*4) {}
void init() { n_items = value/threads_count; }
std::string get_name(int testn) {
@@ -122,9 +127,7 @@ struct TestTBBMap : TesterBase {
switch(test) {
case 0: // fill
for(int i = t*n_items, e = (t+1)*n_items; i < e; i++) {
- accessor a;
- Table.insert( a, i );
- a->second = 0;
+ Table.insert( std::make_pair(i,i) );
}
break;
case 1: // work1
@@ -135,16 +138,20 @@ struct TestTBBMap : TesterBase {
break;
case 2: // work2
for(int i = t*n_items, e = (t+1)*n_items; i < e; i++) {
- accessor a;
- Table.find( a, i );
- ASSERT( !a->second, "A key should be incremented only once");
- a->second += 1;
+ Table.count( i );
+ }
+ break;
+ case 3: // work3
+ for(int i = t*n_items, e = (t+1)*n_items; i < e; i++) {
+ Table.insert( std::make_pair(i,i) );
}
break;
- case 3: // clean
+#if TEST_ERASE
+ case 4: // clean
for(int i = t*n_items, e = (t+1)*n_items; i < e; i++) {
ASSERT( Table.erase( i ), NULL);
}
+#endif
}
return 0;
}
@@ -156,7 +163,7 @@ struct TestSTLMap : TesterBase {
M mutex;
int n_items;
- TestSTLMap() : TesterBase(4) {}
+ TestSTLMap() : TesterBase(4+TEST_ERASE) {}
void init() { n_items = value/threads_count; }
std::string get_name(int testn) {
@@ -182,10 +189,16 @@ struct TestSTLMap : TesterBase {
case 2: // work2
for(int i = t*n_items, e = (t+1)*n_items; i < e; i++) {
typename M::scoped_lock with(mutex);
- Table[i] += 1;
+ Table.count(i);
}
break;
- case 3: // clean
+ case 3: // work3
+ for(int i = t*n_items, e = (t+1)*n_items; i < e; i++) {
+ typename M::scoped_lock with(mutex);
+ Table.insert(std::make_pair(i,i));
+ }
+ break;
+ case 4: // clean
for(int i = t*n_items, e = (t+1)*n_items; i < e; i++) {
typename M::scoped_lock with(mutex);
Table.erase(i);
@@ -196,7 +209,6 @@ struct TestSTLMap : TesterBase {
};
class fake_mutex {
- int a;
public:
class scoped_lock {
fake_mutex *p;
@@ -204,7 +216,7 @@ public:
public:
scoped_lock() {}
scoped_lock( fake_mutex &m ) { p = &m; }
- ~scoped_lock() { p->a = 0; }
+ ~scoped_lock() { }
void acquire( fake_mutex &m ) { p = &m; }
void release() { }
};
@@ -228,108 +240,7 @@ public:
#endif
end );
//stat->Print(StatisticsCollector::Stdout);
- if(value >= 2097152) stat->Print(StatisticsCollector::HTMLFile);
- }
-};
-
-/////////////////////////////////////////////////////////////////////////////////////////
-template<typename TableType>
-struct TestHashMapFind : TesterBase {
- typedef typename TableType::accessor accessor;
- typedef typename TableType::const_accessor const_accessor;
- TableType Table;
- int n_items;
-
- std::string get_name(int testn) {
- return std::string(!testn?"find":"insert");
- }
-
- TestHashMapFind() : TesterBase(2) {}
- void init() {
- n_items = value/threads_count;
- for(int i = 0; i < value; i++) {
- accessor a; Table.insert( a, i );
- }
- }
-
- double test(int test, int t)
- {
- switch(test) {
- case 0: // find
- for(int i = t*n_items, e = (t+1)*n_items; i < e; i++) {
- accessor a;
- Table.find( a, i );
- a->second = i;
- }
- break;
- case 1: // insert
- for(int i = t*n_items, e = (t+1)*n_items; i < e; i++) {
- accessor a;
- Table.insert( a, i );
- a->second = -i;
- }
- break;
- }
- return 0;
- }
-};
-
-const int test2_size = 65536;
-int Data[test2_size];
-
-template<typename TableType>
-struct TestHashCountStrings : TesterBase {
- typedef typename TableType::accessor accessor;
- typedef typename TableType::const_accessor const_accessor;
- TableType Table;
- int n_items;
-
- std::string get_name(int testn) {
- return !testn?"insert":"find";
- }
-
- TestHashCountStrings() : TesterBase(2) {}
- void init() {
- n_items = value/threads_count;
- }
-
- double test(int testn, int t)
- {
- if(!testn) {
- for(int i = t*n_items, e = (t+1)*n_items; i < e; i++) {
- accessor a; Table.insert( a, Data[i] );
- }
- } else { //
- for(int i = t*n_items, e = (t+1)*n_items; i < e; i++) {
- accessor a; Table.find( a, Data[i] );
- }
- }
- return 0;
- }
-};
-
-class test_hash_map_find : public TestProcessor {
-public:
- test_hash_map_find() : TestProcessor("test_hash_map_find") {}
- void factory(int value, int threads) {
- if(Verbose) printf("Processing with %d threads: %d...\n", threads, value);
- process( value, threads,
-#if OLDTABLE
- run("Filled old::hashmap", new NanosecPerValue<TestHashMapFind<OldTable> >() ),
-#endif
- run("Filled tbb::hashmap", new NanosecPerValue<TestHashMapFind<IntTable> >() ),
-#if TESTTABLE
- run("Filled new::hashmap", new NanosecPerValue<TestHashMapFind<TestTable> >() ),
-#endif
-#if OLDTABLE
- run("CountStr old::hashmap", new TimeTest<TestHashCountStrings<OldTable> >() ),
-#endif
- run("CountStr tbb::hashmap", new TimeTest<TestHashCountStrings<IntTable> >() ),
-#if TESTTABLE
- run("CountStr new::hashmap", new TimeTest<TestHashCountStrings<TestTable> >() ),
-#endif
- end );
- //stat->Print(StatisticsCollector::HTMLFile);
+ //if(value >= 2097152) stat->Print(StatisticsCollector::HTMLFile);
}
};
@@ -344,17 +255,8 @@ int main(int argc, char* argv[]) {
ASSERT(tbb_allocator<int>::allocator_type() == tbb_allocator<int>::scalable, "expecting scalable allocator library to be loaded. Please build it by:\n\t\tmake tbbmalloc");
{
- test_hash_map_find test_find; int o = test2_size;
- for(int i = 0; i < o; i++)
- Data[i] = i%60;
- for( int t=MinThread; t <= MaxThread; t++)
- test_find.factory(o, t);
- test_find.report.SetTitle("Nanoseconds per operation of finding operation (Mode) for %d items", o);
- test_find.report.Print(StatisticsCollector::HTMLFile|StatisticsCollector::ExcelXML);
- }
- {
test_hash_map the_test;
- for( int t=MinThread; t <= MaxThread; t*=2)
+ for( int t=MinThread; t <= MaxThread; t++)
for( int o=/*2048*/(1<<8)*8; o<2200000; o*=2 )
the_test.factory(o, t);
the_test.report.SetTitle("Nanoseconds per operation of (Mode) for N items in container (Name)");
diff --git a/src/perf/time_hash_map_fill.cpp b/src/perf/time_hash_map_fill.cpp
index 53e2115..fff0484 100644
--- a/src/perf/time_hash_map_fill.cpp
+++ b/src/perf/time_hash_map_fill.cpp
@@ -34,14 +34,19 @@ const int INPUT_SIZE = 2000000;
#define SOURCE_ARRAY UNIQUE_PERCENT(5); UNIQUE_PERCENT(10); UNIQUE_PERCENT(20); UNIQUE_PERCENT(40)
// enable/disable tests for:
-#define BOX1 "TBB"
+#define BOX1 "CHMap"
#define BOX1TEST ValuePerSecond<Uniques<tbb::concurrent_hash_map<int,int> >, 1000000/*ns*/>
#define BOX1HEADER "tbb/concurrent_hash_map.h"
// enable/disable tests for:
-#define BOX2 "OLD"
-#define BOX2TEST ValuePerSecond<Uniques<tbb::concurrent_hash_map<int,int> >, 1000000/*ns*/>
-#define BOX2HEADER "tbb/concurrent_hash_map-5468.h"
+#define BOX2 "CUMap"
+#define BOX2TEST ValuePerSecond<Uniques<tbb::concurrent_unordered_map<int,int> >, 1000000/*ns*/>
+#define BOX2HEADER "tbb/concurrent_unordered_map.h"
+
+// enable/disable tests for:
+//#define BOX3 "OLD"
+#define BOX3TEST ValuePerSecond<Uniques<tbb::concurrent_hash_map<int,int> >, 1000000/*ns*/>
+#define BOX3HEADER "tbb/concurrent_hash_map-5468.h"
#define TBB_USE_THREADING_TOOLS 0
//////////////////////////////////////////////////////////////////////////////////
@@ -63,6 +68,7 @@ const int INPUT_SIZE = 2000000;
#include "tbb/spin_rw_mutex.h"
#include "tbb/aligned_space.h"
#include "tbb/atomic.h"
+#include "tbb/_concurrent_unordered_internal.h"
// for test
#include "tbb/spin_mutex.h"
#include "time_framework.h"
@@ -80,20 +86,19 @@ int *Data[10];
// Main test class used to run the timing tests. All overridden methods are called by the framework
template<typename TableType>
struct Uniques : TesterBase {
- typedef typename TableType::accessor accessor;
- typedef typename TableType::const_accessor const_accessor;
TableType *Table;
int n_items;
+ // Initializes base class with number of test modes
+ Uniques() : TesterBase(Mixtures+1), Table(0) {}
+ ~Uniques() { if(Table) delete Table; }
+
// Returns name of test mode specified by number
/*override*/ std::string get_name(int testn) {
+ if(testn == Mixtures) return "find existing";
return Format("%d%% uniques", Percents[testn]);
}
- // Initializes base class with number of test modes
- Uniques() : TesterBase(Mixtures), Table(0) {}
- ~Uniques() { if(Table) delete Table; }
-
// Informs the class that value and threads number become known
/*override*/ void init() {
n_items = value/threads_count;
@@ -102,16 +107,25 @@ struct Uniques : TesterBase {
// Informs the class that the test mode for specified thread is about to start
/*override*/ void test_prefix(int testn, int t) {
barrier->wait();
- if( t ) return;
+ if( t || testn == Mixtures ) return;
if(Table) delete Table;
Table = new TableType(MaxThread*4);
+ //Table->max_load_factor(1); // add stub into hash_map to uncomment it
}
// Executes test mode for a given thread. Return value is ignored when used with timing wrappers.
/*override*/ double test(int testn, int t)
{
- for(int i = t*n_items, e = (t+1)*n_items; i < e; i++) {
- Table->insert( std::make_pair(Data[testn][i],t) );
+ if( testn != Mixtures ) { // do insertions
+ for(int i = t*n_items, e = (t+1)*n_items; i < e; i++) {
+ Table->insert( std::make_pair(Data[testn][i],t) );
+ }
+ } else { // do finds
+ --testn; // on the last dataset
+ for(int i = t*n_items, e = (t+1)*n_items; i < e; i++) {
+ size_t c = Table->count( Data[testn][i] );
+ ASSERT( c == 1, NULL ); // must exist
+ }
}
return 0;
}
@@ -141,6 +155,7 @@ int main(int argc, char* argv[]) {
ASSERT(tbb_allocator<int>::allocator_type() == tbb_allocator<int>::scalable, "expecting scalable allocator library to be loaded. Please build it by:\n\t\tmake tbbmalloc");
SOURCE_ARRAY; // prepare source array
+ ASSERT(Mixtures > 0, NULL);
{
// Declares test processor
diff --git a/src/perf/time_sandbox.h b/src/perf/time_sandbox.h
index da6bcd9..950e674 100644
--- a/src/perf/time_sandbox.h
+++ b/src/perf/time_sandbox.h
@@ -30,9 +30,20 @@
#error time_framework.h must be included
#endif
+#define INJECT_TBB namespace tbb { using namespace ::tbb; namespace internal { using namespace ::tbb::internal; } }
+#define INJECT_TBB5 namespace tbb { namespace interface5 { using namespace ::tbb::interface5; namespace internal { using namespace ::tbb::interface5::internal; } } }
+
+#ifndef INJECT_BOX_NAMES
+#if defined(__TBB_task_H) || defined(__TBB_concurrent_unordered_internal_H) || defined(__TBB_reader_writer_lock_H)
+#define INJECT_BOX_NAMES INJECT_TBB INJECT_TBB5
+#else
+#define INJECT_BOX_NAMES INJECT_TBB
+#endif
+#endif
+
#ifdef BOX1
namespace sandbox1 {
- namespace tbb { using namespace ::tbb; namespace internal { using namespace ::tbb::internal; } }
+ INJECT_BOX_NAMES
# ifdef BOX1HEADER
# include BOX1HEADER
# endif
@@ -41,7 +52,7 @@ namespace sandbox1 {
#endif
#ifdef BOX2
namespace sandbox2 {
- namespace tbb { using namespace ::tbb; namespace internal { using namespace ::tbb::internal; } }
+ INJECT_BOX_NAMES
# ifdef BOX2HEADER
# include BOX2HEADER
# endif
@@ -50,7 +61,7 @@ namespace sandbox2 {
#endif
#ifdef BOX3
namespace sandbox3 {
- namespace tbb { using namespace ::tbb; namespace internal { using namespace ::tbb::internal; } }
+ INJECT_BOX_NAMES
# ifdef BOX3HEADER
# include BOX3HEADER
# endif
@@ -59,7 +70,7 @@ namespace sandbox3 {
#endif
#ifdef BOX4
namespace sandbox4 {
- namespace tbb { using namespace ::tbb; namespace internal { using namespace ::tbb::internal; } }
+ INJECT_BOX_NAMES
# ifdef BOX4HEADER
# include BOX4HEADER
# endif
@@ -68,7 +79,7 @@ namespace sandbox4 {
#endif
#ifdef BOX5
namespace sandbox5 {
- namespace tbb { using namespace ::tbb; namespace internal { using namespace ::tbb::internal; } }
+ INJECT_BOX_NAMES
# ifdef BOX5HEADER
# include BOX5HEADER
# endif
@@ -77,7 +88,7 @@ namespace sandbox5 {
#endif
#ifdef BOX6
namespace sandbox6 {
- namespace tbb { using namespace ::tbb; namespace internal { using namespace ::tbb::internal; } }
+ INJECT_BOX_NAMES
# ifdef BOX6HEADER
# include BOX6HEADER
# endif
@@ -86,7 +97,7 @@ namespace sandbox6 {
#endif
#ifdef BOX7
namespace sandbox7 {
- namespace tbb { using namespace ::tbb; namespace internal { using namespace ::tbb::internal; } }
+ INJECT_BOX_NAMES
# ifdef BOX7HEADER
# include BOX7HEADER
# endif
@@ -95,7 +106,7 @@ namespace sandbox7 {
#endif
#ifdef BOX8
namespace sandbox8 {
- namespace tbb { using namespace ::tbb; namespace internal { using namespace ::tbb::internal; } }
+ INJECT_BOX_NAMES
# ifdef BOX8HEADER
# include BOX8HEADER
# endif
@@ -104,7 +115,7 @@ namespace sandbox8 {
#endif
#ifdef BOX9
namespace sandbox9 {
- namespace tbb { using namespace ::tbb; namespace internal { using namespace ::tbb::internal; } }
+ INJECT_BOX_NAMES
# ifdef BOX9HEADER
# include BOX9HEADER
# endif
diff --git a/src/tbb/arena.h b/src/tbb/arena.h
index 806c192..30c455a 100644
--- a/src/tbb/arena.h
+++ b/src/tbb/arena.h
@@ -404,7 +404,7 @@ template<bool Spawned> void arena::advertise_new_work() {
}
// Local memory fence is required to avoid missed wakeups; see the comment below.
// Starvation resistant tasks require mandatory concurrency, so missed wakeups are unacceptable.
- __TBB_rel_acq_fence();
+ __TBB_full_memory_fence();
}
// Double-check idiom that, in case of spawning, is deliberately sloppy about memory fences.
// Technically, to avoid missed wakeups, there should be a full memory fence between the point we
diff --git a/src/tbb/concurrent_monitor.cpp b/src/tbb/concurrent_monitor.cpp
index c53ef96..3cd5054 100644
--- a/src/tbb/concurrent_monitor.cpp
+++ b/src/tbb/concurrent_monitor.cpp
@@ -44,7 +44,7 @@ void concurrent_monitor::prepare_wait( thread_context& thr, void* ctx ) {
thr.epoch = epoch;
waitset_ec.add( (waitset_t::node_t*)&thr );
}
- __TBB_rel_acq_fence();
+ __TBB_full_memory_fence();
}
void concurrent_monitor::cancel_wait( thread_context& thr ) {
diff --git a/src/tbb/concurrent_monitor.h b/src/tbb/concurrent_monitor.h
index 379cbeb..8a626a0 100644
--- a/src/tbb/concurrent_monitor.h
+++ b/src/tbb/concurrent_monitor.h
@@ -234,19 +234,19 @@ public:
void cancel_wait( thread_context& thr );
//! Notify one thread about the event
- void notify_one() {__TBB_rel_acq_fence(); notify_one_relaxed();}
+ void notify_one() {__TBB_full_memory_fence(); notify_one_relaxed();}
//! Notify one thread about the event. Relaxed version.
void notify_one_relaxed();
//! Notify all waiting threads of the event
- void notify_all() {__TBB_rel_acq_fence(); notify_all_relaxed();}
+ void notify_all() {__TBB_full_memory_fence(); notify_all_relaxed();}
//! Notify all waiting threads of the event; Relaxed version
void notify_all_relaxed();
//! Notify waiting threads of the event that satisfies the given predicate
- template<typename P> void notify( const P& predicate ) {__TBB_rel_acq_fence();notify_relaxed( predicate );}
+ template<typename P> void notify( const P& predicate ) {__TBB_full_memory_fence(); notify_relaxed( predicate );}
//! Notify waiting threads of the event that satisfies the given predicate; Relaxed version
template<typename P> void notify_relaxed( const P& predicate );
diff --git a/src/tbb/custom_scheduler.h b/src/tbb/custom_scheduler.h
index 3674096..c56bf54 100644
--- a/src/tbb/custom_scheduler.h
+++ b/src/tbb/custom_scheduler.h
@@ -175,8 +175,13 @@ task* custom_scheduler<SchedulerTraits>::receive_or_steal_task( reference_count&
// just proceed with the obtained task
}
// Check if the resource manager requires our arena to relinquish some threads
- else if ( return_if_no_work && (my_arena->my_num_workers_allotted < my_arena->num_workers_active()) )
+ else if ( return_if_no_work && (my_arena->my_num_workers_allotted < my_arena->num_workers_active()) ) {
+ if( SchedulerTraits::itt_possible ) {
+ if( failure_count!=-1 )
+ ITT_NOTIFY(sync_cancel, this);
+ }
return NULL;
+ }
#endif /* __TBB_ARENA_PER_MASTER */
else {
// Try to steal a task from a random victim.
@@ -239,8 +244,13 @@ fail:
if( failure_count>=yield_threshold+100 ) {
// When a worker thread has nothing to do, return it to RML.
// For purposes of affinity support, the thread is considered idle while in RML.
- if( return_if_no_work && my_arena->is_out_of_work() )
+ if( return_if_no_work && my_arena->is_out_of_work() ) {
+ if( SchedulerTraits::itt_possible ) {
+ if( failure_count!=-1 )
+ ITT_NOTIFY(sync_cancel, this);
+ }
return NULL;
+ }
failure_count = yield_threshold;
}
}
diff --git a/src/tbb/market.cpp b/src/tbb/market.cpp
index 4a24a8c..f4b033e 100644
--- a/src/tbb/market.cpp
+++ b/src/tbb/market.cpp
@@ -34,6 +34,7 @@
#include "tbb_main.h"
#include "governor.h"
#include "scheduler.h"
+#include "itt_notify.h"
namespace tbb {
namespace internal {
@@ -210,6 +211,7 @@ void market::acknowledge_close_connection() {
::rml::job* market::create_one_job() {
unsigned index = ++my_num_workers;
__TBB_ASSERT( index > 0, NULL );
+ ITT_THREAD_SET_NAME(_T("TBB Worker Thread"));
// index serves as a hint decreasing conflicts between workers when they migrate between arenas
generic_scheduler* s = generic_scheduler::create_worker( *this, index );
#if __TBB_TASK_GROUP_CONTEXT
@@ -230,25 +232,21 @@ void market::propagate_cancellation ( task_group_context& ctx ) {
// See the note 1 at the bottom of this file.
global_market_mutex_type::scoped_lock lock(theMarketMutex);
// Advance global cancellation epoch
- uintptr_t global_epoch = __TBB_FetchAndAddWrelease(&global_cancel_count, 1);
+ __TBB_FetchAndAddWrelease(&global_cancel_count, 1);
// Propagate to all workers and masters and sync up their local epochs with the global one
unsigned num_workers = my_num_workers;
for ( unsigned i = 0; i < num_workers; ++i ) {
generic_scheduler *s = my_workers[i];
// If the worker is only about to be registered, skip it.
- if ( s ) {
+ if ( s )
s->propagate_cancellation();
- s->local_cancel_count = global_epoch;
- }
}
arena_list_type::iterator it = my_arenas.begin();
for ( ; it != my_arenas.end(); ++it ) {
generic_scheduler *s = it->slot[0].my_scheduler;
// If the master is under construction, skip it.
- if ( s ) {
+ if ( s )
s->propagate_cancellation();
- s->local_cancel_count = global_epoch;
- }
}
}
#endif /* __TBB_TASK_GROUP_CONTEXT */
diff --git a/src/tbb/private_server.cpp b/src/tbb/private_server.cpp
index 61bd127..f6fda67 100644
--- a/src/tbb/private_server.cpp
+++ b/src/tbb/private_server.cpp
@@ -51,7 +51,10 @@ class private_server;
class private_worker: no_copy {
//! State in finite-state machine that controls the worker.
/** State diagram:
- open --> normal --> quit
+ init --------------------\
+ | |
+ V V
+ starting --> normal --> quit
|
V
plugged
@@ -59,9 +62,11 @@ class private_worker: no_copy {
enum state_t {
//! *this is initialized
st_init,
+ //! *this has associated thread that is starting up.
+ st_starting,
//! Associated thread is doing normal life sequence.
st_normal,
- //! Associated thread is end normal life sequence.
+ //! Associated thread has ended normal life sequence and promises to never touch *this again.
st_quit,
//! Associated thread should skip normal life sequence, because private_server is shutting down.
st_plugged
@@ -82,7 +87,7 @@ class private_worker: no_copy {
"my_slack<=0 && my_state==st_normal && I am on server's list of asleep threads" */
thread_monitor my_thread_monitor;
- //! Link for list of sleeping workers
+ //! Link for list of workers that are sleeping or have no associated thread.
private_worker* my_next;
friend class private_server;
@@ -90,6 +95,9 @@ class private_worker: no_copy {
//! Actions executed by the associated thread
void run();
+ //! Wake up associated thread (or launch a thread if there is none)
+ void wake_or_launch();
+
//! Called by a thread (usually not the associated thread) to commence termination.
void start_shutdown();
@@ -125,8 +133,13 @@ public:
class private_server: public tbb_server, no_copy {
tbb_client& my_client;
+ //! Maximum number of threads to be creatd.
+ /** Threads are created lazily, so maximum might not actually be reached. */
const tbb_client::size_type my_n_thread;
+ //! Stack size for each thread. */
+ const size_t my_stack_size;
+
//! Number of jobs that could use their associated thread minus number of active threads.
/** If negative, indicates oversubscription.
If positive, indicates that more threads should run.
@@ -149,9 +162,13 @@ class private_server: public tbb_server, no_copy {
atomic<int> my_net_slack_requests;
#endif /* TBB_USE_ASSERT */
- //! Used for double-check idiom
- bool has_sleepers() const {
- return my_asleep_list_root!=NULL;
+ //! Wake up to two sleeping workers, if there are any sleeping.
+ /** The call is used to propagate a chain reaction where each thread wakes up two threads,
+ which in turn each wake up two threads, etc. */
+ void propagate_chain_reaction() {
+ // First test of a double-check idiom. Second test is inside wake_some(0).
+ if( my_asleep_list_root )
+ wake_some(0);
}
//! Try to add t to list of sleeping workers
@@ -206,6 +223,10 @@ public:
#pragma warning(push)
#pragma warning(disable:4189)
#endif
+#if __MINGW32__ && __GNUC__==4 &&__GNUC_MINOR__>=2
+// ensure that stack is properly aligned for TBB threads
+__attribute__((force_align_arg_pointer))
+#endif
__RML_DECL_THREAD_ROUTINE private_worker::thread_routine( void* arg ) {
private_worker* self = static_cast<private_worker*>(arg);
AVOID_64K_ALIASING( self->my_index );
@@ -222,23 +243,27 @@ __RML_DECL_THREAD_ROUTINE private_worker::thread_routine( void* arg ) {
void private_worker::start_shutdown() {
state_t s;
- // Transition from st_init or st_normal to st_plugged or st_quit
+ // Transition from st_starting or st_normal to st_plugged or st_quit
do {
s = my_state;
- __TBB_ASSERT( s==st_init||s==st_normal, NULL );
- } while( my_state.compare_and_swap( s==st_init? st_plugged : st_quit, s )!=s );
+ __TBB_ASSERT( s==st_init||s==st_starting||s==st_normal, NULL );
+ } while( my_state.compare_and_swap( s==st_starting? st_plugged : st_quit, s )!=s );
if( s==st_normal ) {
// May have invalidated invariant for sleeping, so wake up the thread.
// Note that the notify() here occurs without maintaining invariants for my_slack.
// It does not matter, because my_state==st_quit overrides checking of my_slack.
my_thread_monitor.notify();
- }
+ } else if( s==st_init ) {
+ // Perform action that otherwise would be performed by associated thread when it quits.
+ my_server.remove_server_ref();
+ }
}
void private_worker::run() {
- if( my_state.compare_and_swap( st_normal, st_init )==st_init ) {
+ my_server.propagate_chain_reaction();
+ state_t s = my_state.compare_and_swap( st_normal, st_starting );
+ if( s==st_starting ) {
::rml::job& j = *my_client.create_one_job();
- --my_server.my_slack;
while( my_state==st_normal ) {
if( my_server.my_slack>=0 ) {
my_client.process(j);
@@ -249,9 +274,7 @@ void private_worker::run() {
// Check/set the invariant for sleeping
if( my_state==st_normal && my_server.try_insert_in_asleep_list(*this) ) {
my_thread_monitor.commit_wait(c);
- // Propagate chain reaction
- if( my_server.has_sleepers() )
- my_server.wake_some(0);
+ my_server.propagate_chain_reaction();
} else {
// Invariant broken
my_thread_monitor.cancel_wait();
@@ -259,17 +282,28 @@ void private_worker::run() {
}
}
my_client.cleanup(j);
- ++my_server.my_slack;
+ } else {
+ // Server is already shutting down.
+ __TBB_ASSERT( s==st_plugged, NULL );
}
+ ++my_server.my_slack;
my_server.remove_server_ref();
}
+inline void private_worker::wake_or_launch() {
+ if( my_state==st_init && my_state.compare_and_swap( st_starting, st_init )==st_init )
+ thread_monitor::launch( thread_routine, this, my_server.my_stack_size );
+ else
+ my_thread_monitor.notify();
+}
+
//------------------------------------------------------------------------
// Methods of private_server
//------------------------------------------------------------------------
private_server::private_server( tbb_client& client ) :
my_client(client),
my_n_thread(client.max_job_count()),
+ my_stack_size(client.min_stack_size()),
my_thread_array(NULL)
{
my_ref_count = my_n_thread+1;
@@ -278,13 +312,12 @@ private_server::private_server( tbb_client& client ) :
my_net_slack_requests = 0;
#endif /* TBB_USE_ASSERT */
my_asleep_list_root = NULL;
- size_t stack_size = client.min_stack_size();
my_thread_array = tbb::cache_aligned_allocator<padded_private_worker>().allocate( my_n_thread );
memset( my_thread_array, 0, sizeof(private_worker)*my_n_thread );
- // FIXME - use recursive chain reaction to launch the threads.
for( size_t i=0; i<my_n_thread; ++i ) {
private_worker* t = new( &my_thread_array[i] ) padded_private_worker( *this, client, i );
- thread_monitor::launch( private_worker::thread_routine, t, stack_size );
+ t->my_next = my_asleep_list_root;
+ my_asleep_list_root = t;
}
}
@@ -338,7 +371,7 @@ void private_server::wake_some( int additional_slack ) {
}
done:
while( w>wakee )
- (*--w)->my_thread_monitor.notify();
+ (*--w)->wake_or_launch();
}
void private_server::adjust_job_count_estimate( int delta ) {
diff --git a/src/tbb/scheduler.cpp b/src/tbb/scheduler.cpp
index c57c4b6..d57bcc7 100644
--- a/src/tbb/scheduler.cpp
+++ b/src/tbb/scheduler.cpp
@@ -200,6 +200,9 @@ void generic_scheduler::propagate_cancellation () {
node = node->my_next;
__TBB_ASSERT( ctx.is_alive(), "Walked into a destroyed context while propagating cancellation" );
}
+ // Sync up local cancelation epoch with the global one. Release fence prevents
+ // reordering of possible store to my_cancellation_requested after the sync point.
+ __TBB_store_with_release(local_cancel_count, global_cancel_count);
}
#if !__TBB_ARENA_PER_MASTER
@@ -230,18 +233,6 @@ void generic_scheduler::propagate_cancellation ( task_group_context& ctx ) {
__TBB_get_object_ref(generic_scheduler, my_node, node).propagate_cancellation();
node = node->my_next;
}
- // Now sync up the local counters
- for ( size_t i = 0; i < num_workers; ++i ) {
- generic_scheduler *s = my_arena->prefix().worker_list[i].scheduler;
- // If the worker is in the middle of its startup sequence, skip it.
- if ( s )
- s->local_cancel_count = global_cancel_count;
- }
- node = the_scheduler_list_head.my_next;
- while ( node != &the_scheduler_list_head ) {
- __TBB_get_object_ref(generic_scheduler, my_node, node).local_cancel_count = global_cancel_count;
- node = node->my_next;
- }
}
#endif /* !__TBB_ARENA_PER_MASTER */
#endif /* __TBB_TASK_GROUP_CONTEXT */
@@ -333,11 +324,16 @@ void generic_scheduler::cleanup_local_context_list () {
uintptr_t local_count_snapshot = local_cancel_count;
local_ctx_list_update = 1;
{
- spin_mutex::scoped_lock lock; // The lock is necessary in acse of a conflict only
- __TBB_rel_acq_fence();
+ // This is just a definition. Actual lock is acquired only in case of conflict.
+ spin_mutex::scoped_lock lock;
+ // Full fence prevents reordering of store to local_ctx_list_update with
+ // load from nonlocal_ctx_list_update.
+ __TBB_full_memory_fence();
// Check for the conflict with concurrent destroyer or cancelation propagator
if ( nonlocal_ctx_list_update || local_count_snapshot != global_cancel_count )
lock.acquire(context_list_mutex);
+ // No acquire fence is necessary for loading context_list_head.my_next,
+ // as the list can be updated by this thread only.
context_list_node_t *node = context_list_head.my_next;
while ( node != &context_list_head ) {
task_group_context &ctx = __TBB_get_object_ref(task_group_context, my_node, node);
@@ -828,7 +824,7 @@ inline task* generic_scheduler::get_task() {
task* result = NULL;
retry:
--my_arena_slot->tail;
- __TBB_rel_acq_fence();
+ __TBB_full_memory_fence();
if ( (intptr_t)my_arena_slot->head > (intptr_t)my_arena_slot->tail ) {
acquire_task_pool();
if ( (intptr_t)my_arena_slot->head <= (intptr_t)my_arena_slot->tail ) {
@@ -879,7 +875,7 @@ task* generic_scheduler::steal_task( arena_slot& victim_slot ) {
task* result = NULL;
retry:
++victim_slot.head;
- __TBB_rel_acq_fence();
+ __TBB_full_memory_fence();
if ( (intptr_t)victim_slot.head > (intptr_t)victim_slot.tail ) {
--victim_slot.head;
}
diff --git a/src/tbb/task.cpp b/src/tbb/task.cpp
index e10401a..f70d44f 100644
--- a/src/tbb/task.cpp
+++ b/src/tbb/task.cpp
@@ -76,35 +76,37 @@ task& allocate_root_with_context_proxy::allocate( size_t size ) const {
__TBB_ASSERT( v, "thread did not activate a task_scheduler_init object?" );
task_prefix& p = v->innermost_running_task->prefix();
task& t = v->allocate_task( size, __TBB_CONTEXT_ARG(NULL, &my_context) );
- // The supported usage model prohibits concurrent initial binding. Thus we
- // do not need interlocked operations or fences here.
+ // Supported usage model prohibits concurrent initial binding. Thus we do not
+ // need interlocked operations or fences to manipulate with my_context.my_kind
if ( my_context.my_kind == task_group_context::binding_required ) {
__TBB_ASSERT ( my_context.my_owner, "Context without owner" );
__TBB_ASSERT ( !my_context.my_parent, "Parent context set before initial binding" );
// If we are in the outermost task dispatch loop of a master thread, then
// there is nothing to bind this context to, and we skip the binding part.
if ( v->innermost_running_task != v->dummy_task ) {
- // By not using the fence here we get faster code in case of normal execution
- // flow in exchange of a bit higher probability that in cases when cancellation
- // is in flight we will take deeper traversal branch. Normally cache coherency
- // mechanisms are efficient enough to deliver updated value most of the time.
- uintptr_t local_count_snapshot = ((generic_scheduler*)my_context.my_owner)->local_cancel_count;
- __TBB_store_with_release(my_context.my_parent, p.context);
- uintptr_t global_count_snapshot = __TBB_load_with_acquire(global_cancel_count);
- if ( !my_context.my_cancellation_requested ) {
- if ( local_count_snapshot == global_count_snapshot ) {
- // It is possible that there is active cancellation request in our
- // parents chain. Fortunately the equality of the local and global
- // counters means that if this is the case it's already been propagated
- // to our parent.
- my_context.my_cancellation_requested = p.context->my_cancellation_requested;
- } else {
- // Another thread was propagating cancellation request at the moment
- // when we set our parent, but since we do not use locks we could've
- // been skipped. So we have to make sure that we get the cancellation
- // request if one of our ancestors has been canceled.
- my_context.propagate_cancellation_from_ancestors();
- }
+ // Though the following assignment makes my_context accessible for
+ // cancelation propagation, we cannot rely on the cancellation being
+ // propagated into it without taking a global lock. Instead we always
+ // check the state of my_context's ancestors, and use cancelation
+ // epoch counters to minimize the depth of inspection.
+ my_context.my_parent = p.context;
+ uintptr_t local_count_snapshot = v->local_cancel_count;
+ // Prevent load of global_cancel_count from being hoisted above store
+ // to my_context.my_parent and load of local_cancel_count.
+ __TBB_full_memory_fence();
+ // The full fence guarantees that if no cancelation propagation was
+ // detected by the following condition, either my_context's parent
+ // has correct cancelation state or my_context will receive cancelation
+ // signal if new cancelation starts after
+ if ( local_count_snapshot != global_cancel_count ) {
+ // Another thread is propagating cancellation right now. Make sure
+ // that my_context's parent gets the cancellation request (if one
+ // of its ancestors is canceled) before we read it later on.
+ p.context->propagate_cancellation_from_ancestors();
+ }
+ if ( p.context->my_cancellation_requested ) {
+ // Propagate cancellation state from the parent context
+ my_context.my_cancellation_requested = 1;
}
}
my_context.my_kind = task_group_context::binding_completed;
diff --git a/src/tbb/task_group_context.cpp b/src/tbb/task_group_context.cpp
index 3e03187..6a971e9 100644
--- a/src/tbb/task_group_context.cpp
+++ b/src/tbb/task_group_context.cpp
@@ -155,7 +155,7 @@ task_group_context::~task_group_context () {
// Local update of the context list
uintptr_t local_count_snapshot = s->local_cancel_count;
s->local_ctx_list_update = 1;
- __TBB_rel_acq_fence();
+ __TBB_full_memory_fence();
if ( s->nonlocal_ctx_list_update ) {
spin_mutex::scoped_lock lock(s->context_list_mutex);
my_node.my_prev->my_next = my_node.my_next;
@@ -168,7 +168,7 @@ task_group_context::~task_group_context () {
__TBB_store_with_release( s->local_ctx_list_update, 0 );
if ( local_count_snapshot != global_cancel_count ) {
// Another thread was propagating cancellation request when we removed
- // ourselves from the list. We must ensure that it does not access us
+ // ourselves from the list. We must ensure that it is not accessing us
// when this destructor finishes. We'll be able to acquire the lock
// below only after the other thread finishes with us.
spin_mutex::scoped_lock lock(s->context_list_mutex);
@@ -216,12 +216,10 @@ void task_group_context::init () {
// Backward links are used by this thread only, thus no fences are necessary
my_node.my_prev = &s->context_list_head;
s->context_list_head.my_next->my_prev = &my_node;
- // The only operation on the thread local list of contexts that may be performed
- // concurrently is its traversal by another thread while propagating cancellation
- // request. Therefore the release fence below is necessary to ensure that the new
- // value of my_node.my_next is visible to the traversing thread
- // after it reads new value of v->context_list_head.my_next.
my_node.my_next = s->context_list_head.my_next;
+ // Thread local list of contexts allows concurrent traversal by another
+ // thread while propagating cancellation request. Release fence ensures
+ // visibility of my_node's members in the traversing thread.
__TBB_store_with_release(s->context_list_head.my_next, &my_node);
}
}
@@ -257,16 +255,16 @@ void task_group_context::reset () {
}
void task_group_context::propagate_cancellation_from_ancestors () {
- task_group_context *parent = my_parent;
- while ( parent && !parent->my_cancellation_requested )
- parent = parent->my_parent;
- if ( parent ) {
- // One of our ancestor groups was canceled. Cancel all its descendants.
+ task_group_context *ancestor = my_parent;
+ while ( ancestor && !ancestor->my_cancellation_requested )
+ ancestor = ancestor->my_parent;
+ if ( ancestor ) {
+ // One of my ancestor groups was canceled. Cancel all its descendants in my heritage line.
task_group_context *ctx = this;
do {
- __TBB_store_with_release(ctx->my_cancellation_requested, 1);
+ ctx->my_cancellation_requested = 1;
ctx = ctx->my_parent;
- } while ( ctx != parent );
+ } while ( ctx != ancestor );
}
}
diff --git a/src/tbb/tbb_misc.cpp b/src/tbb/tbb_misc.cpp
index ae16421..12c7bc0 100644
--- a/src/tbb/tbb_misc.cpp
+++ b/src/tbb/tbb_misc.cpp
@@ -128,7 +128,7 @@ void throw_exception_v4 ( exception_id eid ) {
case eid_operation_not_permitted: DO_THROW( runtime_error, ("Operation not permitted") );
case eid_condvar_wait_failed: DO_THROW( runtime_error, ("Wait on condition variable failed") );
case eid_invalid_load_factor: DO_THROW( out_of_range, ("Invalid hash load factor") );
- case eid_invalid_buckets_number: DO_THROW( out_of_range, ("Invalid number of buckets") );
+ case eid_reserved: DO_THROW( out_of_range, ("[backward compatibility] Invalid number of buckets") );
case eid_invalid_swap: DO_THROW( invalid_argument, ("swap() is invalid on non-equal allocators") );
case eid_reservation_length_error: DO_THROW( length_error, ("reservation size exceeds permitted max size") );
case eid_invalid_key: DO_THROW( out_of_range, ("invalid key") );
diff --git a/src/tbbmalloc/Customize.h b/src/tbbmalloc/Customize.h
index 900fbbe..2ad17a9 100644
--- a/src/tbbmalloc/Customize.h
+++ b/src/tbbmalloc/Customize.h
@@ -98,6 +98,14 @@ inline intptr_t AtomicCompareExchange( volatile intptr_t& location, intptr_t new
return __TBB_CompareAndSwapW( &location, new_value, comparand );
}
+inline intptr_t FencedLoad( const volatile intptr_t &location ) {
+ return __TBB_load_with_acquire(location);
+}
+
+inline void FencedStore( volatile intptr_t &location, intptr_t value ) {
+ __TBB_store_with_release(location, value);
+}
+
#define USE_DEFAULT_MEMORY_MAPPING 1
// To support malloc replacement with LD_PRELOAD
diff --git a/src/tbbmalloc/MemoryAllocator.cpp b/src/tbbmalloc/MemoryAllocator.cpp
index e11620d..482caa3 100644
--- a/src/tbbmalloc/MemoryAllocator.cpp
+++ b/src/tbbmalloc/MemoryAllocator.cpp
@@ -112,11 +112,41 @@ namespace rml {
namespace internal {
+struct Block;
+struct Bin;
+
+#if MALLOC_DEBUG
+#define NOINLINE(decl) decl
+#define ALWAYSINLINE(decl) decl
+
+#elif __INTEL_COMPILER || _MSC_VER
+#define NOINLINE(decl) __declspec(noinline) decl
+#define ALWAYSINLINE(decl) __forceinline decl
+
+#elif __GNUC__
+#define NOINLINE(decl) decl __attribute__ ((noinline))
+#define ALWAYSINLINE(decl) decl __attribute__ ((always_inline))
+
+#else
+#define NOINLINE(decl) decl
+#define ALWAYSINLINE(decl) decl
+
+#endif
+
+static NOINLINE( Block* getPublicFreeListBlock(Bin* bin) );
+static NOINLINE( void moveBlockToBinFront(Block *block) );
+static NOINLINE( void processLessUsedBlock(Block *block) );
+static NOINLINE( void doInitialization() );
+
+ALWAYSINLINE( Bin* getAllocationBin(size_t size) );
+ALWAYSINLINE( bool isMallocInitialized() );
+
+#undef ALWAYSINLINE
+#undef NOINLINE
+
/******* A helper class to support overriding malloc with scalable_malloc *******/
#if MALLOC_CHECK_RECURSION
-inline bool isMallocInitialized();
-
class RecursiveMallocCallProtector {
// pointer to an automatic data of holding thread
static void *autoObjPtr;
@@ -126,7 +156,7 @@ class RecursiveMallocCallProtector {
leads to pthread initialization, that causes malloc calls. As 1st usage of
RecursiveMallocCallProtector can be before pthread initialized, pthread calls
can't be used in 1st instance of RecursiveMallocCallProtector.
- RecursiveMallocCallProtector is used 1st time in checkInitialization(),
+ RecursiveMallocCallProtector is used 1st time in doInitialization(),
so there is a guarantee that on 2nd usage pthread is initialized.
No such situation observed with other supported OSes.
*/
@@ -135,10 +165,6 @@ class RecursiveMallocCallProtector {
#else
static const bool canUsePthread = true;
#endif
-/*
- The variable modified in checkInitialization,
- so can be read without memory barriers.
- */
static bool mallocRecursionDetected;
MallocMutex::scoped_lock* lock_acquired;
@@ -180,7 +206,9 @@ public:
}
static bool noRecursion() {
MALLOC_ASSERT(isMallocInitialized(),
- "Recursion status can be checked only when initialization was done.");
+ "Recursion status can be checked only after initialization.");
+ /* mallocRecursionDetected is only modified in doInitialization,
+ so can be read without memory barriers */
return !mallocRecursionDetected;
}
/* The function is called on 1st scalable_malloc call to check if malloc calls
@@ -232,20 +260,22 @@ const uint32_t numLargeBlockBins = 1024; // for 1024 max cached size is near 8MB
/********* The data structures and global objects **************/
-union BackRefIdx { // composite index to backreference array
- uint32_t t;
- struct {
- uint16_t master; // index in BackRefMaster
- uint16_t offset; // offset from beginning of BackRefBlock
- } s;
+class BackRefIdx { // composite index to backreference array
+private:
+ uint16_t master; // index in BackRefMaster
+ uint16_t largeObj:1; // is this object "large"?
+ uint16_t offset :15; // offset from beginning of BackRefBlock
+public:
+ BackRefIdx() : master((uint16_t)-1) {}
+ bool isInvalid() const { return master == (uint16_t)-1; }
+ bool isLargeObject() const { return largeObj; }
+ uint16_t getMaster() const { return master; }
+ uint16_t getOffset() const { return offset; }
+
+ // only newBackRef can modify BackRefIdx
+ static BackRefIdx newBackRef(bool largeObj);
};
-const BackRefIdx invalidIdx = {(uint32_t)-1};
-
-inline bool operator== (const BackRefIdx &idx1, const BackRefIdx &idx2) {
- return idx1.t == idx2.t;
-}
-
struct FreeObject {
FreeObject *next;
};
@@ -258,8 +288,6 @@ struct FreeObject {
const int blockHeaderAlignment = 64; // a common size of a cache line
-struct Block;
-
/* The 'next' field in the block header has to maintain some invariants:
* it needs to be on a 16K boundary and the first field in the block.
* Any value stored there needs to have the lower 14 bits set to 0
@@ -469,31 +497,12 @@ const unsigned cacheCleanupFreq = 256;
*/
static size_t mmapRequestSize = 0x0100000;
-/********** End of numeric parameters controlling allocations *********/
-
-#if !MALLOC_DEBUG
-#if __INTEL_COMPILER || _MSC_VER
-#define NOINLINE(decl) __declspec(noinline) decl
-#define ALWAYSINLINE(decl) __forceinline decl
-#elif __GNUC__
-#define NOINLINE(decl) decl __attribute__ ((noinline))
-#define ALWAYSINLINE(decl) decl __attribute__ ((always_inline))
-#else
-#define NOINLINE(decl) decl
-#define ALWAYSINLINE(decl) decl
-#endif
-
-static NOINLINE( Block* getPublicFreeListBlock(Bin* bin) );
-static NOINLINE( void moveBlockToBinFront(Block *block) );
-static NOINLINE( void processLessUsedBlock(Block *block) );
-
-static ALWAYSINLINE( Bin* getAllocationBin(size_t size) );
-static ALWAYSINLINE( void checkInitialization() );
-
-#undef ALWAYSINLINE
-#undef NOINLINE
-#endif /* !MALLOC_DEBUG */
+/*
+ * Alignment of large (>= minLargeObjectSize) objects.
+ */
+static int largeObjectAlignment = 64; // 64 is common cache line size
+/********** End of numeric parameters controlling allocations *********/
/*********** Code to provide thread ID and a thread-local void pointer **********/
@@ -810,7 +819,6 @@ static int mallocBigBlock()
* Forward Refs
*/
static Block *getEmptyBlock(size_t size);
-static BackRefIdx newBackRef();
static void setBackRef(BackRefIdx backRefIdx, void *newPtr);
static void removeBackRef(BackRefIdx backRefIdx);
@@ -971,7 +979,7 @@ static void outofTLSBin (Bin* bin, Block* block)
/*
* Return the bin for the given size. If the TLS bin structure is absent, create it.
*/
-static Bin* getAllocationBin(size_t size)
+inline Bin* getAllocationBin(size_t size)
{
TLSData* tls = getThreadMallocTLS();
if( !tls ) {
@@ -1368,8 +1376,8 @@ static Block *getEmptyBlock(size_t size)
if (tls)
result = tls->pool.getBlock();
if (!result) {
- BackRefIdx backRefIdx = newBackRef();
- if (backRefIdx == invalidIdx || !(result = getRawBlock(/*startup=*/false)))
+ BackRefIdx backRefIdx = BackRefIdx::newBackRef(/*largeObj=*/false);
+ if (backRefIdx.isInvalid() || !(result = getRawBlock(/*startup=*/false)))
return NULL;
setBackRef(backRefIdx, result);
result->backRefIdx = backRefIdx;
@@ -1459,8 +1467,8 @@ static StartupBlock *firstStartupBlock;
static StartupBlock *getNewStartupBlock()
{
- BackRefIdx backRefIdx = newBackRef();
- if (backRefIdx == invalidIdx) return NULL;
+ BackRefIdx backRefIdx = BackRefIdx::newBackRef(/*largeObj=*/false);
+ if (backRefIdx.isInvalid()) return NULL;
StartupBlock *block = (StartupBlock *)getRawBlock(/*startup=*/true);
if (!block) return NULL;
@@ -1655,22 +1663,22 @@ BackRefBlock *BackRefMaster::findFreeBlock()
static inline void *getBackRef(BackRefIdx backRefIdx)
{
// !backRefMaster means no initialization done, so it can't be valid memory
- if (!backRefMaster || backRefIdx.s.master > backRefMaster->lastUsed
- || backRefIdx.s.offset >= BR_MAX_CNT)
+ if (!backRefMaster || backRefIdx.getMaster() > backRefMaster->lastUsed
+ || backRefIdx.getOffset() >= BR_MAX_CNT)
return NULL;
- return *(void**)((uintptr_t)backRefMaster->backRefBl[backRefIdx.s.master]
- + sizeof(BackRefBlock)+backRefIdx.s.offset*sizeof(void*));
+ return *(void**)((uintptr_t)backRefMaster->backRefBl[backRefIdx.getMaster()]
+ + sizeof(BackRefBlock)+backRefIdx.getOffset()*sizeof(void*));
}
static void setBackRef(BackRefIdx backRefIdx, void *newPtr)
{
- MALLOC_ASSERT(backRefIdx.s.master<=backRefMaster->lastUsed && backRefIdx.s.offset<BR_MAX_CNT,
+ MALLOC_ASSERT(backRefIdx.getMaster()<=backRefMaster->lastUsed && backRefIdx.getOffset()<BR_MAX_CNT,
ASSERT_TEXT);
- *(void**)((uintptr_t)backRefMaster->backRefBl[backRefIdx.s.master]
- + sizeof(BackRefBlock) + backRefIdx.s.offset*sizeof(void*)) = newPtr;
+ *(void**)((uintptr_t)backRefMaster->backRefBl[backRefIdx.getMaster()]
+ + sizeof(BackRefBlock) + backRefIdx.getOffset()*sizeof(void*)) = newPtr;
}
-static BackRefIdx newBackRef()
+BackRefIdx BackRefIdx::newBackRef(bool largeObj)
{
BackRefBlock *blockToUse;
void **toUse;
@@ -1682,7 +1690,7 @@ static BackRefIdx newBackRef()
MALLOC_ASSERT(backRefMaster, ASSERT_TEXT);
if (! (blockToUse = backRefMaster->findFreeBlock()))
- return invalidIdx;
+ return BackRefIdx();
}
toUse = NULL;
{ // the block is locked to find a reference
@@ -1706,19 +1714,24 @@ static BackRefIdx newBackRef()
blockToUse->allocatedCount++;
} // end of lock scope
} while (!toUse);
- res.s.master = blockToUse->myNum;
- res.s.offset =
+ res.master = blockToUse->myNum;
+ uintptr_t offset =
((uintptr_t)toUse - ((uintptr_t)blockToUse + sizeof(BackRefBlock)))/sizeof(void*);
+ // Is offset too big?
+ MALLOC_ASSERT(!(offset >> 15), ASSERT_TEXT);
+ res.offset = offset;
+ if (largeObj) res.largeObj = largeObj;
+
return res;
}
static void removeBackRef(BackRefIdx backRefIdx)
{
- MALLOC_ASSERT(backRefIdx.s.master<=backRefMaster->lastUsed
- && backRefIdx.s.offset<BR_MAX_CNT, ASSERT_TEXT);
- BackRefBlock *currBlock = backRefMaster->backRefBl[backRefIdx.s.master];
+ MALLOC_ASSERT(backRefIdx.getMaster()<=backRefMaster->lastUsed
+ && backRefIdx.getOffset()<BR_MAX_CNT, ASSERT_TEXT);
+ BackRefBlock *currBlock = backRefMaster->backRefBl[backRefIdx.getMaster()];
FreeObject *freeObj = (FreeObject*)((uintptr_t)currBlock + sizeof(BackRefBlock)
- + backRefIdx.s.offset*sizeof(void*));
+ + backRefIdx.getOffset()*sizeof(void*));
{
MallocMutex::scoped_lock lock(currBlock->blockMutex);
@@ -1749,10 +1762,14 @@ static void removeBackRef(BackRefIdx backRefIdx)
* In theory, we only need values 0 and 2. But value 1 is nonetheless
* useful for detecting errors in the double-check pattern.
*/
-static int mallocInitialized; // implicitly initialized to 0
-static MallocMutex initAndShutMutex;
+static intptr_t mallocInitialized; // implicitly initialized to 0
+static MallocMutex initMutex;
-inline bool isMallocInitialized() { return 2 == mallocInitialized; }
+inline bool isMallocInitialized() {
+ // Load must have acquire fence; otherwise thread taking "initialized" path
+ // might perform textually later loads *before* mallocInitialized becomes 2.
+ return 2 == FencedLoad(mallocInitialized);
+}
/*
* Allocator initialization routine;
@@ -1790,10 +1807,9 @@ static void initMemoryManager()
//! Ensures that initMemoryManager() is called once and only once.
/** Does not return until initMemoryManager() has been completed by a thread.
There is no need to call this routine if mallocInitialized==2 . */
-static void checkInitialization()
+static void doInitialization()
{
- if (mallocInitialized==2) return;
- MallocMutex::scoped_lock lock( initAndShutMutex );
+ MallocMutex::scoped_lock lock( initMutex );
if (mallocInitialized!=2) {
MALLOC_ASSERT( mallocInitialized==0, ASSERT_TEXT );
mallocInitialized = 1;
@@ -1806,7 +1822,9 @@ static void checkInitialization()
RecursiveMallocCallProtector::detectNaiveOverload();
#endif
MALLOC_ASSERT( mallocInitialized==1, ASSERT_TEXT );
- mallocInitialized = 2;
+ // Store must have release fence, otherwise mallocInitialized==2 might become
+ // remotely visible before side effects of initMemoryManager() become remotely visible.
+ FencedStore( mallocInitialized, 2 );
}
MALLOC_ASSERT( mallocInitialized==2, ASSERT_TEXT ); /* It can't be 0 or I would have initialized it */
}
@@ -1901,10 +1919,35 @@ void CachedBlocksList::releaseLastIfOld(uintptr_t currAge, size_t size)
}
}
-/* A predicate checks whether an object starts on blockSize boundary */
-static inline unsigned int isLargeObject(void *object)
+
+/*
+ * Bad dereference caused by a foreign pointer is possible only here, not earlier in call chain.
+ * Separate function isolates SEH code, as it has bad influence on compiler optimization.
+ */
+static inline BackRefIdx safer_dereference (BackRefIdx *ptr)
+{
+ BackRefIdx id;
+#if _MSC_VER
+ __try {
+#endif
+ id = *ptr;
+#if _MSC_VER
+ } __except( GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION?
+ EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH ) {
+ id = BackRefIdx();
+ }
+#endif
+ return id;
+}
+
+static inline bool isLargeObject(void *object)
{
- return isAligned(object, blockSize);
+ if (!isAligned(object, largeObjectAlignment))
+ return false;
+ LargeObjectHdr *header = (LargeObjectHdr*)object - 1;
+ BackRefIdx idx = safer_dereference(&header->backRefIdx);
+
+ return idx.isLargeObject() && getBackRef(idx) == header;
}
static uintptr_t cleanupCacheIfNeed ()
@@ -1963,7 +2006,8 @@ static inline void* mallocLargeObject (size_t size, size_t alignment,
if (startupAlloc || !(lmb = getCachedLargeBlock(allocationSize))) {
BackRefIdx backRefIdx;
- if ((backRefIdx = newBackRef()) == invalidIdx) return NULL;
+ if ((backRefIdx = BackRefIdx::newBackRef(/*largeObj=*/true)).isInvalid())
+ return NULL;
lmb = (LargeMemoryBlock*)getRawMemory(allocationSize, /*useMapMem=*/startupAlloc);
if (!lmb) return NULL;
lmb->fromMapMemory = startupAlloc;
@@ -2004,7 +2048,7 @@ static inline void freeLargeObject (void *object)
LargeObjectHdr *header = (LargeObjectHdr*)object - 1;
// overwrite backRefIdx to simplify double free detection
- header->backRefIdx = invalidIdx;
+ header->backRefIdx = BackRefIdx();
if (!freeLargeObjectToCache(header->memoryBlock)) {
removeBackRef(header->memoryBlock->backRefIdx);
freeRawMemory(header->memoryBlock, header->memoryBlock->unalignedSize,
@@ -2112,7 +2156,7 @@ static void *allocateAligned(size_t size, size_t alignment)
void *result;
if (size<=maxSegregatedObjectSize && alignment<=maxSegregatedObjectSize)
result = scalable_malloc(alignUp(size? size: sizeof(size_t), alignment));
- else if (alignment<=fittingAlignment)
+ else if (size<minLargeObjectSize && alignment<=fittingAlignment)
result = scalable_malloc(size);
else if (size+alignment < minLargeObjectSize) {
void *unaligned = scalable_malloc(size+alignment);
@@ -2120,12 +2164,11 @@ static void *allocateAligned(size_t size, size_t alignment)
result = alignUp(unaligned, alignment);
} else {
/* This can be the first allocation call. */
- checkInitialization();
- /* To correctly detect kind of allocation in scalable_free we need
- to distinguish memory allocated as large object.
- This is done via alignment that is greater than can be found in Block.
- */
- result = mallocLargeObject(size, blockSize>alignment? blockSize: alignment);
+ if (!isMallocInitialized())
+ doInitialization();
+ // take into account only alignment that are higher then natural
+ result = mallocLargeObject(size, largeObjectAlignment>alignment?
+ largeObjectAlignment: alignment);
}
MALLOC_ASSERT( isAligned(result, alignment), ASSERT_TEXT );
@@ -2181,6 +2224,78 @@ static inline FreeObject *findAllocatedObject(const void *address, const Block *
return (FreeObject*)((uintptr_t)address - (offset? block->objectSize-offset: 0));
}
+/**** Check if an object was allocated by scalable_malloc ****/
+
+static inline bool isSmallObject (void *ptr)
+{
+ void* expected = alignDown(ptr, blockSize);
+ BackRefIdx* idx = &((Block*)expected)->backRefIdx;
+
+ return expected == getBackRef(safer_dereference(idx));
+}
+
+static inline bool isRecognized (void* ptr)
+{
+ return isLargeObject(ptr) || isSmallObject(ptr);
+}
+
+static inline void freeSmallObject (void *object) {
+ FreeObject *objectToFree;
+
+ Block *block = (Block *)alignDown(object, blockSize);/* mask low bits to get the block */
+ MALLOC_ASSERT( block->allocatedCount, ASSERT_TEXT );
+
+#if MALLOC_CHECK_RECURSION
+ if (block->objectSize == startupAllocObjSizeMark) {
+ startupFree((StartupBlock *)block, object);
+ return;
+ }
+#endif
+
+ ThreadId myTid = getThreadId();
+
+ // Due to aligned allocations, a pointer passed to scalable_free
+ // might differ from the address of internally allocated object.
+ // Small objects however should always be fine.
+ if (block->objectSize <= maxSegregatedObjectSize)
+ objectToFree = (FreeObject*)object;
+ // "Fitting size" allocations are suspicious if aligned higher than naturally
+ else {
+ if ( ! isAligned(object,2*fittingAlignment) )
+ // TODO: the above check is questionable - it gives false negatives in ~50% cases,
+ // so might even be slower in average than unconditional use of findAllocatedObject.
+ // here it should be a "real" object
+ objectToFree = (FreeObject*)object;
+ else
+ // here object can be an aligned address, so applying additional checks
+ objectToFree = findAllocatedObject(object, block);
+ MALLOC_ASSERT( isAligned(objectToFree,fittingAlignment), ASSERT_TEXT );
+ }
+ MALLOC_ASSERT( isProperlyPlaced(objectToFree, block), ASSERT_TEXT );
+
+ if (myTid == block->owner) {
+ objectToFree->next = block->freeList;
+ block->freeList = objectToFree;
+ block->allocatedCount--;
+ MALLOC_ASSERT( block->allocatedCount < (blockSize-sizeof(Block))/block->objectSize, ASSERT_TEXT );
+#if COLLECT_STATISTICS
+ if (getActiveBlock(getAllocationBin(block->objectSize)) != block)
+ STAT_increment(myTid, getIndex(block->objectSize), freeToInactiveBlock);
+ else
+ STAT_increment(myTid, getIndex(block->objectSize), freeToActiveBlock);
+#endif
+ if (block->isFull) {
+ if (emptyEnoughToUse(block))
+ moveBlockToBinFront(block);
+ } else {
+ if (block->allocatedCount==0 && block->publicFreeList==NULL)
+ processLessUsedBlock(block);
+ }
+ } else { /* Slower path to add to the shared list, the allocatedCount is updated by the owner thread in malloc. */
+ freePublicObject (block, objectToFree);
+ }
+}
+
} // namespace internal
} // namespace rml
@@ -2209,10 +2324,8 @@ extern "C" void mallocThreadShutdownNotification(void* arg)
Block *threadlessBlock;
unsigned int index;
- {
- MallocMutex::scoped_lock lock( initAndShutMutex );
- if ( mallocInitialized == 0 ) return;
- }
+ // Check whether TLS has been initialized
+ if (!isMallocInitialized()) return;
TRACEF(( "[ScalableMalloc trace] Thread id %d blocks return start %d\n",
getThreadId(), threadGoingDownCount++ ));
@@ -2268,43 +2381,6 @@ extern "C" void mallocProcessShutdownNotification(void)
#endif
}
-/**** Check if an object was allocated by scalable_malloc ****/
-
-/*
- * Bad dereference caused by a foreign pointer is possible only here, not earlier in call chain.
- * Separate function isolates SEH code, as it has bad influence on compiler optimization.
- */
-static inline BackRefIdx safer_dereference (BackRefIdx *ptr)
-{
- BackRefIdx id;
-#if _MSC_VER
- __try {
-#endif
- id = *ptr;
-#if _MSC_VER
- } __except( GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION?
- EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH ) {
- id = invalidIdx;
- }
-#endif
- return id;
-}
-
-static inline bool isRecognized (void* ptr)
-{
- void* expected;
- BackRefIdx* idx;
-
- if (isLargeObject(ptr)) {
- expected = (LargeObjectHdr*)ptr - 1;
- idx = &((LargeObjectHdr*)expected)->backRefIdx;
- } else {
- expected = alignDown(ptr, blockSize);
- idx = &((Block*)expected)->backRefIdx;
- }
- return expected == getBackRef(safer_dereference(idx));
-}
-
/********* The malloc code *************/
extern "C" void * scalable_malloc(size_t size)
@@ -2324,14 +2400,14 @@ extern "C" void * scalable_malloc(size_t size)
}
#endif
- /* This returns only after malloc is initialized */
- checkInitialization();
+ if (!isMallocInitialized())
+ doInitialization();
/*
* Use Large Object Allocation
*/
if (size >= minLargeObjectSize) {
- result = (FreeObject*)mallocLargeObject(size, blockSize);
+ result = (FreeObject*)mallocLargeObject(size, largeObjectAlignment);
if (!result) errno = ENOMEM;
return result;
}
@@ -2420,72 +2496,15 @@ extern "C" void * scalable_malloc(size_t size)
/********* The free code *************/
extern "C" void scalable_free (void *object) {
- Block *block;
- ThreadId myTid;
- FreeObject *objectToFree;
-
- if (!object) {
+ if (!object)
return;
- }
+
MALLOC_ASSERT(isRecognized(object), "Invalid pointer in scalable_free detected.");
- if (isLargeObject(object)) {
+ if (isLargeObject(object))
freeLargeObject(object);
- return;
- }
-
- block = (Block *)alignDown(object, blockSize);/* mask low bits to get the block */
- MALLOC_ASSERT( block->allocatedCount, ASSERT_TEXT );
-
-#if MALLOC_CHECK_RECURSION
- if (block->objectSize == startupAllocObjSizeMark) {
- startupFree((StartupBlock *)block, object);
- return;
- }
-#endif
-
- myTid = getThreadId();
-
- // Due to aligned allocations, a pointer passed to scalable_free
- // might differ from the address of internally allocated object.
- // Small objects however should always be fine.
- if (block->objectSize <= maxSegregatedObjectSize)
- objectToFree = (FreeObject*)object;
- // "Fitting size" allocations are suspicious if aligned higher than naturally
- else {
- if ( ! isAligned(object,2*fittingAlignment) )
- // TODO: the above check is questionable - it gives false negatives in ~50% cases,
- // so might even be slower in average than unconditional use of findAllocatedObject.
- // here it should be a "real" object
- objectToFree = (FreeObject*)object;
- else
- // here object can be an aligned address, so applying additional checks
- objectToFree = findAllocatedObject(object, block);
- MALLOC_ASSERT( isAligned(objectToFree,fittingAlignment), ASSERT_TEXT );
- }
- MALLOC_ASSERT( isProperlyPlaced(objectToFree, block), ASSERT_TEXT );
-
- if (myTid == block->owner) {
- objectToFree->next = block->freeList;
- block->freeList = objectToFree;
- block->allocatedCount--;
- MALLOC_ASSERT( block->allocatedCount < (blockSize-sizeof(Block))/block->objectSize, ASSERT_TEXT );
-#if COLLECT_STATISTICS
- if (getActiveBlock(getAllocationBin(block->objectSize)) != block)
- STAT_increment(myTid, getIndex(block->objectSize), freeToInactiveBlock);
- else
- STAT_increment(myTid, getIndex(block->objectSize), freeToActiveBlock);
-#endif
- if (block->isFull) {
- if (emptyEnoughToUse(block))
- moveBlockToBinFront(block);
- } else {
- if (block->allocatedCount==0 && block->publicFreeList==NULL)
- processLessUsedBlock(block);
- }
- } else { /* Slower path to add to the shared list, the allocatedCount is updated by the owner thread in malloc. */
- freePublicObject (block, objectToFree);
- }
+ else
+ freeSmallObject(object);
}
/*
@@ -2497,8 +2516,12 @@ extern "C" void safer_scalable_free (void *object, void (*original_free)(void*))
if (!object)
return;
- if (isRecognized(object))
- scalable_free(object);
+ // must check 1st for large object, because small object check touches 4 pages on left,
+ // and it can be unaccessable
+ if (isLargeObject(object))
+ freeLargeObject(object);
+ else if (isSmallObject(object))
+ freeSmallObject(object);
else if (original_free)
original_free(object);
}
diff --git a/src/tbbmalloc/tbbmalloc.cpp b/src/tbbmalloc/tbbmalloc.cpp
index 1b4b3ba..fff8bb1 100644
--- a/src/tbbmalloc/tbbmalloc.cpp
+++ b/src/tbbmalloc/tbbmalloc.cpp
@@ -136,9 +136,7 @@ void init_tbbmalloc() {
/* Preventing TBB allocator library from unloading to prevent
resource leak, as memory is not released on the library unload.
*/
-#if USE_PTHREAD
- dlopen(MALLOCLIB_NAME, RTLD_NOW);
-#elif USE_WINTHREAD
+#if USE_WINTHREAD
// Prevent Windows from displaying message boxes if it fails to load library
UINT prev_mode = SetErrorMode (SEM_FAILCRITICALERRORS);
LoadLibrary(MALLOCLIB_NAME);
@@ -148,6 +146,12 @@ void init_tbbmalloc() {
#if !(_WIN32||_WIN64)
struct RegisterProcessShutdownNotification {
+ RegisterProcessShutdownNotification() {
+#if USE_PTHREAD
+ // prevents unloading, POSIX case
+ dlopen(MALLOCLIB_NAME, RTLD_NOW);
+#endif
+ }
~RegisterProcessShutdownNotification() {
mallocProcessShutdownNotification();
}
diff --git a/src/test/harness_m128.h b/src/test/harness_m128.h
index 62053b2..88cd15c 100644
--- a/src/test/harness_m128.h
+++ b/src/test/harness_m128.h
@@ -36,6 +36,8 @@
/** Uses circuitous logic forces compiler to put __m128 objects on stack while
executing various methods, and thus tempt it to use aligned loads and stores
on the stack. */
+// Do not create file-scope objects of the class, because MinGW (as of May 2010)
+// did not always provide proper stack alignment in destructors of such objects.
class ClassWithSSE {
static const int n = 16;
__m128 field[n];
@@ -66,7 +68,7 @@ void ClassWithSSE::init( int start ) {
__m128 stack[n];
for( int i=0; i<n; ++i ) {
// Declaring value as a one-element array instead of a scalar quites
- // gratuitous about possible use of "value" before it is used.
+ // gratuitous warnings about possible use of "value" before it was set.
__m128 value[1];
for( int j=0; j<4; ++j )
((float*)value)[j] = float(n*start+4*i+j);
diff --git a/src/test/harness_report.h b/src/test/harness_report.h
index 034f958..455c44b 100644
--- a/src/test/harness_report.h
+++ b/src/test/harness_report.h
@@ -56,6 +56,10 @@
#include <cstdarg>
+#ifdef HARNESS_INCOMPLETE_SOURCES
+#error Source files are not complete. Check the build environment
+#endif
+
#if _MSC_VER
#define snprintf _snprintf
#if _MSC_VER<=1400
diff --git a/src/test/test_concurrent_hash_map.cpp b/src/test/test_concurrent_hash_map.cpp
index caeb12d..df99252 100644
--- a/src/test/test_concurrent_hash_map.cpp
+++ b/src/test/test_concurrent_hash_map.cpp
@@ -402,9 +402,9 @@ void TraverseTable( MyTable& table, size_t n, size_t expected_size ) {
ASSERT(std::distance(cer.first, cer.second) == 1, NULL);
// Check const_iterator
- ASSERT( ci->first.value_of()==k, NULL );
- ASSERT( (*ci).first.value_of()==k, NULL );
- ++ci;
+ MyTable::const_iterator cic = ci++;
+ ASSERT( cic->first.value_of()==k, NULL );
+ ASSERT( (*cic).first.value_of()==k, NULL );
}
ASSERT( ci==const_table.end(), NULL );
delete[] array;
@@ -792,10 +792,10 @@ void TestRehash() {
MyTable w;
w.insert( std::make_pair(MyKey::make(-5), MyData()) );
w.rehash(); // without this, assertion will fail
- MyTable::const_iterator it = w.begin();
+ MyTable::iterator it = w.begin();
int i = 0; // check for non-rehashed buckets
- for( ; it != w.end(); ++it, i++ )
- w.count( it->first );
+ for( ; it != w.end(); i++ )
+ w.count( (it++)->first );
ASSERT( i == 1, NULL );
for( i=0; i<1000; i=(i<29 ? i+1 : i*2) ) {
for( int j=max(256+i, i*2); j<10000; j*=3 ) {
diff --git a/src/test/test_concurrent_unordered.cpp b/src/test/test_concurrent_unordered.cpp
index d781e6b..ff1bc1d 100644
--- a/src/test/test_concurrent_unordered.cpp
+++ b/src/test/test_concurrent_unordered.cpp
@@ -410,13 +410,24 @@ void CheckRange( AtomicByte array[], int n ) {
}
template<typename T>
+class CheckTable: NoAssign {
+ T &table;
+public:
+ CheckTable(T &t) : NoAssign(), table(t) {}
+ void operator()(int i) const {
+ int c = (int)table.count( i );
+ ASSERT( c, "must exist" );
+ }
+};
+
+template<typename T>
void test_concurrent(const char *tablename) {
- T table;
#if TBB_USE_ASSERT
int items = 2000;
#else
int items = 100000;
#endif
+ T table(items/1000);
tbb::tick_count t0 = tbb::tick_count::now();
NativeParallelFor( 16/*min 6*/, FillTable<T>(table, items) );
tbb::tick_count t1 = tbb::tick_count::now();
@@ -437,9 +448,10 @@ void test_concurrent(const char *tablename) {
ASSERT(items == CheckRecursiveRange<typename T::const_iterator>(cr).first, NULL);
tbb::parallel_for( cr, ParallelTraverseBody<typename T::const_range_type>( array, items ));
CheckRange( array, items );
-
delete[] array;
+ tbb::parallel_for( 0, items, CheckTable<T>( table ) );
+
table.clear();
CheckAllocatorA(table, items+1, items); // one dummy is always allocated
}
diff --git a/src/test/test_enumerable_thread_specific.cpp b/src/test/test_enumerable_thread_specific.cpp
index 4f040c1..f15223b 100644
--- a/src/test/test_enumerable_thread_specific.cpp
+++ b/src/test/test_enumerable_thread_specific.cpp
@@ -34,6 +34,7 @@
#include "tbb/tick_count.h"
#include "tbb/tbb_allocator.h"
#include "tbb/tbb_thread.h"
+#include "tbb/atomic.h"
#if !TBB_USE_EXCEPTIONS && _MSC_VER
// Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers
@@ -108,6 +109,9 @@ struct test_helper<minimal<N> > {
static inline double get(const minimal<N> &sum ) { return static_cast<double>(sum.value()); }
};
+//! Tag class used to make certain constructors hard to invoke accidentally.
+struct SecretTagType {} SecretTag;
+
//// functors and routines for initialization and combine
// Addition
@@ -128,13 +132,23 @@ struct FunctorAddCombineRef<minimal<N> > {
}
};
+//! Counts instances of FunctorFinit
+static tbb::atomic<int> FinitCounter;
+
template <typename T, int Value>
-struct FunctorFinit {
+class FunctorFinit {
+public:
+ FunctorFinit( const FunctorFinit& ) {++FinitCounter;}
+ FunctorFinit( SecretTagType ) {++FinitCounter;}
+ ~FunctorFinit() {--FinitCounter;}
T operator()() { return Value; }
};
template <size_t N, int Value>
struct FunctorFinit<minimal<N>,Value> {
+ FunctorFinit( const FunctorFinit& ) {++FinitCounter;}
+ FunctorFinit( SecretTagType ) {++FinitCounter;}
+ ~FunctorFinit() {--FinitCounter;}
minimal<N> operator()() {
minimal<N> result;
result.set_value( Value );
@@ -261,7 +275,7 @@ void run_parallel_scalar_tests_nocombine(const char *test_name) {
static_sums.clear();
ets_type sums(exemplar);
- FunctorFinit<T,0> my_finit;
+ FunctorFinit<T,0> my_finit(SecretTag);
ets_type finit_ets(my_finit);
ASSERT( sums.empty(), NULL);
@@ -920,7 +934,7 @@ run_assign_and_copy_constructor_test(const char *test_name) {
ASSERT(7 == test_helper<T>::get(assign1.local()), NULL);
// test creation with finit function
- FunctorFinit<T,7> my_finit7;
+ FunctorFinit<T,7> my_finit7(SecretTag);
tbb::enumerable_thread_specific<T> create2(my_finit7);
(void) create2.local();
ASSERT(7 == test_helper<T>::get(create2.local()), NULL);
@@ -933,7 +947,7 @@ run_assign_and_copy_constructor_test(const char *test_name) {
// test copy assignment with function initializer
create2.clear();
- FunctorFinit<T,0> my_finit;
+ FunctorFinit<T,0> my_finit(SecretTag);
tbb::enumerable_thread_specific<T> assign2(my_finit);
assign2 = create2;
(void) assign2.local();
@@ -949,9 +963,47 @@ run_assignment_and_copy_constructor_tests() {
run_assign_and_copy_constructor_test<minimal<line_size-1> >("minimal<line_size-1>");
run_assign_and_copy_constructor_test<minimal<line_size> >("minimal<line_size>");
run_assign_and_copy_constructor_test<minimal<line_size+1> >("minimal<line_size+1>");
+ ASSERT(FinitCounter==0, NULL);
+}
+
+// Class with no default constructor
+class HasNoDefaultConstructor {
+ HasNoDefaultConstructor();
+public:
+ HasNoDefaultConstructor( SecretTagType ) {}
+};
+
+// Initialization functor for a HasNoDefaultConstructor
+struct HasNoDefaultConstructorFinit {
+ HasNoDefaultConstructor operator()() {
+ return HasNoDefaultConstructor(SecretTag);
+ }
+};
+
+struct HasNoDefaultConstructorCombine {
+ HasNoDefaultConstructor operator()( HasNoDefaultConstructor, HasNoDefaultConstructor ) {
+ return HasNoDefaultConstructor(SecretTag);
+ }
+};
+
+//! Test situations where only default constructor or copy constructor is required.
+void TestInstantiation() {
+ // Test instantiation is possible when copy constructor is not required.
+ tbb::enumerable_thread_specific<NoCopy> ets1;
+
+ // Test instantiation when default constructor is not required, because exemplar is provided.
+ HasNoDefaultConstructor x(SecretTag);
+ tbb::enumerable_thread_specific<HasNoDefaultConstructor> ets2(x);
+ ets2.combine(HasNoDefaultConstructorCombine());
+
+ // Test instantiation when default constructor is not required, because init function is provided.
+ HasNoDefaultConstructorFinit f;
+ tbb::enumerable_thread_specific<HasNoDefaultConstructor> ets3(f);
+ ets3.combine(HasNoDefaultConstructorCombine());
}
int TestMain () {
+ TestInstantiation();
run_segmented_iterator_tests();
flog_key_creation_and_deletion();
diff --git a/include/tbb/aligned_space.h b/src/test/test_malloc_atexit.cpp
similarity index 54%
copy from include/tbb/aligned_space.h
copy to src/test/test_malloc_atexit.cpp
index c4b58e5..27cc0db 100644
--- a/include/tbb/aligned_space.h
+++ b/src/test/test_malloc_atexit.cpp
@@ -26,30 +26,62 @@
the GNU General Public License.
*/
-#ifndef __TBB_aligned_space_H
-#define __TBB_aligned_space_H
-
-#include "tbb_stddef.h"
-#include "tbb_machine.h"
-
-namespace tbb {
-
-//! Block of space aligned sufficiently to construct an array T with N elements.
-/** The elements are not constructed or destroyed by this class.
- @ingroup memory_allocation */
-template<typename T,size_t N>
-class aligned_space {
-private:
- typedef __TBB_TypeWithAlignmentAtLeastAsStrict(T) element_type;
- element_type array[(sizeof(T)*N+sizeof(element_type)-1)/sizeof(element_type)];
-public:
- //! Pointer to beginning of array
- T* begin() {return reinterpret_cast<T*>(this);}
+/* Regression test against bug in TBB allocator, manifested when
+ dynamic library calls atexit or register dtors of static objects.
+ If the allocator is not initialized yet, we can got deadlock,
+ because allocator library has static object dtors as well, they
+ registred during allocator initialization, and atexit is protected
+ by non-recursive mutex in some GLIBCs.
+ */
+
+#if _USRDLL
+
+#include <stdlib.h>
+
+#if _WIN32||_WIN64
+// isMallocOverloaded must be defined in DLL to linker not drop the dependence
+// to the DLL.
+extern __declspec(dllexport) bool isMallocOverloaded();
+
+bool isMallocOverloaded()
+{
+ return true;
+}
+
+#else
+
+#include <dlfcn.h>
- //! Pointer to one past last element in array.
- T* end() {return begin()+N;}
+bool isMallocOverloaded()
+{
+ return dlsym(RTLD_DEFAULT, "__TBB_malloc_proxy");
+}
+
+#endif
+
+void dummyFunction() {}
+
+class Foo {
+public:
+ Foo() {
+ // need a lot of them to cause memory allocation
+ for (int i=0; i<1024; i++)
+ atexit(dummyFunction);
+ }
};
-} // namespace tbb
+static Foo f;
+
+#else // _USRDLL
+#include "harness.h"
+
+#if _WIN32||_WIN64
+extern __declspec(dllimport)
+#endif
+bool isMallocOverloaded();
+
+int TestMain () {
+ return isMallocOverloaded()? Harness::Done : Harness::Skipped;
+}
-#endif /* __TBB_aligned_space_H */
+#endif // _USRDLL
diff --git a/src/test/test_malloc_compliance.cpp b/src/test/test_malloc_compliance.cpp
index a25bd0d..2ccc0eb 100644
--- a/src/test/test_malloc_compliance.cpp
+++ b/src/test/test_malloc_compliance.cpp
@@ -756,7 +756,9 @@ void CMemTest::NULLReturn(UINT MinSize, UINT MaxSize, int total_threads)
if (errno != 0 && !known_issue) {
CountErrors++;
if (ShouldReportError()) REPORT("valid pointer returned, error: errno not kept\n");
- }
+ }
+ // newly allocated area have to be zeroed
+ memset((char*)tmp + PointerList[i].Size, 0, PointerList[i].Size);
PointerList[i].Pointer = tmp;
PointerList[i].Size *= 2;
}
diff --git a/src/test/test_malloc_init_shutdown.cpp b/src/test/test_malloc_init_shutdown.cpp
new file mode 100644
index 0000000..76a33ac
--- /dev/null
+++ b/src/test/test_malloc_init_shutdown.cpp
@@ -0,0 +1,100 @@
+/*
+ Copyright 2005-2010 Intel Corporation. All Rights Reserved.
+
+ This file is part of Threading Building Blocks.
+
+ Threading Building Blocks is free software; you can redistribute it
+ and/or modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ Threading Building Blocks is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Threading Building Blocks; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ As a special exception, you may use this file as part of a free software
+ library without restriction. Specifically, if other files instantiate
+ templates or use macros or inline functions from this file, or you compile
+ this file and link it with other files to produce an executable, this
+ file does not by itself cause the resulting executable to be covered by
+ the GNU General Public License. This exception does not however
+ invalidate any other reasons why the executable file might be covered by
+ the GNU General Public License.
+*/
+
+/*--------------------------------------------------------------------*/
+// The regression test against a bug triggered when malloc initialization
+// and thread shutdown were called simultaneously, in which case
+// Windows dynamic loader lock and allocator initialization/termination lock
+// were taken in different order.
+
+#include "tbb/scalable_allocator.h"
+#include "tbb/atomic.h"
+#include "tbb/aligned_space.h"
+
+#if _WIN64 && defined(_M_AMD64)
+void __TBB_machine_pause(__int32 /*delay*/ ) {}
+#elif __linux__ && __ia64__
+#include <pthread.h>
+
+pthread_mutex_t counter_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+int32_t __TBB_machine_fetchadd4__TBB_full_fence (volatile void *ptr, int32_t value)
+{
+ pthread_mutex_lock(&counter_mutex);
+ int32_t result = *(int32_t*)ptr;
+ *(int32_t*)ptr = result + value;
+ pthread_mutex_unlock(&counter_mutex);
+ return result;
+}
+
+void __TBB_machine_pause(int32_t /*delay*/) {}
+#endif
+
+#include "harness.h"
+#include "harness_barrier.h"
+
+tbb::atomic<int> FinishedTasks;
+
+class TestFunc {
+ Harness::SpinBarrier* my_barr;
+public:
+ TestFunc (Harness::SpinBarrier& barr) : my_barr(&barr) {}
+ void operator() (bool do_malloc) const {
+ my_barr->wait();
+ if (do_malloc) scalable_malloc(10);
+ ++FinishedTasks;
+ }
+};
+
+typedef NativeParallelForTask<bool,TestFunc> TestTask;
+const int MaxTasks = 16;
+
+int TestMain () {
+ int NTasks = min(MaxTasks, max(2, MaxThread));
+ Harness::SpinBarrier barr(NTasks);
+ TestFunc tf(barr);
+ FinishedTasks = 0;
+ tbb::aligned_space<TestTask,MaxTasks> tasks;
+
+ for(int i=0; i<NTasks; ++i) {
+ TestTask* t = tasks.begin()+i;
+ new(t) TestTask(i%2==0, tf);
+ t->start();
+ }
+
+ Harness::Sleep(1000); // wait a second :)
+ ASSERT( FinishedTasks==NTasks, "Some threads appear to deadlock" );
+
+ for(int i=0; i<NTasks; ++i) {
+ TestTask* t = tasks.begin()+i;
+ t->wait_to_finish();
+ t->~TestTask();
+ }
+
+ return Harness::Done;
+}
diff --git a/src/test/test_malloc_overload.cpp b/src/test/test_malloc_overload.cpp
index 5bd7df2..19f5cc2 100644
--- a/src/test/test_malloc_overload.cpp
+++ b/src/test/test_malloc_overload.cpp
@@ -99,12 +99,20 @@ static inline bool isAligned(T arg, uintptr_t alignment) {
/* Below is part of MemoryAllocator.cpp. */
-union BackRefIdx { // index to backreference array
- uint32_t t;
- struct {
- uint16_t master; // index in BackRefMaster
- uint16_t offset; // offset from beginning of BackRefBlock
- } s;
+class BackRefIdx { // composite index to backreference array
+private:
+ uint16_t master; // index in BackRefMaster
+ uint16_t largeObj:1; // is this object "large"?
+ uint16_t offset :15; // offset from beginning of BackRefBlock
+public:
+ BackRefIdx() : master((uint16_t)-1) {}
+ bool isInvalid() { return master == (uint16_t)-1; }
+ bool isLargeObject() const { return largeObj; }
+ uint16_t getMaster() const { return master; }
+ uint16_t getOffset() const { return offset; }
+
+ // only newBackRef can modify BackRefIdx
+ static BackRefIdx newBackRef(bool largeObj);
};
struct LargeMemoryBlock {
diff --git a/src/test/test_malloc_regression.cpp b/src/test/test_malloc_regression.cpp
index 6123f7c..7e25440 100644
--- a/src/test/test_malloc_regression.cpp
+++ b/src/test/test_malloc_regression.cpp
@@ -49,9 +49,11 @@ void RunThread(const Body& body, const Arg& arg) {
job.wait_to_finish();
}
+/*--------------------------------------------------------------------*/
+// The regression test against bug #1518 where thread boot strap allocations "leaked"
+
#include "harness_memory.h"
-// The regression test for bug #1518 where thread boot strap allocations "leaked"
bool TestBootstrapLeak() {
/* In the bug 1518, each thread leaked ~384 bytes.
Initially, scalable allocator maps 1MB. Thus it is necessary to take out most of this space.
@@ -98,6 +100,9 @@ bool TestBootstrapLeak() {
return memory_leak<=0;
}
+/*--------------------------------------------------------------------*/
+// The regression test against a bug with incompatible semantics of msize and realloc
+
bool TestReallocMsize(size_t startSz) {
bool passed = true;
@@ -121,12 +126,16 @@ bool TestReallocMsize(size_t startSz) {
return passed;
}
+/*--------------------------------------------------------------------*/
+// The main test function
+
int TestMain () {
bool passed = true;
// Check whether memory usage data can be obtained; if not, skip test_bootstrap_leak.
if( GetMemoryUsage() )
passed &= TestBootstrapLeak();
+ // TestReallocMsize runs for each power of 2 and each Fibonacci number below 64K
for (size_t a=1, b=1, sum=1; sum<=64*1024; ) {
passed &= TestReallocMsize(sum);
a = b;
diff --git a/src/test/test_malloc_whitebox.cpp b/src/test/test_malloc_whitebox.cpp
index 3056eee..c37b85f 100644
--- a/src/test/test_malloc_whitebox.cpp
+++ b/src/test/test_malloc_whitebox.cpp
@@ -35,7 +35,9 @@
#undef DO_ITT_NOTIFY
#endif
+#define private public
#include "MemoryAllocator.cpp" // can be in ../tbbmalloc or another directory
+#undef private
#include "../tbbmalloc/tbbmalloc.cpp"
const int LARGE_MEM_SIZES_NUM = 10;
@@ -175,7 +177,7 @@ public:
TestBlock blocks[ITERS];
for (int i=0; i<ITERS; i++) {
- blocks[i].idx = newBackRef();
+ blocks[i].idx = BackRefIdx::newBackRef(/*largeObj=*/false);
setBackRef(blocks[i].idx, &blocks[i].data);
}
for (int i=0; i<ITERS; i++)
@@ -245,6 +247,8 @@ void TestObjectRecognition() {
size_t obtainedSize;
Block *auxBackRef;
+ ASSERT(sizeof(BackRefIdx)==4, "Unexpected size of BackRefIdx");
+
ASSERT(getObjectSize(falseObjectSize)!=falseObjectSize, "Error in test: bad choice for false object size");
void* mem = scalable_malloc(2*blockSize);
@@ -260,7 +264,7 @@ void TestObjectRecognition() {
headerLO->memoryBlock = (LargeMemoryBlock*)bufferLOH;
headerLO->memoryBlock->unalignedSize = 2*blockSize + headersSize;
headerLO->memoryBlock->objectSize = blockSize + headersSize;
- headerLO->backRefIdx = newBackRef();
+ headerLO->backRefIdx = BackRefIdx::newBackRef(/*largeObj=*/true);
setBackRef(headerLO->backRefIdx, headerLO);
ASSERT(scalable_msize(falseLO) == blockSize + headersSize,
"Error in test: LOH falsification failed");
@@ -270,17 +274,22 @@ void TestObjectRecognition() {
BackRefIdx idxs[NUM_OF_IDX];
for (int cnt=0; cnt<2; cnt++) {
for (int master = -10; master<10; master++) {
- falseBlock->backRefIdx.s.master = (uint16_t)master;
- headerLO->backRefIdx.s.master = (uint16_t)master;
+ falseBlock->backRefIdx.master = (uint16_t)master;
+ headerLO->backRefIdx.master = (uint16_t)master;
for (int bl = -10; bl<BR_MAX_CNT+10; bl++) {
- falseBlock->backRefIdx.s.offset = (uint16_t)bl;
- headerLO->backRefIdx.s.offset = (uint16_t)bl;
-
- obtainedSize = safer_scalable_msize(falseSO, NULL);
- ASSERT(obtainedSize==0, "Incorrect pointer accepted");
- obtainedSize = safer_scalable_msize(falseLO, NULL);
- ASSERT(obtainedSize==0, "Incorrect pointer accepted");
+ falseBlock->backRefIdx.offset = (uint16_t)bl;
+ headerLO->backRefIdx.offset = (uint16_t)bl;
+
+ for (int largeObj = 0; largeObj<2; largeObj++) {
+ falseBlock->backRefIdx.largeObj = largeObj;
+ headerLO->backRefIdx.largeObj = largeObj;
+
+ obtainedSize = safer_scalable_msize(falseSO, NULL);
+ ASSERT(obtainedSize==0, "Incorrect pointer accepted");
+ obtainedSize = safer_scalable_msize(falseLO, NULL);
+ ASSERT(obtainedSize==0, "Incorrect pointer accepted");
+ }
}
}
if (cnt == 1) {
@@ -289,7 +298,7 @@ void TestObjectRecognition() {
break;
}
for (int i=0; i<NUM_OF_IDX; i++) {
- idxs[i] = newBackRef();
+ idxs[i] = BackRefIdx::newBackRef(/*largeObj=*/false);
setBackRef(idxs[i], NULL);
}
}
@@ -307,7 +316,7 @@ void TestObjectRecognition() {
int TestMain () {
// backreference requires that initialization was done
- checkInitialization();
+ if(!isMallocInitialized()) doInitialization();
// to succeed, leak detection must be the 1st memory-intensive test
TestBackRef();
diff --git a/src/test/test_parallel_for.cpp b/src/test/test_parallel_for.cpp
index 559f346..68fe08b 100644
--- a/src/test/test_parallel_for.cpp
+++ b/src/test/test_parallel_for.cpp
@@ -286,25 +286,25 @@ void TestCancellation()
#include "harness_m128.h"
-#if HAVE_m128
-ClassWithSSE Global1[N], Global2[N];
-
+#if HAVE_m128 && !__TBB_SSE_STACK_ALIGNMENT_BROKEN
struct SSE_Functor {
+ ClassWithSSE* Src, * Dst;
+ SSE_Functor( ClassWithSSE* src, ClassWithSSE* dst ) : Src(src), Dst(dst) {}
+
void operator()( tbb::blocked_range<int>& r ) const {
for( int i=r.begin(); i!=r.end(); ++i )
- Global2[i] = Global1[i];
+ Dst[i] = Src[i];
}
};
//! Test that parallel_for works with stack-allocated __m128
void TestSSE() {
- for( int i=0; i<N; ++i ) {
- Global1[i] = ClassWithSSE(i);
- Global2[i] = ClassWithSSE();
- }
- tbb::parallel_for( tbb::blocked_range<int>(0,N), SSE_Functor() );
+ ClassWithSSE Array1[N], Array2[N];
+ for( int i=0; i<N; ++i )
+ Array1[i] = ClassWithSSE(i);
+ tbb::parallel_for( tbb::blocked_range<int>(0,N), SSE_Functor(Array1, Array2) );
for( int i=0; i<N; ++i )
- ASSERT( Global2[i]==ClassWithSSE(i), NULL ) ;
+ ASSERT( Array2[i]==ClassWithSSE(i), NULL ) ;
}
#endif /* HAVE_m128 */
@@ -340,7 +340,7 @@ int TestMain () {
TestExceptionsSupport();
#endif /* TBB_USE_EXCEPTIONS && !__TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN */
if (p>1) TestCancellation();
-#if HAVE_m128
+#if HAVE_m128 && !__TBB_SSE_STACK_ALIGNMENT_BROKEN
TestSSE();
#endif /* HAVE_m128 */
@@ -351,6 +351,9 @@ int TestMain () {
#if __TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN
REPORT("Known issue: exception handling tests are skipped.\n");
#endif
+#if HAVE_m128 && __TBB_SSE_STACK_ALIGNMENT_BROKEN
+ REPORT("Known issue: stack alignment for SSE not tested.\n");
+#endif
return Harness::Done;
}
diff --git a/src/test/test_parallel_pipeline.cpp b/src/test/test_parallel_pipeline.cpp
index 0efeb37..e5cd43c 100644
--- a/src/test/test_parallel_pipeline.cpp
+++ b/src/test/test_parallel_pipeline.cpp
@@ -37,82 +37,163 @@ int filter_node_count = 0;
const int n_tokens = 8;
const int max_counter = 16;
-static tbb::atomic<int> tmp_counter;
+static tbb::atomic<int> output_counter;
+static tbb::atomic<int> input_counter;
+static tbb::atomic<int> check_type_counter;
-class check_type {
+class check_type : Harness::NoAfterlife {
unsigned int id;
- bool is_ready;
+ bool am_ready;
public:
- check_type() : id(0), is_ready(false) {}
+ check_type( ) : id(0), am_ready(false) {
+ ++check_type_counter;
+ }
+
+ check_type(const check_type& other) : Harness::NoAfterlife(other) {
+ other.AssertLive();
+ AssertLive();
+ id = other.id;
+ am_ready = other.am_ready;
+ ++check_type_counter;
+ }
+
+ ~check_type() {
+ AssertLive();
+ --check_type_counter;
+ }
+ unsigned int my_id() { AssertLive(); return id; }
+ bool is_ready() { AssertLive(); return am_ready; }
void function() {
+ AssertLive();
if( id == 0 ) {
id = 1;
- is_ready = true;
+ am_ready = true;
}
}
};
+// Filters must be copy-constructible, and be const-qualifiable.
template<typename U>
-class input_filter {
- tbb::atomic<int> counter;
+class input_filter : Harness::NoAfterlife {
public:
- input_filter() {
- counter = max_counter;
- }
- U operator()( tbb::flow_control& control ) {
- if( --counter < 0 ) {
+ U operator()( tbb::flow_control& control ) const {
+ AssertLive();
+ if( --input_counter < 0 ) {
control.stop();
}
- return U();
+ return U(); // default constructed
}
+
};
template<>
-class input_filter<void> {
- tbb::atomic<int> counter;
+class input_filter<void> : Harness::NoAfterlife {
public:
- input_filter() {
- counter = max_counter;
- }
- void operator()( tbb::flow_control& control ) {
- if( --counter < 0 ) {
+ void operator()( tbb::flow_control& control ) const {
+ AssertLive();
+ if( --input_counter < 0 ) {
control.stop();
}
}
+
+};
+
+
+template<>
+class input_filter<check_type> : Harness::NoAfterlife {
+public:
+ check_type operator()( tbb::flow_control& control ) const {
+ AssertLive();
+ if( --input_counter < 0 ) {
+ control.stop();
+ }
+ return check_type( ); // default constructed
+ }
};
template<typename T, typename U>
-class middle_filter {
+class middle_filter : Harness::NoAfterlife {
public:
- U operator()(T /*my_storage*/) {
+ U operator()(T /*my_storage*/) const {
+ AssertLive();
return U();
}
};
+template<>
+class middle_filter<check_type, check_type> : Harness::NoAfterlife {
+public:
+ check_type& operator()( check_type &c) const {
+ AssertLive();
+ ASSERT(!c.my_id(), "bad id value");
+ ASSERT(!c.is_ready(), "Already ready" );
+ c.function();
+ return c;
+ }
+
+};
+
template<typename T>
-class output_filter {
+class output_filter : Harness::NoAfterlife {
public:
- void operator()(T) {
- tmp_counter++;
+ void operator()(T) const {
+ AssertLive();
+ output_counter++;
}
};
-void check_and_reset() {
- ASSERT(tmp_counter == max_counter, "not all tokens were passed through pipeline");
- tmp_counter = 0;
+template<>
+class output_filter<check_type> : Harness::NoAfterlife {
+public:
+ void operator()(check_type &c) const {
+ AssertLive();
+ ASSERT(c.my_id(), "unset id value");
+ ASSERT(c.is_ready(), "not yet ready");
+ output_counter++;
+ }
+};
+
+void resetCounters() {
+ output_counter = 0;
+ input_counter = max_counter;
+}
+
+void checkCounters() {
+ ASSERT(output_counter == max_counter, "not all tokens were passed through pipeline");
}
static const tbb::filter::mode filter_table[] = { tbb::filter::parallel, tbb::filter::serial_in_order, tbb::filter::serial_out_of_order};
const unsigned number_of_filter_types = sizeof(filter_table)/sizeof(filter_table[0]);
+typedef tbb::filter_t<void, void> filter_chain;
+typedef tbb::filter::mode mode_array;
+
+// The filters are passed by value, which forces a temporary copy to be created. This is
+// to reproduce the bug where a filter_chain uses refs to filters, which after a call
+// would be references to destructed temporaries.
+template<typename type1, typename type2>
+void fill_chain( filter_chain &my_chain, mode_array *filter_type, input_filter<type1> i_filter,
+ middle_filter<type1, type2> m_filter, output_filter<type2> o_filter ) {
+ my_chain = tbb::make_filter<void, type1>(filter_type[0], i_filter) &
+ tbb::make_filter<type1, type2>(filter_type[1], m_filter) &
+ tbb::make_filter<type2, void>(filter_type[2], o_filter);
+}
+
void run_function_spec() {
ASSERT(!filter_node_count, NULL);
+ REMARK("Testing < void, void > (single filter in pipeline)");
+#if __TBB_LAMBDAS_PRESENT
+ REMARK( " ( + lambdas)");
+#endif
+ REMARK("\n");
input_filter<void> i_filter;
// Test pipeline that contains only one filter
for( unsigned i = 0; i<number_of_filter_types; i++) {
tbb::filter_t<void, void> one_filter( filter_table[i], i_filter );
ASSERT(filter_node_count==1, "some filter nodes left after previous iteration?");
+ resetCounters();
tbb::parallel_pipeline( n_tokens, one_filter );
+ // no need to check counters
#if __TBB_LAMBDAS_PRESENT
tbb::atomic<int> counter;
counter = max_counter;
@@ -130,8 +211,13 @@ void run_function_spec() {
}
template<typename type1, typename type2>
-void run_function() {
+void run_function(const char *l1, const char *l2) {
ASSERT(!filter_node_count, NULL);
+ REMARK("Testing < %s, %s >", l1, l2 );
+#if __TBB_LAMBDAS_PRESENT
+ REMARK( " ( + lambdas)");
+#endif
+ REMARK("\n");
const size_t number_of_filters = 3;
@@ -154,36 +240,41 @@ void run_function() {
tbb::filter_t<type1, type2> filter2( filter_type[1], m_filter );
tbb::filter_t<type2, void> filter3( filter_type[2], o_filter );
ASSERT(filter_node_count==3, "some filter nodes left after previous iteration?");
+ resetCounters();
// Create filters sequence when parallel_pipeline() is being run
tbb::parallel_pipeline( n_tokens, filter1 & filter2 & filter3 );
- check_and_reset();
+ checkCounters();
// Create filters sequence partially outside parallel_pipeline() and also when parallel_pipeline() is being run
tbb::filter_t<void, type2> filter12;
filter12 = filter1 & filter2;
+ resetCounters();
tbb::parallel_pipeline( n_tokens, filter12 & filter3 );
- check_and_reset();
+ checkCounters();
tbb::filter_t<void, void> filter123 = filter12 & filter3;
// Run pipeline twice with the same filter sequence
for( unsigned i = 0; i<2; i++ ) {
+ resetCounters();
tbb::parallel_pipeline( n_tokens, filter123 );
- check_and_reset();
+ checkCounters();
}
// Now copy-construct another filter_t instance, and use it to run pipeline
{
tbb::filter_t<void, void> copy123( filter123 );
+ resetCounters();
tbb::parallel_pipeline( n_tokens, copy123 );
- check_and_reset();
+ checkCounters();
}
// Construct filters and create the sequence when parallel_pipeline() is being run
+ resetCounters();
tbb::parallel_pipeline( n_tokens,
tbb::make_filter<void, type1>(filter_type[0], i_filter) &
tbb::make_filter<type1, type2>(filter_type[1], m_filter) &
tbb::make_filter<type2, void>(filter_type[2], o_filter) );
- check_and_reset();
+ checkCounters();
// Construct filters, make a copy, destroy the original filters, and run with the copy
int cnt = filter_node_count;
@@ -196,8 +287,18 @@ void run_function() {
tbb::filter_t<void, void> copy123( *p123 );
delete p123;
ASSERT(filter_node_count==cnt+5, "filter nodes deleted prematurely?");
+ resetCounters();
tbb::parallel_pipeline( n_tokens, copy123 );
- check_and_reset();
+ checkCounters();
+ }
+
+ // construct a filter with temporaries
+ {
+ tbb::filter_t<void, void> my_filter;
+ fill_chain<type1,type2>( my_filter, filter_type, i_filter, m_filter, o_filter );
+ resetCounters();
+ tbb::parallel_pipeline( n_tokens, my_filter );
+ checkCounters();
}
ASSERT(filter_node_count==cnt, "scope ended but filter nodes not deleted?");
@@ -205,6 +306,7 @@ void run_function() {
tbb::atomic<int> counter;
counter = max_counter;
// Construct filters using lambda-syntax and create the sequence when parallel_pipeline() is being run;
+ resetCounters(); // only need the output_counter reset.
tbb::parallel_pipeline( n_tokens,
tbb::make_filter<void, type1>(filter_type[0], [&counter]( tbb::flow_control& control ) -> type1 {
if( --counter < 0 )
@@ -215,10 +317,10 @@ void run_function() {
return type2(); }
) &
tbb::make_filter<type2, void>(filter_type[2], [] ( type2 ) -> void {
- tmp_counter++; }
+ output_counter++; }
)
);
- check_and_reset();
+ checkCounters();
#endif
}
ASSERT(!filter_node_count, "filter_node objects leaked");
@@ -230,13 +332,22 @@ int TestMain() {
// Test with varying number of threads.
for( int nthread=MinThread; nthread<=MaxThread; ++nthread ) {
// Initialize TBB task scheduler
+ REMARK("\nTesting with nthread=%d\n", nthread);
tbb::task_scheduler_init init(nthread);
// Run test several times with different types
run_function_spec();
- run_function<size_t,int>();
- run_function<int,double>();
- run_function<check_type,size_t>();
+ run_function<size_t,int>("size_t", "int");
+ run_function<int,double>("int", "double");
+ check_type_counter = 0;
+ run_function<check_type,size_t>("check_type", "size_t");
+ ASSERT(!check_type_counter, "Error in check_type creation/destruction");
+ // check_type as the second type in the pipeline only works if check_type
+ // is also the first type. The middle_filter specialization for <check_type, check_type>
+ // changes the state of the check_type items, and this is checked in the output_filter
+ // specialization.
+ run_function<check_type, check_type>("check_type", "check_type");
+ ASSERT(!check_type_counter, "Error in check_type creation/destruction");
}
return Harness::Done;
}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/tbb.git
More information about the debian-science-commits
mailing list