summaryrefslogtreecommitdiff
path: root/Ix/CPP
diff options
context:
space:
mode:
authorScott Blomquist <sblom@microsoft.com>2013-01-17 17:48:09 -0800
committerScott Blomquist <sblom@microsoft.com>2013-01-17 17:48:09 -0800
commita0f2bbe9acce9483163de730341cf89ec0331d2b (patch)
treead38c78a7f0e916051edce90374586961dcdfee4 /Ix/CPP
parent6aa4590ea5952d3ba5e1f99b6ede76d856f88617 (diff)
downloadRxCpp-a0f2bbe9acce9483163de730341cf89ec0331d2b.tar.gz
New directory structure.
Diffstat (limited to 'Ix/CPP')
-rw-r--r--Ix/CPP/.gitignore109
-rw-r--r--Ix/CPP/license.txt15
-rw-r--r--Ix/CPP/projects/CppLinq.vpj156
-rw-r--r--Ix/CPP/projects/CppLinq.vpw7
-rw-r--r--Ix/CPP/projects/Unittest.CppLinq.vpj137
-rw-r--r--Ix/CPP/samples/SampleCppLinq/SampleCppLinq.cpp128
-rw-r--r--Ix/CPP/samples/SampleCppLinq/SampleCppLinq.sln20
-rw-r--r--Ix/CPP/samples/SampleCppLinq/SampleCppLinq.vcxproj92
-rw-r--r--Ix/CPP/samples/SampleCppLinq/SampleCppLinq.vcxproj.filters25
-rw-r--r--Ix/CPP/samples/SampleCppLinq/data.txt655
-rw-r--r--Ix/CPP/src/cpplinq/linq.hpp531
-rw-r--r--Ix/CPP/src/cpplinq/linq_cursor.hpp340
-rw-r--r--Ix/CPP/src/cpplinq/linq_groupby.hpp195
-rw-r--r--Ix/CPP/src/cpplinq/linq_iterators.hpp194
-rw-r--r--Ix/CPP/src/cpplinq/linq_last.hpp85
-rw-r--r--Ix/CPP/src/cpplinq/linq_select.hpp52
-rw-r--r--Ix/CPP/src/cpplinq/linq_selectmany.hpp107
-rw-r--r--Ix/CPP/src/cpplinq/linq_skip.hpp35
-rw-r--r--Ix/CPP/src/cpplinq/linq_take.hpp96
-rw-r--r--Ix/CPP/src/cpplinq/linq_where.hpp69
-rw-r--r--Ix/CPP/src/cpplinq/util.hpp223
-rw-r--r--Ix/CPP/unittest/makefile37
-rw-r--r--Ix/CPP/unittest/testbench.cpp527
-rw-r--r--Ix/CPP/unittest/testbench.hpp87
24 files changed, 3922 insertions, 0 deletions
diff --git a/Ix/CPP/.gitignore b/Ix/CPP/.gitignore
new file mode 100644
index 0000000..8bbd318
--- /dev/null
+++ b/Ix/CPP/.gitignore
@@ -0,0 +1,109 @@
+# Custom
+*.vtg
+*.vpwhist
+
+# Build Folders (you can keep bin if you'd like, to store dlls and pdbs)
+[Bb]in/
+[Oo]bj/
+
+# mstest test results
+TestResults
+
+## Ignore Visual Studio temporary files, build results, and
+## files generated by popular Visual Studio add-ons.
+
+# User-specific files
+*.suo
+*.user
+*.sln.docstates
+
+# Build results
+[Dd]ebug/
+[Rr]elease/
+x64/
+*_i.c
+*_p.c
+*.ilk
+*.meta
+*.obj
+*.pch
+*.pdb
+*.pgc
+*.pgd
+*.rsp
+*.sbr
+*.tlb
+*.tli
+*.tlh
+*.tmp
+*.log
+*.vspscc
+*.vssscc
+.builds
+
+# Visual C++ cache files
+ipch/
+*.aps
+*.ncb
+*.opensdf
+*.sdf
+
+# Visual Studio profiler
+*.psess
+*.vsp
+*.vspx
+
+# Guidance Automation Toolkit
+*.gpState
+
+# ReSharper is a .NET coding add-in
+_ReSharper*
+
+# NCrunch
+*.ncrunch*
+.*crunch*.local.xml
+
+# Installshield output folder
+[Ee]xpress
+
+# DocProject is a documentation generator add-in
+DocProject/buildhelp/
+DocProject/Help/*.HxT
+DocProject/Help/*.HxC
+DocProject/Help/*.hhc
+DocProject/Help/*.hhk
+DocProject/Help/*.hhp
+DocProject/Help/Html2
+DocProject/Help/html
+
+# Click-Once directory
+publish
+
+# Publish Web Output
+*.Publish.xml
+
+# NuGet Packages Directory
+packages
+
+# Windows Azure Build Output
+csx
+*.build.csdef
+
+# Others
+[Bb]in
+[Oo]bj
+sql
+TestResults
+[Tt]est[Rr]esult*
+*.Cache
+ClientBin
+[Ss]tyle[Cc]op.*
+~$*
+*.dbmdl
+Generated_Code #added for RIA/Silverlight projects
+
+# Backup & report files from converting an old project file to a newer
+# Visual Studio version. Backup files are not needed, because we have git ;-)
+_UpgradeReport_Files/
+Backup*/
+UpgradeLog*.XML \ No newline at end of file
diff --git a/Ix/CPP/license.txt b/Ix/CPP/license.txt
new file mode 100644
index 0000000..5b47fbd
--- /dev/null
+++ b/Ix/CPP/license.txt
@@ -0,0 +1,15 @@
+Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
+Microsoft Open Technologies would like to thank its contributors, a list
+of whom are at http://rx.codeplex.com/wikipage?title=Contributors.
+
+Licensed under the Apache License, Version 2.0 (the "License"); you
+may not use this file except in compliance with the License. You may
+obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+implied. See the License for the specific language governing permissions
+and limitations under the License. \ No newline at end of file
diff --git a/Ix/CPP/projects/CppLinq.vpj b/Ix/CPP/projects/CppLinq.vpj
new file mode 100644
index 0000000..209f42c
--- /dev/null
+++ b/Ix/CPP/projects/CppLinq.vpj
@@ -0,0 +1,156 @@
+<!DOCTYPE Project SYSTEM "http://www.slickedit.com/dtd/vse/10.0/vpj.dtd">
+<Project
+ Version="10.0"
+ VendorName="SlickEdit"
+ WorkingDir=".">
+ <Config
+ Name="Release"
+ OutputFile=""
+ CompilerConfigName="Default Compiler"
+ ObjectDir="Release">
+ <Menu>
+ <Target
+ Name="Compile"
+ MenuCaption="&amp;Compile"
+ CaptureOutputWith="ProcessBuffer"
+ SaveOption="SaveCurrent"
+ RunFromDir="%rw">
+ <Exec/>
+ </Target>
+ <Target
+ Name="Build"
+ MenuCaption="&amp;Build"
+ CaptureOutputWith="ProcessBuffer"
+ SaveOption="SaveWorkspaceFiles"
+ RunFromDir="%rw">
+ <Set
+ Name="OutDir"
+ Value="%rw\%bn"/>
+ <Exec CmdLine="nmake O=%bn runtests"/>
+ </Target>
+ <Target
+ Name="Rebuild"
+ MenuCaption="&amp;Rebuild"
+ CaptureOutputWith="ProcessBuffer"
+ SaveOption="SaveWorkspaceFiles"
+ RunFromDir="%rw">
+ <Exec CmdLine="nmake O=%bn clean all"/>
+ </Target>
+ <Target
+ Name="Debug"
+ MenuCaption="&amp;Debug"
+ SaveOption="SaveNone"
+ RunFromDir="%rw">
+ <Exec/>
+ </Target>
+ <Target
+ Name="Execute"
+ MenuCaption="E&amp;xecute"
+ SaveOption="SaveNone"
+ RunFromDir="%rw"
+ BuildFirst="1"
+ CaptureOutputWith="ProcessBuffer"
+ ClearProcessBuffer="1">
+ <Exec CmdLine='"%bn\testbench.exe"'/>
+ </Target>
+ </Menu>
+ <Includes>
+ </Includes>
+ </Config>
+ <Config
+ Name="Debug"
+ OutputFile=""
+ CompilerConfigName="Default Compiler"
+ ObjectDir="Debug">
+ <Menu>
+ <Target
+ Name="Compile"
+ MenuCaption="&amp;Compile"
+ CaptureOutputWith="ProcessBuffer"
+ SaveOption="SaveCurrent"
+ RunFromDir="%rw">
+ <Exec/>
+ </Target>
+ <Target
+ Name="Build"
+ MenuCaption="&amp;Build"
+ CaptureOutputWith="ProcessBuffer"
+ SaveOption="SaveWorkspaceFiles"
+ RunFromDir="%rw">
+ <Set
+ Name="OutDir"
+ Value="%rw\%bn"/>
+ <Exec CmdLine="nmake O=%bn runtests"/>
+ </Target>
+ <Target
+ Name="Rebuild"
+ MenuCaption="&amp;Rebuild"
+ CaptureOutputWith="ProcessBuffer"
+ SaveOption="SaveWorkspaceFiles"
+ RunFromDir="%rw">
+ <Exec CmdLine="nmake O=%bn clean all"/>
+ </Target>
+ <Target
+ Name="Debug"
+ MenuCaption="&amp;Debug"
+ SaveOption="SaveNone"
+ RunFromDir="%rw">
+ <Exec/>
+ </Target>
+ <Target
+ Name="Execute"
+ MenuCaption="E&amp;xecute"
+ SaveOption="SaveNone"
+ RunFromDir="%rw"
+ BuildFirst="1"
+ CaptureOutputWith="ProcessBuffer"
+ ClearProcessBuffer="1">
+ <Exec CmdLine='"%bn\testbench.exe"'/>
+ </Target>
+ </Menu>
+ <Includes>
+ </Includes>
+ </Config>
+ <CustomFolders>
+ <Folder
+ Name="Source Files"
+ Filters="*.c;*.C;*.cc;*.cpp;*.cp;*.cxx;*.c++;*.prg;*.pas;*.dpr;*.asm;*.s;*.bas;*.java;*.cs;*.sc;*.e;*.cob;*.html;*.rc;*.tcl;*.py;*.pl;*.d">
+ </Folder>
+ <Folder
+ Name="Header Files"
+ Filters="*.h;*.H;*.hh;*.hpp;*.hxx;*.inc;*.sh;*.cpy;*.if">
+ </Folder>
+ <Folder
+ Name="Resource Files"
+ Filters="*.ico;*.cur;*.dlg"/>
+ <Folder
+ Name="Bitmaps"
+ Filters="*.bmp"/>
+ <Folder
+ Name="Other Files"
+ Filters="">
+ </Folder>
+ </CustomFolders>
+ <Files AutoFolders="PackageView">
+ <F
+ N="*.cpp"
+ Recurse="1"
+ Refilter="0"
+ Excludes=""/>
+ <F
+ N="*.h"
+ Recurse="1"
+ Refilter="0"
+ Excludes=""/>
+ <F
+ N="*.hpp"
+ Recurse="1"
+ Refilter="0"
+ Excludes=""/>
+ <F
+ N="*.inl"
+ Recurse="1"
+ Refilter="0"
+ Excludes=""/>
+ </Files>
+</Project>
diff --git a/Ix/CPP/projects/CppLinq.vpw b/Ix/CPP/projects/CppLinq.vpw
new file mode 100644
index 0000000..105f982
--- /dev/null
+++ b/Ix/CPP/projects/CppLinq.vpw
@@ -0,0 +1,7 @@
+<!DOCTYPE Workspace SYSTEM "http://www.slickedit.com/dtd/vse/10.0/vpw.dtd">
+<Workspace Version="10.0" VendorName="SlickEdit">
+ <Projects>
+ <Project File="cpplinq/CppLinq.vpj"/>
+ <Project File="unittest/Unittest.CppLinq.vpj"/>
+ </Projects>
+</Workspace>
diff --git a/Ix/CPP/projects/Unittest.CppLinq.vpj b/Ix/CPP/projects/Unittest.CppLinq.vpj
new file mode 100644
index 0000000..7bbb967
--- /dev/null
+++ b/Ix/CPP/projects/Unittest.CppLinq.vpj
@@ -0,0 +1,137 @@
+<!DOCTYPE Project SYSTEM "http://www.slickedit.com/dtd/vse/10.0/vpj.dtd">
+<Project
+ Version="10.0"
+ VendorName="SlickEdit"
+ TemplateName="(Other)"
+ WorkingDir=".">
+ <Config
+ Name="Release"
+ OutputFile=""
+ CompilerConfigName="">
+ <Menu>
+ <Target
+ Name="Compile"
+ MenuCaption="&amp;Compile"
+ CaptureOutputWith="ProcessBuffer"
+ SaveOption="SaveCurrent"
+ RunFromDir="%rw">
+ <Exec/>
+ </Target>
+ <Target
+ Name="Build"
+ MenuCaption="&amp;Build"
+ CaptureOutputWith="ProcessBuffer"
+ SaveOption="SaveWorkspaceFiles"
+ RunFromDir="%rw">
+ <Exec CmdLine="nmake Config=%bn runtests"/>
+ </Target>
+ <Target
+ Name="Rebuild"
+ MenuCaption="&amp;Rebuild"
+ CaptureOutputWith="ProcessBuffer"
+ SaveOption="SaveWorkspaceFiles"
+ RunFromDir="%rw">
+ <Exec CmdLine="nmake Config=%bn clean all"/>
+ </Target>
+ <Target
+ Name="Debug"
+ MenuCaption="&amp;Debug"
+ SaveOption="SaveNone"
+ RunFromDir="%rw">
+ <Exec/>
+ </Target>
+ <Target
+ Name="Execute"
+ MenuCaption="E&amp;xecute"
+ SaveOption="SaveNone"
+ RunFromDir="%rw">
+ <Exec CmdLine='".exe"'/>
+ </Target>
+ </Menu>
+ </Config>
+ <Config
+ Name="Debug"
+ OutputFile=""
+ CompilerConfigName="">
+ <Menu>
+ <Target
+ Name="Compile"
+ MenuCaption="&amp;Compile"
+ CaptureOutputWith="ProcessBuffer"
+ SaveOption="SaveCurrent"
+ RunFromDir="%rw">
+ <Exec/>
+ </Target>
+ <Target
+ Name="Build"
+ MenuCaption="&amp;Build"
+ CaptureOutputWith="ProcessBuffer"
+ SaveOption="SaveWorkspaceFiles"
+ RunFromDir="%rw">
+ <Exec CmdLine="nmake Config=%bn runtests"/>
+ </Target>
+ <Target
+ Name="Rebuild"
+ MenuCaption="&amp;Rebuild"
+ CaptureOutputWith="ProcessBuffer"
+ SaveOption="SaveWorkspaceFiles"
+ RunFromDir="%rw">
+ <Exec CmdLine="nmake Config=%bn clean all"/>
+ </Target>
+ <Target
+ Name="Debug"
+ MenuCaption="&amp;Debug"
+ SaveOption="SaveNone"
+ RunFromDir="%rw">
+ <Exec/>
+ </Target>
+ <Target
+ Name="Execute"
+ MenuCaption="E&amp;xecute"
+ SaveOption="SaveNone"
+ RunFromDir="%rw">
+ <Exec CmdLine='".exe"'/>
+ </Target>
+ </Menu>
+ </Config>
+ <CustomFolders>
+ <Folder
+ Name="Source Files"
+ Filters="*.c;*.C;*.cc;*.cpp;*.cp;*.cxx;*.c++;*.prg;*.pas;*.dpr;*.asm;*.s;*.bas;*.java;*.cs;*.sc;*.e;*.cob;*.html;*.rc;*.tcl;*.py;*.pl;*.d">
+ </Folder>
+ <Folder
+ Name="Header Files"
+ Filters="*.h;*.H;*.hh;*.hpp;*.hxx;*.inc;*.sh;*.cpy;*.if">
+ </Folder>
+ <Folder
+ Name="Resource Files"
+ Filters="*.ico;*.cur;*.dlg"/>
+ <Folder
+ Name="Bitmaps"
+ Filters="*.bmp"/>
+ <Folder
+ Name="Other Files"
+ Filters="">
+ </Folder>
+ </CustomFolders>
+ <Files AutoFolders="PackageView">
+ <F
+ N="*.cpp"
+ Recurse="1"
+ Refilter="0"
+ Excludes=""/>
+ <F
+ N="*.h"
+ Recurse="1"
+ Refilter="0"
+ Excludes=""/>
+ <F
+ N="*.hpp"
+ Recurse="1"
+ Refilter="0"
+ Excludes=""/>
+ <F
+ N="makefile"
+ Type="Makefile"/>
+ </Files>
+</Project>
diff --git a/Ix/CPP/samples/SampleCppLinq/SampleCppLinq.cpp b/Ix/CPP/samples/SampleCppLinq/SampleCppLinq.cpp
new file mode 100644
index 0000000..e459e4b
--- /dev/null
+++ b/Ix/CPP/samples/SampleCppLinq/SampleCppLinq.cpp
@@ -0,0 +1,128 @@
+// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
+
+// SampleCppLinq.cpp : Defines the entry point for the console application.
+//
+
+#include <cpplinq\linq.hpp>
+
+#include <iostream>
+#include <fstream>
+#include <iomanip>
+#include <string>
+#include <vector>
+#include <exception>
+#include <regex>
+#include <cmath>
+#include <algorithm>
+#include <numeric>
+
+using namespace std;
+
+vector<string> load_data();
+string extract_value(const string& input, const string& key);
+
+
+void run()
+{
+ using namespace cpplinq;
+
+ struct item {
+ string args;
+ int concurrency;
+ double time;
+
+ item(const string& input) {
+ args = extract_value(input, "args");
+ concurrency = atoi( extract_value(input, "concurrency").c_str() );
+ time = atof( extract_value(input, "time").c_str() );
+ }
+ };
+
+ auto data_unparsed = load_data();
+ auto data_parsed =
+ from(data_unparsed)
+ .select([](const string& line) { return item(line); })
+ .to_vector();
+
+ cout << "data loaded" << endl;
+
+ auto data =
+ from(data_parsed)
+ .groupby([](const item& i) { return i.args; });
+
+ for (auto giter = data.begin(), end = data.end(); giter != end; ++giter)
+ {
+ auto& g = *giter;
+
+ cout << "arguments: " << g.key << endl;
+
+ cout << "concurrency, mean, |, raw_data," << endl;
+ auto seq =
+ from(g)
+ .groupby([](const item& i) { return i.concurrency; });
+
+ for (auto giter = seq.begin(), end = seq.end(); giter != end; ++giter)
+ {
+ auto& g = *giter;
+
+ cout << g.key << ", ";
+
+ auto times = from(g).select([](const item& i) { return i.time; });
+
+ auto n = from(g).count();
+ auto sum = std::accumulate(times.begin(), times.end(), 0.0);
+
+ cout << (sum / n) << ", |";
+
+ for (auto timeIter = times.begin(), end = times.end();
+ timeIter != end;
+ ++timeIter)
+ {
+ cout << ", " << *timeIter;
+ }
+ cout << endl;
+ }
+ }
+}
+
+
+int main()
+{
+ try {
+ run();
+ } catch (exception& e) {
+ cerr << "exception: " << e.what() << endl;
+ }
+}
+
+vector<string> load_data()
+{
+ ifstream datafile("data.txt");
+ vector<string> v;
+ string line;
+
+ if (datafile.fail())
+ throw logic_error("could not find file");
+
+ while(getline(datafile, line))
+ v.push_back(line);
+
+ return v;
+}
+
+regex key_value_pair("'([^\']*)'\\s*[:,]\\s*(\\d+(?:\\.\\d+)?|'[^']*')");
+
+string extract_value(const string& input, const string& key)
+{
+ const std::sregex_iterator end;
+ for (std::sregex_iterator i(input.cbegin(), input.cend(), key_value_pair);
+ i != end;
+ ++i)
+ {
+ if ((*i)[1] == key)
+ {
+ return (*i)[2];
+ }
+ }
+ throw std::range_error("search key not found");
+}
diff --git a/Ix/CPP/samples/SampleCppLinq/SampleCppLinq.sln b/Ix/CPP/samples/SampleCppLinq/SampleCppLinq.sln
new file mode 100644
index 0000000..32769e0
--- /dev/null
+++ b/Ix/CPP/samples/SampleCppLinq/SampleCppLinq.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 11
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SampleCppLinq", "SampleCppLinq.vcxproj", "{B65551BA-E1BA-4735-BA51-FFA83D64823E}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {B65551BA-E1BA-4735-BA51-FFA83D64823E}.Debug|Win32.ActiveCfg = Debug|Win32
+ {B65551BA-E1BA-4735-BA51-FFA83D64823E}.Debug|Win32.Build.0 = Debug|Win32
+ {B65551BA-E1BA-4735-BA51-FFA83D64823E}.Release|Win32.ActiveCfg = Release|Win32
+ {B65551BA-E1BA-4735-BA51-FFA83D64823E}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/Ix/CPP/samples/SampleCppLinq/SampleCppLinq.vcxproj b/Ix/CPP/samples/SampleCppLinq/SampleCppLinq.vcxproj
new file mode 100644
index 0000000..83dd175
--- /dev/null
+++ b/Ix/CPP/samples/SampleCppLinq/SampleCppLinq.vcxproj
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and '$(VisualStudioVersion)' == ''">$(VCTargetsPath11)</VCTargetsPath>
+ </PropertyGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{B65551BA-E1BA-4735-BA51-FFA83D64823E}</ProjectGuid>
+ <Keyword>Win32Proj</Keyword>
+ <RootNamespace>SampleCppLinq</RootNamespace>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>v110</PlatformToolset>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <PlatformToolset>v110</PlatformToolset>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <LinkIncremental>true</LinkIncremental>
+ <IncludePath>d:\work\CppLinq Project\src;$(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSDK_IncludePath);</IncludePath>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <LinkIncremental>false</LinkIncremental>
+ <IncludePath>d:\work\CppLinq Project\src;$(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSDK_IncludePath);</IncludePath>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="SampleCppLinq.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <Text Include="data.txt" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/Ix/CPP/samples/SampleCppLinq/SampleCppLinq.vcxproj.filters b/Ix/CPP/samples/SampleCppLinq/SampleCppLinq.vcxproj.filters
new file mode 100644
index 0000000..3e3685f
--- /dev/null
+++ b/Ix/CPP/samples/SampleCppLinq/SampleCppLinq.vcxproj.filters
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+ </Filter>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+ <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
+ </Filter>
+ <Filter Include="Resource Files">
+ <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="SampleCppLinq.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <Text Include="data.txt" />
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/Ix/CPP/samples/SampleCppLinq/data.txt b/Ix/CPP/samples/SampleCppLinq/data.txt
new file mode 100644
index 0000000..b16aea6
--- /dev/null
+++ b/Ix/CPP/samples/SampleCppLinq/data.txt
@@ -0,0 +1,655 @@
+{'var': [('concurrency', 1), ('args', '-test async-gated')], 'result': {'workingset': 22437888.0, 'privatemem': 25964544.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 71.9785421875}}
+{'var': [('concurrency', 1), ('args', '-test async-gated')], 'result': {'workingset': 22626304.0, 'privatemem': 26136576.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 71.956228125}}
+{'var': [('concurrency', 1), ('args', '-test async-gated')], 'result': {'workingset': 22503424.0, 'privatemem': 25968640.0, 'nonpaged': 25384.0, 'virtualmem': 556580864.0, 'time': 71.741975}}
+{'var': [('concurrency', 1), ('args', '-test async-gated')], 'result': {'workingset': 22667264.0, 'privatemem': 26177536.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 71.189240625}}
+{'var': [('concurrency', 1), ('args', '-test async-gated')], 'result': {'workingset': 22323200.0, 'privatemem': 25808896.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 71.7897296875}}
+{'var': [('concurrency', 1), ('args', '-test ums-gated')], 'result': {'workingset': 14917632.0, 'privatemem': 20385792.0, 'nonpaged': 26784.0, 'virtualmem': 577224704.0, 'time': 45.734965625}}
+{'var': [('concurrency', 1), ('args', '-test ums-gated')], 'result': {'workingset': 15060992.0, 'privatemem': 20545536.0, 'nonpaged': 26784.0, 'virtualmem': 577224704.0, 'time': 45.028878125}}
+{'var': [('concurrency', 1), ('args', '-test ums-gated')], 'result': {'workingset': 15052800.0, 'privatemem': 20529152.0, 'nonpaged': 26768.0, 'virtualmem': 577224704.0, 'time': 45.5304375}}
+{'var': [('concurrency', 1), ('args', '-test ums-gated')], 'result': {'workingset': 14934016.0, 'privatemem': 20406272.0, 'nonpaged': 26784.0, 'virtualmem': 577224704.0, 'time': 45.898271875}}
+{'var': [('concurrency', 1), ('args', '-test ums-gated')], 'result': {'workingset': 14991360.0, 'privatemem': 20447232.0, 'nonpaged': 26784.0, 'virtualmem': 577224704.0, 'time': 45.425371875}}
+{'var': [('concurrency', 2), ('args', '-test async-gated')], 'result': {'workingset': 22626304.0, 'privatemem': 26013696.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 32.748084375}}
+{'var': [('concurrency', 2), ('args', '-test async-gated')], 'result': {'workingset': 22806528.0, 'privatemem': 26202112.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 33.5510765625}}
+{'var': [('concurrency', 2), ('args', '-test async-gated')], 'result': {'workingset': 22556672.0, 'privatemem': 26021888.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 33.0404453125}}
+{'var': [('concurrency', 2), ('args', '-test async-gated')], 'result': {'workingset': 22609920.0, 'privatemem': 26038272.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 34.0872890625}}
+{'var': [('concurrency', 2), ('args', '-test async-gated')], 'result': {'workingset': 22573056.0, 'privatemem': 25976832.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 33.026740625}}
+{'var': [('concurrency', 2), ('args', '-test ums-gated')], 'result': {'workingset': 15093760.0, 'privatemem': 21082112.0, 'nonpaged': 27744.0, 'virtualmem': 594001920.0, 'time': 23.0056984375}}
+{'var': [('concurrency', 2), ('args', '-test ums-gated')], 'result': {'workingset': 15208448.0, 'privatemem': 20918272.0, 'nonpaged': 27264.0, 'virtualmem': 585613312.0, 'time': 23.2537171875}}
+{'var': [('concurrency', 2), ('args', '-test ums-gated')], 'result': {'workingset': 15208448.0, 'privatemem': 20905984.0, 'nonpaged': 27264.0, 'virtualmem': 585613312.0, 'time': 23.2316484375}}
+{'var': [('concurrency', 2), ('args', '-test ums-gated')], 'result': {'workingset': 15192064.0, 'privatemem': 20910080.0, 'nonpaged': 27264.0, 'virtualmem': 585613312.0, 'time': 23.259509375}}
+{'var': [('concurrency', 2), ('args', '-test ums-gated')], 'result': {'workingset': 15273984.0, 'privatemem': 20979712.0, 'nonpaged': 27264.0, 'virtualmem': 585613312.0, 'time': 23.3385359375}}
+{'var': [('concurrency', 3), ('args', '-test async-gated')], 'result': {'workingset': 22581248.0, 'privatemem': 25952256.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 20.2717265625}}
+{'var': [('concurrency', 3), ('args', '-test async-gated')], 'result': {'workingset': 22667264.0, 'privatemem': 26046464.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 20.2175609375}}
+{'var': [('concurrency', 3), ('args', '-test async-gated')], 'result': {'workingset': 22732800.0, 'privatemem': 26042368.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 20.07530625}}
+{'var': [('concurrency', 3), ('args', '-test async-gated')], 'result': {'workingset': 22589440.0, 'privatemem': 26013696.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 20.281884375}}
+{'var': [('concurrency', 3), ('args', '-test async-gated')], 'result': {'workingset': 22831104.0, 'privatemem': 26185728.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 20.05386875}}
+{'var': [('concurrency', 3), ('args', '-test ums-gated')], 'result': {'workingset': 15245312.0, 'privatemem': 21233664.0, 'nonpaged': 27744.0, 'virtualmem': 594001920.0, 'time': 15.3586671875}}
+{'var': [('concurrency', 3), ('args', '-test ums-gated')], 'result': {'workingset': 15310848.0, 'privatemem': 21250048.0, 'nonpaged': 27744.0, 'virtualmem': 594001920.0, 'time': 15.70775625}}
+{'var': [('concurrency', 3), ('args', '-test ums-gated')], 'result': {'workingset': 15347712.0, 'privatemem': 21254144.0, 'nonpaged': 27744.0, 'virtualmem': 594001920.0, 'time': 15.6456703125}}
+{'var': [('concurrency', 3), ('args', '-test ums-gated')], 'result': {'workingset': 15273984.0, 'privatemem': 21180416.0, 'nonpaged': 27744.0, 'virtualmem': 594001920.0, 'time': 15.303421875}}
+{'var': [('concurrency', 3), ('args', '-test ums-gated')], 'result': {'workingset': 15335424.0, 'privatemem': 21299200.0, 'nonpaged': 27744.0, 'virtualmem': 594001920.0, 'time': 15.4817796875}}
+{'var': [('concurrency', 4), ('args', '-test async-gated')], 'result': {'workingset': 22630400.0, 'privatemem': 25980928.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.7404328125}}
+{'var': [('concurrency', 4), ('args', '-test async-gated')], 'result': {'workingset': 22482944.0, 'privatemem': 25964544.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 15.2058328125}}
+{'var': [('concurrency', 4), ('args', '-test async-gated')], 'result': {'workingset': 22646784.0, 'privatemem': 25972736.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 17.3264390625}}
+{'var': [('concurrency', 4), ('args', '-test async-gated')], 'result': {'workingset': 22634496.0, 'privatemem': 26091520.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 16.233396875}}
+{'var': [('concurrency', 4), ('args', '-test async-gated')], 'result': {'workingset': 22749184.0, 'privatemem': 26120192.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 15.4778453125}}
+{'var': [('concurrency', 4), ('args', '-test ums-gated')], 'result': {'workingset': 15200256.0, 'privatemem': 21196800.0, 'nonpaged': 27744.0, 'virtualmem': 594001920.0, 'time': 12.3187859375}}
+{'var': [('concurrency', 4), ('args', '-test ums-gated')], 'result': {'workingset': 15474688.0, 'privatemem': 21725184.0, 'nonpaged': 28224.0, 'virtualmem': 602390528.0, 'time': 11.6904421875}}
+{'var': [('concurrency', 4), ('args', '-test ums-gated')], 'result': {'workingset': 15384576.0, 'privatemem': 21630976.0, 'nonpaged': 28224.0, 'virtualmem': 602390528.0, 'time': 10.795390625}}
+{'var': [('concurrency', 4), ('args', '-test ums-gated')], 'result': {'workingset': 15364096.0, 'privatemem': 21606400.0, 'nonpaged': 28224.0, 'virtualmem': 602390528.0, 'time': 10.5224484375}}
+{'var': [('concurrency', 4), ('args', '-test ums-gated')], 'result': {'workingset': 15343616.0, 'privatemem': 21590016.0, 'nonpaged': 28224.0, 'virtualmem': 602390528.0, 'time': 10.4604203125}}
+{'var': [('concurrency', 5), ('args', '-test async-gated')], 'result': {'workingset': 22536192.0, 'privatemem': 25972736.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 14.291790625}}
+{'var': [('concurrency', 5), ('args', '-test async-gated')], 'result': {'workingset': 22753280.0, 'privatemem': 26103808.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.8192703125}}
+{'var': [('concurrency', 5), ('args', '-test async-gated')], 'result': {'workingset': 22585344.0, 'privatemem': 25919488.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 14.1479078125}}
+{'var': [('concurrency', 5), ('args', '-test async-gated')], 'result': {'workingset': 22728704.0, 'privatemem': 26058752.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.7772765625}}
+{'var': [('concurrency', 5), ('args', '-test async-gated')], 'result': {'workingset': 22691840.0, 'privatemem': 26103808.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.4325453125}}
+{'var': [('concurrency', 5), ('args', '-test ums-gated')], 'result': {'workingset': 15458304.0, 'privatemem': 21950464.0, 'nonpaged': 28704.0, 'virtualmem': 610779136.0, 'time': 11.653565625}}
+{'var': [('concurrency', 5), ('args', '-test ums-gated')], 'result': {'workingset': 15622144.0, 'privatemem': 22114304.0, 'nonpaged': 28688.0, 'virtualmem': 610779136.0, 'time': 11.60025}}
+{'var': [('concurrency', 5), ('args', '-test ums-gated')], 'result': {'workingset': 15491072.0, 'privatemem': 21975040.0, 'nonpaged': 28704.0, 'virtualmem': 610779136.0, 'time': 15.956359375}}
+{'var': [('concurrency', 5), ('args', '-test ums-gated')], 'result': {'workingset': 15429632.0, 'privatemem': 21938176.0, 'nonpaged': 28704.0, 'virtualmem': 610779136.0, 'time': 16.7639015625}}
+{'var': [('concurrency', 5), ('args', '-test ums-gated')], 'result': {'workingset': 15560704.0, 'privatemem': 22102016.0, 'nonpaged': 28704.0, 'virtualmem': 610779136.0, 'time': 12.432678125}}
+{'var': [('concurrency', 6), ('args', '-test async-gated')], 'result': {'workingset': 22630400.0, 'privatemem': 26091520.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 14.482378125}}
+{'var': [('concurrency', 6), ('args', '-test async-gated')], 'result': {'workingset': 22724608.0, 'privatemem': 26005504.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 14.6995578125}}
+{'var': [('concurrency', 6), ('args', '-test async-gated')], 'result': {'workingset': 22601728.0, 'privatemem': 25972736.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.7111109375}}
+{'var': [('concurrency', 6), ('args', '-test async-gated')], 'result': {'workingset': 22675456.0, 'privatemem': 26017792.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 14.24071875}}
+{'var': [('concurrency', 6), ('args', '-test async-gated')], 'result': {'workingset': 22822912.0, 'privatemem': 26206208.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 14.1442453125}}
+{'var': [('concurrency', 6), ('args', '-test ums-gated')], 'result': {'workingset': 15446016.0, 'privatemem': 22118400.0, 'nonpaged': 28944.0, 'virtualmem': 614973440.0, 'time': 11.3196953125}}
+{'var': [('concurrency', 6), ('args', '-test ums-gated')], 'result': {'workingset': 15351808.0, 'privatemem': 21860352.0, 'nonpaged': 28704.0, 'virtualmem': 610779136.0, 'time': 13.8507890625}}
+{'var': [('concurrency', 6), ('args', '-test ums-gated')], 'result': {'workingset': 15536128.0, 'privatemem': 22384640.0, 'nonpaged': 29184.0, 'virtualmem': 619167744.0, 'time': 11.411578125}}
+{'var': [('concurrency', 6), ('args', '-test ums-gated')], 'result': {'workingset': 15728640.0, 'privatemem': 22585344.0, 'nonpaged': 29184.0, 'virtualmem': 619167744.0, 'time': 11.3764765625}}
+{'var': [('concurrency', 6), ('args', '-test ums-gated')], 'result': {'workingset': 15695872.0, 'privatemem': 22331392.0, 'nonpaged': 28944.0, 'virtualmem': 614973440.0, 'time': 11.253040625}}
+{'var': [('concurrency', 7), ('args', '-test async-gated')], 'result': {'workingset': 22650880.0, 'privatemem': 25956352.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 14.1586765625}}
+{'var': [('concurrency', 7), ('args', '-test async-gated')], 'result': {'workingset': 22700032.0, 'privatemem': 26046464.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 14.2853515625}}
+{'var': [('concurrency', 7), ('args', '-test async-gated')], 'result': {'workingset': 22663168.0, 'privatemem': 25964544.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 14.9393859375}}
+{'var': [('concurrency', 7), ('args', '-test async-gated')], 'result': {'workingset': 22597632.0, 'privatemem': 25968640.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.95501875}}
+{'var': [('concurrency', 7), ('args', '-test async-gated')], 'result': {'workingset': 22794240.0, 'privatemem': 26148864.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.9703578125}}
+{'var': [('concurrency', 7), ('args', '-test ums-gated')], 'result': {'workingset': 15720448.0, 'privatemem': 22822912.0, 'nonpaged': 29648.0, 'virtualmem': 627556352.0, 'time': 9.88916875}}
+{'var': [('concurrency', 7), ('args', '-test ums-gated')], 'result': {'workingset': 15872000.0, 'privatemem': 22978560.0, 'nonpaged': 29648.0, 'virtualmem': 627556352.0, 'time': 9.7966875}}
+{'var': [('concurrency', 7), ('args', '-test ums-gated')], 'result': {'workingset': 15642624.0, 'privatemem': 22474752.0, 'nonpaged': 29184.0, 'virtualmem': 619167744.0, 'time': 10.072915625}}
+{'var': [('concurrency', 7), ('args', '-test ums-gated')], 'result': {'workingset': 15605760.0, 'privatemem': 22548480.0, 'nonpaged': 29424.0, 'virtualmem': 623362048.0, 'time': 10.3262265625}}
+{'var': [('concurrency', 7), ('args', '-test ums-gated')], 'result': {'workingset': 15503360.0, 'privatemem': 22335488.0, 'nonpaged': 29184.0, 'virtualmem': 619167744.0, 'time': 10.3073703125}}
+{'var': [('concurrency', 8), ('args', '-test async-gated')], 'result': {'workingset': 22671360.0, 'privatemem': 26075136.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.7767140625}}
+{'var': [('concurrency', 8), ('args', '-test async-gated')], 'result': {'workingset': 22683648.0, 'privatemem': 26046464.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.6023046875}}
+{'var': [('concurrency', 8), ('args', '-test async-gated')], 'result': {'workingset': 22581248.0, 'privatemem': 25968640.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.590659375}}
+{'var': [('concurrency', 8), ('args', '-test async-gated')], 'result': {'workingset': 22671360.0, 'privatemem': 26128384.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.797509375}}
+{'var': [('concurrency', 8), ('args', '-test async-gated')], 'result': {'workingset': 22626304.0, 'privatemem': 26001408.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 14.114903125}}
+{'var': [('concurrency', 8), ('args', '-test ums-gated')], 'result': {'workingset': 15843328.0, 'privatemem': 23093248.0, 'nonpaged': 29904.0, 'virtualmem': 631750656.0, 'time': 10.8031640625}}
+{'var': [('concurrency', 8), ('args', '-test ums-gated')], 'result': {'workingset': 15695872.0, 'privatemem': 22933504.0, 'nonpaged': 29904.0, 'virtualmem': 631750656.0, 'time': 10.78183125}}
+{'var': [('concurrency', 8), ('args', '-test ums-gated')], 'result': {'workingset': 15626240.0, 'privatemem': 22466560.0, 'nonpaged': 29184.0, 'virtualmem': 619167744.0, 'time': 10.79186875}}
+{'var': [('concurrency', 8), ('args', '-test ums-gated')], 'result': {'workingset': 15998976.0, 'privatemem': 23089152.0, 'nonpaged': 29664.0, 'virtualmem': 627556352.0, 'time': 10.6507984375}}
+{'var': [('concurrency', 8), ('args', '-test ums-gated')], 'result': {'workingset': 15769600.0, 'privatemem': 22892544.0, 'nonpaged': 29664.0, 'virtualmem': 627556352.0, 'time': 10.7464046875}}
+{'var': [('concurrency', 10), ('args', '-test async-gated')], 'result': {'workingset': 22761472.0, 'privatemem': 26107904.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.5812421875}}
+{'var': [('concurrency', 10), ('args', '-test async-gated')], 'result': {'workingset': 22626304.0, 'privatemem': 26030080.0, 'nonpaged': 25640.0, 'virtualmem': 560775168.0, 'time': 13.8055078125}}
+{'var': [('concurrency', 10), ('args', '-test async-gated')], 'result': {'workingset': 23019520.0, 'privatemem': 26374144.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.661046875}}
+{'var': [('concurrency', 10), ('args', '-test async-gated')], 'result': {'workingset': 22810624.0, 'privatemem': 26165248.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.8447890625}}
+{'var': [('concurrency', 10), ('args', '-test async-gated')], 'result': {'workingset': 22786048.0, 'privatemem': 26157056.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.7037859375}}
+{'var': [('concurrency', 10), ('args', '-test ums-gated')], 'result': {'workingset': 15937536.0, 'privatemem': 23482368.0, 'nonpaged': 30384.0, 'virtualmem': 640139264.0, 'time': 9.9560078125}}
+{'var': [('concurrency', 10), ('args', '-test ums-gated')], 'result': {'workingset': 15732736.0, 'privatemem': 22953984.0, 'nonpaged': 29888.0, 'virtualmem': 631750656.0, 'time': 9.9779875}}
+{'var': [('concurrency', 10), ('args', '-test ums-gated')], 'result': {'workingset': 15806464.0, 'privatemem': 23216128.0, 'nonpaged': 30144.0, 'virtualmem': 635944960.0, 'time': 10.0446703125}}
+{'var': [('concurrency', 10), ('args', '-test ums-gated')], 'result': {'workingset': 15765504.0, 'privatemem': 23171072.0, 'nonpaged': 30128.0, 'virtualmem': 635944960.0, 'time': 9.8954875}}
+{'var': [('concurrency', 10), ('args', '-test ums-gated')], 'result': {'workingset': 15732736.0, 'privatemem': 22679552.0, 'nonpaged': 29424.0, 'virtualmem': 623362048.0, 'time': 10.1007609375}}
+{'var': [('concurrency', 12), ('args', '-test async-gated')], 'result': {'workingset': 22589440.0, 'privatemem': 25964544.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.4936453125}}
+{'var': [('concurrency', 12), ('args', '-test async-gated')], 'result': {'workingset': 22732800.0, 'privatemem': 26148864.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.54201875}}
+{'var': [('concurrency', 12), ('args', '-test async-gated')], 'result': {'workingset': 22609920.0, 'privatemem': 25964544.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.8461453125}}
+{'var': [('concurrency', 12), ('args', '-test async-gated')], 'result': {'workingset': 22749184.0, 'privatemem': 26103808.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.5201171875}}
+{'var': [('concurrency', 12), ('args', '-test async-gated')], 'result': {'workingset': 22740992.0, 'privatemem': 26173440.0, 'nonpaged': 25384.0, 'virtualmem': 556580864.0, 'time': 13.7564125}}
+{'var': [('concurrency', 12), ('args', '-test ums-gated')], 'result': {'workingset': 16015360.0, 'privatemem': 23687168.0, 'nonpaged': 30512.0, 'virtualmem': 644333568.0, 'time': 10.308821875}}
+{'var': [('concurrency', 12), ('args', '-test ums-gated')], 'result': {'workingset': 15978496.0, 'privatemem': 23896064.0, 'nonpaged': 30992.0, 'virtualmem': 652722176.0, 'time': 10.3545609375}}
+{'var': [('concurrency', 12), ('args', '-test ums-gated')], 'result': {'workingset': 16105472.0, 'privatemem': 23773184.0, 'nonpaged': 30512.0, 'virtualmem': 644333568.0, 'time': 10.39604375}}
+{'var': [('concurrency', 12), ('args', '-test ums-gated')], 'result': {'workingset': 16003072.0, 'privatemem': 23670784.0, 'nonpaged': 30512.0, 'virtualmem': 644333568.0, 'time': 11.3077953125}}
+{'var': [('concurrency', 12), ('args', '-test ums-gated')], 'result': {'workingset': 15835136.0, 'privatemem': 23347200.0, 'nonpaged': 30272.0, 'virtualmem': 640139264.0, 'time': 11.2470921875}}
+{'var': [('concurrency', 14), ('args', '-test async-gated')], 'result': {'workingset': 22630400.0, 'privatemem': 26017792.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 14.5840734375}}
+{'var': [('concurrency', 14), ('args', '-test async-gated')], 'result': {'workingset': 22843392.0, 'privatemem': 26238976.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 14.7056515625}}
+{'var': [('concurrency', 14), ('args', '-test async-gated')], 'result': {'workingset': 22765568.0, 'privatemem': 26152960.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 14.4621296875}}
+{'var': [('concurrency', 14), ('args', '-test async-gated')], 'result': {'workingset': 22626304.0, 'privatemem': 26009600.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.7261640625}}
+{'var': [('concurrency', 14), ('args', '-test async-gated')], 'result': {'workingset': 22659072.0, 'privatemem': 26132480.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.43949375}}
+{'var': [('concurrency', 14), ('args', '-test ums-gated')], 'result': {'workingset': 16134144.0, 'privatemem': 24227840.0, 'nonpaged': 31232.0, 'virtualmem': 656916480.0, 'time': 10.1509875}}
+{'var': [('concurrency', 14), ('args', '-test ums-gated')], 'result': {'workingset': 15835136.0, 'privatemem': 23486464.0, 'nonpaged': 30512.0, 'virtualmem': 644333568.0, 'time': 10.4571375}}
+{'var': [('concurrency', 14), ('args', '-test ums-gated')], 'result': {'workingset': 15953920.0, 'privatemem': 23937024.0, 'nonpaged': 30992.0, 'virtualmem': 652722176.0, 'time': 10.21300625}}
+{'var': [('concurrency', 14), ('args', '-test ums-gated')], 'result': {'workingset': 16056320.0, 'privatemem': 24068096.0, 'nonpaged': 30992.0, 'virtualmem': 652722176.0, 'time': 10.3364984375}}
+{'var': [('concurrency', 14), ('args', '-test ums-gated')], 'result': {'workingset': 15851520.0, 'privatemem': 23621632.0, 'nonpaged': 30752.0, 'virtualmem': 648527872.0, 'time': 10.205690625}}
+{'var': [('concurrency', 16), ('args', '-test async-gated')], 'result': {'workingset': 22704128.0, 'privatemem': 26152960.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.4346625}}
+{'var': [('concurrency', 16), ('args', '-test async-gated')], 'result': {'workingset': 22941696.0, 'privatemem': 26288128.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.588709375}}
+{'var': [('concurrency', 16), ('args', '-test async-gated')], 'result': {'workingset': 22573056.0, 'privatemem': 25997312.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.383815625}}
+{'var': [('concurrency', 16), ('args', '-test async-gated')], 'result': {'workingset': 22818816.0, 'privatemem': 26148864.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.60400625}}
+{'var': [('concurrency', 16), ('args', '-test async-gated')], 'result': {'workingset': 22716416.0, 'privatemem': 26120192.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.3768921875}}
+{'var': [('concurrency', 16), ('args', '-test ums-gated')], 'result': {'workingset': 16101376.0, 'privatemem': 24428544.0, 'nonpaged': 31712.0, 'virtualmem': 665305088.0, 'time': 9.846940625}}
+{'var': [('concurrency', 16), ('args', '-test ums-gated')], 'result': {'workingset': 16089088.0, 'privatemem': 24199168.0, 'nonpaged': 31232.0, 'virtualmem': 656916480.0, 'time': 11.1524609375}}
+{'var': [('concurrency', 16), ('args', '-test ums-gated')], 'result': {'workingset': 16199680.0, 'privatemem': 24178688.0, 'nonpaged': 30992.0, 'virtualmem': 652722176.0, 'time': 9.9980328125}}
+{'var': [('concurrency', 16), ('args', '-test ums-gated')], 'result': {'workingset': 16023552.0, 'privatemem': 23977984.0, 'nonpaged': 30992.0, 'virtualmem': 652722176.0, 'time': 11.2873078125}}
+{'var': [('concurrency', 16), ('args', '-test ums-gated')], 'result': {'workingset': 16134144.0, 'privatemem': 24387584.0, 'nonpaged': 31472.0, 'virtualmem': 661110784.0, 'time': 9.934396875}}
+{'var': [('concurrency', 20), ('args', '-test async-gated')], 'result': {'workingset': 22781952.0, 'privatemem': 26120192.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.4010015625}}
+{'var': [('concurrency', 20), ('args', '-test async-gated')], 'result': {'workingset': 22585344.0, 'privatemem': 25985024.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.2167890625}}
+{'var': [('concurrency', 20), ('args', '-test async-gated')], 'result': {'workingset': 22740992.0, 'privatemem': 26152960.0, 'nonpaged': 25768.0, 'virtualmem': 564969472.0, 'time': 13.4800796875}}
+{'var': [('concurrency', 20), ('args', '-test async-gated')], 'result': {'workingset': 22671360.0, 'privatemem': 26050560.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.449178125}}
+{'var': [('concurrency', 20), ('args', '-test async-gated')], 'result': {'workingset': 22671360.0, 'privatemem': 26058752.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.2931078125}}
+{'var': [('concurrency', 20), ('args', '-test ums-gated')], 'result': {'workingset': 16310272.0, 'privatemem': 25399296.0, 'nonpaged': 32912.0, 'virtualmem': 686276608.0, 'time': 10.06823125}}
+{'var': [('concurrency', 20), ('args', '-test ums-gated')], 'result': {'workingset': 16154624.0, 'privatemem': 24883200.0, 'nonpaged': 32432.0, 'virtualmem': 677888000.0, 'time': 10.0306984375}}
+{'var': [('concurrency', 20), ('args', '-test ums-gated')], 'result': {'workingset': 16171008.0, 'privatemem': 25038848.0, 'nonpaged': 32672.0, 'virtualmem': 682082304.0, 'time': 10.06961875}}
+{'var': [('concurrency', 20), ('args', '-test ums-gated')], 'result': {'workingset': 16216064.0, 'privatemem': 24817664.0, 'nonpaged': 32192.0, 'virtualmem': 673693696.0, 'time': 10.0746796875}}
+{'var': [('concurrency', 20), ('args', '-test ums-gated')], 'result': {'workingset': 16375808.0, 'privatemem': 25542656.0, 'nonpaged': 33152.0, 'virtualmem': 690470912.0, 'time': 10.037271875}}
+{'var': [('concurrency', 24), ('args', '-test async-gated')], 'result': {'workingset': 22589440.0, 'privatemem': 25985024.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.4086859375}}
+{'var': [('concurrency', 24), ('args', '-test async-gated')], 'result': {'workingset': 22634496.0, 'privatemem': 26005504.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.3663890625}}
+{'var': [('concurrency', 24), ('args', '-test async-gated')], 'result': {'workingset': 22691840.0, 'privatemem': 26034176.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.3019828125}}
+{'var': [('concurrency', 24), ('args', '-test async-gated')], 'result': {'workingset': 22786048.0, 'privatemem': 26144768.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.389559375}}
+{'var': [('concurrency', 24), ('args', '-test async-gated')], 'result': {'workingset': 22593536.0, 'privatemem': 26005504.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.2155328125}}
+{'var': [('concurrency', 24), ('args', '-test ums-gated')], 'result': {'workingset': 16252928.0, 'privatemem': 25710592.0, 'nonpaged': 33632.0, 'virtualmem': 698859520.0, 'time': 9.93735}}
+{'var': [('concurrency', 24), ('args', '-test ums-gated')], 'result': {'workingset': 16265216.0, 'privatemem': 25427968.0, 'nonpaged': 33152.0, 'virtualmem': 690470912.0, 'time': 9.9944796875}}
+{'var': [('concurrency', 24), ('args', '-test ums-gated')], 'result': {'workingset': 16236544.0, 'privatemem': 25595904.0, 'nonpaged': 33392.0, 'virtualmem': 694665216.0, 'time': 9.94461875}}
+{'var': [('concurrency', 24), ('args', '-test ums-gated')], 'result': {'workingset': 16257024.0, 'privatemem': 25403392.0, 'nonpaged': 33152.0, 'virtualmem': 690470912.0, 'time': 9.94913125}}
+{'var': [('concurrency', 24), ('args', '-test ums-gated')], 'result': {'workingset': 16424960.0, 'privatemem': 26009600.0, 'nonpaged': 33872.0, 'virtualmem': 703053824.0, 'time': 9.9931234375}}
+{'var': [('concurrency', 28), ('args', '-test async-gated')], 'result': {'workingset': 22814720.0, 'privatemem': 26169344.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.376209375}}
+{'var': [('concurrency', 28), ('args', '-test async-gated')], 'result': {'workingset': 22528000.0, 'privatemem': 25866240.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.2378046875}}
+{'var': [('concurrency', 28), ('args', '-test async-gated')], 'result': {'workingset': 22761472.0, 'privatemem': 26128384.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.225084375}}
+{'var': [('concurrency', 28), ('args', '-test async-gated')], 'result': {'workingset': 22663168.0, 'privatemem': 26038272.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.23915625}}
+{'var': [('concurrency', 28), ('args', '-test async-gated')], 'result': {'workingset': 22831104.0, 'privatemem': 26140672.0, 'nonpaged': 25768.0, 'virtualmem': 564969472.0, 'time': 13.35693125}}
+{'var': [('concurrency', 28), ('args', '-test ums-gated')], 'result': {'workingset': 16650240.0, 'privatemem': 26861568.0, 'nonpaged': 34832.0, 'virtualmem': 719831040.0, 'time': 9.7327859375}}
+{'var': [('concurrency', 28), ('args', '-test ums-gated')], 'result': {'workingset': 16547840.0, 'privatemem': 26378240.0, 'nonpaged': 34352.0, 'virtualmem': 711442432.0, 'time': 9.775103125}}
+{'var': [('concurrency', 28), ('args', '-test ums-gated')], 'result': {'workingset': 16654336.0, 'privatemem': 26513408.0, 'nonpaged': 34472.0, 'virtualmem': 713539584.0, 'time': 9.8092875}}
+{'var': [('concurrency', 28), ('args', '-test ums-gated')], 'result': {'workingset': 16445440.0, 'privatemem': 26304512.0, 'nonpaged': 34352.0, 'virtualmem': 711442432.0, 'time': 9.834784375}}
+{'var': [('concurrency', 28), ('args', '-test ums-gated')], 'result': {'workingset': 16510976.0, 'privatemem': 26243072.0, 'nonpaged': 34112.0, 'virtualmem': 707248128.0, 'time': 9.9615171875}}
+{'var': [('concurrency', 32), ('args', '-test async-gated')], 'result': {'workingset': 22589440.0, 'privatemem': 26005504.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.234246875}}
+{'var': [('concurrency', 32), ('args', '-test async-gated')], 'result': {'workingset': 22814720.0, 'privatemem': 26140672.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.1942140625}}
+{'var': [('concurrency', 32), ('args', '-test async-gated')], 'result': {'workingset': 22704128.0, 'privatemem': 26079232.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.3161734375}}
+{'var': [('concurrency', 32), ('args', '-test async-gated')], 'result': {'workingset': 22708224.0, 'privatemem': 26030080.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.2072671875}}
+{'var': [('concurrency', 32), ('args', '-test async-gated')], 'result': {'workingset': 22691840.0, 'privatemem': 26120192.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.2228828125}}
+{'var': [('concurrency', 32), ('args', '-test ums-gated')], 'result': {'workingset': 16568320.0, 'privatemem': 27033600.0, 'nonpaged': 35312.0, 'virtualmem': 728219648.0, 'time': 9.8727921875}}
+{'var': [('concurrency', 32), ('args', '-test ums-gated')], 'result': {'workingset': 16764928.0, 'privatemem': 27238400.0, 'nonpaged': 35312.0, 'virtualmem': 728219648.0, 'time': 9.8168890625}}
+{'var': [('concurrency', 32), ('args', '-test ums-gated')], 'result': {'workingset': 16842752.0, 'privatemem': 27193344.0, 'nonpaged': 35192.0, 'virtualmem': 726122496.0, 'time': 9.8725515625}}
+{'var': [('concurrency', 32), ('args', '-test ums-gated')], 'result': {'workingset': 16732160.0, 'privatemem': 27230208.0, 'nonpaged': 35312.0, 'virtualmem': 728219648.0, 'time': 9.8796578125}}
+{'var': [('concurrency', 32), ('args', '-test ums-gated')], 'result': {'workingset': 16576512.0, 'privatemem': 26882048.0, 'nonpaged': 35072.0, 'virtualmem': 724025344.0, 'time': 9.851103125}}
+{'var': [('concurrency', 40), ('args', '-test async-gated')], 'result': {'workingset': 22679552.0, 'privatemem': 25993216.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.183775}}
+{'var': [('concurrency', 40), ('args', '-test async-gated')], 'result': {'workingset': 22642688.0, 'privatemem': 26030080.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.1523140625}}
+{'var': [('concurrency', 40), ('args', '-test async-gated')], 'result': {'workingset': 22642688.0, 'privatemem': 26009600.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.2646}}
+{'var': [('concurrency', 40), ('args', '-test async-gated')], 'result': {'workingset': 22609920.0, 'privatemem': 26025984.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.190975}}
+{'var': [('concurrency', 40), ('args', '-test async-gated')], 'result': {'workingset': 22806528.0, 'privatemem': 26173440.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.290859375}}
+{'var': [('concurrency', 40), ('args', '-test ums-gated')], 'result': {'workingset': 17313792.0, 'privatemem': 29270016.0, 'nonpaged': 38312.0, 'virtualmem': 780648448.0, 'time': 9.8081125}}
+{'var': [('concurrency', 40), ('args', '-test ums-gated')], 'result': {'workingset': 17297408.0, 'privatemem': 29560832.0, 'nonpaged': 38672.0, 'virtualmem': 786939904.0, 'time': 9.803896875}}
+{'var': [('concurrency', 40), ('args', '-test ums-gated')], 'result': {'workingset': 17514496.0, 'privatemem': 29667328.0, 'nonpaged': 38552.0, 'virtualmem': 784842752.0, 'time': 10.44371875}}
+{'var': [('concurrency', 40), ('args', '-test ums-gated')], 'result': {'workingset': 17350656.0, 'privatemem': 29356032.0, 'nonpaged': 38312.0, 'virtualmem': 780648448.0, 'time': 10.5586140625}}
+{'var': [('concurrency', 40), ('args', '-test ums-gated')], 'result': {'workingset': 17219584.0, 'privatemem': 29265920.0, 'nonpaged': 38072.0, 'virtualmem': 776454144.0, 'time': 11.02230625}}
+{'var': [('concurrency', 48), ('args', '-test async-gated')], 'result': {'workingset': 29392896.0, 'privatemem': 32837632.0, 'nonpaged': 25384.0, 'virtualmem': 556580864.0, 'time': 14.5534375}}
+{'var': [('concurrency', 48), ('args', '-test async-gated')], 'result': {'workingset': 29511680.0, 'privatemem': 32817152.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 15.04296875}}
+{'var': [('concurrency', 48), ('args', '-test async-gated')], 'result': {'workingset': 29323264.0, 'privatemem': 32690176.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.5768078125}}
+{'var': [('concurrency', 48), ('args', '-test async-gated')], 'result': {'workingset': 29327360.0, 'privatemem': 32718848.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.1712328125}}
+{'var': [('concurrency', 48), ('args', '-test async-gated')], 'result': {'workingset': 22704128.0, 'privatemem': 26030080.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.193025}}
+{'var': [('concurrency', 48), ('args', '-test ums-gated')], 'result': {'workingset': 17764352.0, 'privatemem': 30863360.0, 'nonpaged': 40232.0, 'virtualmem': 814202880.0, 'time': 9.7636984375}}
+{'var': [('concurrency', 48), ('args', '-test ums-gated')], 'result': {'workingset': 17707008.0, 'privatemem': 30818304.0, 'nonpaged': 40232.0, 'virtualmem': 814202880.0, 'time': 9.7707}}
+{'var': [('concurrency', 48), ('args', '-test ums-gated')], 'result': {'workingset': 17625088.0, 'privatemem': 30760960.0, 'nonpaged': 40232.0, 'virtualmem': 814202880.0, 'time': 9.812396875}}
+{'var': [('concurrency', 48), ('args', '-test ums-gated')], 'result': {'workingset': 17649664.0, 'privatemem': 30711808.0, 'nonpaged': 40232.0, 'virtualmem': 814202880.0, 'time': 10.313584375}}
+{'var': [('concurrency', 48), ('args', '-test ums-gated')], 'result': {'workingset': 17674240.0, 'privatemem': 30810112.0, 'nonpaged': 40232.0, 'virtualmem': 814202880.0, 'time': 9.8304125}}
+{'var': [('concurrency', 56), ('args', '-test async-gated')], 'result': {'workingset': 29548544.0, 'privatemem': 32927744.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.1279546875}}
+{'var': [('concurrency', 56), ('args', '-test async-gated')], 'result': {'workingset': 29532160.0, 'privatemem': 32894976.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.1256796875}}
+{'var': [('concurrency', 56), ('args', '-test async-gated')], 'result': {'workingset': 29585408.0, 'privatemem': 32956416.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.14424375}}
+{'var': [('concurrency', 56), ('args', '-test async-gated')], 'result': {'workingset': 29421568.0, 'privatemem': 32800768.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.1787703125}}
+{'var': [('concurrency', 56), ('args', '-test async-gated')], 'result': {'workingset': 29347840.0, 'privatemem': 32718848.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.121146875}}
+{'var': [('concurrency', 56), ('args', '-test ums-gated')], 'result': {'workingset': 17829888.0, 'privatemem': 32083968.0, 'nonpaged': 42152.0, 'virtualmem': 847757312.0, 'time': 9.7840515625}}
+{'var': [('concurrency', 56), ('args', '-test ums-gated')], 'result': {'workingset': 17981440.0, 'privatemem': 32190464.0, 'nonpaged': 42152.0, 'virtualmem': 847757312.0, 'time': 9.774884375}}
+{'var': [('concurrency', 56), ('args', '-test ums-gated')], 'result': {'workingset': 17907712.0, 'privatemem': 32178176.0, 'nonpaged': 42152.0, 'virtualmem': 847757312.0, 'time': 9.7712421875}}
+{'var': [('concurrency', 56), ('args', '-test ums-gated')], 'result': {'workingset': 17809408.0, 'privatemem': 32092160.0, 'nonpaged': 42152.0, 'virtualmem': 847757312.0, 'time': 9.883371875}}
+{'var': [('concurrency', 56), ('args', '-test ums-gated')], 'result': {'workingset': 18104320.0, 'privatemem': 32366592.0, 'nonpaged': 42152.0, 'virtualmem': 847757312.0, 'time': 9.8319875}}
+{'var': [('concurrency', 64), ('args', '-test async-gated')], 'result': {'workingset': 29380608.0, 'privatemem': 32731136.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.139365625}}
+{'var': [('concurrency', 64), ('args', '-test async-gated')], 'result': {'workingset': 29401088.0, 'privatemem': 32792576.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.1221734375}}
+{'var': [('concurrency', 64), ('args', '-test async-gated')], 'result': {'workingset': 29298688.0, 'privatemem': 32735232.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.3343921875}}
+{'var': [('concurrency', 64), ('args', '-test async-gated')], 'result': {'workingset': 29564928.0, 'privatemem': 32948224.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.144190625}}
+{'var': [('concurrency', 64), ('args', '-test async-gated')], 'result': {'workingset': 29511680.0, 'privatemem': 32894976.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.147003125}}
+{'var': [('concurrency', 64), ('args', '-test ums-gated')], 'result': {'workingset': 18358272.0, 'privatemem': 34308096.0, 'nonpaged': 45032.0, 'virtualmem': 898088960.0, 'time': 9.80116875}}
+{'var': [('concurrency', 64), ('args', '-test ums-gated')], 'result': {'workingset': 18325504.0, 'privatemem': 33714176.0, 'nonpaged': 44072.0, 'virtualmem': 881311744.0, 'time': 9.898659375}}
+{'var': [('concurrency', 64), ('args', '-test ums-gated')], 'result': {'workingset': 18300928.0, 'privatemem': 33689600.0, 'nonpaged': 44072.0, 'virtualmem': 881311744.0, 'time': 9.7784}}
+{'var': [('concurrency', 64), ('args', '-test ums-gated')], 'result': {'workingset': 18210816.0, 'privatemem': 33574912.0, 'nonpaged': 44072.0, 'virtualmem': 881311744.0, 'time': 9.9189640625}}
+{'var': [('concurrency', 64), ('args', '-test ums-gated')], 'result': {'workingset': 18202624.0, 'privatemem': 33566720.0, 'nonpaged': 44072.0, 'virtualmem': 881311744.0, 'time': 9.7934265625}}
+{'var': [('concurrency', 80), ('args', '-test async-gated')], 'result': {'workingset': 29495296.0, 'privatemem': 32886784.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.111571875}}
+{'var': [('concurrency', 80), ('args', '-test async-gated')], 'result': {'workingset': 29429760.0, 'privatemem': 32776192.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.199890625}}
+{'var': [('concurrency', 80), ('args', '-test async-gated')], 'result': {'workingset': 29442048.0, 'privatemem': 32886784.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.11831875}}
+{'var': [('concurrency', 80), ('args', '-test async-gated')], 'result': {'workingset': 29597696.0, 'privatemem': 32931840.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.1347890625}}
+{'var': [('concurrency', 80), ('args', '-test async-gated')], 'result': {'workingset': 29417472.0, 'privatemem': 32739328.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.171440625}}
+{'var': [('concurrency', 80), ('args', '-test ums-gated')], 'result': {'workingset': 19292160.0, 'privatemem': 38002688.0, 'nonpaged': 49832.0, 'virtualmem': 981975040.0, 'time': 9.7851578125}}
+{'var': [('concurrency', 80), ('args', '-test ums-gated')], 'result': {'workingset': 19222528.0, 'privatemem': 37990400.0, 'nonpaged': 49832.0, 'virtualmem': 981975040.0, 'time': 9.759603125}}
+{'var': [('concurrency', 80), ('args', '-test ums-gated')], 'result': {'workingset': 19308544.0, 'privatemem': 38092800.0, 'nonpaged': 49928.0, 'virtualmem': 981975040.0, 'time': 9.73698125}}
+{'var': [('concurrency', 80), ('args', '-test ums-gated')], 'result': {'workingset': 19214336.0, 'privatemem': 38002688.0, 'nonpaged': 49832.0, 'virtualmem': 981975040.0, 'time': 9.7582359375}}
+{'var': [('concurrency', 80), ('args', '-test ums-gated')], 'result': {'workingset': 19324928.0, 'privatemem': 38129664.0, 'nonpaged': 49832.0, 'virtualmem': 981975040.0, 'time': 9.7412640625}}
+{'var': [('concurrency', 96), ('args', '-test async-gated')], 'result': {'workingset': 29474816.0, 'privatemem': 32837632.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.169203125}}
+{'var': [('concurrency', 96), ('args', '-test async-gated')], 'result': {'workingset': 29614080.0, 'privatemem': 32976896.0, 'nonpaged': 25384.0, 'virtualmem': 556580864.0, 'time': 13.1191375}}
+{'var': [('concurrency', 96), ('args', '-test async-gated')], 'result': {'workingset': 29626368.0, 'privatemem': 32968704.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.1113484375}}
+{'var': [('concurrency', 96), ('args', '-test async-gated')], 'result': {'workingset': 29511680.0, 'privatemem': 33058816.0, 'nonpaged': 25640.0, 'virtualmem': 560775168.0, 'time': 13.1464140625}}
+{'var': [('concurrency', 96), ('args', '-test async-gated')], 'result': {'workingset': 29458432.0, 'privatemem': 32747520.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.1111234375}}
+{'var': [('concurrency', 96), ('args', '-test ums-gated')], 'result': {'workingset': 20041728.0, 'privatemem': 41103360.0, 'nonpaged': 53672.0, 'virtualmem': 1049083904.0, 'time': 9.7898}}
+{'var': [('concurrency', 96), ('args', '-test ums-gated')], 'result': {'workingset': 19968000.0, 'privatemem': 41009152.0, 'nonpaged': 53672.0, 'virtualmem': 1049083904.0, 'time': 9.855309375}}
+{'var': [('concurrency', 96), ('args', '-test ums-gated')], 'result': {'workingset': 19824640.0, 'privatemem': 40890368.0, 'nonpaged': 53672.0, 'virtualmem': 1049083904.0, 'time': 9.9260921875}}
+{'var': [('concurrency', 96), ('args', '-test ums-gated')], 'result': {'workingset': 19947520.0, 'privatemem': 41054208.0, 'nonpaged': 53672.0, 'virtualmem': 1049083904.0, 'time': 9.9416703125}}
+{'var': [('concurrency', 96), ('args', '-test ums-gated')], 'result': {'workingset': 19808256.0, 'privatemem': 40882176.0, 'nonpaged': 53672.0, 'virtualmem': 1049083904.0, 'time': 9.8916515625}}
+{'var': [('concurrency', 112), ('args', '-test async-gated')], 'result': {'workingset': 29691904.0, 'privatemem': 33034240.0, 'nonpaged': 25640.0, 'virtualmem': 560775168.0, 'time': 15.11079375}}
+{'var': [('concurrency', 112), ('args', '-test async-gated')], 'result': {'workingset': 29458432.0, 'privatemem': 32755712.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.1449734375}}
+{'var': [('concurrency', 112), ('args', '-test async-gated')], 'result': {'workingset': 29315072.0, 'privatemem': 32628736.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.13280625}}
+{'var': [('concurrency', 112), ('args', '-test async-gated')], 'result': {'workingset': 29417472.0, 'privatemem': 32788480.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.1016015625}}
+{'var': [('concurrency', 112), ('args', '-test async-gated')], 'result': {'workingset': 29417472.0, 'privatemem': 32735232.0, 'nonpaged': 25384.0, 'virtualmem': 556580864.0, 'time': 13.1100125}}
+{'var': [('concurrency', 112), ('args', '-test ums-gated')], 'result': {'workingset': 20836352.0, 'privatemem': 44212224.0, 'nonpaged': 57512.0, 'virtualmem': 1116192768.0, 'time': 10.02668125}}
+{'var': [('concurrency', 112), ('args', '-test ums-gated')], 'result': {'workingset': 20934656.0, 'privatemem': 44322816.0, 'nonpaged': 57512.0, 'virtualmem': 1116192768.0, 'time': 9.9877078125}}
+{'var': [('concurrency', 112), ('args', '-test ums-gated')], 'result': {'workingset': 21037056.0, 'privatemem': 45981696.0, 'nonpaged': 60152.0, 'virtualmem': 1162330112.0, 'time': 9.9358015625}}
+{'var': [('concurrency', 112), ('args', '-test ums-gated')], 'result': {'workingset': 20824064.0, 'privatemem': 44150784.0, 'nonpaged': 57512.0, 'virtualmem': 1116192768.0, 'time': 9.98304375}}
+{'var': [('concurrency', 112), ('args', '-test ums-gated')], 'result': {'workingset': 20856832.0, 'privatemem': 44257280.0, 'nonpaged': 57512.0, 'virtualmem': 1116192768.0, 'time': 10.009546875}}
+{'var': [('concurrency', 128), ('args', '-test async-gated')], 'result': {'workingset': 29589504.0, 'privatemem': 33009664.0, 'nonpaged': 25640.0, 'virtualmem': 560775168.0, 'time': 13.0923984375}}
+{'var': [('concurrency', 128), ('args', '-test async-gated')], 'result': {'workingset': 29470720.0, 'privatemem': 32874496.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.163709375}}
+{'var': [('concurrency', 128), ('args', '-test async-gated')], 'result': {'workingset': 29483008.0, 'privatemem': 32849920.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.1063703125}}
+{'var': [('concurrency', 128), ('args', '-test async-gated')], 'result': {'workingset': 29450240.0, 'privatemem': 32800768.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.0826171875}}
+{'var': [('concurrency', 128), ('args', '-test async-gated')], 'result': {'workingset': 29528064.0, 'privatemem': 32833536.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.086065625}}
+{'var': [('concurrency', 128), ('args', '-test ums-gated')], 'result': {'workingset': 21835776.0, 'privatemem': 48500736.0, 'nonpaged': 63032.0, 'virtualmem': 1212661760.0, 'time': 10.0842015625}}
+{'var': [('concurrency', 128), ('args', '-test ums-gated')], 'result': {'workingset': 21663744.0, 'privatemem': 47255552.0, 'nonpaged': 61352.0, 'virtualmem': 1183301632.0, 'time': 10.0181609375}}
+{'var': [('concurrency', 128), ('args', '-test ums-gated')], 'result': {'workingset': 21577728.0, 'privatemem': 47198208.0, 'nonpaged': 61352.0, 'virtualmem': 1183301632.0, 'time': 10.846165625}}
+{'var': [('concurrency', 128), ('args', '-test ums-gated')], 'result': {'workingset': 21389312.0, 'privatemem': 46759936.0, 'nonpaged': 61112.0, 'virtualmem': 1179107328.0, 'time': 11.5423390625}}
+{'var': [('concurrency', 128), ('args', '-test ums-gated')], 'result': {'workingset': 21254144.0, 'privatemem': 46899200.0, 'nonpaged': 61352.0, 'virtualmem': 1183301632.0, 'time': 11.306240625}}
+{'var': [('concurrency', 160), ('args', '-test async-gated')], 'result': {'workingset': 29491200.0, 'privatemem': 32927744.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.85168125}}
+{'var': [('concurrency', 160), ('args', '-test async-gated')], 'result': {'workingset': 29646848.0, 'privatemem': 33005568.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 14.58709375}}
+{'var': [('concurrency', 160), ('args', '-test async-gated')], 'result': {'workingset': 29536256.0, 'privatemem': 32862208.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.5917140625}}
+{'var': [('concurrency', 160), ('args', '-test async-gated')], 'result': {'workingset': 29532160.0, 'privatemem': 32821248.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.1530390625}}
+{'var': [('concurrency', 160), ('args', '-test async-gated')], 'result': {'workingset': 29405184.0, 'privatemem': 32788480.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.08974375}}
+{'var': [('concurrency', 160), ('args', '-test ums-gated')], 'result': {'workingset': 23420928.0, 'privatemem': 55808000.0, 'nonpaged': 72872.0, 'virtualmem': 1384628224.0, 'time': 10.2232734375}}
+{'var': [('concurrency', 160), ('args', '-test ums-gated')], 'result': {'workingset': 23494656.0, 'privatemem': 55554048.0, 'nonpaged': 72392.0, 'virtualmem': 1376239616.0, 'time': 10.3183484375}}
+{'var': [('concurrency', 160), ('args', '-test ums-gated')], 'result': {'workingset': 23584768.0, 'privatemem': 55844864.0, 'nonpaged': 72872.0, 'virtualmem': 1384628224.0, 'time': 10.3544203125}}
+{'var': [('concurrency', 160), ('args', '-test ums-gated')], 'result': {'workingset': 23617536.0, 'privatemem': 55844864.0, 'nonpaged': 72872.0, 'virtualmem': 1384628224.0, 'time': 10.2523703125}}
+{'var': [('concurrency', 160), ('args', '-test ums-gated')], 'result': {'workingset': 23609344.0, 'privatemem': 55885824.0, 'nonpaged': 72872.0, 'virtualmem': 1384628224.0, 'time': 10.154103125}}
+{'var': [('concurrency', 192), ('args', '-test async-gated')], 'result': {'workingset': 29544448.0, 'privatemem': 32878592.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.0866078125}}
+{'var': [('concurrency', 192), ('args', '-test async-gated')], 'result': {'workingset': 29507584.0, 'privatemem': 32878592.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.0993953125}}
+{'var': [('concurrency', 192), ('args', '-test async-gated')], 'result': {'workingset': 29483008.0, 'privatemem': 32841728.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.10189375}}
+{'var': [('concurrency', 192), ('args', '-test async-gated')], 'result': {'workingset': 29470720.0, 'privatemem': 32874496.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.0977}}
+{'var': [('concurrency', 192), ('args', '-test async-gated')], 'result': {'workingset': 29581312.0, 'privatemem': 32894976.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.0975171875}}
+{'var': [('concurrency', 192), ('args', '-test ums-gated')], 'result': {'workingset': 24719360.0, 'privatemem': 61693952.0, 'nonpaged': 80792.0, 'virtualmem': 1523040256.0, 'time': 10.415759375}}
+{'var': [('concurrency', 192), ('args', '-test ums-gated')], 'result': {'workingset': 24862720.0, 'privatemem': 61919232.0, 'nonpaged': 80792.0, 'virtualmem': 1523040256.0, 'time': 10.2971765625}}
+{'var': [('concurrency', 192), ('args', '-test ums-gated')], 'result': {'workingset': 24784896.0, 'privatemem': 61628416.0, 'nonpaged': 80552.0, 'virtualmem': 1518845952.0, 'time': 10.34406875}}
+{'var': [('concurrency', 192), ('args', '-test ums-gated')], 'result': {'workingset': 24969216.0, 'privatemem': 61984768.0, 'nonpaged': 80792.0, 'virtualmem': 1523040256.0, 'time': 10.2925640625}}
+{'var': [('concurrency', 192), ('args', '-test ums-gated')], 'result': {'workingset': 24752128.0, 'privatemem': 61415424.0, 'nonpaged': 80312.0, 'virtualmem': 1514651648.0, 'time': 10.284221875}}
+{'var': [('concurrency', 224), ('args', '-test async-gated')], 'result': {'workingset': 29650944.0, 'privatemem': 33046528.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.15705625}}
+{'var': [('concurrency', 224), ('args', '-test async-gated')], 'result': {'workingset': 29700096.0, 'privatemem': 33017856.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.122590625}}
+{'var': [('concurrency', 224), ('args', '-test async-gated')], 'result': {'workingset': 29659136.0, 'privatemem': 33026048.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.08970625}}
+{'var': [('concurrency', 224), ('args', '-test async-gated')], 'result': {'workingset': 29491200.0, 'privatemem': 32915456.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.1275171875}}
+{'var': [('concurrency', 224), ('args', '-test async-gated')], 'result': {'workingset': 29532160.0, 'privatemem': 32882688.0, 'nonpaged': 25384.0, 'virtualmem': 556580864.0, 'time': 13.14285}}
+{'var': [('concurrency', 224), ('args', '-test ums-gated')], 'result': {'workingset': 26378240.0, 'privatemem': 67780608.0, 'nonpaged': 88352.0, 'virtualmem': 1657257984.0, 'time': 10.4648703125}}
+{'var': [('concurrency', 224), ('args', '-test ums-gated')], 'result': {'workingset': 26124288.0, 'privatemem': 67293184.0, 'nonpaged': 88112.0, 'virtualmem': 1653063680.0, 'time': 10.5292671875}}
+{'var': [('concurrency', 224), ('args', '-test ums-gated')], 'result': {'workingset': 26046464.0, 'privatemem': 67276800.0, 'nonpaged': 87992.0, 'virtualmem': 1648869376.0, 'time': 10.491190625}}
+{'var': [('concurrency', 224), ('args', '-test ums-gated')], 'result': {'workingset': 26034176.0, 'privatemem': 67489792.0, 'nonpaged': 88232.0, 'virtualmem': 1653063680.0, 'time': 10.5243890625}}
+{'var': [('concurrency', 224), ('args', '-test ums-gated')], 'result': {'workingset': 26234880.0, 'privatemem': 67649536.0, 'nonpaged': 88352.0, 'virtualmem': 1657257984.0, 'time': 10.5925109375}}
+{'var': [('concurrency', 256), ('args', '-test async-gated')], 'result': {'workingset': 29548544.0, 'privatemem': 32944128.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.150478125}}
+{'var': [('concurrency', 256), ('args', '-test async-gated')], 'result': {'workingset': 29741056.0, 'privatemem': 33099776.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.1190796875}}
+{'var': [('concurrency', 256), ('args', '-test async-gated')], 'result': {'workingset': 29720576.0, 'privatemem': 33005568.0, 'nonpaged': 25384.0, 'virtualmem': 556580864.0, 'time': 13.178025}}
+{'var': [('concurrency', 256), ('args', '-test async-gated')], 'result': {'workingset': 29536256.0, 'privatemem': 32948224.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.1318578125}}
+{'var': [('concurrency', 256), ('args', '-test async-gated')], 'result': {'workingset': 29933568.0, 'privatemem': 33325056.0, 'nonpaged': 26120.0, 'virtualmem': 569163776.0, 'time': 13.130896875}}
+{'var': [('concurrency', 256), ('args', '-test ums-gated')], 'result': {'workingset': 27303936.0, 'privatemem': 73404416.0, 'nonpaged': 96272.0, 'virtualmem': 1795670016.0, 'time': 10.5394765625}}
+{'var': [('concurrency', 256), ('args', '-test ums-gated')], 'result': {'workingset': 27607040.0, 'privatemem': 73625600.0, 'nonpaged': 96032.0, 'virtualmem': 1791475712.0, 'time': 10.565934375}}
+{'var': [('concurrency', 256), ('args', '-test ums-gated')], 'result': {'workingset': 27287552.0, 'privatemem': 72835072.0, 'nonpaged': 95552.0, 'virtualmem': 1783087104.0, 'time': 10.6236890625}}
+{'var': [('concurrency', 256), ('args', '-test ums-gated')], 'result': {'workingset': 27480064.0, 'privatemem': 73379840.0, 'nonpaged': 96032.0, 'virtualmem': 1791475712.0, 'time': 10.57548125}}
+{'var': [('concurrency', 256), ('args', '-test ums-gated')], 'result': {'workingset': 27201536.0, 'privatemem': 73240576.0, 'nonpaged': 96032.0, 'virtualmem': 1791475712.0, 'time': 10.68160625}}
+{'var': [('concurrency', 320), ('args', '-test async-gated')], 'result': {'workingset': 29671424.0, 'privatemem': 33038336.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.175703125}}
+{'var': [('concurrency', 320), ('args', '-test async-gated')], 'result': {'workingset': 29827072.0, 'privatemem': 33165312.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.1375234375}}
+{'var': [('concurrency', 320), ('args', '-test async-gated')], 'result': {'workingset': 29777920.0, 'privatemem': 33116160.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.121140625}}
+{'var': [('concurrency', 320), ('args', '-test async-gated')], 'result': {'workingset': 29589504.0, 'privatemem': 32870400.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.1075078125}}
+{'var': [('concurrency', 320), ('args', '-test async-gated')], 'result': {'workingset': 29704192.0, 'privatemem': 33001472.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.150696875}}
+{'var': [('concurrency', 320), ('args', '-test ums-gated')], 'result': {'workingset': 29577216.0, 'privatemem': 84500480.0, 'nonpaged': 111152.0, 'virtualmem': 2055716864.0, 'time': 10.8671703125}}
+{'var': [('concurrency', 320), ('args', '-test ums-gated')], 'result': {'workingset': 29835264.0, 'privatemem': 84918272.0, 'nonpaged': 111392.0, 'virtualmem': 2059911168.0, 'time': 10.893078125}}
+{'var': [('concurrency', 320), ('args', '-test ums-gated')], 'result': {'workingset': 29667328.0, 'privatemem': 84197376.0, 'nonpaged': 110672.0, 'virtualmem': 2047328256.0, 'time': 10.899709375}}
+{'var': [('concurrency', 320), ('args', '-test ums-gated')], 'result': {'workingset': 29663232.0, 'privatemem': 84520960.0, 'nonpaged': 111152.0, 'virtualmem': 2055716864.0, 'time': 10.9027828125}}
+{'var': [('concurrency', 320), ('args', '-test ums-gated')], 'result': {'workingset': 29720576.0, 'privatemem': 84615168.0, 'nonpaged': 111152.0, 'virtualmem': 2055716864.0, 'time': 10.904421875}}
+{'var': [('concurrency', 384), ('args', '-test async-gated')], 'result': {'workingset': 29646848.0, 'privatemem': 32960512.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.132984375}}
+{'var': [('concurrency', 384), ('args', '-test async-gated')], 'result': {'workingset': 29839360.0, 'privatemem': 33132544.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.13160625}}
+{'var': [('concurrency', 384), ('args', '-test async-gated')], 'result': {'workingset': 29978624.0, 'privatemem': 33378304.0, 'nonpaged': 25880.0, 'virtualmem': 564969472.0, 'time': 13.1281796875}}
+{'var': [('concurrency', 384), ('args', '-test async-gated')], 'result': {'workingset': 29798400.0, 'privatemem': 33095680.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.1194140625}}
+{'var': [('concurrency', 384), ('args', '-test async-gated')], 'result': {'workingset': 29880320.0, 'privatemem': 33148928.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.140121875}}
+{'var': [('concurrency', 384), ('args', '-test ums-gated')], 'result': {'workingset': 32329728.0, 'privatemem': 96473088.0, 'nonpaged': 126752.0, 'virtualmem': 2328346624.0, 'time': 11.03265625}}
+{'var': [('concurrency', 384), ('args', '-test ums-gated')], 'result': {'workingset': 32165888.0, 'privatemem': 96047104.0, 'nonpaged': 126272.0, 'virtualmem': 2319958016.0, 'time': 11.1066328125}}
+{'var': [('concurrency', 384), ('args', '-test ums-gated')], 'result': {'workingset': 32178176.0, 'privatemem': 96284672.0, 'nonpaged': 126512.0, 'virtualmem': 2324152320.0, 'time': 11.0177765625}}
+{'var': [('concurrency', 384), ('args', '-test ums-gated')], 'result': {'workingset': 32161792.0, 'privatemem': 96284672.0, 'nonpaged': 126752.0, 'virtualmem': 2328346624.0, 'time': 11.15135}}
+{'var': [('concurrency', 384), ('args', '-test ums-gated')], 'result': {'workingset': 32096256.0, 'privatemem': 96309248.0, 'nonpaged': 126752.0, 'virtualmem': 2328346624.0, 'time': 11.1041015625}}
+{'var': [('concurrency', 448), ('args', '-test async-gated')], 'result': {'workingset': 29798400.0, 'privatemem': 33148928.0, 'nonpaged': 25384.0, 'virtualmem': 556580864.0, 'time': 13.127125}}
+{'var': [('concurrency', 448), ('args', '-test async-gated')], 'result': {'workingset': 29913088.0, 'privatemem': 33284096.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.1395265625}}
+{'var': [('concurrency', 448), ('args', '-test async-gated')], 'result': {'workingset': 29921280.0, 'privatemem': 33263616.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.136646875}}
+{'var': [('concurrency', 448), ('args', '-test async-gated')], 'result': {'workingset': 29761536.0, 'privatemem': 33140736.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.1379828125}}
+{'var': [('concurrency', 448), ('args', '-test async-gated')], 'result': {'workingset': 29818880.0, 'privatemem': 33173504.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 14.7975015625}}
+{'var': [('concurrency', 448), ('args', '-test ums-gated')], 'result': {'workingset': 34549760.0, 'privatemem': 107462656.0, 'nonpaged': 141632.0, 'virtualmem': 2588393472.0, 'time': 12.9889609375}}
+{'var': [('concurrency', 448), ('args', '-test ums-gated')], 'result': {'workingset': 34643968.0, 'privatemem': 108085248.0, 'nonpaged': 142352.0, 'virtualmem': 2600976384.0, 'time': 13.0880796875}}
+{'var': [('concurrency', 448), ('args', '-test ums-gated')], 'result': {'workingset': 34697216.0, 'privatemem': 107810816.0, 'nonpaged': 141872.0, 'virtualmem': 2592587776.0, 'time': 13.2690765625}}
+{'var': [('concurrency', 448), ('args', '-test ums-gated')], 'result': {'workingset': 34508800.0, 'privatemem': 107683840.0, 'nonpaged': 141872.0, 'virtualmem': 2592587776.0, 'time': 12.4901671875}}
+{'var': [('concurrency', 448), ('args', '-test ums-gated')], 'result': {'workingset': 34443264.0, 'privatemem': 107638784.0, 'nonpaged': 141872.0, 'virtualmem': 2592587776.0, 'time': 11.23786875}}
+{'var': [('concurrency', 512), ('args', '-test async-gated')], 'result': {'workingset': 29847552.0, 'privatemem': 33222656.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.127740625}}
+{'var': [('concurrency', 512), ('args', '-test async-gated')], 'result': {'workingset': 29859840.0, 'privatemem': 33206272.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.22630625}}
+{'var': [('concurrency', 512), ('args', '-test async-gated')], 'result': {'workingset': 29896704.0, 'privatemem': 33259520.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.1849640625}}
+{'var': [('concurrency', 512), ('args', '-test async-gated')], 'result': {'workingset': 29884416.0, 'privatemem': 33206272.0, 'nonpaged': 25384.0, 'virtualmem': 556580864.0, 'time': 13.13985}}
+{'var': [('concurrency', 512), ('args', '-test async-gated')], 'result': {'workingset': 30007296.0, 'privatemem': 33333248.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.1424328125}}
+{'var': [('concurrency', 512), ('args', '-test ums-gated')], 'result': {'workingset': 37142528.0, 'privatemem': 119185408.0, 'nonpaged': 156992.0, 'virtualmem': 2856828928.0, 'time': 11.397996875}}
+{'var': [('concurrency', 512), ('args', '-test ums-gated')], 'result': {'workingset': 37056512.0, 'privatemem': 119328768.0, 'nonpaged': 157232.0, 'virtualmem': 2861023232.0, 'time': 11.38355}}
+{'var': [('concurrency', 512), ('args', '-test ums-gated')], 'result': {'workingset': 37068800.0, 'privatemem': 119164928.0, 'nonpaged': 156992.0, 'virtualmem': 2856828928.0, 'time': 11.4034015625}}
+{'var': [('concurrency', 512), ('args', '-test ums-gated')], 'result': {'workingset': 37187584.0, 'privatemem': 119382016.0, 'nonpaged': 157232.0, 'virtualmem': 2861023232.0, 'time': 11.341525}}
+{'var': [('concurrency', 512), ('args', '-test ums-gated')], 'result': {'workingset': 37076992.0, 'privatemem': 119296000.0, 'nonpaged': 157232.0, 'virtualmem': 2861023232.0, 'time': 11.373334375}}
+{'var': [('concurrency', 640), ('args', '-test async-gated')], 'result': {'workingset': 30105600.0, 'privatemem': 33378304.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.18291875}}
+{'var': [('concurrency', 640), ('args', '-test async-gated')], 'result': {'workingset': 30064640.0, 'privatemem': 33406976.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.201753125}}
+{'var': [('concurrency', 640), ('args', '-test async-gated')], 'result': {'workingset': 30154752.0, 'privatemem': 33447936.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.1939015625}}
+{'var': [('concurrency', 640), ('args', '-test async-gated')], 'result': {'workingset': 30044160.0, 'privatemem': 33349632.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.2285859375}}
+{'var': [('concurrency', 640), ('args', '-test async-gated')], 'result': {'workingset': 30068736.0, 'privatemem': 33341440.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.1834984375}}
+{'var': [('concurrency', 640), ('args', '-test ums-gated')], 'result': {'workingset': 47366144.0, 'privatemem': 141705216.0, 'nonpaged': 188192.0, 'virtualmem': 3402088448.0, 'time': 11.7742625}}
+{'var': [('concurrency', 640), ('args', '-test ums-gated')], 'result': {'workingset': 47321088.0, 'privatemem': 141434880.0, 'nonpaged': 187712.0, 'virtualmem': 3393699840.0, 'time': 11.8519890625}}
+{'var': [('concurrency', 640), ('args', '-test ums-gated')], 'result': {'workingset': 47198208.0, 'privatemem': 141729792.0, 'nonpaged': 188432.0, 'virtualmem': 3406282752.0, 'time': 11.8748625}}
+{'var': [('concurrency', 640), ('args', '-test ums-gated')], 'result': {'workingset': 47349760.0, 'privatemem': 141578240.0, 'nonpaged': 187952.0, 'virtualmem': 3397894144.0, 'time': 11.80855625}}
+{'var': [('concurrency', 640), ('args', '-test ums-gated')], 'result': {'workingset': 47333376.0, 'privatemem': 141635584.0, 'nonpaged': 188192.0, 'virtualmem': 3402088448.0, 'time': 11.8793171875}}
+{'var': [('concurrency', 768), ('args', '-test async-gated')], 'result': {'workingset': 30441472.0, 'privatemem': 33677312.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.1907140625}}
+{'var': [('concurrency', 768), ('args', '-test async-gated')], 'result': {'workingset': 30380032.0, 'privatemem': 33607680.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.224996875}}
+{'var': [('concurrency', 768), ('args', '-test async-gated')], 'result': {'workingset': 30326784.0, 'privatemem': 33628160.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.1955234375}}
+{'var': [('concurrency', 768), ('args', '-test async-gated')], 'result': {'workingset': 30355456.0, 'privatemem': 33726464.0, 'nonpaged': 26008.0, 'virtualmem': 569163776.0, 'time': 13.1947671875}}
+{'var': [('concurrency', 768), ('args', '-test async-gated')], 'result': {'workingset': 30322688.0, 'privatemem': 33738752.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.2064796875}}
+{'var': [('concurrency', 768), ('args', '-test ums-gated')], 'result': {'workingset': 52543488.0, 'privatemem': 163958784.0, 'nonpaged': 219032.0, 'virtualmem': 3947347968.0, 'time': 11.974178125}}
+{'var': [('concurrency', 768), ('args', '-test ums-gated')], 'result': {'workingset': 52502528.0, 'privatemem': 164315136.0, 'nonpaged': 219512.0, 'virtualmem': 3955736576.0, 'time': 11.9167046875}}
+{'var': [('concurrency', 768), ('args', '-test ums-gated')], 'result': {'workingset': 52707328.0, 'privatemem': 164122624.0, 'nonpaged': 219032.0, 'virtualmem': 3947347968.0, 'time': 12.118128125}}
+{'var': [('concurrency', 768), ('args', '-test ums-gated')], 'result': {'workingset': 52293632.0, 'privatemem': 163651584.0, 'nonpaged': 218792.0, 'virtualmem': 3943153664.0, 'time': 12.049109375}}
+{'var': [('concurrency', 768), ('args', '-test ums-gated')], 'result': {'workingset': 52748288.0, 'privatemem': 163999744.0, 'nonpaged': 219032.0, 'virtualmem': 3947347968.0, 'time': 12.0723515625}}
+{'var': [('concurrency', 896), ('args', '-test async-gated')], 'result': {'workingset': 30642176.0, 'privatemem': 33882112.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.1681703125}}
+{'var': [('concurrency', 896), ('args', '-test async-gated')], 'result': {'workingset': 30302208.0, 'privatemem': 33697792.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.1825015625}}
+{'var': [('concurrency', 896), ('args', '-test async-gated')], 'result': {'workingset': 30408704.0, 'privatemem': 33726464.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.2253203125}}
+{'var': [('concurrency', 896), ('args', '-test async-gated')], 'result': {'workingset': 30486528.0, 'privatemem': 33800192.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.250696875}}
+{'var': [('concurrency', 896), ('args', '-test async-gated')], 'result': {'workingset': 30560256.0, 'privatemem': 33894400.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.174471875}}
+{'var': [('concurrency', 896), ('args', '-test ums-gated')], 'result': {'workingset': 58105856.0, 'privatemem': 186347520.0, 'nonpaged': 249512.0, 'virtualmem': 4480024576.0, 'time': 12.09041875}}
+{'var': [('concurrency', 896), ('args', '-test ums-gated')], 'result': {'workingset': 57851904.0, 'privatemem': 186142720.0, 'nonpaged': 249752.0, 'virtualmem': 4484218880.0, 'time': 11.9983140625}}
+{'var': [('concurrency', 896), ('args', '-test ums-gated')], 'result': {'workingset': 57663488.0, 'privatemem': 185761792.0, 'nonpaged': 249512.0, 'virtualmem': 4480024576.0, 'time': 12.26386875}}
+{'var': [('concurrency', 896), ('args', '-test ums-gated')], 'result': {'workingset': 57929728.0, 'privatemem': 186257408.0, 'nonpaged': 249752.0, 'virtualmem': 4484218880.0, 'time': 11.9970984375}}
+{'var': [('concurrency', 896), ('args', '-test ums-gated')], 'result': {'workingset': 58085376.0, 'privatemem': 186654720.0, 'nonpaged': 249752.0, 'virtualmem': 4484218880.0, 'time': 12.0862875}}
+{'var': [('concurrency', 1024), ('args', '-test async-gated')], 'result': {'workingset': 30867456.0, 'privatemem': 34107392.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.2160328125}}
+{'var': [('concurrency', 1024), ('args', '-test async-gated')], 'result': {'workingset': 30945280.0, 'privatemem': 34258944.0, 'nonpaged': 25384.0, 'virtualmem': 556580864.0, 'time': 13.2101375}}
+{'var': [('concurrency', 1024), ('args', '-test async-gated')], 'result': {'workingset': 31059968.0, 'privatemem': 34291712.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.3171546875}}
+{'var': [('concurrency', 1024), ('args', '-test async-gated')], 'result': {'workingset': 31064064.0, 'privatemem': 34279424.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.2282890625}}
+{'var': [('concurrency', 1024), ('args', '-test async-gated')], 'result': {'workingset': 31006720.0, 'privatemem': 34263040.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.209078125}}
+{'var': [('concurrency', 1024), ('args', '-test ums-gated')], 'result': {'workingset': 63021056.0, 'privatemem': 208171008.0, 'nonpaged': 280232.0, 'virtualmem': 5016895488.0, 'time': 13.048375}}
+{'var': [('concurrency', 1024), ('args', '-test ums-gated')], 'result': {'workingset': 63369216.0, 'privatemem': 208424960.0, 'nonpaged': 280232.0, 'virtualmem': 5016895488.0, 'time': 12.2770109375}}
+{'var': [('concurrency', 1024), ('args', '-test ums-gated')], 'result': {'workingset': 63447040.0, 'privatemem': 208539648.0, 'nonpaged': 279992.0, 'virtualmem': 5012701184.0, 'time': 12.228196875}}
+{'var': [('concurrency', 1024), ('args', '-test ums-gated')], 'result': {'workingset': 63488000.0, 'privatemem': 208715776.0, 'nonpaged': 280232.0, 'virtualmem': 5016895488.0, 'time': 12.670853125}}
+{'var': [('concurrency', 1024), ('args', '-test ums-gated')], 'result': {'workingset': 63070208.0, 'privatemem': 208207872.0, 'nonpaged': 279992.0, 'virtualmem': 5012701184.0, 'time': 12.4422}}
+{'var': [('concurrency', 1280), ('args', '-test async-gated')], 'result': {'workingset': 31617024.0, 'privatemem': 34848768.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.2811921875}}
+{'var': [('concurrency', 1280), ('args', '-test async-gated')], 'result': {'workingset': 31719424.0, 'privatemem': 34897920.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.22355625}}
+{'var': [('concurrency', 1280), ('args', '-test async-gated')], 'result': {'workingset': 31494144.0, 'privatemem': 34746368.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.22349375}}
+{'var': [('concurrency', 1280), ('args', '-test async-gated')], 'result': {'workingset': 31694848.0, 'privatemem': 34947072.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.2325609375}}
+{'var': [('concurrency', 1280), ('args', '-test async-gated')], 'result': {'workingset': 31547392.0, 'privatemem': 34807808.0, 'nonpaged': 25640.0, 'virtualmem': 560775168.0, 'time': 13.767953125}}
+{'var': [('concurrency', 1280), ('args', '-test ums-gated')], 'result': {'workingset': 73158656.0, 'privatemem': 252420096.0, 'nonpaged': 341912.0, 'virtualmem': 6094831616.0, 'time': 15.0598109375}}
+{'var': [('concurrency', 1280), ('args', '-test ums-gated')], 'result': {'workingset': 65974272.0, 'privatemem': 252903424.0, 'nonpaged': 342152.0, 'virtualmem': 6099025920.0, 'time': 13.8913953125}}
+{'var': [('concurrency', 1280), ('args', '-test ums-gated')], 'result': {'workingset': 66895872.0, 'privatemem': 253501440.0, 'nonpaged': 342632.0, 'virtualmem': 6107414528.0, 'time': 13.2943546875}}
+{'var': [('concurrency', 1280), ('args', '-test ums-gated')], 'result': {'workingset': 67772416.0, 'privatemem': 252964864.0, 'nonpaged': 341912.0, 'virtualmem': 6094831616.0, 'time': 12.7788609375}}
+{'var': [('concurrency', 1280), ('args', '-test ums-gated')], 'result': {'workingset': 66498560.0, 'privatemem': 252874752.0, 'nonpaged': 341912.0, 'virtualmem': 6094831616.0, 'time': 12.8031625}}
+{'var': [('concurrency', 1536), ('args', '-test async-gated')], 'result': {'workingset': 24178688.0, 'privatemem': 27402240.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.357275}}
+{'var': [('concurrency', 1536), ('args', '-test async-gated')], 'result': {'workingset': 23916544.0, 'privatemem': 27070464.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.3384296875}}
+{'var': [('concurrency', 1536), ('args', '-test async-gated')], 'result': {'workingset': 24154112.0, 'privatemem': 27303936.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.3860484375}}
+{'var': [('concurrency', 1536), ('args', '-test async-gated')], 'result': {'workingset': 24080384.0, 'privatemem': 27303936.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.40868125}}
+{'var': [('concurrency', 1536), ('args', '-test async-gated')], 'result': {'workingset': 23764992.0, 'privatemem': 26914816.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.3454890625}}
+{'var': [('concurrency', 1536), ('args', '-test ums-gated')], 'result': {'workingset': 74870784.0, 'privatemem': 296960000.0, 'nonpaged': 403512.0, 'virtualmem': 7172767744.0, 'time': 13.6358265625}}
+{'var': [('concurrency', 1536), ('args', '-test ums-gated')], 'result': {'workingset': 84811776.0, 'privatemem': 298262528.0, 'nonpaged': 403832.0, 'virtualmem': 7176962048.0, 'time': 14.18599375}}
+{'var': [('concurrency', 1536), ('args', '-test ums-gated')], 'result': {'workingset': 75407360.0, 'privatemem': 296779776.0, 'nonpaged': 403592.0, 'virtualmem': 7172767744.0, 'time': 13.6721390625}}
+{'var': [('concurrency', 1536), ('args', '-test ums-gated')], 'result': {'workingset': 75026432.0, 'privatemem': 296505344.0, 'nonpaged': 403112.0, 'virtualmem': 7164379136.0, 'time': 13.3102890625}}
+{'var': [('concurrency', 1536), ('args', '-test ums-gated')], 'result': {'workingset': 74461184.0, 'privatemem': 296538112.0, 'nonpaged': 403272.0, 'virtualmem': 7168573440.0, 'time': 14.0042234375}}
+{'var': [('concurrency', 1792), ('args', '-test async-gated')], 'result': {'workingset': 24694784.0, 'privatemem': 27824128.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.3436484375}}
+{'var': [('concurrency', 1792), ('args', '-test async-gated')], 'result': {'workingset': 24739840.0, 'privatemem': 27815936.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.3563359375}}
+{'var': [('concurrency', 1792), ('args', '-test async-gated')], 'result': {'workingset': 24772608.0, 'privatemem': 27918336.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.4315375}}
+{'var': [('concurrency', 1792), ('args', '-test async-gated')], 'result': {'workingset': 24756224.0, 'privatemem': 27865088.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.345803125}}
+{'var': [('concurrency', 1792), ('args', '-test async-gated')], 'result': {'workingset': 24608768.0, 'privatemem': 27750400.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.402634375}}
+{'var': [('concurrency', 1792), ('args', '-test ums-gated')], 'result': {'workingset': 95748096.0, 'privatemem': 343252992.0, 'nonpaged': 465312.0, 'virtualmem': 8267284480.0, 'time': 14.8233890625}}
+{'var': [('concurrency', 1792), ('args', '-test ums-gated')], 'result': {'workingset': 96260096.0, 'privatemem': 343367680.0, 'nonpaged': 465072.0, 'virtualmem': 8263090176.0, 'time': 14.9048890625}}
+{'var': [('concurrency', 1792), ('args', '-test ums-gated')], 'result': {'workingset': 95764480.0, 'privatemem': 342867968.0, 'nonpaged': 465072.0, 'virtualmem': 8263090176.0, 'time': 14.65851875}}
+{'var': [('concurrency', 1792), ('args', '-test ums-gated')], 'result': {'workingset': 95637504.0, 'privatemem': 342515712.0, 'nonpaged': 464832.0, 'virtualmem': 8258895872.0, 'time': 14.7174265625}}
+{'var': [('concurrency', 1792), ('args', '-test ums-gated')], 'result': {'workingset': 95924224.0, 'privatemem': 342884352.0, 'nonpaged': 464832.0, 'virtualmem': 8258895872.0, 'time': 14.8882921875}}
+{'var': [('concurrency', 2048), ('args', '-test async-gated')], 'result': {'workingset': 25047040.0, 'privatemem': 28094464.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.3807953125}}
+{'var': [('concurrency', 2048), ('args', '-test async-gated')], 'result': {'workingset': 24981504.0, 'privatemem': 28151808.0, 'nonpaged': 25640.0, 'virtualmem': 560775168.0, 'time': 13.398909375}}
+{'var': [('concurrency', 2048), ('args', '-test async-gated')], 'result': {'workingset': 25075712.0, 'privatemem': 28147712.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.359221875}}
+{'var': [('concurrency', 2048), ('args', '-test async-gated')], 'result': {'workingset': 25006080.0, 'privatemem': 28098560.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.3784}}
+{'var': [('concurrency', 2048), ('args', '-test async-gated')], 'result': {'workingset': 24997888.0, 'privatemem': 28069888.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.3560390625}}
+{'var': [('concurrency', 2048), ('args', '-test ums-gated')], 'result': {'workingset': 105529344.0, 'privatemem': 386404352.0, 'nonpaged': 526512.0, 'virtualmem': 9336832000.0, 'time': 15.17243125}}
+{'var': [('concurrency', 2048), ('args', '-test ums-gated')], 'result': {'workingset': 106209280.0, 'privatemem': 387317760.0, 'nonpaged': 526992.0, 'virtualmem': 9345220608.0, 'time': 15.41375625}}
+{'var': [('concurrency', 2048), ('args', '-test ums-gated')], 'result': {'workingset': 107094016.0, 'privatemem': 388059136.0, 'nonpaged': 526752.0, 'virtualmem': 9341026304.0, 'time': 15.4270546875}}
+{'var': [('concurrency', 2048), ('args', '-test ums-gated')], 'result': {'workingset': 106483712.0, 'privatemem': 387428352.0, 'nonpaged': 526272.0, 'virtualmem': 9332637696.0, 'time': 15.0365046875}}
+{'var': [('concurrency', 2048), ('args', '-test ums-gated')], 'result': {'workingset': 106057728.0, 'privatemem': 386617344.0, 'nonpaged': 526272.0, 'virtualmem': 9332637696.0, 'time': 15.11465}}
+{'var': [('concurrency', 2560), ('args', '-test async-gated')], 'result': {'workingset': 25714688.0, 'privatemem': 28733440.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.4772109375}}
+{'var': [('concurrency', 2560), ('args', '-test async-gated')], 'result': {'workingset': 29986816.0, 'privatemem': 33038336.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.39680625}}
+{'var': [('concurrency', 2560), ('args', '-test async-gated')], 'result': {'workingset': 30007296.0, 'privatemem': 33005568.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.43141875}}
+{'var': [('concurrency', 2560), ('args', '-test async-gated')], 'result': {'workingset': 25714688.0, 'privatemem': 28782592.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.4375484375}}
+{'var': [('concurrency', 2560), ('args', '-test async-gated')], 'result': {'workingset': 29941760.0, 'privatemem': 33050624.0, 'nonpaged': 25528.0, 'virtualmem': 560775168.0, 'time': 13.40918125}}
+{'var': [('concurrency', 2560), ('args', '-test ums-gated')], 'result': {'workingset': 124895232.0, 'privatemem': 473268224.0, 'nonpaged': 649152.0, 'virtualmem': 11480121344.0, 'time': 15.8352921875}}
+{'var': [('concurrency', 2560), ('args', '-test ums-gated')], 'result': {'workingset': 125243392.0, 'privatemem': 474202112.0, 'nonpaged': 649152.0, 'virtualmem': 11480121344.0, 'time': 15.9860609375}}
+{'var': [('concurrency', 2560), ('args', '-test ums-gated')], 'result': {'workingset': 126054400.0, 'privatemem': 474787840.0, 'nonpaged': 648912.0, 'virtualmem': 11475927040.0, 'time': 15.8798015625}}
+{'var': [('concurrency', 2560), ('args', '-test ums-gated')], 'result': {'workingset': 125100032.0, 'privatemem': 473649152.0, 'nonpaged': 648912.0, 'virtualmem': 11475927040.0, 'time': 15.90209375}}
+{'var': [('concurrency', 2560), ('args', '-test ums-gated')], 'result': {'workingset': 127406080.0, 'privatemem': 482037760.0, 'nonpaged': 658512.0, 'virtualmem': 11643699200.0, 'time': 16.0772640625}}
+{'var': [('concurrency', 3072), ('args', '-test async-gated')], 'result': {'workingset': 30760960.0, 'privatemem': 33771520.0, 'nonpaged': 25640.0, 'virtualmem': 560775168.0, 'time': 13.4638640625}}
+{'var': [('concurrency', 3072), ('args', '-test async-gated')], 'result': {'workingset': 30720000.0, 'privatemem': 33730560.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.4992015625}}
+{'var': [('concurrency', 3072), ('args', '-test async-gated')], 'result': {'workingset': 30593024.0, 'privatemem': 33632256.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.460190625}}
+{'var': [('concurrency', 3072), ('args', '-test async-gated')], 'result': {'workingset': 30691328.0, 'privatemem': 33710080.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.584534375}}
+{'var': [('concurrency', 3072), ('args', '-test async-gated')], 'result': {'workingset': 30756864.0, 'privatemem': 33738752.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 14.8325828125}}
+{'var': [('concurrency', 3072), ('args', '-test ums-gated')], 'result': {'workingset': 145821696.0, 'privatemem': 562421760.0, 'nonpaged': 772032.0, 'virtualmem': 13627604992.0, 'time': 18.0121359375}}
+{'var': [('concurrency', 3072), ('args', '-test ums-gated')], 'result': {'workingset': 145391616.0, 'privatemem': 562782208.0, 'nonpaged': 772416.0, 'virtualmem': 13635993600.0, 'time': 16.273371875}}
+{'var': [('concurrency', 3072), ('args', '-test ums-gated')], 'result': {'workingset': 145211392.0, 'privatemem': 561577984.0, 'nonpaged': 771936.0, 'virtualmem': 13627604992.0, 'time': 16.684478125}}
+{'var': [('concurrency', 3072), ('args', '-test ums-gated')], 'result': {'workingset': 145367040.0, 'privatemem': 561598464.0, 'nonpaged': 771936.0, 'virtualmem': 13627604992.0, 'time': 16.70395}}
+{'var': [('concurrency', 3072), ('args', '-test ums-gated')], 'result': {'workingset': 145969152.0, 'privatemem': 562495488.0, 'nonpaged': 771936.0, 'virtualmem': 13627604992.0, 'time': 16.7380234375}}
+{'var': [('concurrency', 3584), ('args', '-test async-gated')], 'result': {'workingset': 31399936.0, 'privatemem': 34484224.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.5152703125}}
+{'var': [('concurrency', 3584), ('args', '-test async-gated')], 'result': {'workingset': 31645696.0, 'privatemem': 34541568.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.5179421875}}
+{'var': [('concurrency', 3584), ('args', '-test async-gated')], 'result': {'workingset': 31395840.0, 'privatemem': 34435072.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.486846875}}
+{'var': [('concurrency', 3584), ('args', '-test async-gated')], 'result': {'workingset': 31571968.0, 'privatemem': 34500608.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.5053265625}}
+{'var': [('concurrency', 3584), ('args', '-test async-gated')], 'result': {'workingset': 31473664.0, 'privatemem': 34447360.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.506196875}}
+{'var': [('concurrency', 3584), ('args', '-test ums-gated')], 'result': {'workingset': 166944768.0, 'privatemem': 650125312.0, 'nonpaged': 895176.0, 'virtualmem': 15795929088.0, 'time': 17.12616875}}
+{'var': [('concurrency', 3584), ('args', '-test ums-gated')], 'result': {'workingset': 166453248.0, 'privatemem': 650084352.0, 'nonpaged': 895656.0, 'virtualmem': 15804317696.0, 'time': 17.1012453125}}
+{'var': [('concurrency', 3584), ('args', '-test ums-gated')], 'result': {'workingset': 166957056.0, 'privatemem': 650522624.0, 'nonpaged': 895416.0, 'virtualmem': 15800123392.0, 'time': 17.041084375}}
+{'var': [('concurrency', 3584), ('args', '-test ums-gated')], 'result': {'workingset': 166461440.0, 'privatemem': 651186176.0, 'nonpaged': 896136.0, 'virtualmem': 15812706304.0, 'time': 17.265559375}}
+{'var': [('concurrency', 3584), ('args', '-test ums-gated')], 'result': {'workingset': 166281216.0, 'privatemem': 650743808.0, 'nonpaged': 895416.0, 'virtualmem': 15800123392.0, 'time': 17.20788125}}
+{'var': [('concurrency', 4096), ('args', '-test async-gated')], 'result': {'workingset': 33193984.0, 'privatemem': 36044800.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.543359375}}
+{'var': [('concurrency', 4096), ('args', '-test async-gated')], 'result': {'workingset': 33120256.0, 'privatemem': 35979264.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.5913015625}}
+{'var': [('concurrency', 4096), ('args', '-test async-gated')], 'result': {'workingset': 32976896.0, 'privatemem': 35794944.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.5597421875}}
+{'var': [('concurrency', 4096), ('args', '-test async-gated')], 'result': {'workingset': 32976896.0, 'privatemem': 35885056.0, 'nonpaged': 25288.0, 'virtualmem': 556580864.0, 'time': 13.561975}}
+{'var': [('concurrency', 4096), ('args', '-test async-gated')], 'result': {'workingset': 33013760.0, 'privatemem': 35872768.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.552240625}}
+{'var': [('concurrency', 4096), ('args', '-test ums-gated')], 'result': {'workingset': 188612608.0, 'privatemem': 740990976.0, 'nonpaged': 1019232.0, 'virtualmem': 17964384256.0, 'time': 18.23205}}
+{'var': [('concurrency', 4096), ('args', '-test ums-gated')], 'result': {'workingset': 190369792.0, 'privatemem': 742092800.0, 'nonpaged': 1018176.0, 'virtualmem': 17947607040.0, 'time': 18.1267921875}}
+{'var': [('concurrency', 4096), ('args', '-test ums-gated')], 'result': {'workingset': 190291968.0, 'privatemem': 751833088.0, 'nonpaged': 1034976.0, 'virtualmem': 18241208320.0, 'time': 18.278765625}}
+{'var': [('concurrency', 4096), ('args', '-test ums-gated')], 'result': {'workingset': 187871232.0, 'privatemem': 739778560.0, 'nonpaged': 1018512.0, 'virtualmem': 17951801344.0, 'time': 18.356121875}}
+{'var': [('concurrency', 4096), ('args', '-test ums-gated')], 'result': {'workingset': 188469248.0, 'privatemem': 739135488.0, 'nonpaged': 1018512.0, 'virtualmem': 17951801344.0, 'time': 17.9174328125}}
+{'var': [('concurrency', 5120), ('args', '-test async-gated')], 'result': {'workingset': 34922496.0, 'privatemem': 37539840.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.705434375}}
+{'var': [('concurrency', 5120), ('args', '-test async-gated')], 'result': {'workingset': 34988032.0, 'privatemem': 37617664.0, 'nonpaged': 25640.0, 'virtualmem': 560775168.0, 'time': 13.677278125}}
+{'var': [('concurrency', 5120), ('args', '-test async-gated')], 'result': {'workingset': 34988032.0, 'privatemem': 37523456.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.64224375}}
+{'var': [('concurrency', 5120), ('args', '-test async-gated')], 'result': {'workingset': 35012608.0, 'privatemem': 37642240.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.65468125}}
+{'var': [('concurrency', 5120), ('args', '-test async-gated')], 'result': {'workingset': 35115008.0, 'privatemem': 37711872.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.70276875}}
+{'var': [('concurrency', 5120), ('args', '-test ums-gated')], 'result': {'workingset': 228339712.0, 'privatemem': 915566592.0, 'nonpaged': 1264176.0, 'virtualmem': 22246768640.0, 'time': 19.006409375}}
+{'var': [('concurrency', 5120), ('args', '-test ums-gated')], 'result': {'workingset': 229093376.0, 'privatemem': 916045824.0, 'nonpaged': 1264296.0, 'virtualmem': 22263349248.0, 'time': 19.33424375}}
+{'var': [('concurrency', 5120), ('args', '-test ums-gated')], 'result': {'workingset': 228802560.0, 'privatemem': 915972096.0, 'nonpaged': 1264184.0, 'virtualmem': 22263349248.0, 'time': 19.201040625}}
+{'var': [('concurrency', 5120), ('args', '-test ums-gated')], 'result': {'workingset': 228282368.0, 'privatemem': 915853312.0, 'nonpaged': 1263936.0, 'virtualmem': 22242574336.0, 'time': 19.1797125}}
+{'var': [('concurrency', 5120), ('args', '-test ums-gated')], 'result': {'workingset': 227971072.0, 'privatemem': 915865600.0, 'nonpaged': 1264896.0, 'virtualmem': 22259351552.0, 'time': 20.5840234375}}
+{'var': [('concurrency', 6144), ('args', '-test async-gated')], 'result': {'workingset': 36610048.0, 'privatemem': 39178240.0, 'nonpaged': 25640.0, 'virtualmem': 560775168.0, 'time': 15.2996234375}}
+{'var': [('concurrency', 6144), ('args', '-test async-gated')], 'result': {'workingset': 36446208.0, 'privatemem': 39006208.0, 'nonpaged': 25640.0, 'virtualmem': 560775168.0, 'time': 15.2134390625}}
+{'var': [('concurrency', 6144), ('args', '-test async-gated')], 'result': {'workingset': 36413440.0, 'privatemem': 39055360.0, 'nonpaged': 25880.0, 'virtualmem': 564969472.0, 'time': 14.35226875}}
+{'var': [('concurrency', 6144), ('args', '-test async-gated')], 'result': {'workingset': 36429824.0, 'privatemem': 39075840.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.8014796875}}
+{'var': [('concurrency', 6144), ('args', '-test async-gated')], 'result': {'workingset': 36474880.0, 'privatemem': 39116800.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.7755546875}}
+{'var': [('concurrency', 6144), ('args', '-test ums-gated')], 'result': {'workingset': 267964416.0, 'privatemem': 1090080768.0, 'nonpaged': 1509464.0, 'virtualmem': 26549927936.0, 'time': 19.5823140625}}
+{'var': [('concurrency', 6144), ('args', '-test ums-gated')], 'result': {'workingset': 268500992.0, 'privatemem': 1091354624.0, 'nonpaged': 1509816.0, 'virtualmem': 26554122240.0, 'time': 19.5744}}
+{'var': [('concurrency', 6144), ('args', '-test ums-gated')], 'result': {'workingset': 269398016.0, 'privatemem': 1090744320.0, 'nonpaged': 1509576.0, 'virtualmem': 26549927936.0, 'time': 19.7508015625}}
+{'var': [('concurrency', 6144), ('args', '-test ums-gated')], 'result': {'workingset': 269123584.0, 'privatemem': 1093181440.0, 'nonpaged': 1514664.0, 'virtualmem': 26642202624.0, 'time': 19.75071875}}
+{'var': [('concurrency', 6144), ('args', '-test ums-gated')], 'result': {'workingset': 269733888.0, 'privatemem': 1091674112.0, 'nonpaged': 1511384.0, 'virtualmem': 26583482368.0, 'time': 19.5216640625}}
+{'var': [('concurrency', 7168), ('args', '-test async-gated')], 'result': {'workingset': 36532224.0, 'privatemem': 39153664.0, 'nonpaged': 25384.0, 'virtualmem': 556580864.0, 'time': 13.9015625}}
+{'var': [('concurrency', 7168), ('args', '-test async-gated')], 'result': {'workingset': 36720640.0, 'privatemem': 39264256.0, 'nonpaged': 25864.0, 'virtualmem': 564969472.0, 'time': 13.90245}}
+{'var': [('concurrency', 7168), ('args', '-test async-gated')], 'result': {'workingset': 31596544.0, 'privatemem': 34111488.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.8932265625}}
+{'var': [('concurrency', 7168), ('args', '-test async-gated')], 'result': {'workingset': 31571968.0, 'privatemem': 34131968.0, 'nonpaged': 25880.0, 'virtualmem': 564969472.0, 'time': 13.9260484375}}
+{'var': [('concurrency', 7168), ('args', '-test async-gated')], 'result': {'workingset': 31571968.0, 'privatemem': 34066432.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 13.954315625}}
+{'var': [('concurrency', 7168), ('args', '-test ums-gated')], 'result': {'workingset': 315875328.0, 'privatemem': 1271836672.0, 'nonpaged': 1755264.0, 'virtualmem': 30861475840.0, 'time': 19.696196875}}
+{'var': [('concurrency', 7168), ('args', '-test ums-gated')], 'result': {'workingset': 312127488.0, 'privatemem': 1268944896.0, 'nonpaged': 1755944.0, 'virtualmem': 30869929984.0, 'time': 19.7884125}}
+{'var': [('concurrency', 7168), ('args', '-test ums-gated')], 'result': {'workingset': 313524224.0, 'privatemem': 1270001664.0, 'nonpaged': 1755344.0, 'virtualmem': 30861475840.0, 'time': 19.5355734375}}
+{'var': [('concurrency', 7168), ('args', '-test ums-gated')], 'result': {'workingset': 313815040.0, 'privatemem': 1271222272.0, 'nonpaged': 1756064.0, 'virtualmem': 30874058752.0, 'time': 19.61661875}}
+{'var': [('concurrency', 7168), ('args', '-test ums-gated')], 'result': {'workingset': 314990592.0, 'privatemem': 1271472128.0, 'nonpaged': 1755624.0, 'virtualmem': 30865735680.0, 'time': 20.050821875}}
+{'var': [('concurrency', 8192), ('args', '-test async-gated')], 'result': {'workingset': 38105088.0, 'privatemem': 40636416.0, 'nonpaged': 25384.0, 'virtualmem': 556580864.0, 'time': 14.0955625}}
+{'var': [('concurrency', 8192), ('args', '-test async-gated')], 'result': {'workingset': 37982208.0, 'privatemem': 40583168.0, 'nonpaged': 25640.0, 'virtualmem': 560775168.0, 'time': 14.040196875}}
+{'var': [('concurrency', 8192), ('args', '-test async-gated')], 'result': {'workingset': 38129664.0, 'privatemem': 40685568.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 14.042221875}}
+{'var': [('concurrency', 8192), ('args', '-test async-gated')], 'result': {'workingset': 38043648.0, 'privatemem': 40665088.0, 'nonpaged': 25528.0, 'virtualmem': 560775168.0, 'time': 14.1191921875}}
+{'var': [('concurrency', 8192), ('args', '-test async-gated')], 'result': {'workingset': 37933056.0, 'privatemem': 40538112.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 14.0314734375}}
+{'var': [('concurrency', 8192), ('args', '-test ums-gated')], 'result': {'workingset': 356925440.0, 'privatemem': 1448673280.0, 'nonpaged': 2001264.0, 'virtualmem': 35157557248.0, 'time': 20.15775}}
+{'var': [('concurrency', 8192), ('args', '-test ums-gated')], 'result': {'workingset': 354324480.0, 'privatemem': 1447530496.0, 'nonpaged': 2001984.0, 'virtualmem': 35170140160.0, 'time': 19.9642671875}}
+{'var': [('concurrency', 8192), ('args', '-test ums-gated')], 'result': {'workingset': 355999744.0, 'privatemem': 1446727680.0, 'nonpaged': 2001984.0, 'virtualmem': 35170140160.0, 'time': 19.937840625}}
+{'var': [('concurrency', 8192), ('args', '-test ums-gated')], 'result': {'workingset': 355708928.0, 'privatemem': 1447718912.0, 'nonpaged': 2001984.0, 'virtualmem': 35170140160.0, 'time': 21.3836453125}}
+{'var': [('concurrency', 8192), ('args', '-test ums-gated')], 'result': {'workingset': 355086336.0, 'privatemem': 1448427520.0, 'nonpaged': 2001984.0, 'virtualmem': 35170140160.0, 'time': 20.5806625}}
+{'var': [('concurrency', 10240), ('args', '-test async-gated')], 'result': {'workingset': 40574976.0, 'privatemem': 42999808.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 14.212690625}}
+{'var': [('concurrency', 10240), ('args', '-test async-gated')], 'result': {'workingset': 40849408.0, 'privatemem': 43442176.0, 'nonpaged': 25880.0, 'virtualmem': 564969472.0, 'time': 14.26136875}}
+{'var': [('concurrency', 10240), ('args', '-test async-gated')], 'result': {'workingset': 40611840.0, 'privatemem': 43065344.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 14.2927234375}}
+{'var': [('concurrency', 10240), ('args', '-test async-gated')], 'result': {'workingset': 35049472.0, 'privatemem': 37515264.0, 'nonpaged': 25768.0, 'virtualmem': 564969472.0, 'time': 14.2932515625}}
+{'var': [('concurrency', 10240), ('args', '-test async-gated')], 'result': {'workingset': 40902656.0, 'privatemem': 43450368.0, 'nonpaged': 25880.0, 'virtualmem': 564969472.0, 'time': 14.29265625}}
+{'var': [('concurrency', 10240), ('args', '-test ums-gated')], 'result': {'workingset': 437157888.0, 'privatemem': 1799569408.0, 'nonpaged': 2493704.0, 'virtualmem': 43789238272.0, 'time': 22.39598125}}
+{'var': [('concurrency', 10240), ('args', '-test ums-gated')], 'result': {'workingset': 438943744.0, 'privatemem': 1800122368.0, 'nonpaged': 2493624.0, 'virtualmem': 43789238272.0, 'time': 22.3933875}}
+{'var': [('concurrency', 10240), ('args', '-test ums-gated')], 'result': {'workingset': 454443008.0, 'privatemem': 1816186880.0, 'nonpaged': 2493264.0, 'virtualmem': 43797430272.0, 'time': 22.156965625}}
+{'var': [('concurrency', 10240), ('args', '-test ums-gated')], 'result': {'workingset': 441925632.0, 'privatemem': 1810481152.0, 'nonpaged': 2503344.0, 'virtualmem': 43973591040.0, 'time': 22.4793375}}
+{'var': [('concurrency', 10240), ('args', '-test ums-gated')], 'result': {'workingset': 437071872.0, 'privatemem': 1798299648.0, 'nonpaged': 2493624.0, 'virtualmem': 43789238272.0, 'time': 22.3045375}}
+{'var': [('concurrency', 12288), ('args', '-test async-gated')], 'result': {'workingset': 43515904.0, 'privatemem': 45961216.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 14.59280625}}
+{'var': [('concurrency', 12288), ('args', '-test async-gated')], 'result': {'workingset': 43683840.0, 'privatemem': 46112768.0, 'nonpaged': 25640.0, 'virtualmem': 560775168.0, 'time': 14.596046875}}
+{'var': [('concurrency', 12288), ('args', '-test async-gated')], 'result': {'workingset': 43720704.0, 'privatemem': 46157824.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 14.590865625}}
+{'var': [('concurrency', 12288), ('args', '-test async-gated')], 'result': {'workingset': 43683840.0, 'privatemem': 46100480.0, 'nonpaged': 25640.0, 'virtualmem': 560775168.0, 'time': 14.609971875}}
+{'var': [('concurrency', 12288), ('args', '-test async-gated')], 'result': {'workingset': 43429888.0, 'privatemem': 45940736.0, 'nonpaged': 25880.0, 'virtualmem': 564969472.0, 'time': 14.6273390625}}
+{'var': [('concurrency', 12288), ('args', '-test ums-gated')], 'result': {'workingset': 516640768.0, 'privatemem': 2149273600.0, 'nonpaged': 2984784.0, 'virtualmem': 52399816704.0, 'time': 26.321934375}}
+{'var': [('concurrency', 12288), ('args', '-test ums-gated')], 'result': {'workingset': 517148672.0, 'privatemem': 2152136704.0, 'nonpaged': 2986944.0, 'virtualmem': 52437565440.0, 'time': 26.177103125}}
+{'var': [('concurrency', 12288), ('args', '-test ums-gated')], 'result': {'workingset': 523063296.0, 'privatemem': 2156064768.0, 'nonpaged': 2985504.0, 'virtualmem': 52412399616.0, 'time': 26.05946875}}
+{'var': [('concurrency', 12288), ('args', '-test ums-gated')], 'result': {'workingset': 518561792.0, 'privatemem': 2162417664.0, 'nonpaged': 2994864.0, 'virtualmem': 52575977472.0, 'time': 28.18605}}
+{'var': [('concurrency', 12288), ('args', '-test ums-gated')], 'result': {'workingset': 525058048.0, 'privatemem': 2157924352.0, 'nonpaged': 2985264.0, 'virtualmem': 52408205312.0, 'time': 26.42195625}}
+{'var': [('concurrency', 14336), ('args', '-test async-gated')], 'result': {'workingset': 40148992.0, 'privatemem': 42582016.0, 'nonpaged': 25384.0, 'virtualmem': 556580864.0, 'time': 15.0295875}}
+{'var': [('concurrency', 14336), ('args', '-test async-gated')], 'result': {'workingset': 40206336.0, 'privatemem': 42512384.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 14.990478125}}
+{'var': [('concurrency', 14336), ('args', '-test async-gated')], 'result': {'workingset': 45486080.0, 'privatemem': 47845376.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 14.9103515625}}
+{'var': [('concurrency', 14336), ('args', '-test async-gated')], 'result': {'workingset': 44941312.0, 'privatemem': 47333376.0, 'nonpaged': 25640.0, 'virtualmem': 560775168.0, 'time': 14.9739078125}}
+{'var': [('concurrency', 14336), ('args', '-test async-gated')], 'result': {'workingset': 46559232.0, 'privatemem': 49074176.0, 'nonpaged': 25640.0, 'virtualmem': 560775168.0, 'time': 14.99918125}}
+{'var': [('concurrency', 14336), ('args', '-test ums-gated')], 'result': {'workingset': 601858048.0, 'privatemem': 2509008896.0, 'nonpaged': 3485304.0, 'virtualmem': 61158797312.0, 'time': 28.8111328125}}
+{'var': [('concurrency', 14336), ('args', '-test ums-gated')], 'result': {'workingset': 604540928.0, 'privatemem': 2506592256.0, 'nonpaged': 3477504.0, 'virtualmem': 61023174656.0, 'time': 28.554359375}}
+{'var': [('concurrency', 14336), ('args', '-test ums-gated')], 'result': {'workingset': 607997952.0, 'privatemem': 2508111872.0, 'nonpaged': 3477024.0, 'virtualmem': 61014786048.0, 'time': 29.05818125}}
+{'var': [('concurrency', 14336), ('args', '-test ums-gated')], 'result': {'workingset': 606982144.0, 'privatemem': 2510180352.0, 'nonpaged': 3477024.0, 'virtualmem': 61014786048.0, 'time': 29.6098046875}}
+{'var': [('concurrency', 14336), ('args', '-test ums-gated')], 'result': {'workingset': 603512832.0, 'privatemem': 2506928128.0, 'nonpaged': 3478584.0, 'virtualmem': 61041356800.0, 'time': 30.173225}}
+{'var': [('concurrency', 16384), ('args', '-test async-gated')], 'result': {'workingset': 42070016.0, 'privatemem': 44314624.0, 'nonpaged': 25640.0, 'virtualmem': 560775168.0, 'time': 16.2156484375}}
+{'var': [('concurrency', 16384), ('args', '-test async-gated')], 'result': {'workingset': 42672128.0, 'privatemem': 44982272.0, 'nonpaged': 25384.0, 'virtualmem': 556580864.0, 'time': 16.160125}}
+{'var': [('concurrency', 16384), ('args', '-test async-gated')], 'result': {'workingset': 42905600.0, 'privatemem': 45236224.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 15.2525890625}}
+{'var': [('concurrency', 16384), ('args', '-test async-gated')], 'result': {'workingset': 43896832.0, 'privatemem': 46153728.0, 'nonpaged': 25384.0, 'virtualmem': 556580864.0, 'time': 15.3214}}
+{'var': [('concurrency', 16384), ('args', '-test async-gated')], 'result': {'workingset': 42004480.0, 'privatemem': 44298240.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 15.23181875}}
+{'var': [('concurrency', 16384), ('args', '-test ums-gated')], 'result': {'workingset': 689721344.0, 'privatemem': 2865324032.0, 'nonpaged': 3968784.0, 'virtualmem': 69622706176.0, 'time': 31.0380265625}}
+{'var': [('concurrency', 16384), ('args', '-test ums-gated')], 'result': {'workingset': 701034496.0, 'privatemem': 2882179072.0, 'nonpaged': 3982704.0, 'virtualmem': 69865975808.0, 'time': 31.334315625}}
+{'var': [('concurrency', 16384), ('args', '-test ums-gated')], 'result': {'workingset': 685584384.0, 'privatemem': 2856980480.0, 'nonpaged': 3968664.0, 'virtualmem': 69621301248.0, 'time': 33.5692328125}}
+{'var': [('concurrency', 16384), ('args', '-test ums-gated')], 'result': {'workingset': 697085952.0, 'privatemem': 2868523008.0, 'nonpaged': 3968784.0, 'virtualmem': 69637881856.0, 'time': 30.9457953125}}
+{'var': [('concurrency', 16384), ('args', '-test ums-gated')], 'result': {'workingset': 690245632.0, 'privatemem': 2862125056.0, 'nonpaged': 3970344.0, 'virtualmem': 69650661376.0, 'time': 33.4727609375}}
+{'var': [('concurrency', 20480), ('args', '-test async-gated')], 'result': {'workingset': 55869440.0, 'privatemem': 58114048.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 15.7086890625}}
+{'var': [('concurrency', 20480), ('args', '-test async-gated')], 'result': {'workingset': 56160256.0, 'privatemem': 58540032.0, 'nonpaged': 25880.0, 'virtualmem': 564969472.0, 'time': 15.7096078125}}
+{'var': [('concurrency', 20480), ('args', '-test async-gated')], 'result': {'workingset': 49836032.0, 'privatemem': 52043776.0, 'nonpaged': 25640.0, 'virtualmem': 560775168.0, 'time': 16.2957859375}}
+{'var': [('concurrency', 20480), ('args', '-test async-gated')], 'result': {'workingset': 55492608.0, 'privatemem': 57851904.0, 'nonpaged': 25880.0, 'virtualmem': 564969472.0, 'time': 16.5145359375}}
+{'var': [('concurrency', 20480), ('args', '-test async-gated')], 'result': {'workingset': 47857664.0, 'privatemem': 50147328.0, 'nonpaged': 25880.0, 'virtualmem': 564969472.0, 'time': 16.8469078125}}
+{'var': [('concurrency', 20480), ('args', '-test ums-gated')], 'result': {'workingset': 862195712.0, 'privatemem': 3575685120.0, 'nonpaged': 4952784.0, 'virtualmem': 86889738240.0, 'time': 40.3810609375}}
+{'var': [('concurrency', 20480), ('args', '-test ums-gated')], 'result': {'workingset': 865746944.0, 'privatemem': 3578298368.0, 'nonpaged': 4952304.0, 'virtualmem': 86881349632.0, 'time': 36.3784328125}}
+{'var': [('concurrency', 20480), ('args', '-test ums-gated')], 'result': {'workingset': 869675008.0, 'privatemem': 3581808640.0, 'nonpaged': 4952544.0, 'virtualmem': 86885543936.0, 'time': 38.871209375}}
+{'var': [('concurrency', 20480), ('args', '-test ums-gated')], 'result': {'workingset': 860774400.0, 'privatemem': 3582889984.0, 'nonpaged': 4966464.0, 'virtualmem': 87128813568.0, 'time': 43.21194375}}
+{'var': [('concurrency', 20480), ('args', '-test ums-gated')], 'result': {'workingset': 855191552.0, 'privatemem': 3567927296.0, 'nonpaged': 4952904.0, 'virtualmem': 86877351936.0, 'time': 38.48225625}}
+{'var': [('concurrency', 24576), ('args', '-test async-gated')], 'result': {'workingset': 57565184.0, 'privatemem': 59461632.0, 'nonpaged': 25880.0, 'virtualmem': 564969472.0, 'time': 16.1426484375}}
+{'var': [('concurrency', 24576), ('args', '-test async-gated')], 'result': {'workingset': 54370304.0, 'privatemem': 56492032.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 16.101009375}}
+{'var': [('concurrency', 24576), ('args', '-test async-gated')], 'result': {'workingset': 62488576.0, 'privatemem': 64598016.0, 'nonpaged': 25400.0, 'virtualmem': 556580864.0, 'time': 15.84624375}}
+{'var': [('concurrency', 24576), ('args', '-test async-gated')], 'result': {'workingset': 57757696.0, 'privatemem': 59613184.0, 'nonpaged': 25640.0, 'virtualmem': 569163776.0, 'time': 15.9433421875}}
+{'var': [('concurrency', 24576), ('args', '-test async-gated')], 'result': {'workingset': 67629056.0, 'privatemem': 69304320.0, 'nonpaged': 25640.0, 'virtualmem': 560775168.0, 'time': 16.0379890625}}
+{'var': [('concurrency', 24576), ('args', '-test ums-gated')], 'result': {'workingset': 1028907008.0, 'privatemem': 4283650048.0, 'nonpaged': 5936184.0, 'virtualmem': 104104235008.0, 'time': 53.8624046875}}
+{'var': [('concurrency', 24576), ('args', '-test ums-gated')], 'result': {'workingset': 1037115392.0, 'privatemem': 4290715648.0, 'nonpaged': 5936304.0, 'virtualmem': 104120815616.0, 'time': 53.877346875}}
+{'var': [('concurrency', 24576), ('args', '-test ums-gated')], 'result': {'workingset': 1037705216.0, 'privatemem': 4291125248.0, 'nonpaged': 5935824.0, 'virtualmem': 104112427008.0, 'time': 54.8691671875}}
+{'var': [('concurrency', 24576), ('args', '-test ums-gated')], 'result': {'workingset': 1043337216.0, 'privatemem': 4301135872.0, 'nonpaged': 5935824.0, 'virtualmem': 104111026176.0, 'time': 46.317490625}}
+{'var': [('concurrency', 24576), ('args', '-test ums-gated')], 'result': {'workingset': 1028558848.0, 'privatemem': 4282368000.0, 'nonpaged': 5936424.0, 'virtualmem': 104108429312.0, 'time': 53.502359375}}
+{'var': [('concurrency', 28672), ('args', '-test async-gated')], 'result': {'workingset': 73793536.0, 'privatemem': 75640832.0, 'nonpaged': 26600.0, 'virtualmem': 577552384.0, 'time': 16.6419671875}}
+{'var': [('concurrency', 28672), ('args', '-test async-gated')], 'result': {'workingset': 74006528.0, 'privatemem': 75755520.0, 'nonpaged': 26008.0, 'virtualmem': 569163776.0, 'time': 16.59216875}}
+{'var': [('concurrency', 28672), ('args', '-test async-gated')], 'result': {'workingset': 74121216.0, 'privatemem': 75894784.0, 'nonpaged': 25640.0, 'virtualmem': 560775168.0, 'time': 16.6399796875}}
+{'var': [('concurrency', 28672), ('args', '-test async-gated')], 'result': {'workingset': 75317248.0, 'privatemem': 77017088.0, 'nonpaged': 25528.0, 'virtualmem': 560775168.0, 'time': 16.6508421875}}
+{'var': [('concurrency', 28672), ('args', '-test async-gated')], 'result': {'workingset': 73236480.0, 'privatemem': 75030528.0, 'nonpaged': 25528.0, 'virtualmem': 560775168.0, 'time': 16.776903125}}
+{'var': [('concurrency', 28672), ('args', '-test ums-gated')], 'result': {'workingset': 1193185280.0, 'privatemem': 4992319488.0, 'nonpaged': 6919104.0, 'virtualmem': 121308942336.0, 'time': 59.2310265625}}
+{'var': [('concurrency', 28672), ('args', '-test ums-gated')], 'result': {'workingset': 1186713600.0, 'privatemem': 4982370304.0, 'nonpaged': 6919584.0, 'virtualmem': 121317330944.0, 'time': 62.308228125}}
+{'var': [('concurrency', 28672), ('args', '-test ums-gated')], 'result': {'workingset': 1204101120.0, 'privatemem': 5004546048.0, 'nonpaged': 6919704.0, 'virtualmem': 121333911552.0, 'time': 59.4607328125}}
+{'var': [('concurrency', 28672), ('args', '-test ums-gated')], 'result': {'workingset': 1186025472.0, 'privatemem': 4979195904.0, 'nonpaged': 6919824.0, 'virtualmem': 121321525248.0, 'time': 68.2966625}}
+{'var': [('concurrency', 28672), ('args', '-test ums-gated')], 'result': {'workingset': 1190494208.0, 'privatemem': 4990369792.0, 'nonpaged': 6919104.0, 'virtualmem': 121308942336.0, 'time': 65.9037140625}}
+{'var': [('concurrency', 32768), ('args', '-test async-gated')], 'result': {'workingset': 69914624.0, 'privatemem': 71544832.0, 'nonpaged': 26008.0, 'virtualmem': 569163776.0, 'time': 17.5821546875}}
+{'var': [('concurrency', 32768), ('args', '-test async-gated')], 'result': {'workingset': 82804736.0, 'privatemem': 84516864.0, 'nonpaged': 25528.0, 'virtualmem': 560775168.0, 'time': 17.4147265625}}
+{'var': [('concurrency', 32768), ('args', '-test async-gated')], 'result': {'workingset': 80211968.0, 'privatemem': 81952768.0, 'nonpaged': 26120.0, 'virtualmem': 569163776.0, 'time': 17.2119453125}}
+{'var': [('concurrency', 32768), ('args', '-test async-gated')], 'result': {'workingset': 72941568.0, 'privatemem': 74739712.0, 'nonpaged': 26008.0, 'virtualmem': 569163776.0, 'time': 17.0826671875}}
+{'var': [('concurrency', 32768), ('args', '-test async-gated')], 'result': {'workingset': 57122816.0, 'privatemem': 59056128.0, 'nonpaged': 25528.0, 'virtualmem': 560775168.0, 'time': 15.8496921875}}
+{'var': [('concurrency', 32768), ('args', '-test ums-gated')], 'result': {'workingset': 1363570688.0, 'privatemem': 5696401408.0, 'nonpaged': 7902864.0, 'virtualmem': 138542813184.0, 'time': 77.319371875}}
+{'var': [('concurrency', 32768), ('args', '-test ums-gated')], 'result': {'workingset': 1359228928.0, 'privatemem': 5693067264.0, 'nonpaged': 7902504.0, 'virtualmem': 138522038272.0, 'time': 75.611196875}}
+{'var': [('concurrency', 32768), ('args', '-test ums-gated')], 'result': {'workingset': 1382010880.0, 'privatemem': 5722746880.0, 'nonpaged': 7903224.0, 'virtualmem': 138563588096.0, 'time': 75.43135625}}
+{'var': [('concurrency', 32768), ('args', '-test ums-gated')], 'result': {'workingset': 1366474752.0, 'privatemem': 5719846912.0, 'nonpaged': 7935264.0, 'virtualmem': 139092529152.0, 'time': 77.2984921875}}
+{'var': [('concurrency', 32768), ('args', '-test ums-gated')], 'result': {'workingset': 1380454400.0, 'privatemem': 5713457152.0, 'nonpaged': 7902744.0, 'virtualmem': 138555199488.0, 'time': 72.9519984375}}
+{'var': [('concurrency', 40960), ('args', '-test async-gated')], 'result': {'workingset': 82169856.0, 'privatemem': 84209664.0, 'nonpaged': 25768.0, 'virtualmem': 564969472.0, 'time': 18.2689421875}}
+{'var': [('concurrency', 40960), ('args', '-test async-gated')], 'result': {'workingset': 86765568.0, 'privatemem': 88666112.0, 'nonpaged': 25768.0, 'virtualmem': 564969472.0, 'time': 17.703690625}}
+{'var': [('concurrency', 40960), ('args', '-test async-gated')], 'result': {'workingset': 89808896.0, 'privatemem': 91951104.0, 'nonpaged': 25744.0, 'virtualmem': 562872320.0, 'time': 17.698275}}
+{'var': [('concurrency', 40960), ('args', '-test async-gated')], 'result': {'workingset': 83464192.0, 'privatemem': 84893696.0, 'nonpaged': 26008.0, 'virtualmem': 569163776.0, 'time': 17.8156953125}}
+{'var': [('concurrency', 40960), ('args', '-test async-gated')], 'result': {'workingset': 89182208.0, 'privatemem': 91365376.0, 'nonpaged': 25888.0, 'virtualmem': 567066624.0, 'time': 17.637353125}}
+{'var': [('concurrency', 40960), ('args', '-test ums-gated')], 'result': {'workingset': 1688113152.0, 'privatemem': 7102902272.0, 'nonpaged': 9870744.0, 'virtualmem': 172987879424.0, 'time': 109.5945375}}
+{'var': [('concurrency', 40960), ('args', '-test ums-gated')], 'result': {'workingset': 1681657856.0, 'privatemem': 7097241600.0, 'nonpaged': 9870264.0, 'virtualmem': 172979490816.0, 'time': 112.0583734375}}
+{'var': [('concurrency', 40960), ('args', '-test ums-gated')], 'result': {'workingset': 1701982208.0, 'privatemem': 7125585920.0, 'nonpaged': 9876984.0, 'virtualmem': 173109383168.0, 'time': 108.868828125}}
+{'var': [('concurrency', 40960), ('args', '-test ums-gated')], 'result': {'workingset': 1696256000.0, 'privatemem': 7110664192.0, 'nonpaged': 9870384.0, 'virtualmem': 172979556352.0, 'time': 100.987990625}}
+{'var': [('concurrency', 40960), ('args', '-test ums-gated')], 'result': {'workingset': 1681092608.0, 'privatemem': 7102992384.0, 'nonpaged': 9881424.0, 'virtualmem': 173160042496.0, 'time': 103.1147171875}}
+{'var': [('concurrency', 49152), ('args', '-test async-gated')], 'result': {'workingset': 88752128.0, 'privatemem': 90644480.0, 'nonpaged': 26368.0, 'virtualmem': 575455232.0, 'time': 19.194690625}}
+{'var': [('concurrency', 49152), ('args', '-test async-gated')], 'result': {'workingset': 91697152.0, 'privatemem': 93396992.0, 'nonpaged': 26240.0, 'virtualmem': 571260928.0, 'time': 19.1130046875}}
+{'var': [('concurrency', 49152), ('args', '-test async-gated')], 'result': {'workingset': 70430720.0, 'privatemem': 72364032.0, 'nonpaged': 26240.0, 'virtualmem': 571260928.0, 'time': 17.7690265625}}
+{'var': [('concurrency', 49152), ('args', '-test async-gated')], 'result': {'workingset': 85979136.0, 'privatemem': 87822336.0, 'nonpaged': 26120.0, 'virtualmem': 569163776.0, 'time': 19.166028125}}
+{'var': [('concurrency', 49152), ('args', '-test async-gated')], 'result': {'workingset': 87728128.0, 'privatemem': 89387008.0, 'nonpaged': 26000.0, 'virtualmem': 567066624.0, 'time': 19.178809375}}
+{'var': [('concurrency', 49152), ('args', '-test ums-gated')], 'result': {'workingset': 2026475520.0, 'privatemem': 8518123520.0, 'nonpaged': 11837784.0, 'virtualmem': 207459684352.0, 'time': 140.7092328125}}
+{'var': [('concurrency', 49152), ('args', '-test ums-gated')], 'result': {'workingset': 2036518912.0, 'privatemem': 8542306304.0, 'nonpaged': 11840544.0, 'virtualmem': 207512752128.0, 'time': 147.6286140625}}
+{'var': [('concurrency', 49152), ('args', '-test ums-gated')], 'result': {'workingset': 2027098112.0, 'privatemem': 8528797696.0, 'nonpaged': 11837424.0, 'virtualmem': 207455424512.0, 'time': 157.0997796875}}
+{'var': [('concurrency', 49152), ('args', '-test ums-gated')], 'result': {'workingset': 2029830144.0, 'privatemem': 8523378688.0, 'nonpaged': 11838144.0, 'virtualmem': 207470809088.0, 'time': 149.35805}}
+{'var': [('concurrency', 49152), ('args', '-test ums-gated')], 'result': {'workingset': 2018607104.0, 'privatemem': 8512258048.0, 'nonpaged': 11837544.0, 'virtualmem': 207443038208.0, 'time': 156.43776875}}
+{'var': [('concurrency', 57344), ('args', '-test async-gated')], 'result': {'workingset': 110104576.0, 'privatemem': 112001024.0, 'nonpaged': 25888.0, 'virtualmem': 567066624.0, 'time': 19.1979890625}}
+{'var': [('concurrency', 57344), ('args', '-test async-gated')], 'result': {'workingset': 117399552.0, 'privatemem': 118956032.0, 'nonpaged': 26368.0, 'virtualmem': 575455232.0, 'time': 19.72220625}}
+{'var': [('concurrency', 57344), ('args', '-test async-gated')], 'result': {'workingset': 102563840.0, 'privatemem': 104300544.0, 'nonpaged': 26000.0, 'virtualmem': 567066624.0, 'time': 19.6945328125}}
+{'var': [('concurrency', 57344), ('args', '-test async-gated')], 'result': {'workingset': 105697280.0, 'privatemem': 107380736.0, 'nonpaged': 26368.0, 'virtualmem': 575455232.0, 'time': 19.43420625}}
+{'var': [('concurrency', 57344), ('args', '-test async-gated')], 'result': {'workingset': 106532864.0, 'privatemem': 108306432.0, 'nonpaged': 26000.0, 'virtualmem': 567066624.0, 'time': 19.3152046875}}
+{'var': [('concurrency', 57344), ('args', '-test ums-gated')], 'result': {'workingset': 2363232256.0, 'privatemem': 9939460096.0, 'nonpaged': 13804464.0, 'virtualmem': 241888612352.0, 'time': 184.053434375}}
+{'var': [('concurrency', 57344), ('args', '-test ums-gated')], 'result': {'workingset': 2365878272.0, 'privatemem': 9953259520.0, 'nonpaged': 13804344.0, 'virtualmem': 241900998656.0, 'time': 192.2616015625}}
+{'var': [('concurrency', 57344), ('args', '-test ums-gated')], 'result': {'workingset': 2358566912.0, 'privatemem': 9937661952.0, 'nonpaged': 13806264.0, 'virtualmem': 241918038016.0, 'time': 189.8282234375}}
+{'var': [('concurrency', 57344), ('args', '-test ums-gated')], 'result': {'workingset': 2342895616.0, 'privatemem': 9925849088.0, 'nonpaged': 13804224.0, 'virtualmem': 241884418048.0, 'time': 182.3936078125}}
+{'var': [('concurrency', 57344), ('args', '-test ums-gated')], 'result': {'workingset': 2347986944.0, 'privatemem': 9933496320.0, 'nonpaged': 13804824.0, 'virtualmem': 241892872192.0, 'time': 186.212921875}}
+{'var': [('concurrency', 65536), ('args', '-test async-gated')], 'result': {'workingset': 130637824.0, 'privatemem': 132468736.0, 'nonpaged': 25528.0, 'virtualmem': 560775168.0, 'time': 20.00561875}}
+{'var': [('concurrency', 65536), ('args', '-test async-gated')], 'result': {'workingset': 115064832.0, 'privatemem': 116396032.0, 'nonpaged': 26008.0, 'virtualmem': 569163776.0, 'time': 20.3946609375}}
+{'var': [('concurrency', 65536), ('args', '-test async-gated')], 'result': {'workingset': 72556544.0, 'privatemem': 74584064.0, 'nonpaged': 26720.0, 'virtualmem': 579649536.0, 'time': 17.1177015625}}
+{'var': [('concurrency', 65536), ('args', '-test async-gated')], 'result': {'workingset': 112943104.0, 'privatemem': 114147328.0, 'nonpaged': 26120.0, 'virtualmem': 569163776.0, 'time': 20.2790203125}}
+{'var': [('concurrency', 65536), ('args', '-test async-gated')], 'result': {'workingset': 129822720.0, 'privatemem': 131096576.0, 'nonpaged': 26128.0, 'virtualmem': 571260928.0, 'time': 20.95596875}}
+{'var': [('concurrency', 65536), ('args', '-test ums-gated')], 'result': {'workingset': 2690383872.0, 'privatemem': 11338743808.0, 'nonpaged': 15772944.0, 'virtualmem': 276378443776.0, 'time': 247.372325}}
+{'var': [('concurrency', 65536), ('args', '-test ums-gated')], 'result': {'workingset': 2684055552.0, 'privatemem': 11335376896.0, 'nonpaged': 15771504.0, 'virtualmem': 276344889344.0, 'time': 240.684809375}}
+{'var': [('concurrency', 65536), ('args', '-test ums-gated')], 'result': {'workingset': 2701897728.0, 'privatemem': 11360075776.0, 'nonpaged': 15772344.0, 'virtualmem': 276374052864.0, 'time': 235.606675}}
+{'var': [('concurrency', 65536), ('args', '-test ums-gated')], 'result': {'workingset': 2961162240.0, 'privatemem': 11630002176.0, 'nonpaged': 15773904.0, 'virtualmem': 276618567680.0, 'time': 277.3269875}}
+{'var': [('concurrency', 65536), ('args', '-test ums-gated')], 'result': {'workingset': 2682052608.0, 'privatemem': 11340992512.0, 'nonpaged': 15776304.0, 'virtualmem': 276428775424.0, 'time': 244.7224234375}}
+{'var': [('concurrency', 81920), ('args', '-test async-gated')], 'result': {'workingset': 138235904.0, 'privatemem': 139558912.0, 'nonpaged': 25648.0, 'virtualmem': 562872320.0, 'time': 21.6494125}}
+{'var': [('concurrency', 81920), ('args', '-test async-gated')], 'result': {'workingset': 89427968.0, 'privatemem': 90931200.0, 'nonpaged': 25528.0, 'virtualmem': 560775168.0, 'time': 17.4579984375}}
+{'var': [('concurrency', 81920), ('args', '-test async-gated')], 'result': {'workingset': 130588672.0, 'privatemem': 131649536.0, 'nonpaged': 26008.0, 'virtualmem': 569163776.0, 'time': 21.278078125}}
+{'var': [('concurrency', 81920), ('args', '-test async-gated')], 'result': {'workingset': 135176192.0, 'privatemem': 136491008.0, 'nonpaged': 25640.0, 'virtualmem': 560775168.0, 'time': 21.5131796875}}
+{'var': [('concurrency', 81920), ('args', '-test async-gated')], 'result': {'workingset': 127688704.0, 'privatemem': 129499136.0, 'nonpaged': 26728.0, 'virtualmem': 581746688.0, 'time': 19.93003125}}
+{'var': [('concurrency', 81920), ('args', '-test ums-gated')], 'result': {'workingset': 3732779008.0, 'privatemem': 14553665536.0, 'nonpaged': 19709064.0, 'virtualmem': 345628565504.0, 'time': 353.601725}}
+{'var': [('concurrency', 81920), ('args', '-test ums-gated')], 'result': {'workingset': 3335438336.0, 'privatemem': 14157639680.0, 'nonpaged': 19704744.0, 'virtualmem': 345205465088.0, 'time': 356.084828125}}
+{'var': [('concurrency', 81920), ('args', '-test ums-gated')], 'result': {'workingset': 3416276992.0, 'privatemem': 14252584960.0, 'nonpaged': 19705824.0, 'virtualmem': 345296756736.0, 'time': 364.665215625}}
+{'var': [('concurrency', 81920), ('args', '-test ums-gated')], 'result': {'workingset': 3340185600.0, 'privatemem': 14166282240.0, 'nonpaged': 19705344.0, 'virtualmem': 345218048000.0, 'time': 330.89671875}}
+{'var': [('concurrency', 81920), ('args', '-test ums-gated')], 'result': {'workingset': 3341864960.0, 'privatemem': 14169149440.0, 'nonpaged': 19707504.0, 'virtualmem': 345255796736.0, 'time': 352.603725}}
+{'var': [('concurrency', 98304), ('args', '-test async-gated')], 'result': {'workingset': 119099392.0, 'privatemem': 120713216.0, 'nonpaged': 26368.0, 'virtualmem': 575455232.0, 'time': 21.3428921875}}
+{'var': [('concurrency', 98304), ('args', '-test async-gated')], 'result': {'workingset': 139829248.0, 'privatemem': 141701120.0, 'nonpaged': 27088.0, 'virtualmem': 588038144.0, 'time': 23.1737}}
+{'var': [('concurrency', 98304), ('args', '-test async-gated')], 'result': {'workingset': 151707648.0, 'privatemem': 153325568.0, 'nonpaged': 26488.0, 'virtualmem': 577552384.0, 'time': 22.1648703125}}
+{'var': [('concurrency', 98304), ('args', '-test async-gated')], 'result': {'workingset': 139603968.0, 'privatemem': 141705216.0, 'nonpaged': 26720.0, 'virtualmem': 579649536.0, 'time': 24.3582796875}}
+{'var': [('concurrency', 98304), ('args', '-test async-gated')], 'result': {'workingset': 126025728.0, 'privatemem': 128827392.0, 'nonpaged': 27568.0, 'virtualmem': 596426752.0, 'time': 21.027715625}}
+{'var': [('concurrency', 98304), ('args', '-test ums-gated')], 'result': {'workingset': 3993194496.0, 'privatemem': 16967299072.0, 'nonpaged': 23638824.0, 'virtualmem': 414117388288.0, 'time': 480.1536890625}}
+{'var': [('concurrency', 98304), ('args', '-test ums-gated')], 'result': {'workingset': 3999387648.0, 'privatemem': 16987381760.0, 'nonpaged': 23638824.0, 'virtualmem': 414117388288.0, 'time': 516.035265625}}
+{'var': [('concurrency', 98304), ('args', '-test ums-gated')], 'result': {'workingset': 4001804288.0, 'privatemem': 17038946304.0, 'nonpaged': 23718144.0, 'virtualmem': 415501574144.0, 'time': 483.755525}}
+{'var': [('concurrency', 98304), ('args', '-test ums-gated')], 'result': {'workingset': 4013903872.0, 'privatemem': 17002704896.0, 'nonpaged': 23639544.0, 'virtualmem': 414158938112.0, 'time': 503.345384375}}
+{'var': [('concurrency', 98304), ('args', '-test ums-gated')], 'result': {'workingset': 4039008256.0, 'privatemem': 17174925312.0, 'nonpaged': 23918784.0, 'virtualmem': 419020464128.0, 'time': 505.355275}}
+{'var': [('concurrency', 114688), ('args', '-test async-gated')], 'result': {'workingset': 164077568.0, 'privatemem': 165376000.0, 'nonpaged': 25648.0, 'virtualmem': 562872320.0, 'time': 23.6242703125}}
+{'var': [('concurrency', 114688), ('args', '-test async-gated')], 'result': {'workingset': 136712192.0, 'privatemem': 138002432.0, 'nonpaged': 26608.0, 'virtualmem': 579649536.0, 'time': 23.1367515625}}
+{'var': [('concurrency', 114688), ('args', '-test async-gated')], 'result': {'workingset': 118976512.0, 'privatemem': 120524800.0, 'nonpaged': 26720.0, 'virtualmem': 579649536.0, 'time': 23.2383796875}}
+{'var': [('concurrency', 114688), ('args', '-test async-gated')], 'result': {'workingset': 127246336.0, 'privatemem': 128696320.0, 'nonpaged': 26608.0, 'virtualmem': 579649536.0, 'time': 23.4868671875}}
+{'var': [('concurrency', 114688), ('args', '-test async-gated')], 'result': {'workingset': 201854976.0, 'privatemem': 202383360.0, 'nonpaged': 26128.0, 'virtualmem': 571260928.0, 'time': 26.734434375}}
+{'var': [('concurrency', 114688), ('args', '-test ums-gated')], 'result': {'workingset': 4636082176.0, 'privatemem': 19810603008.0, 'nonpaged': 27575064.0, 'virtualmem': 483073843200.0, 'time': 602.0996375}}
+{'var': [('concurrency', 114688), ('args', '-test ums-gated')], 'result': {'workingset': 4602040320.0, 'privatemem': 19810873344.0, 'nonpaged': 27579744.0, 'virtualmem': 483141148672.0, 'time': 659.99125625}}
+{'var': [('concurrency', 114688), ('args', '-test ums-gated')], 'result': {'workingset': 4591165440.0, 'privatemem': 19790200832.0, 'nonpaged': 27573024.0, 'virtualmem': 483023708160.0, 'time': 583.1214046875}}
+{'var': [('concurrency', 114688), ('args', '-test ums-gated')], 'result': {'workingset': 4639674368.0, 'privatemem': 19800694784.0, 'nonpaged': 27572544.0, 'virtualmem': 483015319552.0, 'time': 595.6076765625}}
+{'var': [('concurrency', 114688), ('args', '-test ums-gated')], 'result': {'workingset': 4615213056.0, 'privatemem': 19768594432.0, 'nonpaged': 27572304.0, 'virtualmem': 483011125248.0, 'time': 585.95591875}}
+{'var': [('concurrency', 131072), ('args', '-test async-gated')], 'result': {'workingset': 122953728.0, 'privatemem': 124391424.0, 'nonpaged': 26608.0, 'virtualmem': 579649536.0, 'time': 22.2635234375}}
+{'var': [('concurrency', 131072), ('args', '-test async-gated')], 'result': {'workingset': 128253952.0, 'privatemem': 129671168.0, 'nonpaged': 26128.0, 'virtualmem': 571260928.0, 'time': 22.54289375}}
+{'var': [('concurrency', 131072), ('args', '-test async-gated')], 'result': {'workingset': 130244608.0, 'privatemem': 131567616.0, 'nonpaged': 26248.0, 'virtualmem': 573358080.0, 'time': 21.3423078125}}
+{'var': [('concurrency', 131072), ('args', '-test async-gated')], 'result': {'workingset': 120819712.0, 'privatemem': 121860096.0, 'nonpaged': 26128.0, 'virtualmem': 571260928.0, 'time': 22.1759359375}}
+{'var': [('concurrency', 131072), ('args', '-test async-gated')], 'result': {'workingset': 197222400.0, 'privatemem': 197992448.0, 'nonpaged': 26128.0, 'virtualmem': 571260928.0, 'time': 26.0388765625}}
+{'var': [('concurrency', 131072), ('args', '-test ums-gated')], 'result': {'workingset': 5291032576.0, 'privatemem': 22605094912.0, 'nonpaged': 31506624.0, 'virtualmem': 551903141888.0, 'time': 769.2572203125}}
+{'var': [('concurrency', 131072), ('args', '-test ums-gated')], 'result': {'workingset': 5268750336.0, 'privatemem': 22580580352.0, 'nonpaged': 31506624.0, 'virtualmem': 551903141888.0, 'time': 715.4761953125}}
+{'var': [('concurrency', 131072), ('args', '-test ums-gated')], 'result': {'workingset': 5275197440.0, 'privatemem': 22597181440.0, 'nonpaged': 31506504.0, 'virtualmem': 551886561280.0, 'time': 743.6708078125}}
+{'var': [('concurrency', 131072), ('args', '-test ums-gated')], 'result': {'workingset': 5559996416.0, 'privatemem': 22927003648.0, 'nonpaged': 31508664.0, 'virtualmem': 552185012224.0, 'time': 777.7286765625}}
+{'var': [('concurrency', 131072), ('args', '-test ums-gated')], 'result': {'workingset': 5265473536.0, 'privatemem': 22609494016.0, 'nonpaged': 31506384.0, 'virtualmem': 551898947584.0, 'time': 774.769990625}}
+{'var': [('concurrency', 163840), ('args', '-test async-gated')], 'result': {'workingset': 161509376.0, 'privatemem': 163639296.0, 'nonpaged': 26720.0, 'virtualmem': 579649536.0, 'time': 29.432303125}}
+{'var': [('concurrency', 163840), ('args', '-test async-gated')], 'result': {'workingset': 152326144.0, 'privatemem': 153423872.0, 'nonpaged': 27088.0, 'virtualmem': 588038144.0, 'time': 24.661028125}}
+{'var': [('concurrency', 163840), ('args', '-test async-gated')], 'result': {'workingset': 148279296.0, 'privatemem': 150319104.0, 'nonpaged': 26368.0, 'virtualmem': 575455232.0, 'time': 25.9785390625}}
+{'var': [('concurrency', 163840), ('args', '-test async-gated')], 'result': {'workingset': 153616384.0, 'privatemem': 154677248.0, 'nonpaged': 26248.0, 'virtualmem': 573358080.0, 'time': 25.02185}}
+{'var': [('concurrency', 163840), ('args', '-test async-gated')], 'result': {'workingset': 154402816.0, 'privatemem': 155430912.0, 'nonpaged': 26360.0, 'virtualmem': 573358080.0, 'time': 25.0472640625}}
+{'var': [('concurrency', 163840), ('args', '-test ums-gated')], 'result': {'workingset': 6044577792.0, 'privatemem': 28556054528.0, 'nonpaged': 39377064.0, 'virtualmem': 690026848256.0, 'time': 238880.438532812}}
+{'var': [('concurrency', 163840), ('args', '-test ums-gated')], 'result': {'workingset': 6581481472.0, 'privatemem': 28245975040.0, 'nonpaged': 39374664.0, 'virtualmem': 689695236096.0, 'time': 1124.5557}}
+{'var': [('concurrency', 163840), ('args', '-test ums-gated')], 'result': {'workingset': 5939179520.0, 'privatemem': 28300779520.0, 'nonpaged': 39375144.0, 'virtualmem': 689703624704.0, 'time': 61740.7140578125}}
+{'var': [('concurrency', 163840), ('args', '-test ums-gated')], 'result': {'workingset': 6597120000.0, 'privatemem': 28281757696.0, 'nonpaged': 39374904.0, 'virtualmem': 689728397312.0, 'time': 1146.400846875}}
+{'var': [('concurrency', 163840), ('args', '-test ums-gated')], 'result': {'workingset': 6597758976.0, 'privatemem': 28234469376.0, 'nonpaged': 39375264.0, 'virtualmem': 689703690240.0, 'time': 1061.4835671875}}
+{'var': [('concurrency', 196608), ('args', '-test async-gated')], 'result': {'workingset': 187748352.0, 'privatemem': 191131648.0, 'nonpaged': 26840.0, 'virtualmem': 581292032.0, 'time': 28.6244015625}}
+{'var': [('concurrency', 196608), ('args', '-test async-gated')], 'result': {'workingset': 186040320.0, 'privatemem': 189222912.0, 'nonpaged': 27448.0, 'virtualmem': 593874944.0, 'time': 27.09115625}}
+{'var': [('concurrency', 196608), ('args', '-test async-gated')], 'result': {'workingset': 191225856.0, 'privatemem': 192925696.0, 'nonpaged': 27088.0, 'virtualmem': 588038144.0, 'time': 27.2597046875}}
+{'var': [('concurrency', 196608), ('args', '-test async-gated')], 'result': {'workingset': 182910976.0, 'privatemem': 184160256.0, 'nonpaged': 25760.0, 'virtualmem': 562872320.0, 'time': 26.3374671875}}
+{'var': [('concurrency', 196608), ('args', '-test async-gated')], 'result': {'workingset': 178884608.0, 'privatemem': 179732480.0, 'nonpaged': 26608.0, 'virtualmem': 579649536.0, 'time': 26.914534375}}
diff --git a/Ix/CPP/src/cpplinq/linq.hpp b/Ix/CPP/src/cpplinq/linq.hpp
new file mode 100644
index 0000000..1070331
--- /dev/null
+++ b/Ix/CPP/src/cpplinq/linq.hpp
@@ -0,0 +1,531 @@
+// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
+
+///
+/// namespace cpplinq
+/// -----------------
+///
+/// Defines a number of range-based composable operators for enumerating and modifying collections
+///
+/// The general design philosophy is to
+/// (1) emulate the composable query patterns introduced in C# Linq
+/// (2) preserve iterator category and writability where possible
+/// For instance, like C# Linq we have a select operator to project one sequence into a new one.
+/// Unlike Linq, invoking Select on a random access sequence will yield you a _random_ access sequence.
+///
+/// The general workflow begins with 'from()' which normally only takes a reference
+/// the the collection in question. However, from that point on, all operators function
+/// by value, so that the range can store any necessary state, rather than duplicating it
+/// onto iterator pairs.
+///
+/// In subsequent documentation, "powers" lists which powers that the operator attempts to preserve if
+/// available on on the input sequence. Some iterator powers may be skipped - in such a case, round down
+/// to the next supported power (e.g. if 'fwd' and 'rnd', an input of 'bidi' will round down to a 'fwd' result).
+///
+///
+///
+/// class linq_query
+/// ----------------
+///
+/// from(container&)
+/// ================
+/// - Result: Query
+///
+/// Construct a new query, from an lvalue reference to a collection. Does not copy the collection
+///
+///
+///
+/// from(iter, iter)
+/// ================
+/// - Result: Query
+///
+/// Construct a new query, from an iterator pair.
+///
+///
+///
+/// query.select(map)
+/// ==========================
+/// - Result: Query
+/// - Powers: input, forward, bidirectional, random access
+///
+/// For each element `x` in the input sequences, computes `map(x)` for the result sequence.
+///
+///
+///
+/// query.where(pred) -> query
+/// ==========================
+/// - Result: Query
+/// - Powers: input, forward, bidirectional
+///
+/// Each element `x` in the input appears in the output if `pred(x)` is true.
+///
+/// The expression `pred(x)` is evaluated only when moving iterators (op++, op--).
+/// Dereferencing (op*) does not invoke the predicate.
+///
+///
+///
+/// query.groupby(keymap [, keyequal])
+/// ====================================
+/// Result: Query of groups. Each group has a 'key' field, and is a query of elements from the input.
+/// Powers: forward
+///
+///
+///
+/// query.any([pred])
+/// =================
+/// - Result: bool
+///
+/// (No argument) Returns true if sequence is non-empty. Equivalent to `query.begin()!=query.end()`
+///
+/// (One argument) Returns true if the sequence contains any elements for which `pred(element)` is true.
+/// Equivalent to `query.where(pred).any()`.
+///
+///
+///
+/// query.all(pred)
+/// ===============
+/// - Result: bool
+///
+/// Returns true if `pred` holds for all elements in the sequence. Equivalent to `!query.any(std::not1(pred))`
+///
+///
+///
+/// query.take(n)
+/// =============
+/// - Result: query
+/// - Powers: input, forward, random access (not bidirectional)
+///
+/// Returns a sequence that contains up to `n` items from the original sequence.
+///
+///
+///
+/// query.skip(n)
+/// =============
+/// - Result: query
+/// - Powers: input, forward, random access (not bidirectional)
+///
+/// Returns a sequence that skips the first `n` items from the original sequence, or an empty sequence if
+/// fewer than `n` were available on input.
+///
+/// Note: begin() takes O(n) time when input iteration power is weaker than random access.
+///
+///
+///
+/// query.count([pred])
+/// ===================
+/// - Result: size_t
+///
+/// _TODO: should use inner container's iterator distance type instead._
+///
+/// (Zero-argument) Returns the number of elements in the range.
+/// Equivalent to `std::distance(query.begin(), query.end())`
+///
+/// (One-argument) Returns the number of elements for whicht `pred(element)` is true.
+/// Equivalent to `query.where(pred).count()`
+///
+
+
+
+#if !defined(CPPLINQ_LINQ_HPP)
+#define CPPLINQ_LINQ_HPP
+#pragma once
+
+#include <functional>
+#include <iterator>
+#include <list>
+#include <map>
+#include <memory>
+#include <utility>
+#include <type_traits>
+#include <vector>
+
+
+
+// some configuration macros
+#if _MSC_VER > 1600 || __cplusplus > 199711L
+#define LINQ_USE_RVALUEREF 1
+#endif
+
+#if (defined(_MSC_VER) && _CPPRTTI) || !defined(_MSC_VER)
+#define LINQ_USE_RTTI 1
+#endif
+
+
+// individual features
+#include "util.hpp"
+#include "linq_cursor.hpp"
+#include "linq_iterators.hpp"
+#include "linq_select.hpp"
+#include "linq_take.hpp"
+#include "linq_skip.hpp"
+#include "linq_groupby.hpp"
+#include "linq_where.hpp"
+#include "linq_last.hpp"
+#include "linq_selectmany.hpp"
+
+
+
+
+namespace cpplinq
+{
+
+namespace detail
+{
+ template<class Pred>
+ struct not1_{
+ Pred pred;
+ not1_(Pred p) : pred(p)
+ {}
+ template<class T>
+ bool operator()(const T& value)
+ {
+ return !pred(value);
+ }
+ };
+ // note: VC2010's std::not1 doesn't support lambda expressions. provide our own.
+ template<class Pred>
+ not1_<Pred> not1(Pred p) { return not1_<Pred>(p); }
+}
+
+namespace detail {
+ template <class U>
+ struct cast_to {
+ template <class T>
+ U operator()(const T& value) const {
+ return static_cast<U>(value);
+ }
+ };
+}
+
+template <class Collection>
+class linq_driver
+{
+ typedef typename Collection::cursor::element_type
+ element_type;
+ typedef typename Collection::cursor::reference_type
+ reference_type;
+public:
+ typedef cursor_iterator<typename Collection::cursor>
+ iterator;
+
+ linq_driver(Collection c) : c(c) {}
+
+
+ // -------------------- linq core methods --------------------
+
+ template <class KeyFn>
+ linq_driver< linq_groupby<Collection, KeyFn> > groupby(KeyFn fn)
+ {
+ return linq_groupby<Collection, KeyFn>(c, std::move(fn) );
+ }
+
+ // TODO: groupby(keyfn, eq)
+
+ // TODO: join...
+
+ template <class Selector>
+ linq_driver< linq_select<Collection, Selector> > select(Selector sel) const {
+ return linq_select<Collection, Selector>(c, std::move(sel) );
+ }
+
+ template <class Fn>
+ linq_driver< linq_select_many<Collection, Fn, detail::default_select_many_selector> >
+ select_many(Fn fn) const
+ {
+ return linq_select_many<Collection, Fn, detail::default_select_many_selector>(c, fn, detail::default_select_many_selector());
+ }
+
+ template <class Fn, class Fn2>
+ linq_driver< linq_select_many<Collection, Fn, Fn2> > select_many(Fn fn, Fn2 fn2) const
+ {
+ return linq_select_many<Collection, Fn, Fn2>(c, fn, fn2);
+ }
+
+ template <class Predicate>
+ linq_driver< linq_where<Collection, Predicate> > where(Predicate p) const {
+ return typename linq_where<Collection, Predicate>(c, std::move(p) );
+ }
+
+
+ // -------------------- linq peripheral methods --------------------
+
+ template <class Fn>
+ element_type aggregate(Fn fn) const
+ {
+ auto it = begin();
+ if (it == end()) {
+ return element_type();
+ }
+
+ reference_type first = *it;
+ return std::accumulate(++it, end(), first, fn);
+ }
+
+ template <class T, class Fn>
+ T aggregate(T initialValue, Fn fn) const
+ {
+ return std::accumulate(begin(), end(), initialValue, fn);
+ }
+
+ bool any() const { return !empty(cur); }
+
+ template <class Predicate>
+ bool any(Predicate p) const {
+ auto it = std::find_if(begin(), end(), p);
+ return it != end();
+ }
+
+ template <class Predicate>
+ bool all(Predicate p) const {
+ auto it = std::find_if(begin(), end(), detail::not1(p));
+ return it == end();
+ }
+
+ // TODO: average
+
+ template <class U>
+ auto cast()
+ -> decltype(static_cast<linq_driver*>(0)->select(detail::cast_to<U>()))
+ {
+ return this->select(detail::cast_to<U>());
+ }
+
+ // TODO: concat
+
+ bool contains(const typename Collection::cursor::element_type& value) const {
+ return std::find(begin(), end(), value) != end();
+ }
+
+ typename std::iterator_traits<iterator>::distance_type count() const {
+ return std::distance(begin(), end());
+ }
+
+ template <class Predicate>
+ typename std::iterator_traits<iterator>::distance_type count(Predicate p) const {
+ auto filtered = this->where(p);
+ return std::distance(begin(filtered), end(filtered));
+ }
+
+ // TODO: default_if_empty
+
+ // TODO: distinct()
+ // TODO: distinct(cmp)
+
+ reference_type element_at(size_t ix) const {
+ auto cur = c.get_cursor();
+ while(ix && !cur.empty()) {
+ cur.inc();
+ --ix;
+ }
+ if (cur.empty()) { throw std::logic_error("index out of bounds"); }
+ else { return cur.get(); }
+ }
+
+ element_type element_at_or_default(size_t ix) const {
+ auto cur = c.get_cursor();
+ while(ix && !cur.empty()) {
+ cur.inc();
+ -- ix;
+ }
+ if (cur.empty()) { return element_type(); }
+ else { return cur.get(); }
+ }
+
+ bool empty() const {
+ return !this->any();
+ }
+
+ // TODO: except(second)
+ // TODO: except(second, eq)
+
+ reference_type first() const {
+ auto cur = c.get_cursor();
+ if (cur.empty()) { throw std::logic_error("index out of bounds"); }
+ else { return cur.get(); }
+ }
+
+ template <class Predicate>
+ reference_type first(Predicate pred) const {
+ auto cur = c.get_cursor();
+ while (!cur.empty() && !pred(cur.get())) {
+ cur.inc();
+ }
+ if (cur.empty()) { throw std::logic_error("index out of bounds"); }
+ else { return cur.get(); }
+ }
+
+ element_type first_or_default() const {
+ auto cur = c.get_cursor();
+ if (cur.empty()) { return element_type(); }
+ else { return cur.get(); }
+ }
+
+ template <class Predicate>
+ element_type first_or_default(Predicate pred) const {
+ auto cur = c.get_cursor();
+ while (!cur.empty() && !pred(cur.get())) {
+ cur.inc();
+ }
+ if (cur.empty()) { return element_type(); }
+ else { return cur.get(); }
+ }
+
+ // TODO: intersect(second)
+ // TODO: intersect(second, eq)
+
+ // note: forward cursors and beyond can provide a clone, so we can refer to the element directly
+ typename std::conditional<
+ std::is_convertible<
+ typename Collection::cursor::cursor_category,
+ forward_cursor_tag>::value,
+ reference_type,
+ element_type>::type
+ last() const
+ {
+ return linq_last_(c.get_cursor(), typename Collection::cursor::cursor_category());
+ }
+
+ template <class Predicate>
+ reference_type last(Predicate pred) const
+ {
+ auto cur = c.where(pred).get_cursor();
+ return linq_last_(cur, typename decltype(cur)::cursor_category());
+ }
+
+ element_type last_or_default() const
+ {
+ return linq_last_or_default_(c.get_cursor(), typename Collection::cursor::cursor_category());
+ }
+
+ template <class Predicate>
+ element_type last_or_default(Predicate pred) const
+ {
+ auto cur = c.where(pred).get_cursor();
+ return linq_last_or_default_(cur, typename decltype(cur)::cursor_category());
+ }
+
+ reference_type max() const
+ {
+ return max(std::less<element_type>());
+ }
+
+ template <class Compare>
+ reference_type max(Compare less) const
+ {
+ auto it = std::max_element(begin(), end(), less);
+ if (it == end())
+ throw std::logic_error("max performed on empty range");
+
+ return *it;
+ }
+
+ reference_type min() const
+ {
+ return min(std::less<element_type>());
+ }
+
+ template <class Compare>
+ reference_type min(Compare less) const
+ {
+ auto it = std::min_element(begin(), end(), less);
+ if (it == end())
+ throw std::logic_error("max performed on empty range");
+
+ return *it;
+ }
+
+ // TODO: order_by(sel)
+ // TODO: order_by(sel, less)
+ // TODO: order_by_descending(sel)
+ // TODO: order_by_descending(sel, less)
+
+ // TODO: sequence_equal(second)
+ // TODO: sequence_equal(second, eq)
+
+ // TODO: single / single_or_default
+
+ linq_driver<linq_skip<Collection>> skip(size_t n) const {
+ return linq_skip<Collection>(c, n);
+ }
+
+ // TODO: skip_while(pred)
+
+ // TODO: sum
+
+ linq_driver<linq_take<Collection>> take(size_t n) const {
+ return linq_take<Collection>(c, n);
+ }
+
+ // TODO: take_while
+
+ // TODO: then_by / then_by_descending ?
+
+ // TODO: to_...
+
+ // TODO: union(second)
+ // TODO: union(eq)
+
+ // TODO: zip
+
+ // -------------------- conversion methods --------------------
+
+ std::vector<typename Collection::cursor::element_type> to_vector() const
+ {
+ return std::vector<typename Collection::cursor::element_type>(begin(), end());
+ }
+
+ // -------------------- container/range methods --------------------
+
+ iterator begin() const { auto cur = c.get_cursor(); return !cur.empty() ? iterator(cur) : iterator(); }
+ iterator end() const { return iterator(); }
+ linq_driver& operator=(const linq_driver& other) { c = other.c; return *this; }
+ template <class TC2>
+ linq_driver& operator=(const linq_driver<TC2>& other) { c = other.c; return *this; }
+
+ typename std::iterator_traits<iterator>::reference
+ operator[](size_t ix) const {
+ return *(begin()+=ix);
+ }
+
+ // -------------------- collection methods (leaky abstraction) --------------------
+
+ typedef typename Collection::cursor cursor;
+ cursor get_cursor() { return c.get_cursor(); }
+
+ linq_driver< dynamic_collection<typename Collection::cursor::reference_type> >
+ late_bind() const
+ {
+ return dynamic_collection<typename Collection::cursor::reference_type>(c);
+ }
+
+private:
+ Collection c;
+};
+
+// TODO: should probably use reference-wrapper instead?
+template <class TContainer>
+linq_driver<iter_cursor<typename util::container_traits<TContainer>::iterator>> from(TContainer& c)
+{
+ auto cur = iter_cursor<typename util::container_traits<TContainer>::iterator>(begin(c), end(c));
+ return std::move(cur);
+}
+template <class T>
+const linq_driver<T>& from(const linq_driver<T>& c)
+{
+ return c;
+}
+template <class Iter>
+linq_driver<iter_cursor<Iter>> from(Iter start, Iter finish)
+{
+ return iter_cursor<Iter>(start, finish);
+}
+
+template <class TContainer>
+linq_driver<TContainer> from_value(const TContainer& c)
+{
+ return linq_driver<TContainer>(c);
+}
+
+}
+
+#endif // defined(CPPLINQ_LINQ_HPP)
+
diff --git a/Ix/CPP/src/cpplinq/linq_cursor.hpp b/Ix/CPP/src/cpplinq/linq_cursor.hpp
new file mode 100644
index 0000000..827c488
--- /dev/null
+++ b/Ix/CPP/src/cpplinq/linq_cursor.hpp
@@ -0,0 +1,340 @@
+// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
+
+#if !defined(CPPLINQ_LINQ_CURSOR_HPP)
+#define CPPLINQ_LINQ_CURSOR_HPP
+#pragma once
+
+/// cursors
+/// ----------
+/// It should be noted that CppLinq uses a slightly different iterator concept, one where iterators
+/// know their extents. This sacrificed some generality, but it adds convenience and improves
+/// some performance in some cases. Notably, captures need only be stored once instead of twice in
+/// most use cases.
+///
+/// Cursors and Ranges are always classes.
+///
+/// To get a cursor from a range:
+///
+/// get_cursor(range) -> cur
+///
+/// Unlike boost ranges, CppLinq cursors are mutated directly, and may "shed state" as they are
+/// mutated. For example, a GroupBy range will drop references to earlier groups, possibly
+/// permitting freeing them.
+///
+/// Onepass cursor
+/// ===========
+/// - empty(cur) -> bool : at end of sequence
+/// - inc(cur)
+/// - get(cur) -> T
+/// - copy ctor : duplicate reference to seek position
+///
+/// Forward cursor
+/// =============
+/// - copy ctor : true duplicate of seek position
+///
+/// Bidirectional cursor
+/// ====================
+/// - forget() : notes the current element as the new 'begin' point
+/// - atbegin(cur) -> bool
+/// - dec(cur)
+///
+/// Random access cursor
+/// ====================
+/// - skip(cur, n)
+/// - position(cur) -> n
+/// - size(cur) -> n
+/// - truncate(n) : keep only n more elements
+///
+/// As well, cursors must define the appropriate type/typedefs:
+/// - cursor_category :: { onepass_cursor_tag, forward_cursor_tag, bidirectional_cursor_tag, random_access_cursor_tag }
+/// - element_type
+/// - reference_type : if writable, element_type& or such. else, == element_type
+/// -
+
+
+
+namespace cpplinq {
+
+ // used to identify cursor-based collections
+ struct collection_tag {};
+
+ struct onepass_cursor_tag {};
+ struct forward_cursor_tag : onepass_cursor_tag {};
+ struct bidirectional_cursor_tag : forward_cursor_tag {};
+ struct random_access_cursor_tag : bidirectional_cursor_tag {};
+
+ struct noread_cursor_tag {}; // TODO: remove if not used
+ struct readonly_cursor_tag : noread_cursor_tag {};
+ struct readwrite_cursor_tag : readonly_cursor_tag {};
+
+
+
+ // standard cursor adaptors
+
+ namespace util
+ {
+ namespace detail
+ {
+ template <size_t n> struct type_to_size { char value[n]; };
+
+ type_to_size<1> get_category_from_iterator(std::input_iterator_tag);
+ type_to_size<2> get_category_from_iterator(std::forward_iterator_tag);
+ type_to_size<3> get_category_from_iterator(std::bidirectional_iterator_tag);
+ type_to_size<4> get_category_from_iterator(std::random_access_iterator_tag);
+ }
+
+ template <size_t>
+ struct iter_to_cursor_category_;
+
+ template <class Iter>
+ struct iter_to_cursor_category
+ {
+ static const size_t catIx = sizeof(detail::get_category_from_iterator(typename std::iterator_traits<Iter>::iterator_category()) /*.value*/ );
+ typedef typename iter_to_cursor_category_<catIx>::type type;
+ };
+
+ template <> struct iter_to_cursor_category_<1> { typedef onepass_cursor_tag type; };
+ template <> struct iter_to_cursor_category_<2> { typedef forward_cursor_tag type; };
+ template <> struct iter_to_cursor_category_<3> { typedef bidirectional_cursor_tag type; };
+ template <> struct iter_to_cursor_category_<4> { typedef random_access_cursor_tag type; };
+
+
+ // Note: returns false if no partial order exists between two
+ // particular iterator categories, such as with some of the boost categories
+ template <class Cat1, class Cat2>
+ struct less_or_equal_cursor_category
+ {
+ private:
+ typedef char yes;
+ typedef struct { char c1,c2; } no;
+ static yes invoke(Cat1);
+ static no invoke(...);
+ public:
+ enum { value = (sizeof(invoke(Cat2())) == sizeof(yes)) };
+ };
+
+ // Return the weaker of the two iterator categories. Make sure
+ // a non-standard category is in the second argument position, as
+ // this metafunction will default to the first value if the order is undefined
+ template <class Cat1, class Cat2, class Cat3 = void>
+ struct min_cursor_category : min_cursor_category<typename min_cursor_category<Cat1, Cat2>::type, Cat3>
+ {
+ };
+
+ template <class Cat1, class Cat2>
+ struct min_cursor_category<Cat1, Cat2>
+ : std::conditional<
+ less_or_equal_cursor_category<Cat2, Cat1>::value,
+ Cat2,
+ Cat1>
+ {
+ };
+
+ template <class Collection>
+ struct cursor_type {
+ typedef decltype(cursor(*static_cast<Collection*>(0))) type;
+ };
+ }
+
+ // simultaniously models a cursor and a cursor-collection
+ template <class Iterator>
+ class iter_cursor : collection_tag {
+ public:
+
+ typedef iter_cursor cursor;
+
+ typedef typename std::remove_reference<typename std::iterator_traits<Iterator>::value_type>::type
+ element_type;
+ typedef typename std::iterator_traits<Iterator>::reference
+ reference_type;
+ typedef typename util::iter_to_cursor_category<Iterator>::type
+ cursor_category;
+
+ void forget() { start = current; }
+ bool empty() const { return current == fin; }
+ void inc() {
+ if (current == fin)
+ throw std::logic_error("inc past end");
+ ++current;
+ }
+ typename std::iterator_traits<Iterator>::reference get() const { return *current; }
+
+ bool atbegin() const { return current == start; }
+ void dec() {
+ if (current == start)
+ throw std::logic_error("dec past begin");
+ --current;
+ }
+
+ void skip(ptrdiff_t n) { current += n; }
+ size_t size() { return fin-start; }
+ void position() { return current-start; }
+ void truncate(size_t n) {
+ if (n > fin-current) {
+ fin = current + n;
+ }
+ }
+
+
+ iter_cursor(Iterator start, Iterator fin)
+ : start(start)
+ , fin(std::move(fin))
+ , current(start)
+ {
+ }
+
+ iter_cursor(Iterator start, Iterator fin, Iterator current)
+ : start(std::move(start))
+ , fin(std::move(fin))
+ , current(std::move(current))
+ {
+ }
+
+ iter_cursor get_cursor() const { return *this; }
+
+ private:
+ Iterator current;
+ Iterator start, fin;
+ };
+
+
+ template <class T>
+ struct cursor_interface
+ {
+ virtual bool empty() const = 0;
+ virtual void inc() = 0;
+ virtual cursor_interface* copy() const = 0;
+
+ virtual T get() const = 0;
+
+ virtual ~cursor_interface() {}
+ };
+
+ template <class T>
+ class dynamic_cursor : collection_tag
+ {
+ template <class Cur>
+ struct instance : cursor_interface<T>
+ {
+ Cur innerCursor;
+
+ instance(Cur cursor) : innerCursor(std::move(cursor))
+ {
+ }
+ virtual bool empty() const
+ {
+ return innerCursor.empty();
+ }
+ virtual void inc()
+ {
+ innerCursor.inc();
+ }
+ virtual T get() const
+ {
+ return innerCursor.get();
+ }
+ virtual cursor_interface<T>* copy() const
+ {
+ return new instance(*this);
+ }
+ };
+
+ std::unique_ptr<cursor_interface<T>> myCur;
+
+ public:
+ typedef forward_cursor_tag cursor_category; // TODO: not strictly true!
+ typedef typename std::remove_reference<T>::type element_type;
+ typedef T reference_type;
+
+ dynamic_cursor() {}
+
+ dynamic_cursor(const dynamic_cursor& other)
+ : myCur(other.myCur ? other.myCur->copy() : nullptr)
+ {
+ }
+
+ dynamic_cursor(dynamic_cursor&& other)
+ : myCur(other.myCur.release())
+ {
+ }
+
+ template <class Cursor>
+ dynamic_cursor(Cursor cursor)
+ : myCur(new instance<Cursor>(std::move(cursor)))
+ {
+ }
+
+ template <class Iterator>
+ dynamic_cursor(Iterator start, Iterator end)
+ {
+ *this = iter_cursor<Iterator>(start, end);
+ }
+
+ bool empty() const { return !myCur || myCur->empty(); }
+ void inc() { myCur->inc(); }
+ T get() const { return myCur->get(); }
+
+ dynamic_cursor& operator=(dynamic_cursor other)
+ {
+ std::swap(myCur, other.myCur);
+ return *this;
+ }
+ };
+
+ template <class T>
+ struct container_interface
+ {
+ virtual dynamic_cursor<T> get_cursor() const = 0;
+ };
+
+ template <class T>
+ class dynamic_collection
+ {
+ std::shared_ptr< container_interface<T> > container;
+
+ template <class Container>
+ struct instance : container_interface<T>
+ {
+ Container c;
+
+ instance(Container c) : c(c)
+ {
+ }
+
+ dynamic_cursor<T> get_cursor() const
+ {
+ return c.get_cursor();
+ }
+ };
+
+ public:
+ typedef dynamic_cursor<T> cursor;
+
+ dynamic_collection() {}
+
+ dynamic_collection(const dynamic_collection& other)
+ : container(other.container)
+ {
+ }
+
+ // container or query
+ template <class Container>
+ dynamic_collection(Container c)
+ : container(new instance<Container>(c))
+ {
+ }
+
+ // container or query
+ template <class Iterator>
+ dynamic_collection(Iterator begin, Iterator end)
+ : container(new instance< iter_cursor<Iterator> >(iter_cursor<Iterator>(begin, end)))
+ {
+ }
+
+ dynamic_cursor<T> get_cursor() const {
+ return container ? container->get_cursor() : dynamic_cursor<T>();
+ }
+ };
+}
+
+#endif // !defined(CPPLINQ_LINQ_CURSOR_HPP
diff --git a/Ix/CPP/src/cpplinq/linq_groupby.hpp b/Ix/CPP/src/cpplinq/linq_groupby.hpp
new file mode 100644
index 0000000..c521e5e
--- /dev/null
+++ b/Ix/CPP/src/cpplinq/linq_groupby.hpp
@@ -0,0 +1,195 @@
+// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
+
+#if !defined(CPPLINQ_LINQ_GROUPBY_HPP)
+#define CPPLINQ_LINQ_GROUPBY_HPP
+#pragma once
+
+namespace cpplinq
+{
+
+template <class Iter, class Key>
+struct group
+{
+ Key key;
+ Iter start;
+ Iter fin;
+
+ typedef Iter iterator;
+ typedef Iter const_iterator;
+
+ group(){}
+
+ group(const Key& key) : key(key)
+ {
+ }
+
+ Iter begin() const { return start; }
+ Iter end() const { return fin; }
+};
+
+struct default_equality
+{
+ template <class T>
+ bool operator()(const T& a, const T& b) const {
+ return a == b;
+ }
+};
+struct default_less
+{
+ template<class T>
+ bool operator()(const T& a, const T& b) const {
+ return a < b;
+ }
+};
+
+// progressively constructs grouping as user iterates over groups and elements
+// within each group. Performs this task by building a std::list of element
+// iterators with equal elements within each group.
+//
+// invariants:
+// - relative order of groups corresponds to relative order of each group's first
+// element, as they appeared in the input sequence.
+// - relative order of elements within a group correspond to relative order
+// as they appeared in the input sequence.
+//
+// requires:
+// Iter must be a forward iterator.
+template <class Collection, class KeyFn, class Compare = default_less>
+class linq_groupby
+{
+ typedef typename Collection::cursor
+ inner_cursor;
+
+ typedef typename util::result_of<KeyFn(typename inner_cursor::element_type)>::type
+ key_type;
+
+ typedef std::list<typename inner_cursor::element_type>
+ element_list_type;
+
+ typedef group<typename element_list_type::iterator, key_type>
+ group_type;
+
+ typedef std::list<group_type>
+ group_list_type;
+
+private:
+ struct impl_t
+ {
+ // TODO: would be faster to use a chunked list, where
+ // pointers are invalidated but iterators are not. Need
+ // benchmarks first
+
+ element_list_type elements;
+ std::list<group_type> groups;
+ std::map<key_type, group_type*, Compare> groupIndex;
+
+
+
+ KeyFn keySelector;
+ Compare comp;
+
+ impl_t(inner_cursor cur,
+ KeyFn keySelector,
+ Compare comp = Compare())
+ : keySelector(keySelector)
+ , groupIndex(comp)
+ {
+ // TODO: make lazy
+ insert_all(std::move(cur));
+ }
+
+ void insert_all(inner_cursor cur)
+ {
+ while(!cur.empty()) {
+ insert(cur.get());
+ cur.inc();
+ }
+ }
+ void insert(typename inner_cursor::reference_type element)
+ {
+ key_type key = keySelector(element);
+ auto groupPos = groupIndex.find(key);
+ if(groupPos == groupIndex.end()) {
+ // new group
+ bool firstGroup = groups.empty();
+
+ elements.push_back(element);
+ if(!firstGroup) {
+ // pop new element out of previous group
+ --groups.back().fin;
+ }
+
+ // build new group
+ groups.push_back(group_type(key));
+ group_type& newGroup = groups.back();
+
+ groupIndex.insert( std::make_pair(key, &newGroup) );
+
+ newGroup.fin = elements.end();
+ --(newGroup.start = newGroup.fin);
+ } else {
+ // add to existing group at end
+ elements.insert(groupPos->second->end(), element);
+ }
+ }
+ };
+
+public:
+ struct cursor {
+ typedef group_type
+ element_type;
+
+ typedef element_type
+ reference_type;
+
+ typedef forward_cursor_tag
+ cursor_category;
+
+ cursor(inner_cursor cur,
+ KeyFn keyFn,
+ Compare comp = Compare())
+ {
+ impl.reset(new impl_t(cur, keyFn, comp));
+ inner = impl->groups.begin();
+ fin = impl->groups.end();
+ }
+
+ void forget() { } // nop on forward-only cursors
+ bool empty() const {
+ return inner == fin;
+ }
+ void inc() {
+ if (inner == fin) {
+ throw std::logic_error("attempt to iterate past end of range");
+ }
+ ++inner;
+ }
+ reference_type get() const {
+ return *inner;
+ }
+
+ private:
+ std::shared_ptr<impl_t> impl;
+ typename std::list<group_type>::iterator inner;
+ typename std::list<group_type>::iterator fin;
+ };
+
+ linq_groupby(Collection c,
+ KeyFn keyFn,
+ Compare comp = Compare())
+ : c(c), keyFn(keyFn), comp(comp)
+ {
+ }
+
+ cursor get_cursor() const { return cursor(c.get_cursor(), keyFn, comp); }
+
+private:
+ Collection c;
+ KeyFn keyFn;
+ Compare comp;
+};
+
+}
+
+#endif // !defined(CPPLINQ_LINQ_GROUPBY_HPP)
+
diff --git a/Ix/CPP/src/cpplinq/linq_iterators.hpp b/Ix/CPP/src/cpplinq/linq_iterators.hpp
new file mode 100644
index 0000000..ed267ec
--- /dev/null
+++ b/Ix/CPP/src/cpplinq/linq_iterators.hpp
@@ -0,0 +1,194 @@
+// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
+
+#if !defined(CPPLINQ_LINQ_ITERATORS_HPP)
+#define CPPLINQ_LINQ_ITERATORS_HPP
+#pragma once
+
+namespace cpplinq {
+
+ // if a member, provides the straightforward implementation of various redundant operators. For example,
+ // providing -> for any iterator providing *, and so forth.
+ struct use_default_iterator_operators {};
+
+ #define CPPLINQ_USE_DEFAULT_ITERATOR_OPERATORS \
+ operator ::cpplinq::use_default_iterator_operators() const { return ::cpplinq::use_default_iterator_operators(); }
+
+ template <class Iter>
+ typename std::enable_if<
+ std::is_convertible<Iter, use_default_iterator_operators>::value,
+ Iter
+ >::type
+ operator+(const Iter& it, typename std::iterator_traits<Iter>::distance_type n) {
+ return it += n;
+ }
+ template <class Iter>
+ typename std::enable_if<
+ std::is_convertible<Iter, use_default_iterator_operators>::value,
+ Iter
+ >::type
+ operator-(const Iter& it, typename std::iterator_traits<Iter>::distance_type n) {
+ return it -= n;
+ }
+ template <class Iter>
+ typename std::enable_if<
+ std::is_convertible<Iter, use_default_iterator_operators>::value,
+ Iter
+ >::type
+ operator-=(const Iter& it, typename std::iterator_traits<Iter>::distance_type n) {
+ return it += (-n);
+ }
+
+ template <class Iter>
+ typename std::enable_if<
+ std::is_convertible<Iter, use_default_iterator_operators>::value,
+ bool
+ >::type
+ operator!=(const Iter& it, const Iter& it2) {
+ return !(it == it2);
+ }
+ template <class Iter>
+ typename std::enable_if<
+ std::is_convertible<Iter, use_default_iterator_operators>::value,
+ bool
+ >::type
+ operator>(const Iter& it, const Iter& it2) {
+ return it2 < it;
+ }
+ template <class Iter>
+ typename std::enable_if<
+ std::is_convertible<Iter, use_default_iterator_operators>::value,
+ bool
+ >::type
+ operator<=(const Iter& it, const Iter& it2) {
+ return !(it2 < it);
+ }
+ template <class Iter>
+ typename std::enable_if<
+ std::is_convertible<Iter, use_default_iterator_operators>::value,
+ bool
+ >::type
+ operator>=(const Iter& it, const Iter& it2) {
+ return !(it < it2);
+ }
+
+ namespace util {
+ template <class Iter, class T>
+ typename std::iterator_traits<Iter>::pointer deref_iterator(const Iter& it) {
+ return detail::deref_iterator(it, std::identity<typename std::iterator_traits<Iter>::reference>());
+ }
+
+ template <class Iter, class T>
+ T* deref_iterator(const Iter& it, std::identity<T&>) {
+ return &*it;
+ }
+
+ template <class Iter, class T>
+ util::value_ptr<T> deref_iterator(const Iter& it, std::identity<T>) {
+ return util::value_ptr<T>(*it);
+ }
+ }
+
+
+ template <class Iter>
+ class iter_range
+ {
+ Iter start, finish;
+ public:
+
+ CPPLINQ_USE_DEFAULT_ITERATOR_OPERATORS
+
+ typedef Iter iterator;
+ typedef typename iterator::value_type value_type;
+
+ explicit iter_range(Iter start, Iter finish) : start(start), finish(finish) {}
+ iterator begin() const { return start; }
+ iterator end() const { return finish; }
+ };
+ template <class Iter>
+ iter_range<Iter> make_range(Iter start, Iter finish) {
+ return iter_range<Iter>(start, finish);
+ }
+
+ // decays into a onepass/forward iterator
+ template <class Cursor>
+ class cursor_iterator
+ : public std::iterator<std::forward_iterator_tag,
+ typename Cursor::element_type,
+ ptrdiff_t,
+ typename std::conditional<std::is_reference<typename Cursor::reference_type>::value,
+ typename std::add_pointer<typename Cursor::element_type>::type,
+ util::value_ptr<typename Cursor::element_type>>::type,
+ typename Cursor::reference_type>
+ {
+ public:
+ CPPLINQ_USE_DEFAULT_ITERATOR_OPERATORS;
+
+ cursor_iterator(Cursor cur) : cur(cur) {
+ }
+
+ cursor_iterator() : cur() {
+ }
+
+ bool operator==(const cursor_iterator& other) const {
+ return !cur && !other.cur;
+ }
+
+ typename Cursor::reference_type operator*() const {
+ return cur->get();
+ }
+
+ pointer operator->() const {
+ auto& v = **this;
+ return &v;
+ }
+
+ cursor_iterator& operator++() {
+ cur->inc();
+
+ if (cur->empty()) { cur.reset(); }
+ return *this;
+ }
+
+ cursor_iterator& operator+=(ptrdiff_t n) {
+ cur->skip(n);
+
+ if (cur->empty()) { cur.reset(); }
+ return *this;
+ }
+
+
+
+ private:
+ bool empty() const {
+ !cur || cur->empty();
+ }
+
+ util::maybe<Cursor> cur;
+ };
+
+ template <class Container>
+ class container_range
+ {
+ Container c;
+
+ public:
+ typedef cursor_iterator<typename Container::cursor> iterator;
+
+ container_range(Container c) : c(c)
+ {
+ }
+
+ iterator begin() const
+ {
+ return iterator(c.get_cursor());
+ }
+
+ iterator end() const
+ {
+ return iterator();
+ }
+ };
+
+}
+
+#endif
diff --git a/Ix/CPP/src/cpplinq/linq_last.hpp b/Ix/CPP/src/cpplinq/linq_last.hpp
new file mode 100644
index 0000000..fd08823
--- /dev/null
+++ b/Ix/CPP/src/cpplinq/linq_last.hpp
@@ -0,0 +1,85 @@
+// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
+
+#if !defined(CPPLINQ_LINQ_LAST_HPP)
+#define CPPLINQ_LINQ_LAST_HPP
+#pragma once
+
+namespace cpplinq {
+
+ template <class Cursor>
+ typename Cursor::element_type
+ linq_last_(Cursor c, onepass_cursor_tag)
+ {
+ if (c.empty()) { throw std::logic_error("last() out of bounds"); }
+ typename Cursor::element_type elem = c.get();
+ for(;;) {
+ c.inc();
+ if (c.empty()) break;
+ elem = c.get();
+ }
+ return std::move(elem);
+ }
+
+ // TODO: bidirectional iterator in constant time
+
+ template <class Cursor>
+ typename Cursor::reference_type
+ linq_last_(Cursor c, forward_cursor_tag)
+ {
+ if (c.empty()) { throw std::logic_error("last() out of bounds"); }
+ Cursor best = c;
+ for(;;) {
+ c.inc();
+ if (c.empty()) break;
+ best = c;
+ }
+ return best.get();
+ }
+
+ template <class Cursor>
+ typename Cursor::reference_type
+ linq_last_(Cursor c, random_access_cursor_tag)
+ {
+ if (c.empty()) { throw std::logic_error("last() out of bounds"); }
+ c.skip(c.size()-1);
+ return c.get();
+ }
+
+ template <class Cursor>
+ typename Cursor::element_type
+ linq_last_or_default_(Cursor c, onepass_cursor_tag)
+ {
+ typename Cursor::element_type elem;
+ while(!c.empty()) {
+ elem = c.get();
+ c.inc();
+ }
+ return std::move(elem);
+ }
+
+ template <class Cursor>
+ typename Cursor::element_type
+ linq_last_or_default_(Cursor c, forward_cursor_tag)
+ {
+ if (c.empty()) { throw std::logic_error("last() out of bounds"); }
+ Cursor best = c;
+ for(;;) {
+ c.inc();
+ if (c.empty()) break;
+ best = c;
+ }
+ return best.get();
+ }
+
+ template <class Cursor>
+ typename Cursor::element_type
+ linq_last_or_default_(Cursor c, random_access_cursor_tag)
+ {
+ if (c.empty()) { return typename Cursor::element_type(); }
+ c.skip(c.size()-1);
+ return c.get();
+ }
+
+}
+
+#endif // CPPLINQ_LINQ_LAST_HPP
diff --git a/Ix/CPP/src/cpplinq/linq_select.hpp b/Ix/CPP/src/cpplinq/linq_select.hpp
new file mode 100644
index 0000000..650a1dc
--- /dev/null
+++ b/Ix/CPP/src/cpplinq/linq_select.hpp
@@ -0,0 +1,52 @@
+// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
+
+#if !defined(CPPLINQ_LINQ_SELECT_HPP)
+#define CPPLINQ_LINQ_SELECT_HPP
+#pragma once
+
+namespace cpplinq
+{
+ template <class Collection, class Selector>
+ class linq_select
+ {
+ typedef typename Collection::cursor
+ inner_cursor;
+ public:
+ struct cursor {
+ typedef typename util::result_of<Selector(typename inner_cursor::element_type)>::type
+ reference_type;
+ typedef typename std::remove_reference<reference_type>::type
+ element_type;
+ typedef typename inner_cursor::cursor_category
+ cursor_category;
+
+ cursor(const inner_cursor& cur, Selector sel) : cur(cur), sel(std::move(sel)) {}
+
+ void forget() { cur.forget(); }
+ bool empty() const { return cur.empty(); }
+ void inc() { cur.inc(); }
+ reference_type get() const { return sel(cur.get()); }
+
+ bool atbegin() const { return cur.atbegin(); }
+ void dec() { cur.dec(); }
+
+ void skip(size_t n) { cur.skip(n); }
+ size_t position() const { return cur.position(); }
+ size_t size() const { return cur.size(); }
+ private:
+ inner_cursor cur;
+ Selector sel;
+ };
+
+ linq_select(const Collection& c, Selector sel) : c(c), sel(sel) {}
+
+ cursor get_cursor() const { return cursor(c.get_cursor(), sel); }
+
+ private:
+ Collection c;
+ Selector sel;
+ };
+
+}
+
+#endif // defined(CPPLINQ_LINQ_SELECT_HPP)
diff --git a/Ix/CPP/src/cpplinq/linq_selectmany.hpp b/Ix/CPP/src/cpplinq/linq_selectmany.hpp
new file mode 100644
index 0000000..45f0574
--- /dev/null
+++ b/Ix/CPP/src/cpplinq/linq_selectmany.hpp
@@ -0,0 +1,107 @@
+// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
+
+#pragma once
+
+#include "util.hpp"
+#include "linq_cursor.hpp"
+
+namespace cpplinq
+{
+ namespace detail
+ {
+ struct default_select_many_selector
+ {
+ template <class T1, class T2>
+ auto operator()(T1&& t1, T2&& t2) const
+ -> decltype(std::forward<T2>(t2))
+ {
+ return std::forward<T2>(t2);
+ }
+ };
+ }
+
+ // cur<T> -> (T -> cur<element_type>) -> cur<element_type>
+ template <class Container1, class Fn, class Fn2>
+ class linq_select_many
+ {
+ template <class T> static T instance(); // for type inference
+
+ Container1 c1;
+ Fn fn;
+ Fn2 fn2;
+
+ typedef typename Container1::cursor Cur1;
+ typedef decltype(from(instance<Fn>()(instance<Cur1>().get()))) Container2;
+ typedef typename Container2::cursor Cur2;
+
+ public:
+ class cursor
+ {
+ public:
+ typedef typename util::min_cursor_category<typename Cur1::cursor_category,
+ typename Cur2::cursor_category,
+ forward_cursor_tag>::type
+ cursor_category;
+ typedef typename Cur2::reference_type reference_type;
+ typedef typename Cur2::element_type element_type;
+
+ private:
+ // TODO: we need to lazy eval somehow, but this feels wrong.
+ Cur1 cur1;
+ dynamic_cursor<reference_type> cur2;
+ Fn fn;
+ Fn2 fn2;
+
+ public:
+ cursor(Cur1 cur1, const Fn& fn, const Fn2& fn2)
+ : cur1(std::move(cur1)), fn(fn), fn2(fn2)
+ {
+ auto container2 = fn(cur1.get());
+ cur2 = from(container2).get_cursor();
+ }
+
+ bool empty() const
+ {
+ return cur2.empty();
+ }
+
+ void inc()
+ {
+ cur2.inc();
+ thunk();
+ }
+
+ reference_type get() const
+ {
+ return fn2(cur1.get(), cur2.get());
+ }
+
+ private:
+ void thunk()
+ {
+ // refill cur2
+ while (cur2.empty() && !cur1.empty()) {
+ cur1.inc();
+ if (cur1.empty())
+ break;
+
+ auto container2 = fn(cur1.get());
+ cur2 = from(container2).get_cursor();
+ }
+ }
+ };
+
+ linq_select_many(Container1 c1, Fn fn, Fn2 fn2)
+ : c1(std::move(c1)), fn(std::move(fn)), fn2(std::move(fn2))
+ {
+ }
+
+ cursor get_cursor() const
+ {
+ return cursor(c1.get_cursor(), fn, fn2);
+ }
+ };
+}
+
+
+
diff --git a/Ix/CPP/src/cpplinq/linq_skip.hpp b/Ix/CPP/src/cpplinq/linq_skip.hpp
new file mode 100644
index 0000000..422592a
--- /dev/null
+++ b/Ix/CPP/src/cpplinq/linq_skip.hpp
@@ -0,0 +1,35 @@
+// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
+
+#if !defined(CPPLINQ_LINQ_SKIP_HPP)
+#define CPPLINQ_LINQ_SKIP_HPP
+#pragma once
+
+namespace cpplinq
+{
+ template <class Collection>
+ struct linq_skip
+ {
+ public:
+ typedef typename Collection::cursor cursor;
+
+ linq_skip(const Collection& c, size_t n) : c(c), n(n) {}
+
+ cursor get_cursor() const {
+ size_t rem = n;
+
+ auto cur = c.get_cursor();
+ while(rem-- && !cur.empty()) {
+ cur.inc();
+ }
+ cur.forget();
+ return std::move(cur);
+ }
+
+ private:
+ Collection c;
+ size_t n;
+ };
+}
+#endif // !defined(CPPLINQ_LINQ_SKIP_HPP)
+
+
diff --git a/Ix/CPP/src/cpplinq/linq_take.hpp b/Ix/CPP/src/cpplinq/linq_take.hpp
new file mode 100644
index 0000000..63f7449
--- /dev/null
+++ b/Ix/CPP/src/cpplinq/linq_take.hpp
@@ -0,0 +1,96 @@
+// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
+
+#if !defined(CPPLINQ_LINQ_TAKE_HPP)
+#define CPPLINQ_LINQ_TAKE_HPP
+#pragma once
+
+namespace cpplinq
+{
+ template <class InnerCursor>
+ struct linq_take_cursor
+ {
+ typedef typename InnerCursor::element_type element_type;
+ typedef typename InnerCursor::reference_type reference_type;
+ typedef typename InnerCursor::cursor_category cursor_category;
+
+ linq_take_cursor(const InnerCursor& cur, size_t rem) : cur(cur), rem(rem) {}
+
+ void forget() { cur.forget(); }
+ bool empty() const { return cur.empty() || rem == 0; }
+ void inc() { cur.inc(); --rem; }
+ reference_type get() const { return cur.get(); }
+
+ bool atbegin() const { return cur.atbegin(); }
+ void dec() { cur.dec(); --rem; }
+
+ void skip(size_t n) { cur.skip(n); rem -= n; }
+ size_t position() const { return cur.position(); }
+ size_t size() const { return cur.size(); }
+
+ private:
+ InnerCursor cur;
+ size_t rem;
+ };
+
+ namespace detail {
+ template <class Collection>
+ linq_take_cursor<typename Collection::cursor>
+ take_get_cursor_(
+ const Collection& c,
+ size_t n,
+ onepass_cursor_tag
+ )
+ {
+ return linq_take_cursor<typename Collection::cursor>(c.get_cursor(), n);
+ }
+
+ template <class Collection>
+ typename Collection::cursor
+ take_get_cursor_(
+ const Collection& c,
+ size_t n,
+ random_access_cursor_tag
+ )
+ {
+ auto cur = c.get_cursor();
+ if (cur.size() > n) {
+ cur.truncate(n);
+ }
+ return std::move(cur);
+ }
+ }
+
+ template <class Collection>
+ struct linq_take
+ {
+ typedef typename std::conditional<
+ util::less_or_equal_cursor_category<
+ random_access_cursor_tag,
+ typename Collection::cursor::cursor_category>::value,
+ typename Collection::cursor,
+ linq_take_cursor<typename Collection::cursor>>::type
+ cursor;
+
+ linq_take(const Collection& c, size_t n) : c(c), n(n) {}
+
+ cursor get_cursor() const {
+ return detail::take_get_cursor_(c, n, typename Collection::cursor::cursor_category());
+ }
+
+ Collection c;
+ size_t n;
+ };
+
+ template <class Collection>
+ auto get_cursor(
+ const linq_take<Collection>& take
+ )
+ -> decltype(get_cursor_(take, typename Collection::cursor::cursor_category()))
+ {
+ return get_cursor_(take, typename Collection::cursor::cursor_category());
+ }
+
+
+}
+#endif // !defined(CPPLINQ_LINQ_TAKE_HPP)
+
diff --git a/Ix/CPP/src/cpplinq/linq_where.hpp b/Ix/CPP/src/cpplinq/linq_where.hpp
new file mode 100644
index 0000000..4f66ba7
--- /dev/null
+++ b/Ix/CPP/src/cpplinq/linq_where.hpp
@@ -0,0 +1,69 @@
+// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
+
+#if !defined(CPPLINQ_LINQ_WHERE_HPP)
+#define CPPLINQ_LINQ_WHERE_HPP
+#pragma once
+
+namespace cpplinq
+{
+ template <class Collection, class Predicate>
+ class linq_where
+ {
+ typedef typename Collection::cursor
+ inner_cursor;
+ public:
+ struct cursor {
+ typedef typename util::min_iterator_category<
+ bidirectional_cursor_tag,
+ typename inner_cursor::cursor_category>::type
+ cursor_category;
+ typedef typename inner_cursor::element_type
+ element_type;
+ typedef typename inner_cursor::reference_type
+ reference_type;
+
+ cursor(const inner_cursor& cur, const Predicate& p) : cur(cur), pred(p)
+ {
+ if (!pred(cur.get())) {
+ this->inc();
+ }
+ }
+
+ void forget() { cur.forget(); }
+ bool empty() const { return cur.empty(); }
+ void inc() {
+ for (;;) {
+ cur.inc();
+ if (cur.empty() || pred(cur.get())) break;
+ }
+ }
+ reference_type get() const {
+ return cur.get();
+ }
+
+ bool atbegin() const { return atbegin(cur); }
+ void dec() {
+ for (;;) {
+ cur.dec();
+ if (pred(cur.get())) break;
+ }
+ }
+ private:
+ inner_cursor cur;
+ Predicate pred;
+ };
+
+ linq_where(const Collection& c, Predicate pred) : c(c), pred(pred) {}
+
+ cursor get_cursor() const {
+ return cursor(c.get_cursor(), pred);
+ }
+
+ private:
+ Collection c;
+ Predicate pred;
+ };
+}
+
+#endif // !defined(CPPLINQ_LINQ_WHERE_HPP)
+
diff --git a/Ix/CPP/src/cpplinq/util.hpp b/Ix/CPP/src/cpplinq/util.hpp
new file mode 100644
index 0000000..6fb62ff
--- /dev/null
+++ b/Ix/CPP/src/cpplinq/util.hpp
@@ -0,0 +1,223 @@
+// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
+
+#if !defined(CPPLINQ_LINQ_UTIL_HPP)
+#define CPPLINQ_LINQ_UTIL_HPP
+#pragma once
+
+namespace cpplinq { namespace util {
+
+ template <class Container>
+ struct container_traits {
+ typedef typename Container::iterator iterator;
+ typedef typename std::iterator_traits<iterator>::value_type value_type;
+ typedef typename std::iterator_traits<iterator>::iterator_category iterator_category;
+
+ // TODO: conservative definition for now.
+ enum { is_writable_iterator =
+ std::is_reference<typename std::iterator_traits<iterator>::reference>::value
+ && std::is_same<typename std::remove_cv<value_type>::type,
+ typename std::remove_cv<typename std::remove_reference<typename std::iterator_traits<iterator>::reference>::type>::type>::value
+ };
+ };
+
+ template <>
+ struct container_traits<int>;
+
+ template <class Container>
+ struct container_traits<Container&>
+ : container_traits<Container>
+ {};
+ template <class Container>
+ struct container_traits<const Container>
+ : container_traits<Container>
+ {
+ typedef typename Container::const_iterator iterator;
+ };
+
+ // Note: returns false if no partial order exists between two
+ // particular iterator categories, such as with some of the boost categories
+ template <class Cat1, class Cat2>
+ struct less_or_equal_iterator_category
+ {
+ private:
+ typedef char yes;
+ typedef struct { char c1,c2; } no;
+ static yes invoke(Cat1);
+ static no invoke(...);
+ public:
+ enum { value = (sizeof(invoke(Cat2())) == sizeof(yes)) };
+ };
+
+ // Return the weaker of the two iterator categories. Make sure
+ // a non-standard category is in the second argument position, as
+ // this metafunction will default to the first value if the order is undefined
+ template <class Cat1, class Cat2>
+ struct min_iterator_category
+ : std::conditional<
+ less_or_equal_iterator_category<Cat2, Cat1>::value,
+ Cat2,
+ Cat1>
+ {
+ };
+
+#if 0
+#define CppLinq_GET_ITERATOR_TYPE(TContainer) \
+ decltype(begin(static_cast<TContainer*>(0)))
+#define CppLinq_GET_CONST_ITERATOR_TYPE(TContainer) \
+ decltype(begin(static_cast<const TContainer*>(0)))
+#else
+#define CppLinq_GET_ITERATOR_TYPE(TContainer) \
+ typename ::cpplinq::util::container_traits<TContainer>::iterator
+#define CppLinq_GET_CONST_ITERATOR_TYPE(TContainer) \
+ typename ::cpplinq::util::container_traits<TContainer>::const_iterator
+#endif
+
+ // VC10's std::tr1::result_of is busted with lambdas. use decltype instead on vc10 and later
+#if defined(_MSC_VER) && _MSC_VER >= 1600
+ namespace detail {
+ template <class T> T instance();
+ };
+ template <class Fn> struct result_of;
+ template <class Fn>
+ struct result_of<Fn()> {
+ typedef decltype(detail::instance<Fn>()()) type;
+ };
+ template <class Fn, class A0>
+ struct result_of<Fn(A0)> {
+ typedef decltype(detail::instance<Fn>()(detail::instance<A0>())) type;
+ };
+ template <class Fn, class A0, class A1>
+ struct result_of<Fn(A0,A1)> {
+ typedef decltype(detail::instance<Fn>()(detail::instance<A0>(),
+ detail::instance<A1>())) type;
+ };
+ template <class Fn, class A0, class A1, class A2>
+ struct result_of<Fn(A0,A1,A2)> {
+ typedef decltype(detail::instance<Fn>()(detail::instance<A0>(),
+ detail::instance<A1>(),
+ detail::instance<A2>())) type;
+ };
+ template <class Fn, class A0, class A1, class A2, class A3>
+ struct result_of<Fn(A0,A1,A2,A3)> {
+ typedef decltype(detail::instance<Fn>()(detail::instance<A0>(),
+ detail::instance<A1>(),
+ detail::instance<A2>(),
+ detail::instance<A3>())) type;
+ };
+#else
+ template <class T>
+ struct result_of<T> : std::tr1::result_of<T> {};
+#endif
+
+ // faux pointer proxy for iterators that dereference to a value rather than reference, such as selectors
+ template <class T>
+ struct value_ptr
+ {
+ T value;
+ value_ptr(const T& pvalue) : value(value)
+ {}
+ value_ptr(const T* pvalue) : value(*pvalue)
+ {}
+ const T* operator->()
+ {
+ return &value;
+ }
+ };
+
+
+ template <class T>
+ class maybe
+ {
+ bool is_set;
+ typename std::aligned_storage<sizeof(T), std::alignment_of<T>::value>::type
+ storage;
+ public:
+ maybe()
+ : is_set(false)
+ {
+ }
+
+ maybe(T value)
+ : is_set(false)
+ {
+ new (reinterpret_cast<T*>(&storage)) T(value);
+ is_set = true;
+ }
+
+ maybe(const maybe& other)
+ : is_set(false)
+ {
+ if (other.is_set) {
+ new (reinterpret_cast<T*>(&storage)) T(*other.get());
+ is_set = true;
+ }
+ }
+ maybe(maybe&& other)
+ : is_set(false)
+ {
+ if (other.is_set) {
+ new (reinterpret_cast<T*>(&storage)) T(std::move(*other.get()));
+ is_set = true;
+ other.reset();
+ }
+ }
+
+ ~maybe()
+ {
+ reset();
+ }
+
+ void reset()
+ {
+ if (is_set) {
+ is_set = false;
+ reinterpret_cast<T*>(&storage)->~T();
+ }
+ }
+
+ T* get() {
+ return is_set ? reinterpret_cast<T*>(&storage) : 0;
+ }
+
+ const T* get() const {
+ return is_set ? reinterpret_cast<const T*>(&storage) : 0;
+ }
+
+ void set(const T& value) {
+ if (is_set) {
+ *reinterpret_cast<T*>(&storage) = value;
+ } else {
+ new (reinterpret_cast<T*>(&storage)) T(value);
+ is_set = true;
+ }
+ }
+
+ T& operator*() { return *get(); }
+ const T& operator*() const { return *get(); }
+ T* operator->() { return get(); }
+ const T* operator->() const { return get(); }
+
+ maybe& operator=(const T& other) {
+ set(other);
+ }
+ maybe& operator=(const maybe& other) {
+ if (const T* pother = other.get()) {
+ set(*pother);
+ } else {
+ reset();
+ }
+ return *this;
+ }
+
+ // boolean-like operators
+ operator T*() { return get(); }
+ operator const T*() const { return get(); }
+
+ private:
+
+ };
+}}
+
+
+#endif //CPPLINQ_UTIL_HPP
+
diff --git a/Ix/CPP/unittest/makefile b/Ix/CPP/unittest/makefile
new file mode 100644
index 0000000..4fea142
--- /dev/null
+++ b/Ix/CPP/unittest/makefile
@@ -0,0 +1,37 @@
+
+
+!ifndef Config
+Config=Debug
+!endif
+
+O=..\..\bin\$(Config)
+
+!message Building ===== $(Config) =====
+
+program=testbench.exe
+INCLUDE=$(INCLUDE);../src
+
+!if "$(Config)"=="Debug"
+OPTIONS=/Od
+!else
+OPTIONS=/Ox
+!endif
+OPTIONS=$(OPTIONS) /Zi /I$(BOOST) /DBOOST_RESULT_OF_USE_DECLTYPE
+
+runtests : "$O/$(program)"
+ "$O/$(program)"
+
+
+all : "$O/$(program)"
+
+$O :
+ mkdir $O
+
+"$O/$(program)" : testbench.cpp testbench.hpp ../src/cpplinq/*.hpp $O
+ $(CPP) $(OPTIONS) /EHsc /Zi /Fe"$@" /Fo$O/ testbench.cpp
+
+clean :
+ del /Q $O\*.exe
+ del /Q $O\*.pdb
+ del /Q $O\*.obj
+ del /Q $O\*.ilk
diff --git a/Ix/CPP/unittest/testbench.cpp b/Ix/CPP/unittest/testbench.cpp
new file mode 100644
index 0000000..7788e5f
--- /dev/null
+++ b/Ix/CPP/unittest/testbench.cpp
@@ -0,0 +1,527 @@
+// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
+
+#include <iostream>
+#include <iomanip>
+#include <vector>
+#include <functional>
+#include <algorithm>
+#include <numeric>
+#include <iterator>
+#include <string>
+
+#include <ctime>
+
+#include <boost/lambda/core.hpp>
+#include <boost/lambda/lambda.hpp>
+#include <boost/iterator.hpp>
+
+#include "cpplinq/linq.hpp"
+
+#include "testbench.hpp"
+
+using namespace std;
+using namespace cpplinq;
+
+struct int_iter
+ : std::iterator<std::random_access_iterator_tag, int, ptrdiff_t, int*, int>
+{
+ int_iter(value_type i = 0, value_type step = 1) : value(i), step(step)
+ {}
+
+ value_type operator*() const {
+ return value;
+ }
+ int_iter& operator++() {
+ value+=step; return *this;
+ }
+ int_iter& operator--() {
+ value-=step; return *this;
+ }
+ int_iter& operator+=(ptrdiff_t offset) {
+ value += step*offset; return *this;
+ }
+ int_iter& operator-=(ptrdiff_t offset) {
+ value -= step*offset; return *this;
+ }
+ ptrdiff_t operator-(int_iter rhs) const {
+ return ptrdiff_t((value - rhs.value)/step);
+ }
+ bool operator==(int_iter other) const {
+ return value == other.value;
+ }
+ bool operator!=(int_iter other) const {
+ return !(*this == other);
+ }
+ bool operator<(int_iter other) const { return (*this - other) < 0; }
+ bool operator>(int_iter other) const { return (*this - other) > 0; }
+ bool operator<=(int_iter other) const { return (*this - other) <= 0; }
+ bool operator>=(int_iter other) const { return (*this - other) >= 0; }
+
+ value_type value;
+ value_type step;
+};
+int_iter operator+(int_iter lhs, ptrdiff_t rhs) {
+ return lhs+=rhs;
+}
+int_iter operator+(ptrdiff_t lhs, int_iter rhs) {
+ return rhs+=lhs;
+}
+int_iter operator-(int_iter lhs, ptrdiff_t rhs) {
+ return lhs-=rhs;
+}
+struct int_range
+{
+ typedef int_iter iterator;
+ typedef int_iter::value_type value_type;
+ int_range(value_type begin, value_type end, value_type step = 1)
+ : b(begin, step), e(end, step)
+ {
+ if (step == 0) {
+ throw std::logic_error("bad step");
+ }
+ if (abs(end - begin) % abs(step) != 0) {
+ end -= (end-begin)%abs(step);
+ }
+ }
+ int_iter begin() const { return int_iter(b);}
+ int_iter end() const { return int_iter(e); }
+
+ iterator b, e;
+};
+
+vector<int> vector_range(int start, int end)
+{
+ vector<int> v;
+ for (int i = start; i < end; ++i)
+ v.push_back(i);
+ return v;
+}
+
+TEST(test_selection)
+{
+ vector<int> v = vector_range(0, 10);
+
+ auto v2 = from(v)
+ .select([](int x) { return x*2; });
+
+ auto result = accumulate(begin(v2), end(v2), int(0));
+
+ VERIFY_EQ(90, result);
+}
+
+TEST(test_where)
+{
+ vector<int> v = vector_range(0, 10);
+ auto v2 = from(v)
+ .where([](int x) { return x % 2;});
+
+ VERIFY_EQ(1, *v2.begin());
+
+ auto result = accumulate(begin(v2), end(v2), int(0));
+
+ VERIFY_EQ(25, result);
+}
+
+
+bool is_prime(int x) {
+ if (x < 2) {return false;}
+ if (x == 2) {return true;}
+ for (int i = x/2; i >= 2; --i) {
+ if (x % i == 0) { return false;}
+ }
+ return true;
+};
+
+template <class It>
+void display(It start, It end)
+{
+ int i = 0;
+ for_each(start, end, [&](typename iterator_traits<It>::value_type x){
+ if (++i % 10 == 0) {
+ cout << endl;
+ }
+ cout << x << " ";
+ });
+ cout << endl;
+}
+
+TEST(test_whereselect)
+{
+ auto xs = int_range(0,100);
+ auto ys = from(xs)
+ .where(is_prime)
+ .select([](int x){ return x*x; });
+ auto result = accumulate(begin(ys), end(ys), int(0));
+
+ //display(begin(ys), end(ys));
+
+ // primes < 100
+ VERIFY_EQ(65796, result);
+}
+TEST(test_where_modification)
+{
+ vector<int> xs = vector_range(0, 100);
+
+ auto ys = from(xs)
+ .where(is_prime);
+ std::fill(begin(ys), end(ys), int(0));
+
+ auto result = accumulate(begin(xs), end(xs), int(0));
+
+ //display(begin(ys), end(ys));
+
+ // non-primes < 100
+ VERIFY_EQ(3890, result);
+}
+
+TEST(test_where_any)
+{
+ using namespace boost::lambda;
+
+ vector<int> xs(200);
+ fill(begin(xs), end(xs), int(0));
+ auto it = xs.begin();
+ *it = 2;
+
+ for(;;) {
+ auto last = *it++;
+ auto primes = from(int_range(last+1, -1))
+ .where([&](int x){
+ return from(begin(xs), it)
+ //.all([&](int d){return x%d;});
+ .all(x % boost::lambda::_1);
+ });
+ *it = *primes.begin();
+ if ((*it)>=100) {
+ break;
+ }
+ };
+ xs.erase(it, xs.end());
+
+ auto result = accumulate(begin(xs), end(xs), int(0));
+
+ //display(begin(xs), end(xs));
+
+ // primes < 100
+ VERIFY_EQ(1060, result);
+}
+
+TEST(test_take)
+{
+ auto zero_one = from(int_range(0, -1))
+ .take(2);
+
+ VERIFY_EQ(0, zero_one[0]);
+ VERIFY_EQ(1, zero_one[1]);
+
+ auto ten = from(int_range(0, -1))
+ .skip(10);
+
+ VERIFY_EQ(10, ten[0]);
+ VERIFY_EQ(11, ten[1]);
+}
+
+vector<int> some_primes(size_t howMany)
+{
+ auto xs = from(int_range(0, -1))
+ .where(is_prime)
+ .take(howMany);
+ auto v = vector<int>(begin(xs), end(xs));
+ return v;
+}
+
+TEST(test_groupby)
+{
+ auto xs = some_primes(40);
+ //display(begin(xs), end(xs));
+
+ auto grouped =
+ from(xs)
+ .groupby([](int i){return i % 10; });
+
+ VERIFY_EQ(6, from(grouped).count());
+ for(auto group = begin(grouped); group != end(grouped); ++group) {
+ //cout << "key = " << group->key << endl
+ // << "| ";
+ for (auto elem = group->begin(); elem != group->end(); ++elem) {
+ //cout << *elem << " ";
+ }
+ //cout << endl;
+
+ switch(group->key) {
+ case 2: VERIFY_EQ(1, from(*group).count()); break;
+ case 3: VERIFY_EQ(11, from(*group).count()); break;
+ case 5: VERIFY_EQ(1, from(*group).count()); break;
+ case 7: VERIFY_EQ(11, from(*group).count()); break;
+ case 1: VERIFY_EQ(8, from(*group).count()); break;
+ case 9: VERIFY_EQ(8, from(*group).count()); break;
+ }
+ }
+}
+
+TEST(test_symbolname)
+{
+ auto complexQuery =
+ from(int_range(0,100000))
+ .select([](int x){ return x*2;})
+ .where([](int x){ return x%7; })
+ .skip(20);
+
+ //cout << " type name: " << typeid(complexQuery1).name() << endl;
+
+
+ //auto complexQuery =
+ // complexQuery1.groupby([](int x) { return x%5; })
+ // .take(3)
+ // ;
+
+
+ cout << "type name: " << typeid(complexQuery).name() << endl;
+ cout << "type name length: " << strlen(typeid(complexQuery).name()) << endl;
+
+ auto iter = complexQuery.begin();
+ cout << "iterator name: " << typeid(iter).name() << endl;
+ cout << "iterator name length: " << strlen(typeid(iter).name()) << endl;
+}
+
+TEST(test_cast)
+{
+ auto q = from(int_range(0,10))
+ .cast<bool>();
+ VERIFY_EQ(false, q[0]);
+ VERIFY_EQ(true, q[1]);
+ VERIFY_EQ(true, q[2]);
+ VERIFY((std::is_same<decltype(q[0]), bool>::value));
+}
+
+TEST(test_contains)
+{
+ auto q = from(int_range(0,10))
+ .select([](int x){return x*2;});
+ VERIFY(q.contains(4));
+ VERIFY(!q.contains(5));
+}
+
+TEST(test_element_accessors)
+{
+ vector<int> v(int_iter(0), int_iter(10));
+ auto q = from(v)
+ .where([](int x){return x%2==0;});
+
+ VERIFY_EQ(0, q.first());
+ VERIFY_EQ(8, q.last());
+ VERIFY_EQ(6, q.element_at(3));
+
+ bool thrown = false;
+ try { q.element_at(5); } catch (std::logic_error&) { thrown = true; }
+ VERIFY(thrown);
+
+ q.first() = 1;
+ q.last() = 42;
+
+ // note: because the vector now contains { 1, 1, 2, 3, ... 7, 8, 42 }, the first
+ // even number is now '2'
+ VERIFY_EQ(2, q.first());
+ VERIFY_EQ(42, q.last());
+}
+
+//////////////////// New style cursors ////////////////////
+
+TEST(test_cursor_dynamic)
+{
+ dynamic_cursor<int> dc(int_iter(0), int_iter(2));
+
+ VERIFY(!dc.empty());
+ VERIFY_EQ(0, dc.get());
+ dc.inc();
+ VERIFY_EQ(1, dc.get());
+ dc.inc();
+ VERIFY(dc.empty());
+}
+
+TEST(test_selectmany)
+{
+ int_range range1(0, 3);
+ auto range2 =
+
+ from(range1)
+ .select_many(
+ [](int x)
+ {
+ return int_range(0, x+1);
+ });
+
+ auto cur = range2.get_cursor();
+
+ // expected: 0, 0, 1, 0, 1, 2.
+ VERIFY(!cur.empty());
+
+ VERIFY_EQ(0, cur.get());
+ cur.inc();
+ VERIFY(!cur.empty());
+
+ VERIFY_EQ(0, cur.get());
+ cur.inc();
+ VERIFY(!cur.empty());
+
+ VERIFY_EQ(1, cur.get());
+ cur.inc();
+ VERIFY(!cur.empty());
+
+ VERIFY_EQ(0, cur.get());
+ cur.inc();
+ VERIFY(!cur.empty());
+
+ VERIFY_EQ(1, cur.get());
+ cur.inc();
+ VERIFY(!cur.empty());
+
+ VERIFY_EQ(2, cur.get());
+ cur.inc();
+ VERIFY(cur.empty());
+}
+
+TEST(test_cursor_selectmany2)
+{
+ int_range range1(0, 3);
+ auto range2 = from(range1)
+ .select_many(
+ [](int x)
+ {
+ return int_range(0, x+1);
+ });
+
+ // expected: 0, 0, 1, 0, 1, 2.
+ int expect[] = { 0, 0, 1, 0, 1, 2 };
+
+ VERIFY_EQ(_countof(expect), std::distance(range2.begin(), range2.end()));
+ VERIFY_EQ(_countof(expect), std::distance(range2.begin(), range2.end()));
+
+ auto result = std::mismatch(expect, expect + _countof(expect), range2.begin());
+ if (result.second != range2.end()) {
+ cout << "mismatch: " << *result.first << " != " << *result.second << endl;
+ }
+ VERIFY( result.second == range2.end());
+}
+
+TEST(test_late_bind)
+{
+ int_range range1(0, 100);
+ linq_driver<dynamic_collection<int>> range2 = from(range1).late_bind();
+
+ VERIFY_EQ(1, range2.element_at(1));
+
+ auto q1 = from(range1).select([](int x){ return x*2; }).where([](int x){ return x%10!=0; });
+
+ cout << "typeof q1 ==> " << typeid(q1).name() << endl;
+ cout << "typeof q1.late_bind() ==> " << typeid(q1.late_bind()).name() << endl;
+}
+
+struct stopwatch
+{
+ time_t t0, t1;
+ void start() {
+ t1 = t0 = clock();
+ }
+ void stop() {
+ t1 = clock();
+ }
+ double value() const {
+ return double(t1-t0)/CLOCKS_PER_SEC;
+ }
+};
+
+template <class Fn>
+void test_perf(Fn fn)
+{
+ // warmup
+ fn(10);
+
+ int n = 100;
+ stopwatch sw;
+ for(;;)
+ {
+ cout << "trying n=" << n << endl;
+ sw.start();
+ fn(n);
+ sw.stop();
+ if (sw.value() > 2.0) {
+ break;
+ }
+ n *= 2;
+ }
+ cout << "time = " << sw.value() << " s\n";
+ cout << "steps = " << n << "\n";
+ cout << "t/step = " << (sw.value() * 1e9 / n) << " ns\n";
+ cout << "step/t = " << (n / sw.value()) << " Hz\n";
+}
+
+TEST(test_performance)
+{
+ // http://projecteuler.net/problem=8
+ //
+ // Find the greatest product of five consecutive digits in the 1000-digit number.
+ //
+
+ static const char num[] =
+ "73167176531330624919225119674426574742355349194934"
+ "96983520312774506326239578318016984801869478851843"
+ "85861560789112949495459501737958331952853208805511"
+ "12540698747158523863050715693290963295227443043557"
+ "66896648950445244523161731856403098711121722383113"
+ "62229893423380308135336276614282806444486645238749"
+ "30358907296290491560440772390713810515859307960866"
+ "70172427121883998797908792274921901699720888093776"
+ "65727333001053367881220235421809751254540594752243"
+ "52584907711670556013604839586446706324415722155397"
+ "53697817977846174064955149290862569321978468622482"
+ "83972241375657056057490261407972968652414535100474"
+ "82166370484403199890008895243450658541227588666881"
+ "16427171479924442928230863465674813919123162824586"
+ "17866458359124566529476545682848912883142607690042"
+ "24219022671055626321111109370544217506941658960408"
+ "07198403850962455444362981230987879927244284909188"
+ "84580156166097919133875499200524063689912560717606"
+ "05886116467109405077541002256983155200055935729725"
+ "71636269561882670428252483600823257530420752963450";
+
+ auto task = [&](int n){
+ for (int i = 0; i < n; ++i) {
+ auto range1 = int_range(0, _countof(num)-5); // 5 digit numbers, plus null terminator
+
+ auto products = from(range1)
+ .select([&](int i){ return num+i;})
+ .where([&](const char* s){ return !from(s, s+5).contains('0'); })
+ .select([&](const char* s) { return from(s, s+5).select([](char c){ return c - '0'; })
+ .aggregate(std::multiplies<int>()); });
+
+ auto result = products.max();
+ if (n == 1) {
+ cout << "result = " << result << endl;
+ }
+ }
+ };
+ cout << "length of input: " << (_countof(num)-1) << endl;
+
+ task(1);
+ cout << endl;
+
+#ifdef PERF
+ test_perf(task);
+ cout << endl;
+#endif
+}
+
+int main(int argc, char** argv)
+{
+ size_t pass=0, fail=0;
+ testrange<0,__LINE__>().run(pass, fail);
+
+
+ cout << "pass: " << pass << ", fail: " << fail << endl;
+ if (fail){
+ cerr << "ERRORS PRESENT." << endl;
+ } else if (!pass) {
+ cerr << "ERROR, no tests run" << endl;
+ }
+}
diff --git a/Ix/CPP/unittest/testbench.hpp b/Ix/CPP/unittest/testbench.hpp
new file mode 100644
index 0000000..6dbb1c8
--- /dev/null
+++ b/Ix/CPP/unittest/testbench.hpp
@@ -0,0 +1,87 @@
+// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
+
+#pragma once
+
+#include <iostream>
+#include <iomanip>
+#include <exception>
+#include <sstream>
+#include <utility>
+#include <memory>
+
+struct empty_testcase{ void run(){} const char* name(){return 0;} };
+
+template <size_t offset>
+struct testcase : empty_testcase{};
+
+
+template <size_t begin, size_t end>
+struct testrange {
+ void run(size_t& pass, size_t& fail)
+ {
+ using namespace std;
+ { testcase<begin> a_case;
+ if (a_case.name()) {
+ size_t p=0, f=0;
+ cout << "TEST: Running " << a_case.name() << endl;
+ try {
+ a_case.run();
+ ++p;
+ } catch (logic_error& e) {
+ cerr << "ERRORS:" << endl;
+ cerr << " " << e.what() << endl;
+ ++f;
+ }
+ pass += p; fail += f;
+ }
+ }
+ const size_t rem = (end-begin-1);
+ testrange<begin+1, begin+1+rem/2>().run(pass, fail);
+ testrange<begin+1+rem/2, end>().run(pass, fail);
+ }
+};
+
+template <size_t begin>
+struct testrange<begin,begin> {
+ void run(size_t& pass, size_t& fail) {};
+};
+
+#define TEST(fun_name) \
+void fun_name (); \
+template <> \
+struct testcase<__LINE__> { \
+ const char* name() { return(#fun_name); } \
+ void run() { fun_name(); } \
+}; \
+void fun_name()
+
+#define Q_(e) #e
+#define Q(e) Q_(e)
+#define TASSERT(expr) \
+ { auto e = (expr); if (!e) { throw std::logic_error(__FILE__ "(" Q(__LINE__) "): TASSERT("#expr")"); } }
+
+struct errmsg
+{
+ std::shared_ptr<std::stringstream> msg;
+ errmsg() : msg(new std::stringstream)
+ {}
+
+ template <class T>
+ errmsg& operator<<(T value)
+ {
+ (*msg) << value;
+ return *this;
+ }
+ std::string str() { return msg->str(); }
+};
+
+#define TEST_WHERE __FILE__ "(" Q(__LINE__) "): "
+#define VERIFY(expr) \
+ { auto e = (expr); if (!e) { throw std::logic_error(TEST_WHERE "VERIFY("#expr")"); } }
+#define VERIFY_EQ(expected, actual) \
+ { auto e = (expected); auto a = (actual); \
+ if (!(e == a)) { \
+ throw std::logic_error( \
+ (errmsg() << TEST_WHERE << "(" << e << ")!=(" << a << ") in VERIFY_EQ("#expected","#actual")").str() );}}
+
+