Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r84141 - in sandbox/triplegit/trunk: . .be .be/b115473a-7c9f-4a36-ad9f-b266a029ec4e .be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/bugs .be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/bugs/71435816-3067-4e43-ab33-fe02e0366b6a .be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/bugs/7d68ad17-e5e8-4242-8f87-1172a9d68638 .be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/bugs/82e80731-2430-4007-99c2-e254041f3b55 .be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/bugs/82e80731-2430-4007-99c2-e254041f3b55/comments .be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/bugs/82e80731-2430-4007-99c2-e254041f3b55/comments/2a080481-628d-489a-a28a-f0df461131bd .be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/bugs/94562f01-aed7-4c00-b442-8aa72b91457d .be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/bugs/9f9cd3bc-e5f5-42cf-b3f4-2a617c90319f .be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/bugs/e95542a8-1ade-4acb-a69a-ab79fd1a4ba4 BEBugsAsHTML BEBugsAsHTML/bugs BEBugsAsHTML/bugs/71435816-3067-4e43-ab33-fe02e0366b6a BEBugsAsHTML/bugs/7d68ad17-e5e8-4242-8f87-1172a9d68638 BEBugsAsHTML/bugs/82e80731-2430-4007-99c2-e254041f3b55 BEBugsAsHTML/bugs/94562f01-aed7-4c00-b442-8aa72b91457d BEBugsAsHTML/bugs/9f9cd3bc-e5f5-42cf-b3f4-2a617c90319f BEBugsAsHTML/bugs/e95542a8-1ade-4acb-a69a-ab79fd1a4ba4 html html/search triplegit triplegit/include triplegit/src unittests
From: s_sourceforge_at_[hidden]
Date: 2013-05-04 18:38:23


Author: ned14
Date: 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
New Revision: 84141
URL: http://svn.boost.org/trac/boost/changeset/84141

Log:
Merged squashed trunk master.
Added:
   sandbox/triplegit/trunk/.be/ (props changed)
   sandbox/triplegit/trunk/.be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/ (props changed)
   sandbox/triplegit/trunk/.be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/bugs/ (props changed)
   sandbox/triplegit/trunk/.be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/bugs/71435816-3067-4e43-ab33-fe02e0366b6a/ (props changed)
   sandbox/triplegit/trunk/.be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/bugs/71435816-3067-4e43-ab33-fe02e0366b6a/values (contents, props changed)
   sandbox/triplegit/trunk/.be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/bugs/7d68ad17-e5e8-4242-8f87-1172a9d68638/ (props changed)
   sandbox/triplegit/trunk/.be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/bugs/7d68ad17-e5e8-4242-8f87-1172a9d68638/values (contents, props changed)
   sandbox/triplegit/trunk/.be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/bugs/82e80731-2430-4007-99c2-e254041f3b55/ (props changed)
   sandbox/triplegit/trunk/.be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/bugs/82e80731-2430-4007-99c2-e254041f3b55/comments/ (props changed)
   sandbox/triplegit/trunk/.be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/bugs/82e80731-2430-4007-99c2-e254041f3b55/comments/2a080481-628d-489a-a28a-f0df461131bd/ (props changed)
   sandbox/triplegit/trunk/.be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/bugs/82e80731-2430-4007-99c2-e254041f3b55/comments/2a080481-628d-489a-a28a-f0df461131bd/body (contents, props changed)
   sandbox/triplegit/trunk/.be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/bugs/82e80731-2430-4007-99c2-e254041f3b55/comments/2a080481-628d-489a-a28a-f0df461131bd/values (contents, props changed)
   sandbox/triplegit/trunk/.be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/bugs/82e80731-2430-4007-99c2-e254041f3b55/values (contents, props changed)
   sandbox/triplegit/trunk/.be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/bugs/94562f01-aed7-4c00-b442-8aa72b91457d/ (props changed)
   sandbox/triplegit/trunk/.be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/bugs/94562f01-aed7-4c00-b442-8aa72b91457d/values (contents, props changed)
   sandbox/triplegit/trunk/.be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/bugs/9f9cd3bc-e5f5-42cf-b3f4-2a617c90319f/ (props changed)
   sandbox/triplegit/trunk/.be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/bugs/9f9cd3bc-e5f5-42cf-b3f4-2a617c90319f/values (contents, props changed)
   sandbox/triplegit/trunk/.be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/bugs/e95542a8-1ade-4acb-a69a-ab79fd1a4ba4/ (props changed)
   sandbox/triplegit/trunk/.be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/bugs/e95542a8-1ade-4acb-a69a-ab79fd1a4ba4/values (contents, props changed)
   sandbox/triplegit/trunk/.be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/settings (contents, props changed)
      - copied, changed from r84027, /sandbox/triplegit/trunk/testAutoSVNAttribs.c
   sandbox/triplegit/trunk/.be/version (contents, props changed)
   sandbox/triplegit/trunk/BEBugsAsHTML/ (props changed)
   sandbox/triplegit/trunk/BEBugsAsHTML/bugs/ (props changed)
   sandbox/triplegit/trunk/BEBugsAsHTML/bugs/71435816-3067-4e43-ab33-fe02e0366b6a/ (props changed)
   sandbox/triplegit/trunk/BEBugsAsHTML/bugs/71435816-3067-4e43-ab33-fe02e0366b6a/index.html (contents, props changed)
   sandbox/triplegit/trunk/BEBugsAsHTML/bugs/7d68ad17-e5e8-4242-8f87-1172a9d68638/ (props changed)
   sandbox/triplegit/trunk/BEBugsAsHTML/bugs/7d68ad17-e5e8-4242-8f87-1172a9d68638/index.html (contents, props changed)
   sandbox/triplegit/trunk/BEBugsAsHTML/bugs/82e80731-2430-4007-99c2-e254041f3b55/ (props changed)
   sandbox/triplegit/trunk/BEBugsAsHTML/bugs/82e80731-2430-4007-99c2-e254041f3b55/index.html (contents, props changed)
   sandbox/triplegit/trunk/BEBugsAsHTML/bugs/94562f01-aed7-4c00-b442-8aa72b91457d/ (props changed)
   sandbox/triplegit/trunk/BEBugsAsHTML/bugs/94562f01-aed7-4c00-b442-8aa72b91457d/index.html (contents, props changed)
   sandbox/triplegit/trunk/BEBugsAsHTML/bugs/9f9cd3bc-e5f5-42cf-b3f4-2a617c90319f/ (props changed)
   sandbox/triplegit/trunk/BEBugsAsHTML/bugs/9f9cd3bc-e5f5-42cf-b3f4-2a617c90319f/index.html (contents, props changed)
   sandbox/triplegit/trunk/BEBugsAsHTML/bugs/e95542a8-1ade-4acb-a69a-ab79fd1a4ba4/ (props changed)
   sandbox/triplegit/trunk/BEBugsAsHTML/bugs/e95542a8-1ade-4acb-a69a-ab79fd1a4ba4/index.html (contents, props changed)
   sandbox/triplegit/trunk/BEBugsAsHTML/index.html (contents, props changed)
   sandbox/triplegit/trunk/BEBugsAsHTML/index_by_target.html (contents, props changed)
   sandbox/triplegit/trunk/BEBugsAsHTML/index_inactive.html (contents, props changed)
   sandbox/triplegit/trunk/BEBugsAsHTML/style.css (contents, props changed)
   sandbox/triplegit/trunk/Doxyfile (contents, props changed)
   sandbox/triplegit/trunk/SConscript (contents, props changed)
   sandbox/triplegit/trunk/SConstruct (contents, props changed)
   sandbox/triplegit/trunk/TripleGit.sln (contents, props changed)
   sandbox/triplegit/trunk/footer.html (contents, props changed)
   sandbox/triplegit/trunk/html/ (props changed)
   sandbox/triplegit/trunk/html/annotated.html (contents, props changed)
   sandbox/triplegit/trunk/html/async__file__io_8hpp.html (contents, props changed)
   sandbox/triplegit/trunk/html/async__file__io_8hpp_source.html (contents, props changed)
   sandbox/triplegit/trunk/html/bc_s.png (contents, props changed)
   sandbox/triplegit/trunk/html/bdwn.png (contents, props changed)
   sandbox/triplegit/trunk/html/classes.html (contents, props changed)
   sandbox/triplegit/trunk/html/classpackaged__task.html (contents, props changed)
   sandbox/triplegit/trunk/html/classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base-members.html (contents, props changed)
   sandbox/triplegit/trunk/html/classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html (contents, props changed)
   sandbox/triplegit/trunk/html/classtriplegit_1_1async__io_1_1detail_1_1async__io__handle-members.html (contents, props changed)
   sandbox/triplegit/trunk/html/classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html (contents, props changed)
   sandbox/triplegit/trunk/html/classtriplegit_1_1async__io_1_1future-members.html (contents, props changed)
   sandbox/triplegit/trunk/html/classtriplegit_1_1async__io_1_1future.html (contents, props changed)
   sandbox/triplegit/trunk/html/classtriplegit_1_1async__io_1_1promise-members.html (contents, props changed)
   sandbox/triplegit/trunk/html/classtriplegit_1_1async__io_1_1promise.html (contents, props changed)
   sandbox/triplegit/trunk/html/classtriplegit_1_1async__io_1_1shared__future-members.html (contents, props changed)
   sandbox/triplegit/trunk/html/classtriplegit_1_1async__io_1_1shared__future.html (contents, props changed)
   sandbox/triplegit/trunk/html/classtriplegit_1_1async__io_1_1thread__pool-members.html (contents, props changed)
   sandbox/triplegit/trunk/html/classtriplegit_1_1async__io_1_1thread__pool.html (contents, props changed)
   sandbox/triplegit/trunk/html/classtriplegit_1_1base__store-members.html (contents, props changed)
   sandbox/triplegit/trunk/html/classtriplegit_1_1base__store.html (contents, props changed)
   sandbox/triplegit/trunk/html/classtriplegit_1_1base__store.png (contents, props changed)
   sandbox/triplegit/trunk/html/classtriplegit_1_1boost_1_1adjacency__list-members.html (contents, props changed)
   sandbox/triplegit/trunk/html/classtriplegit_1_1boost_1_1adjacency__list.html (contents, props changed)
   sandbox/triplegit/trunk/html/classtriplegit_1_1boost_1_1adjacency__list.png (contents, props changed)
   sandbox/triplegit/trunk/html/classtriplegit_1_1collection__id-members.html (contents, props changed)
   sandbox/triplegit/trunk/html/classtriplegit_1_1collection__id.html (contents, props changed)
   sandbox/triplegit/trunk/html/classtriplegit_1_1collection__id.png (contents, props changed)
   sandbox/triplegit/trunk/html/classtriplegit_1_1fs__store-members.html (contents, props changed)
   sandbox/triplegit/trunk/html/classtriplegit_1_1fs__store.html (contents, props changed)
   sandbox/triplegit/trunk/html/classtriplegit_1_1fs__store.png (contents, props changed)
   sandbox/triplegit/trunk/html/classtriplegit_1_1storable__vertices-members.html (contents, props changed)
   sandbox/triplegit/trunk/html/classtriplegit_1_1storable__vertices.html (contents, props changed)
   sandbox/triplegit/trunk/html/classtriplegit_1_1unique__id-members.html (contents, props changed)
   sandbox/triplegit/trunk/html/classtriplegit_1_1unique__id.html (contents, props changed)
   sandbox/triplegit/trunk/html/closed.png (contents, props changed)
   sandbox/triplegit/trunk/html/dir_5702f8a2329a6e3cef9103a99d8690ff.html (contents, props changed)
   sandbox/triplegit/trunk/html/dir_603090840fc3140f581dcce46ee211a4.html (contents, props changed)
   sandbox/triplegit/trunk/html/doxygen.css (contents, props changed)
   sandbox/triplegit/trunk/html/doxygen.png (contents, props changed)
   sandbox/triplegit/trunk/html/dynsections.js (contents, props changed)
   sandbox/triplegit/trunk/html/files.html (contents, props changed)
   sandbox/triplegit/trunk/html/ftv2blank.png (contents, props changed)
   sandbox/triplegit/trunk/html/ftv2cl.png (contents, props changed)
   sandbox/triplegit/trunk/html/ftv2doc.png (contents, props changed)
   sandbox/triplegit/trunk/html/ftv2folderclosed.png (contents, props changed)
   sandbox/triplegit/trunk/html/ftv2folderopen.png (contents, props changed)
   sandbox/triplegit/trunk/html/ftv2lastnode.png (contents, props changed)
   sandbox/triplegit/trunk/html/ftv2link.png (contents, props changed)
   sandbox/triplegit/trunk/html/ftv2mlastnode.png (contents, props changed)
   sandbox/triplegit/trunk/html/ftv2mnode.png (contents, props changed)
   sandbox/triplegit/trunk/html/ftv2mo.png (contents, props changed)
   sandbox/triplegit/trunk/html/ftv2node.png (contents, props changed)
   sandbox/triplegit/trunk/html/ftv2ns.png (contents, props changed)
   sandbox/triplegit/trunk/html/ftv2plastnode.png (contents, props changed)
   sandbox/triplegit/trunk/html/ftv2pnode.png (contents, props changed)
   sandbox/triplegit/trunk/html/ftv2splitbar.png (contents, props changed)
   sandbox/triplegit/trunk/html/ftv2vertline.png (contents, props changed)
   sandbox/triplegit/trunk/html/functions.html (contents, props changed)
   sandbox/triplegit/trunk/html/functions_func.html (contents, props changed)
   sandbox/triplegit/trunk/html/functions_type.html (contents, props changed)
   sandbox/triplegit/trunk/html/functions_vars.html (contents, props changed)
   sandbox/triplegit/trunk/html/hierarchy.html (contents, props changed)
   sandbox/triplegit/trunk/html/index.html (contents, props changed)
   sandbox/triplegit/trunk/html/jquery.js (contents, props changed)
   sandbox/triplegit/trunk/html/namespacemembers.html (contents, props changed)
   sandbox/triplegit/trunk/html/namespacemembers_func.html (contents, props changed)
   sandbox/triplegit/trunk/html/namespacemembers_type.html (contents, props changed)
   sandbox/triplegit/trunk/html/namespaces.html (contents, props changed)
   sandbox/triplegit/trunk/html/namespacetriplegit_1_1async__io.html (contents, props changed)
   sandbox/triplegit/trunk/html/nav_f.png (contents, props changed)
   sandbox/triplegit/trunk/html/nav_g.png (contents, props changed)
   sandbox/triplegit/trunk/html/nav_h.png (contents, props changed)
   sandbox/triplegit/trunk/html/open.png (contents, props changed)
   sandbox/triplegit/trunk/html/search/ (props changed)
   sandbox/triplegit/trunk/html/search/all_61.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/all_61.js (contents, props changed)
   sandbox/triplegit/trunk/html/search/all_62.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/all_62.js (contents, props changed)
   sandbox/triplegit/trunk/html/search/all_63.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/all_63.js (contents, props changed)
   sandbox/triplegit/trunk/html/search/all_64.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/all_64.js (contents, props changed)
   sandbox/triplegit/trunk/html/search/all_65.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/all_65.js (contents, props changed)
   sandbox/triplegit/trunk/html/search/all_66.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/all_66.js (contents, props changed)
   sandbox/triplegit/trunk/html/search/all_68.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/all_68.js (contents, props changed)
   sandbox/triplegit/trunk/html/search/all_69.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/all_69.js (contents, props changed)
   sandbox/triplegit/trunk/html/search/all_6e.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/all_6e.js (contents, props changed)
   sandbox/triplegit/trunk/html/search/all_6f.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/all_6f.js (contents, props changed)
   sandbox/triplegit/trunk/html/search/all_70.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/all_70.js (contents, props changed)
   sandbox/triplegit/trunk/html/search/all_72.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/all_72.js (contents, props changed)
   sandbox/triplegit/trunk/html/search/all_73.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/all_73.js (contents, props changed)
   sandbox/triplegit/trunk/html/search/all_74.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/all_74.js (contents, props changed)
   sandbox/triplegit/trunk/html/search/all_75.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/all_75.js (contents, props changed)
   sandbox/triplegit/trunk/html/search/all_77.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/all_77.js (contents, props changed)
   sandbox/triplegit/trunk/html/search/classes_61.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/classes_61.js (contents, props changed)
   sandbox/triplegit/trunk/html/search/classes_62.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/classes_62.js (contents, props changed)
   sandbox/triplegit/trunk/html/search/classes_63.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/classes_63.js (contents, props changed)
   sandbox/triplegit/trunk/html/search/classes_66.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/classes_66.js (contents, props changed)
   sandbox/triplegit/trunk/html/search/classes_70.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/classes_70.js (contents, props changed)
   sandbox/triplegit/trunk/html/search/classes_73.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/classes_73.js (contents, props changed)
   sandbox/triplegit/trunk/html/search/classes_74.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/classes_74.js (contents, props changed)
   sandbox/triplegit/trunk/html/search/classes_75.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/classes_75.js (contents, props changed)
   sandbox/triplegit/trunk/html/search/close.png (contents, props changed)
   sandbox/triplegit/trunk/html/search/files_61.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/files_61.js (contents, props changed)
   sandbox/triplegit/trunk/html/search/functions_61.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/functions_61.js (contents, props changed)
   sandbox/triplegit/trunk/html/search/functions_63.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/functions_63.js (contents, props changed)
   sandbox/triplegit/trunk/html/search/functions_64.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/functions_64.js (contents, props changed)
   sandbox/triplegit/trunk/html/search/functions_65.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/functions_65.js (contents, props changed)
   sandbox/triplegit/trunk/html/search/functions_66.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/functions_66.js (contents, props changed)
   sandbox/triplegit/trunk/html/search/functions_69.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/functions_69.js (contents, props changed)
   sandbox/triplegit/trunk/html/search/functions_6e.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/functions_6e.js (contents, props changed)
   sandbox/triplegit/trunk/html/search/functions_6f.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/functions_6f.js (contents, props changed)
   sandbox/triplegit/trunk/html/search/functions_70.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/functions_70.js (contents, props changed)
   sandbox/triplegit/trunk/html/search/functions_72.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/functions_72.js (contents, props changed)
   sandbox/triplegit/trunk/html/search/functions_73.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/functions_73.js (contents, props changed)
   sandbox/triplegit/trunk/html/search/functions_74.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/functions_74.js (contents, props changed)
   sandbox/triplegit/trunk/html/search/functions_77.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/functions_77.js (contents, props changed)
   sandbox/triplegit/trunk/html/search/mag_sel.png (contents, props changed)
   sandbox/triplegit/trunk/html/search/namespaces_74.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/namespaces_74.js (contents, props changed)
   sandbox/triplegit/trunk/html/search/nomatches.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/search.css (contents, props changed)
   sandbox/triplegit/trunk/html/search/search.js (contents, props changed)
   sandbox/triplegit/trunk/html/search/search_l.png (contents, props changed)
   sandbox/triplegit/trunk/html/search/search_m.png (contents, props changed)
   sandbox/triplegit/trunk/html/search/search_r.png (contents, props changed)
   sandbox/triplegit/trunk/html/search/typedefs_63.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/typedefs_63.js (contents, props changed)
   sandbox/triplegit/trunk/html/search/typedefs_65.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/typedefs_65.js (contents, props changed)
   sandbox/triplegit/trunk/html/search/variables_68.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/variables_68.js (contents, props changed)
   sandbox/triplegit/trunk/html/search/variables_69.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/variables_69.js (contents, props changed)
   sandbox/triplegit/trunk/html/search/variables_70.html (contents, props changed)
   sandbox/triplegit/trunk/html/search/variables_70.js (contents, props changed)
   sandbox/triplegit/trunk/html/structtriplegit_1_1async__io_1_1async__data__op__req-members.html (contents, props changed)
   sandbox/triplegit/trunk/html/structtriplegit_1_1async__io_1_1async__data__op__req.html (contents, props changed)
   sandbox/triplegit/trunk/html/structtriplegit_1_1async__io_1_1async__data__op__req.png (contents, props changed)
   sandbox/triplegit/trunk/html/structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1array_3_01_t_00_01_n_01_4_01_4-members.html (contents, props changed)
   sandbox/triplegit/trunk/html/structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1array_3_01_t_00_01_n_01_4_01_4.html (contents, props changed)
   sandbox/triplegit/trunk/html/structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1array_3_01_t_00_01_n_01_4_01_4.png (contents, props changed)
   sandbox/triplegit/trunk/html/structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1basic__string_3_01_c_00_01_t_00_01_a_01_4_01_4-members.html (contents, props changed)
   sandbox/triplegit/trunk/html/structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1basic__string_3_01_c_00_01_t_00_01_a_01_4_01_4.html (contents, props changed)
   sandbox/triplegit/trunk/html/structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1basic__string_3_01_c_00_01_t_00_01_a_01_4_01_4.png (contents, props changed)
   sandbox/triplegit/trunk/html/structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1vector_3_01_t_00_01_a_01_4_01_4-members.html (contents, props changed)
   sandbox/triplegit/trunk/html/structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1vector_3_01_t_00_01_a_01_4_01_4.html (contents, props changed)
   sandbox/triplegit/trunk/html/structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1vector_3_01_t_00_01_a_01_4_01_4.png (contents, props changed)
   sandbox/triplegit/trunk/html/structtriplegit_1_1async__io_1_1async__io__op-members.html (contents, props changed)
   sandbox/triplegit/trunk/html/structtriplegit_1_1async__io_1_1async__io__op.html (contents, props changed)
   sandbox/triplegit/trunk/html/structtriplegit_1_1async__io_1_1async__path__op__req-members.html (contents, props changed)
   sandbox/triplegit/trunk/html/structtriplegit_1_1async__io_1_1async__path__op__req.html (contents, props changed)
   sandbox/triplegit/trunk/html/sync_off.png (contents, props changed)
   sandbox/triplegit/trunk/html/sync_on.png (contents, props changed)
   sandbox/triplegit/trunk/html/tab_a.png (contents, props changed)
   sandbox/triplegit/trunk/html/tab_b.png (contents, props changed)
   sandbox/triplegit/trunk/html/tab_h.png (contents, props changed)
   sandbox/triplegit/trunk/html/tab_s.png (contents, props changed)
   sandbox/triplegit/trunk/html/tabs.css (contents, props changed)
   sandbox/triplegit/trunk/html/triplegit_8hpp_source.html (contents, props changed)
   sandbox/triplegit/trunk/triplegit/ (props changed)
   sandbox/triplegit/trunk/triplegit/SConscript (contents, props changed)
   sandbox/triplegit/trunk/triplegit/SConstruct (contents, props changed)
   sandbox/triplegit/trunk/triplegit/TripleGit.vcxproj (contents, props changed)
   sandbox/triplegit/trunk/triplegit/include/ (props changed)
   sandbox/triplegit/trunk/triplegit/include/async_file_io.hpp (contents, props changed)
   sandbox/triplegit/trunk/triplegit/include/triplegit.hpp (contents, props changed)
   sandbox/triplegit/trunk/triplegit/src/ (props changed)
   sandbox/triplegit/trunk/triplegit/src/SConscript (contents, props changed)
   sandbox/triplegit/trunk/triplegit/src/async_file_io.cpp (contents, props changed)
   sandbox/triplegit/trunk/triplegit/src/triplegitmain.cpp (contents, props changed)
   sandbox/triplegit/trunk/unittests/ (props changed)
   sandbox/triplegit/trunk/unittests/!GenCatch.bat (contents, props changed)
   sandbox/triplegit/trunk/unittests/SConscript (contents, props changed)
   sandbox/triplegit/trunk/unittests/catch.hpp (contents, props changed)
   sandbox/triplegit/trunk/unittests/main.cpp (contents, props changed)
   sandbox/triplegit/trunk/unittests/unittests.vcxproj (contents, props changed)
Removed:
   sandbox/triplegit/trunk/testAutoSVNAttribs.c
   sandbox/triplegit/trunk/testfile
Properties modified:
   sandbox/triplegit/trunk/ (props changed)

Added: sandbox/triplegit/trunk/.be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/bugs/71435816-3067-4e43-ab33-fe02e0366b6a/values
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/.be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/bugs/71435816-3067-4e43-ab33-fe02e0366b6a/values 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,19 @@
+creator: '"Niall Douglas \(s \[underscore\] sourceforge {at} nedprod \[dot\] com\)"
+ <noone_at_spamtrap>'
+
+
+reporter: '"Niall Douglas \(s \[underscore\] sourceforge {at} nedprod \[dot\] com\)"
+ <noone_at_spamtrap>'
+
+
+severity: minor
+
+
+status: open
+
+
+summary: Replace all uses of new and shared_ptr<> with make_shared<>
+
+
+time: Tue, 30 Apr 2013 23:32:27 +0000
+

Added: sandbox/triplegit/trunk/.be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/bugs/7d68ad17-e5e8-4242-8f87-1172a9d68638/values
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/.be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/bugs/7d68ad17-e5e8-4242-8f87-1172a9d68638/values 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,20 @@
+creator: '"Niall Douglas \(s \[underscore\] sourceforge {at} nedprod \[dot\] com\)"
+ <noone_at_spamtrap>'
+
+
+reporter: '"Niall Douglas \(s \[underscore\] sourceforge {at} nedprod \[dot\] com\)"
+ <noone_at_spamtrap>'
+
+
+severity: wishlist
+
+
+status: open
+
+
+summary: Add a torture test for error handling. For that matter need to tightly define
+ how we handle errors.
+
+
+time: Thu, 11 Apr 2013 21:36:12 +0000
+

Added: sandbox/triplegit/trunk/.be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/bugs/82e80731-2430-4007-99c2-e254041f3b55/comments/2a080481-628d-489a-a28a-f0df461131bd/body
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/.be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/bugs/82e80731-2430-4007-99c2-e254041f3b55/comments/2a080481-628d-489a-a28a-f0df461131bd/body 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1 @@
+Fixed in commit 8293dd32 (decimal -2104238798)

Added: sandbox/triplegit/trunk/.be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/bugs/82e80731-2430-4007-99c2-e254041f3b55/comments/2a080481-628d-489a-a28a-f0df461131bd/values
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/.be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/bugs/82e80731-2430-4007-99c2-e254041f3b55/comments/2a080481-628d-489a-a28a-f0df461131bd/values 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,8 @@
+Author: BEurtle auto issue closer
+
+
+Content-type: text/plain
+
+
+Date: Fri, 12 Apr 2013 22:43:02 +0000
+

Added: sandbox/triplegit/trunk/.be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/bugs/82e80731-2430-4007-99c2-e254041f3b55/values
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/.be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/bugs/82e80731-2430-4007-99c2-e254041f3b55/values 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,19 @@
+creator: '"Niall Douglas \(s \[underscore\] sourceforge {at} nedprod \[dot\] com\)"
+ <noone_at_spamtrap>'
+
+
+reporter: '"Niall Douglas \(s \[underscore\] sourceforge {at} nedprod \[dot\] com\)"
+ <noone_at_spamtrap>'
+
+
+severity: wishlist
+
+
+status: fixed
+
+
+summary: Change detached future support to bitfield, and add immediatecompletion
+
+
+time: Thu, 11 Apr 2013 21:32:09 +0000
+

Added: sandbox/triplegit/trunk/.be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/bugs/94562f01-aed7-4c00-b442-8aa72b91457d/values
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/.be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/bugs/94562f01-aed7-4c00-b442-8aa72b91457d/values 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,20 @@
+creator: '"Niall Douglas \(s \[underscore\] sourceforge {at} nedprod \[dot\] com\)"
+ <noone_at_spamtrap>'
+
+
+reporter: '"Niall Douglas \(s \[underscore\] sourceforge {at} nedprod \[dot\] com\)"
+ <noone_at_spamtrap>'
+
+
+severity: wishlist
+
+
+status: open
+
+
+summary: function() and call() currently provide no method for retrieving their returns.
+ This should be fixed.
+
+
+time: Thu, 11 Apr 2013 21:38:03 +0000
+

Added: sandbox/triplegit/trunk/.be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/bugs/9f9cd3bc-e5f5-42cf-b3f4-2a617c90319f/values
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/.be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/bugs/9f9cd3bc-e5f5-42cf-b3f4-2a617c90319f/values 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,20 @@
+creator: '"Niall Douglas \(s \[underscore\] sourceforge {at} nedprod \[dot\] com\)"
+ <noone_at_spamtrap>'
+
+
+reporter: '"Niall Douglas \(s \[underscore\] sourceforge {at} nedprod \[dot\] com\)"
+ <noone_at_spamtrap>'
+
+
+severity: wishlist
+
+
+status: open
+
+
+summary: Add a std::vector<async_io_op> barrier() which completes each of its inputs
+ when and only when all of its inputs become ready.
+
+
+time: Thu, 11 Apr 2013 21:34:50 +0000
+

Added: sandbox/triplegit/trunk/.be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/bugs/e95542a8-1ade-4acb-a69a-ab79fd1a4ba4/values
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/.be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/bugs/e95542a8-1ade-4acb-a69a-ab79fd1a4ba4/values 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,19 @@
+creator: '"Niall Douglas \(s \[underscore\] sourceforge {at} nedprod \[dot\] com\)"
+ <noone_at_spamtrap>'
+
+
+reporter: '"Niall Douglas \(s \[underscore\] sourceforge {at} nedprod \[dot\] com\)"
+ <noone_at_spamtrap>'
+
+
+severity: minor
+
+
+status: fixed
+
+
+summary: Port to ARM is unfinished.
+
+
+time: Thu, 11 Apr 2013 21:38:40 +0000
+

Copied: sandbox/triplegit/trunk/.be/b115473a-7c9f-4a36-ad9f-b266a029ec4e/settings (from r84027, /sandbox/triplegit/trunk/testAutoSVNAttribs.c)
==============================================================================

Added: sandbox/triplegit/trunk/.be/version
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/.be/version 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1 @@
+Bugs Everywhere Directory v1.4

Added: sandbox/triplegit/trunk/BEBugsAsHTML/bugs/71435816-3067-4e43-ab33-fe02e0366b6a/index.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/BEBugsAsHTML/bugs/71435816-3067-4e43-ab33-fe02e0366b6a/index.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,60 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+ <head>
+ <title>Bugs Everywhere Issue Tracker</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <link rel="stylesheet" href="../../style.css" type="text/css" />
+ </head>
+ <body>
+ <div class="header">Bugs Everywhere Bug List</div>
+ <div class="main">
+
+<p class="backlink">Back to Active Index</p>
+<p class="backlink">Back to Target Index</p>
+<h1>Bug: b11/714</h1>
+
+<table>
+ <tbody>
+ <tr><td class="bug_detail_label">ID :</td>
+ <td class="bug_detail">71435816-3067-4e43-ab33-fe02e0366b6a</td></tr>
+ <tr><td class="bug_detail_label">Short name :</td>
+ <td class="bug_detail">b11/714</td></tr>
+ <tr><td class="bug_detail_label">Status :</td>
+ <td class="bug_detail">open</td></tr>
+ <tr><td class="bug_detail_label">Severity :</td>
+ <td class="bug_detail">minor</td></tr>
+ <tr><td class="bug_detail_label">Assigned :</td>
+ <td class="bug_detail"></td></tr>
+ <tr><td class="bug_detail_label">Reporter :</td>
+ <td class="bug_detail">&#34;Niall Douglas \(s \[underscore\] sourceforge {at} nedprod \[dot\] com\)&#34; &lt;noone_at_spamtrap&gt;</td></tr>
+ <tr><td class="bug_detail_label">Creator :</td>
+ <td class="bug_detail">&#34;Niall Douglas \(s \[underscore\] sourceforge {at} nedprod \[dot\] com\)&#34; &lt;noone_at_spamtrap&gt;</td></tr>
+ <tr><td class="bug_detail_label">Created :</td>
+ <td class="bug_detail">Tue, 30 Apr 2013 23:32:27 +0000</td></tr>
+ <tr><td class="bug_detail_label">Summary :</td>
+ <td class="bug_detail">Replace all uses of new and shared_ptr&lt;&gt; with make_shared&lt;&gt;</td></tr>
+ </tbody>
+</table>
+
+<hr/>
+
+
+<p>No comments.</p>
+
+<p class="backlink">Back to Active Index</p>
+<p class="backlink">Back to Target Index</p>
+
+ </div>
+ <div class="footer">
+ <p>Generated by <a href="http://www.bugseverywhere.org/">
+ Bugs Everywhere</a></p>
+ <p>
+ <a href="http://validator.w3.org/check?uri=referer">
+ Validate XHTML</a>&nbsp;|&nbsp;
+ <a href="http://jigsaw.w3.org/css-validator/check?uri=referer">
+ Validate CSS</a>
+ </p>
+ </div>
+ </body>
+</html>
\ No newline at end of file

Added: sandbox/triplegit/trunk/BEBugsAsHTML/bugs/7d68ad17-e5e8-4242-8f87-1172a9d68638/index.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/BEBugsAsHTML/bugs/7d68ad17-e5e8-4242-8f87-1172a9d68638/index.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,60 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+ <head>
+ <title>Bugs Everywhere Issue Tracker</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <link rel="stylesheet" href="../../style.css" type="text/css" />
+ </head>
+ <body>
+ <div class="header">Bugs Everywhere Bug List</div>
+ <div class="main">
+
+<p class="backlink">Back to Active Index</p>
+<p class="backlink">Back to Target Index</p>
+<h1>Bug: b11/7d6</h1>
+
+<table>
+ <tbody>
+ <tr><td class="bug_detail_label">ID :</td>
+ <td class="bug_detail">7d68ad17-e5e8-4242-8f87-1172a9d68638</td></tr>
+ <tr><td class="bug_detail_label">Short name :</td>
+ <td class="bug_detail">b11/7d6</td></tr>
+ <tr><td class="bug_detail_label">Status :</td>
+ <td class="bug_detail">open</td></tr>
+ <tr><td class="bug_detail_label">Severity :</td>
+ <td class="bug_detail">wishlist</td></tr>
+ <tr><td class="bug_detail_label">Assigned :</td>
+ <td class="bug_detail"></td></tr>
+ <tr><td class="bug_detail_label">Reporter :</td>
+ <td class="bug_detail">&#34;Niall Douglas \(s \[underscore\] sourceforge {at} nedprod \[dot\] com\)&#34; &lt;noone_at_spamtrap&gt;</td></tr>
+ <tr><td class="bug_detail_label">Creator :</td>
+ <td class="bug_detail">&#34;Niall Douglas \(s \[underscore\] sourceforge {at} nedprod \[dot\] com\)&#34; &lt;noone_at_spamtrap&gt;</td></tr>
+ <tr><td class="bug_detail_label">Created :</td>
+ <td class="bug_detail">Thu, 11 Apr 2013 21:36:12 +0000</td></tr>
+ <tr><td class="bug_detail_label">Summary :</td>
+ <td class="bug_detail">Add a torture test for error handling. For that matter need to tightly define how we handle errors.</td></tr>
+ </tbody>
+</table>
+
+<hr/>
+
+
+<p>No comments.</p>
+
+<p class="backlink">Back to Active Index</p>
+<p class="backlink">Back to Target Index</p>
+
+ </div>
+ <div class="footer">
+ <p>Generated by <a href="http://www.bugseverywhere.org/">
+ Bugs Everywhere</a></p>
+ <p>
+ <a href="http://validator.w3.org/check?uri=referer">
+ Validate XHTML</a>&nbsp;|&nbsp;
+ <a href="http://jigsaw.w3.org/css-validator/check?uri=referer">
+ Validate CSS</a>
+ </p>
+ </div>
+ </body>
+</html>
\ No newline at end of file

Added: sandbox/triplegit/trunk/BEBugsAsHTML/bugs/82e80731-2430-4007-99c2-e254041f3b55/index.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/BEBugsAsHTML/bugs/82e80731-2430-4007-99c2-e254041f3b55/index.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,85 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+ <head>
+ <title>Bugs Everywhere Issue Tracker</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <link rel="stylesheet" href="../../style.css" type="text/css" />
+ </head>
+ <body>
+ <div class="header">Bugs Everywhere Bug List</div>
+ <div class="main">
+
+<p class="backlink">Back to Inactive Index</p>
+<p class="backlink">Back to Target Index</p>
+<h1>Bug: b11/82e</h1>
+
+<table>
+ <tbody>
+ <tr><td class="bug_detail_label">ID :</td>
+ <td class="bug_detail">82e80731-2430-4007-99c2-e254041f3b55</td></tr>
+ <tr><td class="bug_detail_label">Short name :</td>
+ <td class="bug_detail">b11/82e</td></tr>
+ <tr><td class="bug_detail_label">Status :</td>
+ <td class="bug_detail">fixed</td></tr>
+ <tr><td class="bug_detail_label">Severity :</td>
+ <td class="bug_detail">wishlist</td></tr>
+ <tr><td class="bug_detail_label">Assigned :</td>
+ <td class="bug_detail"></td></tr>
+ <tr><td class="bug_detail_label">Reporter :</td>
+ <td class="bug_detail">&#34;Niall Douglas \(s \[underscore\] sourceforge {at} nedprod \[dot\] com\)&#34; &lt;noone_at_spamtrap&gt;</td></tr>
+ <tr><td class="bug_detail_label">Creator :</td>
+ <td class="bug_detail">&#34;Niall Douglas \(s \[underscore\] sourceforge {at} nedprod \[dot\] com\)&#34; &lt;noone_at_spamtrap&gt;</td></tr>
+ <tr><td class="bug_detail_label">Created :</td>
+ <td class="bug_detail">Thu, 11 Apr 2013 21:32:09 +0000</td></tr>
+ <tr><td class="bug_detail_label">Summary :</td>
+ <td class="bug_detail">Change detached future support to bitfield, and add immediatecompletion</td></tr>
+ </tbody>
+</table>
+
+<hr/>
+
+
+
+
+<div class="comment root" id="C2a080481-628d-489a-a28a-f0df461131bd">
+
+<table>
+ <tbody>
+ <tr>
+ <td class="bug_comment_label">Comment:</td>
+ <td class="bug_comment">
+ --------- Comment ---------<br/>
+ ID: 2a080481-628d-489a-a28a-f0df461131bd<br/>
+ Short name: b11/82e/2a0<br/>
+ From: BEurtle auto issue closer<br/>
+ Date: Fri, 12 Apr 2013 22:43:02 +0000<br/>
+ <br/>
+ <pre>
+Fixed in commit 8293dd32 (decimal -2104238798)
+
+</pre>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+
+
+
+<p class="backlink">Back to Inactive Index</p>
+<p class="backlink">Back to Target Index</p>
+
+ </div>
+ <div class="footer">
+ <p>Generated by <a href="http://www.bugseverywhere.org/">
+ Bugs Everywhere</a></p>
+ <p>
+ <a href="http://validator.w3.org/check?uri=referer">
+ Validate XHTML</a>&nbsp;|&nbsp;
+ <a href="http://jigsaw.w3.org/css-validator/check?uri=referer">
+ Validate CSS</a>
+ </p>
+ </div>
+ </body>
+</html>
\ No newline at end of file

Added: sandbox/triplegit/trunk/BEBugsAsHTML/bugs/94562f01-aed7-4c00-b442-8aa72b91457d/index.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/BEBugsAsHTML/bugs/94562f01-aed7-4c00-b442-8aa72b91457d/index.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,60 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+ <head>
+ <title>Bugs Everywhere Issue Tracker</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <link rel="stylesheet" href="../../style.css" type="text/css" />
+ </head>
+ <body>
+ <div class="header">Bugs Everywhere Bug List</div>
+ <div class="main">
+
+<p class="backlink">Back to Active Index</p>
+<p class="backlink">Back to Target Index</p>
+<h1>Bug: b11/945</h1>
+
+<table>
+ <tbody>
+ <tr><td class="bug_detail_label">ID :</td>
+ <td class="bug_detail">94562f01-aed7-4c00-b442-8aa72b91457d</td></tr>
+ <tr><td class="bug_detail_label">Short name :</td>
+ <td class="bug_detail">b11/945</td></tr>
+ <tr><td class="bug_detail_label">Status :</td>
+ <td class="bug_detail">open</td></tr>
+ <tr><td class="bug_detail_label">Severity :</td>
+ <td class="bug_detail">wishlist</td></tr>
+ <tr><td class="bug_detail_label">Assigned :</td>
+ <td class="bug_detail"></td></tr>
+ <tr><td class="bug_detail_label">Reporter :</td>
+ <td class="bug_detail">&#34;Niall Douglas \(s \[underscore\] sourceforge {at} nedprod \[dot\] com\)&#34; &lt;noone_at_spamtrap&gt;</td></tr>
+ <tr><td class="bug_detail_label">Creator :</td>
+ <td class="bug_detail">&#34;Niall Douglas \(s \[underscore\] sourceforge {at} nedprod \[dot\] com\)&#34; &lt;noone_at_spamtrap&gt;</td></tr>
+ <tr><td class="bug_detail_label">Created :</td>
+ <td class="bug_detail">Thu, 11 Apr 2013 21:38:03 +0000</td></tr>
+ <tr><td class="bug_detail_label">Summary :</td>
+ <td class="bug_detail">function() and call() currently provide no method for retrieving their returns. This should be fixed.</td></tr>
+ </tbody>
+</table>
+
+<hr/>
+
+
+<p>No comments.</p>
+
+<p class="backlink">Back to Active Index</p>
+<p class="backlink">Back to Target Index</p>
+
+ </div>
+ <div class="footer">
+ <p>Generated by <a href="http://www.bugseverywhere.org/">
+ Bugs Everywhere</a></p>
+ <p>
+ <a href="http://validator.w3.org/check?uri=referer">
+ Validate XHTML</a>&nbsp;|&nbsp;
+ <a href="http://jigsaw.w3.org/css-validator/check?uri=referer">
+ Validate CSS</a>
+ </p>
+ </div>
+ </body>
+</html>
\ No newline at end of file

Added: sandbox/triplegit/trunk/BEBugsAsHTML/bugs/9f9cd3bc-e5f5-42cf-b3f4-2a617c90319f/index.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/BEBugsAsHTML/bugs/9f9cd3bc-e5f5-42cf-b3f4-2a617c90319f/index.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,60 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+ <head>
+ <title>Bugs Everywhere Issue Tracker</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <link rel="stylesheet" href="../../style.css" type="text/css" />
+ </head>
+ <body>
+ <div class="header">Bugs Everywhere Bug List</div>
+ <div class="main">
+
+<p class="backlink">Back to Active Index</p>
+<p class="backlink">Back to Target Index</p>
+<h1>Bug: b11/9f9</h1>
+
+<table>
+ <tbody>
+ <tr><td class="bug_detail_label">ID :</td>
+ <td class="bug_detail">9f9cd3bc-e5f5-42cf-b3f4-2a617c90319f</td></tr>
+ <tr><td class="bug_detail_label">Short name :</td>
+ <td class="bug_detail">b11/9f9</td></tr>
+ <tr><td class="bug_detail_label">Status :</td>
+ <td class="bug_detail">open</td></tr>
+ <tr><td class="bug_detail_label">Severity :</td>
+ <td class="bug_detail">wishlist</td></tr>
+ <tr><td class="bug_detail_label">Assigned :</td>
+ <td class="bug_detail"></td></tr>
+ <tr><td class="bug_detail_label">Reporter :</td>
+ <td class="bug_detail">&#34;Niall Douglas \(s \[underscore\] sourceforge {at} nedprod \[dot\] com\)&#34; &lt;noone_at_spamtrap&gt;</td></tr>
+ <tr><td class="bug_detail_label">Creator :</td>
+ <td class="bug_detail">&#34;Niall Douglas \(s \[underscore\] sourceforge {at} nedprod \[dot\] com\)&#34; &lt;noone_at_spamtrap&gt;</td></tr>
+ <tr><td class="bug_detail_label">Created :</td>
+ <td class="bug_detail">Thu, 11 Apr 2013 21:34:50 +0000</td></tr>
+ <tr><td class="bug_detail_label">Summary :</td>
+ <td class="bug_detail">Add a std::vector&lt;async_io_op&gt; barrier() which completes each of its inputs when and only when all of its inputs become ready.</td></tr>
+ </tbody>
+</table>
+
+<hr/>
+
+
+<p>No comments.</p>
+
+<p class="backlink">Back to Active Index</p>
+<p class="backlink">Back to Target Index</p>
+
+ </div>
+ <div class="footer">
+ <p>Generated by <a href="http://www.bugseverywhere.org/">
+ Bugs Everywhere</a></p>
+ <p>
+ <a href="http://validator.w3.org/check?uri=referer">
+ Validate XHTML</a>&nbsp;|&nbsp;
+ <a href="http://jigsaw.w3.org/css-validator/check?uri=referer">
+ Validate CSS</a>
+ </p>
+ </div>
+ </body>
+</html>
\ No newline at end of file

Added: sandbox/triplegit/trunk/BEBugsAsHTML/bugs/e95542a8-1ade-4acb-a69a-ab79fd1a4ba4/index.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/BEBugsAsHTML/bugs/e95542a8-1ade-4acb-a69a-ab79fd1a4ba4/index.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,60 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+ <head>
+ <title>Bugs Everywhere Issue Tracker</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <link rel="stylesheet" href="../../style.css" type="text/css" />
+ </head>
+ <body>
+ <div class="header">Bugs Everywhere Bug List</div>
+ <div class="main">
+
+<p class="backlink">Back to Inactive Index</p>
+<p class="backlink">Back to Target Index</p>
+<h1>Bug: b11/e95</h1>
+
+<table>
+ <tbody>
+ <tr><td class="bug_detail_label">ID :</td>
+ <td class="bug_detail">e95542a8-1ade-4acb-a69a-ab79fd1a4ba4</td></tr>
+ <tr><td class="bug_detail_label">Short name :</td>
+ <td class="bug_detail">b11/e95</td></tr>
+ <tr><td class="bug_detail_label">Status :</td>
+ <td class="bug_detail">fixed</td></tr>
+ <tr><td class="bug_detail_label">Severity :</td>
+ <td class="bug_detail">minor</td></tr>
+ <tr><td class="bug_detail_label">Assigned :</td>
+ <td class="bug_detail"></td></tr>
+ <tr><td class="bug_detail_label">Reporter :</td>
+ <td class="bug_detail">&#34;Niall Douglas \(s \[underscore\] sourceforge {at} nedprod \[dot\] com\)&#34; &lt;noone_at_spamtrap&gt;</td></tr>
+ <tr><td class="bug_detail_label">Creator :</td>
+ <td class="bug_detail">&#34;Niall Douglas \(s \[underscore\] sourceforge {at} nedprod \[dot\] com\)&#34; &lt;noone_at_spamtrap&gt;</td></tr>
+ <tr><td class="bug_detail_label">Created :</td>
+ <td class="bug_detail">Thu, 11 Apr 2013 21:38:40 +0000</td></tr>
+ <tr><td class="bug_detail_label">Summary :</td>
+ <td class="bug_detail">Port to ARM is unfinished.</td></tr>
+ </tbody>
+</table>
+
+<hr/>
+
+
+<p>No comments.</p>
+
+<p class="backlink">Back to Inactive Index</p>
+<p class="backlink">Back to Target Index</p>
+
+ </div>
+ <div class="footer">
+ <p>Generated by <a href="http://www.bugseverywhere.org/">
+ Bugs Everywhere</a></p>
+ <p>
+ <a href="http://validator.w3.org/check?uri=referer">
+ Validate XHTML</a>&nbsp;|&nbsp;
+ <a href="http://jigsaw.w3.org/css-validator/check?uri=referer">
+ Validate CSS</a>
+ </p>
+ </div>
+ </body>
+</html>
\ No newline at end of file

Added: sandbox/triplegit/trunk/BEBugsAsHTML/index.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/BEBugsAsHTML/index.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,85 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+ <head>
+ <title>Bugs Everywhere Issue Tracker</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <link rel="stylesheet" href="style.css" type="text/css" />
+ </head>
+ <body>
+ <div class="header">Bugs Everywhere Bug List</div>
+ <div class="main">
+
+<table>
+ <tbody>
+ <tr>
+ <td class="tab sel">Active Bugs</td>
+ <td class="tab nsel">Inactive Bugs</td>
+ <td class="tab nsel">Divided by target</td>
+ </tr>
+ </tbody>
+</table>
+
+
+<table class="bug_list">
+ <thead>
+ <tr>
+ <th>UUID</th>
+ <th>Status</th>
+ <th>Severity</th>
+ <th>Summary</th>
+ <th>Date</th>
+ </tr>
+ </thead>
+ <tbody>
+
+ <tr class="minor">
+ <td class="uuid">b11/714</td>
+ <td class="status">open</td>
+ <td class="severity">minor</td>
+ <td class="summary">Replace all uses of new and shared_ptr<> with make_shared<></td>
+ <td class="date">Tue, 30 Apr 2013 23:32:27 +0000</td>
+</tr>
+
+ <tr class="wishlist">
+ <td class="uuid">b11/945</td>
+ <td class="status">open</td>
+ <td class="severity">wishlist</td>
+ <td class="summary">function() and call() currently provide no method for retrieving their returns. This should be fixed.</td>
+ <td class="date">Thu, 11 Apr 2013 21:38:03 +0000</td>
+</tr>
+
+ <tr class="wishlist">
+ <td class="uuid">b11/7d6</td>
+ <td class="status">open</td>
+ <td class="severity">wishlist</td>
+ <td class="summary">Add a torture test for error handling. For that matter need to tightly define how we handle errors.</td>
+ <td class="date">Thu, 11 Apr 2013 21:36:12 +0000</td>
+</tr>
+
+ <tr class="wishlist">
+ <td class="uuid">b11/9f9</td>
+ <td class="status">open</td>
+ <td class="severity">wishlist</td>
+ <td class="summary">Add a std::vector<async_io_op> barrier() which completes each of its inputs when and only when all of its inputs become ready.</td>
+ <td class="date">Thu, 11 Apr 2013 21:34:50 +0000</td>
+</tr>
+
+ </tbody>
+</table>
+
+
+
+ </div>
+ <div class="footer">
+ <p>Generated by <a href="http://www.bugseverywhere.org/">
+ Bugs Everywhere</a></p>
+ <p>
+ <a href="http://validator.w3.org/check?uri=referer">
+ Validate XHTML</a>&nbsp;|&nbsp;
+ <a href="http://jigsaw.w3.org/css-validator/check?uri=referer">
+ Validate CSS</a>
+ </p>
+ </div>
+ </body>
+</html>

Added: sandbox/triplegit/trunk/BEBugsAsHTML/index_by_target.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/BEBugsAsHTML/index_by_target.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+ <head>
+ <title>Bugs Everywhere Issue Tracker</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <link rel="stylesheet" href="style.css" type="text/css" />
+ </head>
+ <body>
+ <div class="header">Bugs Everywhere Bug List</div>
+ <div class="main">
+
+<table>
+ <tbody>
+ <tr>
+ <td class="tab nsel">Active Bugs</td>
+ <td class="tab nsel">Inactive Bugs</td>
+ <td class="tab sel">Divided by target</td>
+ </tr>
+ </tbody>
+</table>
+
+<p>No bugs.</p>
+
+
+ </div>
+ <div class="footer">
+ <p>Generated by <a href="http://www.bugseverywhere.org/">
+ Bugs Everywhere</a></p>
+ <p>
+ <a href="http://validator.w3.org/check?uri=referer">
+ Validate XHTML</a>&nbsp;|&nbsp;
+ <a href="http://jigsaw.w3.org/css-validator/check?uri=referer">
+ Validate CSS</a>
+ </p>
+ </div>
+ </body>
+</html>

Added: sandbox/triplegit/trunk/BEBugsAsHTML/index_inactive.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/BEBugsAsHTML/index_inactive.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,69 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+ <head>
+ <title>Bugs Everywhere Issue Tracker</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <link rel="stylesheet" href="style.css" type="text/css" />
+ </head>
+ <body>
+ <div class="header">Bugs Everywhere Bug List</div>
+ <div class="main">
+
+<table>
+ <tbody>
+ <tr>
+ <td class="tab nsel">Active Bugs</td>
+ <td class="tab sel">Inactive Bugs</td>
+ <td class="tab nsel">Divided by target</td>
+ </tr>
+ </tbody>
+</table>
+
+
+<table class="bug_list">
+ <thead>
+ <tr>
+ <th>UUID</th>
+ <th>Status</th>
+ <th>Severity</th>
+ <th>Summary</th>
+ <th>Date</th>
+ </tr>
+ </thead>
+ <tbody>
+
+ <tr class="minor">
+ <td class="uuid">b11/e95</td>
+ <td class="status">fixed</td>
+ <td class="severity">minor</td>
+ <td class="summary">Port to ARM is unfinished.</td>
+ <td class="date">Thu, 11 Apr 2013 21:38:40 +0000</td>
+</tr>
+
+ <tr class="wishlist">
+ <td class="uuid">b11/82e</td>
+ <td class="status">fixed</td>
+ <td class="severity">wishlist</td>
+ <td class="summary">Change detached future support to bitfield, and add immediatecompletion</td>
+ <td class="date">Thu, 11 Apr 2013 21:32:09 +0000</td>
+</tr>
+
+ </tbody>
+</table>
+
+
+
+ </div>
+ <div class="footer">
+ <p>Generated by <a href="http://www.bugseverywhere.org/">
+ Bugs Everywhere</a></p>
+ <p>
+ <a href="http://validator.w3.org/check?uri=referer">
+ Validate XHTML</a>&nbsp;|&nbsp;
+ <a href="http://jigsaw.w3.org/css-validator/check?uri=referer">
+ Validate CSS</a>
+ </p>
+ </div>
+ </body>
+</html>

Added: sandbox/triplegit/trunk/BEBugsAsHTML/style.css
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/BEBugsAsHTML/style.css 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,198 @@
+body {
+ font-family: "lucida grande", "sans serif";
+ font-size: 14px;
+ color: #333;
+ width: auto;
+ margin: auto;
+}
+
+div.main {
+ padding: 20px;
+ margin: auto;
+ padding-top: 0;
+ margin-top: 1em;
+ background-color: #fcfcfc;
+ -moz-border-radius: 10px;
+
+}
+
+div.footer {
+ font-size: small;
+ padding-left: 20px;
+ padding-right: 20px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+ margin: auto;
+ background: #305275;
+ color: #fffee7;
+ -moz-border-radius: 10px;
+}
+
+div.header {
+ font-size: xx-large;
+ padding-left: 20px;
+ padding-right: 20px;
+ padding-top: 10px;
+ font-weight:bold;
+ padding-bottom: 10px;
+ background: #305275;
+ color: #fffee7;
+ -moz-border-radius: 10px;
+}
+
+th.target_name {
+ text-align:left;
+ border: 1px solid;
+ border-color: #305275;
+ background-color: #305275;
+ color: #fff;
+ width: auto%;
+ -moz-border-radius-topleft: 8px;
+ -moz-border-radius-topright: 8px;
+ padding-left: 5px;
+ padding-right: 5px;
+}
+
+table {
+ border-style: solid;
+ border: 1px #c3d9ff;
+ border-spacing: 0px 0px;
+ width: auto;
+ padding: 0px;
+
+ }
+
+tb { border: 1px; }
+
+tr {
+ vertical-align: top;
+ border: 1px #c3d9ff;
+ border-style: dotted;
+ width: auto;
+ padding: 0px;
+}
+
+th {
+ border-width: 1px;
+ border-style: solid;
+ border-color: #c3d9ff;
+ border-collapse: collapse;
+ padding-left: 5px;
+ padding-right: 5px;
+}
+
+
+td {
+ border-width: 1px;
+ border-color: #c3d9ff;
+ border-collapse: collapse;
+ padding-left: 5px;
+ padding-right: 5px;
+ width: auto%;
+}
+
+img { border-style: none; }
+
+ul {
+ list-style-type: none;
+ padding: 0;
+}
+
+p { width: auto; }
+
+p.backlink {
+ width: auto;
+ font-weight: bold;
+}
+
+a {
+ background: inherit;
+ text-decoration: none;
+}
+
+a { color: #553d41; }
+a:hover { color: #003d41; }
+a:visited { color: #305275; }
+.footer a { color: #508d91; }
+
+/* bug index pages */
+
+td.tab {
+ padding-right: 1em;
+ padding-left: 1em;
+}
+
+td.sel.tab {
+ background-color: #c3d9ff ;
+ border: 1px solid #c3d9ff;
+ font-weight:bold;
+ -moz-border-radius-topleft: 15px;
+ -moz-border-radius-topright: 15px;
+}
+
+td.nsel.tab {
+ border: 1px solid #c3d9ff;
+ font-weight:bold;
+ -moz-border-radius-topleft: 5px;
+ -moz-border-radius-topright: 5px;
+}
+
+table.bug_list {
+ border-width: 1px;
+ border-style: solid;
+ border-color: #c3d9ff;
+ padding: 0px;
+ width: 100%;
+ border: 1px solid #c3d9ff;
+}
+
+table.target_list {
+ padding: 0px;
+ width: 100%;
+ margin-bottom: 10px;
+}
+
+table.target_list.td {
+ border-width: 1px;
+}
+
+tr.wishlist { background-color: #DCFAFF;}
+tr.wishlist:hover { background-color: #C2DCE1; }
+
+tr.minor { background-color: #FFFFA6; }
+tr.minor:hover { background-color: #E6E696; }
+
+tr.serious { background-color: #FF9077;}
+tr.serious:hover { background-color: #E6826B; }
+
+tr.critical { background-color: #FF752A; }
+tr.critical:hover { background-color: #D63905;}
+
+tr.fatal { background-color: #FF3300;}
+tr.fatal:hover { background-color: #D60000;}
+
+td.uuid { width: 5%; border-style: dotted;}
+td.status { width: 5%; border-style: dotted;}
+td.severity { width: 5%; border-style: dotted;}
+td.summary { border-style: dotted;}
+td.date { width: 25%; border-style: dotted;}
+
+/* bug detail pages */
+
+td.bug_detail_label { text-align: right; border: none;}
+td.bug_detail { border: none;}
+td.bug_comment_label { text-align: right; vertical-align: top; }
+td.bug_comment { }
+
+div.comment {
+ padding: 20px;
+ padding-top: 20px;
+ margin: auto;
+ margin-top: 0;
+}
+
+div.root.comment {
+ padding: 0px;
+ /* padding-top: 0px; */
+ padding-bottom: 20px;
+}
\ No newline at end of file

Added: sandbox/triplegit/trunk/Doxyfile
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/Doxyfile 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,1808 @@
+# Doxyfile 1.8.2
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the
+# iconv built into libc) for the transcoding. See
+# http://www.gnu.org/software/libiconv for the list of possible encodings.
+
+DOXYFILE_ENCODING = UTF-8
+
+# The PROJECT_NAME tag is a single word (or sequence of words) that should
+# identify the project. Note that if you do not use Doxywizard you need
+# to put quotes around the project name if it contains spaces.
+
+PROJECT_NAME = "TripleGit"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
+PROJECT_NUMBER = v0.01
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer
+# a quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF =
+
+# With the PROJECT_LOGO tag one can specify an logo or icon that is
+# included in the documentation. The maximum height of the logo should not
+# exceed 55 pixels and the maximum width should not exceed 200 pixels.
+# Doxygen will copy the logo to the output directory.
+
+PROJECT_LOGO =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY =
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
+# 4096 sub-directories (in 2 levels) under the output directory of each output
+# format and will distribute the generated files over these directories.
+# Enabling this option can be useful when feeding doxygen a huge amount of
+# source files, where putting all generated files in the same directory would
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,
+# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German,
+# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English
+# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian,
+# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak,
+# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
+
+OUTPUT_LANGUAGE = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator
+# that is used to form the text in various listings. Each string
+# in this list, if found as the leading text of the brief description, will be
+# stripped from the text and the result after processing the whole list, is
+# used as the annotated text. Otherwise, the brief description is used as-is.
+# If left blank, the following values are used ("$name" is automatically
+# replaced with the name of the entity): "The $name class" "The $name widget"
+# "The $name file" "is" "provides" "specifies" "contains"
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
+ALWAYS_DETAILED_SEC = YES
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES = YES
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user-defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the
+# path to strip. Note that you specify absolute paths here, but also
+# relative paths, which will be relative from the directory where doxygen is
+# started.
+
+STRIP_FROM_PATH =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
+# the path mentioned in the documentation of a class, which tells
+# the reader which header file to include in order to use a class.
+# If left blank only the name of the header file containing the class
+# definition is used. Otherwise one should specify the include paths that
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+# (but less readable) file names. This can be useful if your file system
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like regular Qt-style comments
+# (thus requiring an explicit @brief command for a brief description.)
+
+JAVADOC_AUTOBRIEF = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then Doxygen will
+# interpret the first line (until the first dot) of a Qt-style
+# comment as the brief description. If set to NO, the comments
+# will behave just like regular Qt-style comments (thus requiring
+# an explicit \brief command for a brief description.)
+
+QT_AUTOBRIEF = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
+# treat a multi-line C++ special comment block (i.e. a block of //! or ///
+# comments) as a brief description. This used to be the default behaviour.
+# The new default is to treat a multi-line C++ comment block as a detailed
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# re-implements.
+
+INHERIT_DOCS = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
+# a new page for each member. If set to NO, the documentation of a member will
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE = 4
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user-defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES =
+
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding
+# "class=itcl::class" will allow you to use the command class in the
+# itcl::class meaning.
+
+TCL_SUBST =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
+# sources only. Doxygen will then generate output that is more tailored for C.
+# For instance, some of the names that are used will be different. The list
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
+# sources only. Doxygen will then generate output that is more tailored for
+# Java. For instance, namespaces will be presented as packages, qualified
+# scopes will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources only. Doxygen will then generate output that is more tailored for
+# Fortran.
+
+OPTIMIZE_FOR_FORTRAN = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for
+# VHDL.
+
+OPTIMIZE_OUTPUT_VHDL = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension,
+# and language is one of the parsers supported by doxygen: IDL, Java,
+# Javascript, CSharp, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL, C,
+# C++. For instance to make doxygen treat .inc files as Fortran files (default
+# is PHP), and .f files as C (default is Fortran), use: inc=Fortran f=C. Note
+# that for custom extensions you also need to set FILE_PATTERNS otherwise the
+# files are not read by doxygen.
+
+EXTENSION_MAPPING =
+
+# If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all
+# comments according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you
+# can mix doxygen, HTML, and XML commands with Markdown formatting.
+# Disable only in case of backward compatibilities issues.
+
+MARKDOWN_SUPPORT = YES
+
+# When enabled doxygen tries to link words that correspond to documented classes,
+# or namespaces to their corresponding documentation. Such a link can be
+# prevented in individual cases by by putting a % sign in front of the word or
+# globally by setting AUTOLINK_SUPPORT to NO.
+
+AUTOLINK_SUPPORT = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should
+# set this tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
+# func(std::string) {}). This also makes the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT = YES
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+
+CPP_CLI_SUPPORT = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only.
+# Doxygen will parse them like normal C++ but will assume all classes use public
+# instead of private inheritance when no explicit protection keyword is present.
+
+SIP_SUPPORT = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate getter and setter methods for a property. Setting this option to YES (the default) will make doxygen replace the get and set methods by a property in the documentation. This will only work if the methods are indeed getting or setting a simple type. If this is not the case, or you want to show the methods anyway, you should set this option to NO.
+
+IDL_PROPERTY_SUPPORT = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
+# the same type (for instance a group of public functions) to be put as a
+# subgroup of that type (e.g. under the Public Functions section). Set it to
+# NO to prevent subgrouping. Alternatively, this can be done per class using
+# the \nosubgrouping command.
+
+SUBGROUPING = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and
+# unions are shown inside the group in which they are included (e.g. using
+# @ingroup) instead of on a separate page (for HTML and Man pages) or
+# section (for LaTeX and RTF).
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and
+# unions with only public data fields will be shown inline in the documentation
+# of the scope in which they are defined (i.e. file, namespace, or group
+# documentation), provided this scope is documented. If set to NO (the default),
+# structs, classes, and unions are shown on a separate page (for HTML and Man
+# pages) or section (for LaTeX and RTF).
+
+INLINE_SIMPLE_STRUCTS = NO
+
+# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum
+# is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically
+# be useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+
+TYPEDEF_HIDES_STRUCT = NO
+
+# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to
+# determine which symbols to keep in memory and which to flush to disk.
+# When the cache is full, less often used symbols will be written to disk.
+# For small to medium size projects (<1000 input files) the default value is
+# probably good enough. For larger projects a too small cache size can cause
+# doxygen to be busy swapping symbols to and from disk most of the time
+# causing a significant performance penalty.
+# If the system has enough physical memory increasing the cache will improve the
+# performance by keeping more symbols in memory. Note that the value works on
+# a logarithmic scale so increasing the size by one will roughly double the
+# memory usage. The cache size is given by this formula:
+# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,
+# corresponding to a cache size of 2^16 = 65536 symbols.
+
+SYMBOL_CACHE_SIZE = 0
+
+# Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be
+# set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given
+# their name and scope. Since this can be an expensive process and often the
+# same symbol appear multiple times in the code, doxygen keeps a cache of
+# pre-resolved symbols. If the cache is too small doxygen will become slower.
+# If the cache is too large, memory is wasted. The cache size is given by this
+# formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0,
+# corresponding to a cache size of 2^16 = 65536 symbols.
+
+LOOKUP_CACHE_SIZE = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE = NO
+
+# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal
+# scope will be included in the documentation.
+
+EXTRACT_PACKAGE = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# This flag is only useful for Objective-C code. When set to YES local
+# methods, which are defined in the implementation section but not in
+# the interface are included in the documentation.
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base
+# name of the file that contains the anonymous namespace. By default
+# anonymous namespaces are hidden.
+
+EXTRACT_ANON_NSPACES = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS = YES
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these classes will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES = YES
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+# friend (class|struct|union) declarations.
+# If set to NO (the default) these declarations will be included in the
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
+# documentation blocks found inside the body of a function.
+# If set to NO (the default) these blocks will be appended to the
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS = NO
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES = NO
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put a list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen
+# will list include files with double quotes in the documentation
+# rather than with sharp brackets.
+
+FORCE_LOCAL_INCLUDES = NO
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
+# brief documentation of file, namespace and class members alphabetically
+# by member name. If set to NO (the default) the members will appear in
+# declaration order.
+
+SORT_BRIEF_DOCS = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen
+# will sort the (brief and detailed) documentation of class members so that
+# constructors and destructors are listed first. If set to NO (the default)
+# the constructors will appear in the respective orders defined by
+# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS.
+# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO
+# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the
+# hierarchy of group names into alphabetical order. If set to NO (the default)
+# the group names will appear in their defined order.
+
+SORT_GROUP_NAMES = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
+# sorted by fully-qualified names, including namespaces. If set to
+# NO (the default), the class list will be sorted only by class name,
+# not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to
+# do proper type resolution of all parameters of a function it will reject a
+# match between the prototype and the implementation of a member function even
+# if there is only one candidate or it is obvious which candidate to choose
+# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen
+# will still accept a match between prototype and implementation in such cases.
+
+STRICT_PROTO_MATCHING = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
+# commands in the documentation.
+
+GENERATE_BUGLIST = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
+# disable (NO) the deprecated list. This list is created by putting
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or macro consists of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and macros in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+# at the bottom of the documentation of classes and structs. If set to YES the
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page.
+# This will remove the Files entry from the Quick Index and from the
+# Folder Tree View (if specified). The default is YES.
+
+SHOW_FILES = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the
+# Namespaces page.
+# This will remove the Namespaces entry from the Quick Index
+# and from the Folder Tree View (if specified). The default is YES.
+
+SHOW_NAMESPACES = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command <command> <input-file>, where <command> is the value of
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
+# provided by doxygen. Whatever the program writes to standard output
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option.
+# You can optionally specify a file name after the option, if omitted
+# DoxygenLayout.xml will be used as the name of the layout file.
+
+LAYOUT_FILE =
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files
+# containing the references data. This must be a list of .bib files. The
+# .bib extension is automatically appended if omitted. Using this command
+# requires the bibtex tool to be installed. See also
+# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style
+# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this
+# feature you need bibtex and perl available in the search path.
+
+CITE_BIB_FILES =
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some
+# parameters in a documented function, or documenting parameters that
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR = YES
+
+# The WARN_NO_PARAMDOC option can be enabled to get warnings for
+# functions that are documented, but have no documentation for their parameters
+# or return value. If set to NO (the default) doxygen will only warn about
+# wrong or incomplete parameter documentation, but not about the absence of
+# documentation.
+
+WARN_NO_PARAMDOC = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text. Optionally the format may contain
+# $version, which will be replaced by the version of the file (if it could
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
+# to stderr.
+
+WARN_LOGFILE = Doxyfile.log
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT = triplegit/include
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
+# also the default input encoding. Doxygen uses libiconv (or the iconv built
+# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for
+# the list of possible encodings.
+
+INPUT_ENCODING = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh
+# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py
+# *.f90 *.f *.for *.vhd *.vhdl
+
+FILE_PATTERNS = *.hpp
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE = NO
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE =
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+
+EXCLUDE_SYMLINKS = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories. Note that the wildcards are matched
+# against the file with absolute path, so to exclude all test directories
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS =
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+
+EXCLUDE_SYMBOLS =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output.
+# If FILTER_PATTERNS is specified, this tag will be
+# ignored.
+
+INPUT_FILTER =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis.
+# Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match.
+# The filters are a list of the form:
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
+# info on how filters are used. If FILTER_PATTERNS is empty or if
+# non of the patterns match the file name, INPUT_FILTER is applied.
+
+FILTER_PATTERNS =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any)
+# and it is also possible to disable source filtering for a specific pattern
+# using *.ext= (so without naming a filter). This option only has effect when
+# FILTER_SOURCE_FILES is enabled.
+
+FILTER_SOURCE_PATTERNS =
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+# Note: To get rid of all source code in the generated output, make sure also
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C, C++ and Fortran comments will always remain visible.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES
+# then for each documented function all documented
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES
+# then for each documented function all documented entities
+# called/used by that function will be listed.
+
+REFERENCES_RELATION = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
+# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
+# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
+# link to the source code.
+# Otherwise they will link to the documentation.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code
+# will point to the HTML generated by the htags(1) tool instead of doxygen
+# built-in source browser. The htags tool is part of GNU's global source
+# tagging system (see http://www.gnu.org/software/global/global.html). You
+# will need version 4.8.6 or higher.
+
+USE_HTAGS = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX = YES
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header. Note that when using a custom header you are responsible
+# for the proper inclusion of any scripts and style sheets that doxygen
+# needs, which is dependent on the configuration options used.
+# It is advised to generate a default header using "doxygen -w html
+# header.html footer.html stylesheet.css YourConfigFile" and then modify
+# that header. Note that the header is subject to change so you typically
+# have to redo this when upgrading to a newer version of doxygen or when
+# changing the value of configuration settings such as GENERATE_TREEVIEW!
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER = footer.html
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If left blank doxygen will
+# generate a default style sheet. Note that it is recommended to use
+# HTML_EXTRA_STYLESHEET instead of this one, as it is more robust and this
+# tag will in the future become obsolete.
+
+HTML_STYLESHEET =
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional
+# user-defined cascading style sheet that is included after the standard
+# style sheets created by doxygen. Using this option one can overrule
+# certain style aspects. This is preferred over using HTML_STYLESHEET
+# since it does not replace the standard style sheet and is therefor more
+# robust against future updates. Doxygen will copy the style sheet file to
+# the output directory.
+
+HTML_EXTRA_STYLESHEET =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that
+# the files will be copied as-is; there are no commands or markers available.
+
+HTML_EXTRA_FILES =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output.
+# Doxygen will adjust the colors in the style sheet and background images
+# according to this color. Hue is specified as an angle on a colorwheel,
+# see http://en.wikipedia.org/wiki/Hue for more information.
+# For instance the value 0 represents red, 60 is yellow, 120 is green,
+# 180 is cyan, 240 is blue, 300 purple, and 360 is red again.
+# The allowed range is 0 to 359.
+
+HTML_COLORSTYLE_HUE = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of
+# the colors in the HTML output. For a value of 0 the output will use
+# grayscales only. A value of 255 will produce the most vivid colors.
+
+HTML_COLORSTYLE_SAT = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to
+# the luminance component of the colors in the HTML output. Values below
+# 100 gradually make the output lighter, whereas values above 100 make
+# the output darker. The value divided by 100 is the actual gamma applied,
+# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2,
+# and 100 does not change the gamma.
+
+HTML_COLORSTYLE_GAMMA = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting
+# this to NO can help when comparing the output of multiple runs.
+
+HTML_TIMESTAMP = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+
+HTML_DYNAMIC_SECTIONS = NO
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of
+# entries shown in the various tree structured indices initially; the user
+# can expand and collapse entries dynamically later on. Doxygen will expand
+# the tree to such a level that at most the specified number of entries are
+# visible (unless a fully collapsed tree already exceeds this amount).
+# So setting the number of entries 1 will produce a full collapsed tree by
+# default. 0 is a special value representing an infinite number of entries
+# and will result in a full expanded tree by default.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files
+# will be generated that can be used as input for Apple's Xcode 3
+# integrated development environment, introduced with OSX 10.5 (Leopard).
+# To create a documentation set, doxygen will generate a Makefile in the
+# HTML output directory. Running make will produce the docset in that
+# directory and running "make install" will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find
+# it at startup.
+# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+
+GENERATE_DOCSET = NO
+
+# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the
+# feed. A documentation feed provides an umbrella under which multiple
+# documentation sets from a single provider (such as a company or product suite)
+# can be grouped.
+
+DOCSET_FEEDNAME = "Doxygen generated docs"
+
+# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that
+# should uniquely identify the documentation set bundle. This should be a
+# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen
+# will append .docset to the name.
+
+DOCSET_BUNDLE_ID = org.doxygen.Project
+
+# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely
+# identify the documentation publisher. This should be a reverse domain-name
+# style string, e.g. com.mycompany.MyDocSet.documentation.
+
+DOCSET_PUBLISHER_ID = org.doxygen.Publisher
+
+# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.
+
+DOCSET_PUBLISHER_NAME = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compiled HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
+# be used to specify the file name of the resulting .chm file. You
+# can add a path in front of the file if the result should not be
+# written to the html output directory.
+
+CHM_FILE =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
+# be used to specify the location (absolute path including file name) of
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING
+# is used to encode HtmlHelp index (hhk), content (hhc) and project file
+# content.
+
+CHM_INDEX_ENCODING =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated
+# that can be used as input for Qt's qhelpgenerator to generate a
+# Qt Compressed Help (.qch) of the generated HTML documentation.
+
+GENERATE_QHP = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can
+# be used to specify the file name of the resulting .qch file.
+# The path specified is relative to the HTML output folder.
+
+QCH_FILE =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#namespace
+
+QHP_NAMESPACE = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#virtual-folders
+
+QHP_VIRTUAL_FOLDER = doc
+
+# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to
+# add. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#custom-filters
+
+QHP_CUST_FILTER_NAME =
+
+# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see
+# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters">
+# Qt Help Project / Custom Filters</a>.
+
+QHP_CUST_FILTER_ATTRS =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's
+# filter section matches.
+# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes">
+# Qt Help Project / Filter Attributes</a>.
+
+QHP_SECT_FILTER_ATTRS =
+
+# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can
+# be used to specify the location of Qt's qhelpgenerator.
+# If non-empty doxygen will try to run qhelpgenerator on the generated
+# .qhp file.
+
+QHG_LOCATION =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files
+# will be generated, which together with the HTML files, form an Eclipse help
+# plugin. To install this plugin and make it available under the help contents
+# menu in Eclipse, the contents of the directory containing the HTML and XML
+# files needs to be copied into the plugins directory of eclipse. The name of
+# the directory within the plugins directory should be the same as
+# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before
+# the help appears.
+
+GENERATE_ECLIPSEHELP = NO
+
+# A unique identifier for the eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have
+# this name.
+
+ECLIPSE_DOC_ID = org.doxygen.Project
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs)
+# at top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it. Since the tabs have the same information as the
+# navigation tree you can set this option to NO if you already set
+# GENERATE_TREEVIEW to YES.
+
+DISABLE_INDEX = NO
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information.
+# If the tag value is set to YES, a side panel will be generated
+# containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).
+# Windows users are probably better off using the HTML help feature.
+# Since the tree basically has the same information as the tab index you
+# could consider to set DISABLE_INDEX to NO when enabling this option.
+
+GENERATE_TREEVIEW = NO
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values
+# (range [0,1..20]) that doxygen will group on one line in the generated HTML
+# documentation. Note that a value of 0 will completely suppress the enum
+# values from appearing in the overview section.
+
+ENUM_VALUES_PER_LINE = 4
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
+TREEVIEW_WIDTH = 250
+
+# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open
+# links to external symbols imported via tag files in a separate window.
+
+EXT_LINKS_IN_WINDOW = NO
+
+# Use this tag to change the font size of Latex formulas included
+# as images in the HTML documentation. The default is 10. Note that
+# when you change the font size after a successful doxygen run you need
+# to manually remove any form_*.png images from the HTML output directory
+# to force them to be regenerated.
+
+FORMULA_FONTSIZE = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are
+# not supported properly for IE 6.0, but are supported on all modern browsers.
+# Note that when changing this option you need to delete any form_*.png files
+# in the HTML output before the changes have effect.
+
+FORMULA_TRANSPARENT = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax
+# (see http://www.mathjax.org) which uses client side Javascript for the
+# rendering instead of using prerendered bitmaps. Use this if you do not
+# have LaTeX installed or if you want to formulas look prettier in the HTML
+# output. When enabled you may also need to install MathJax separately and
+# configure the path to it using the MATHJAX_RELPATH option.
+
+USE_MATHJAX = NO
+
+# When MathJax is enabled you need to specify the location relative to the
+# HTML output directory using the MATHJAX_RELPATH option. The destination
+# directory should contain the MathJax.js script. For instance, if the mathjax
+# directory is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to
+# the MathJax Content Delivery Network so you can quickly see the result without
+# installing MathJax.
+# However, it is strongly recommended to install a local
+# copy of MathJax from http://www.mathjax.org before deployment.
+
+MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension
+# names that should be enabled during MathJax rendering.
+
+MATHJAX_EXTENSIONS =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box
+# for the HTML output. The underlying search engine uses javascript
+# and DHTML and should work on any modern browser. Note that when using
+# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets
+# (GENERATE_DOCSET) there is already a search function so this one should
+# typically be disabled. For large projects the javascript based search engine
+# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.
+
+SEARCHENGINE = YES
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a PHP enabled web server instead of at the web client
+# using Javascript. Doxygen will generate the search PHP script and index
+# file to put on the web server. The advantage of the server
+# based approach is that it scales better to large projects and allows
+# full text search. The disadvantages are that it is more difficult to setup
+# and does not have live searching capabilities.
+
+SERVER_BASED_SEARCH = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX = No
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked. If left blank `latex' will be used as the default command name.
+# Note that when enabling USE_PDFLATEX this option is only used for
+# generating bitmaps for formulas in the HTML output, but not in the
+# Makefile that is written to the output directory.
+
+LATEX_CMD_NAME = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
+# default command name.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE = a4
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for
+# the generated latex document. The footer should contain everything after
+# the last chapter. If it is left blank doxygen will generate a
+# standard footer. Notice: only use this tag if you know what you are doing!
+
+LATEX_FOOTER =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not
+# include the index chapters (such as File Index, Compound Index, etc.)
+# in the output.
+
+LATEX_HIDE_INDICES = NO
+
+# If LATEX_SOURCE_CODE is set to YES then doxygen will include
+# source code with syntax highlighting in the LaTeX output.
+# Note that which sources are shown also depends on other settings
+# such as SOURCE_BROWSER.
+
+LATEX_SOURCE_CODE = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See
+# http://en.wikipedia.org/wiki/BibTeX for more info.
+
+LATEX_BIB_STYLE = plain
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimized for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS = NO
+
+# Load style sheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an rtf document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation.
+
+GENERATE_XML = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_SCHEMA =
+
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_DTD =
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
+# dump the program listings (including syntax highlighting
+# and cross-referencing information) to the XML output. Note that
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will
+# generate a Perl module file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+# nicely formatted so it can be parsed by a human reader.
+# This is useful
+# if you want to understand what is going on.
+# On the other hand, if this
+# tag is set to NO the size of the Perl module output will be much smaller
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+# This is useful so different doxyrules.make files included by the same
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION = YES
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# pointed to by INCLUDE_PATH will be searched when a #include is found.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed. To prevent a macro definition from being
+# undefined via #undef or recursively expanded use the := operator
+# instead of the = operator.
+
+PREDEFINED =
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition that
+# overrules the definition found in the source code.
+
+EXPAND_AS_DEFINED =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all references to function-like macros
+# that are alone on a line, have an all uppercase name, and do not end with a
+# semicolon, because these will confuse the parser if not removed.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles. For each
+# tag file the location of the external documentation should be added. The
+# format of a tag file without this location is as follows:
+#
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+#
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where "loc1" and "loc2" can be relative or absolute paths
+# or URLs. Note that each tag file must have a unique name (where the name does
+# NOT include the path). If a tag file is not located in the directory in which
+# doxygen is run, you must also specify the path to the tagfile here.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will
+# be listed.
+
+EXTERNAL_GROUPS = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
+# or super classes. Setting the tag to NO turns the diagrams off. Note that
+# this option also works with HAVE_DOT disabled, but it is recommended to
+# install and use dot, since it yields more powerful graphs.
+
+CLASS_DIAGRAMS = YES
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see
+# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH =
+
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT = NO
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is
+# allowed to run in parallel. When set to 0 (the default) doxygen will
+# base this on the number of processors available in the system. You can set it
+# explicitly to a value larger than 0 to get control over the balance
+# between CPU load and processing speed.
+
+DOT_NUM_THREADS = 0
+
+# By default doxygen will use the Helvetica font for all dot files that
+# doxygen generates. When you want a differently looking font you can specify
+# the font name using DOT_FONTNAME. You need to make sure dot is able to find
+# the font, which can be done by putting it in a standard location or by setting
+# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the
+# directory containing the font.
+
+DOT_FONTNAME = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.
+# The default size is 10pt.
+
+DOT_FONTSIZE = 10
+
+# By default doxygen will tell dot to use the Helvetica font.
+# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to
+# set the path where dot can find it.
+
+DOT_FONTPATH =
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+
+UML_LOOK = NO
+
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside
+# the class node. If there are many fields or methods and many nodes the
+# graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS
+# threshold limits the number of items for each type to make the size more
+# managable. Set this to 0 for no limit. Note that the threshold may be
+# exceeded by 50% before the limit is enforced.
+
+UML_LIMIT_NUM_FIELDS = 10
+
+# If set to YES, the inheritance and collaboration graphs will show the
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
+# other documented files.
+
+INCLUDE_GRAPH = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH = YES
+
+# If the CALL_GRAPH and HAVE_DOT options are set to YES then
+# doxygen will generate a call dependency graph for every global function
+# or class method. Note that enabling this option will significantly increase
+# the time of a run. So in most cases it will be better to enable call graphs
+# for selected functions only using the \callgraph command.
+
+CALL_GRAPH = NO
+
+# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then
+# doxygen will generate a caller dependency graph for every global function
+# or class method. Note that enabling this option will significantly increase
+# the time of a run. So in most cases it will be better to enable caller
+# graphs for selected functions only using the \callergraph command.
+
+CALLER_GRAPH = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will generate a graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY = YES
+
+# If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES
+# then doxygen will show the dependencies a directory has on other directories
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. Possible values are svg, png, jpg, or gif.
+# If left blank png will be used. If you choose svg you need to set
+# HTML_FILE_EXTENSION to xhtml in order to make the SVG files
+# visible in IE 9+ (other browsers do not have this requirement).
+
+DOT_IMAGE_FORMAT = png
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+# Note that this requires a modern browser other than Internet Explorer.
+# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you
+# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files
+# visible. Older versions of IE do not have SVG support.
+
+INTERACTIVE_SVG = NO
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
+# \dotfile command).
+
+DOTFILE_DIRS =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the
+# \mscfile command).
+
+MSCFILE_DIRS =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of
+# nodes that will be shown in the graph. If the number of nodes in a graph
+# becomes larger than this value, doxygen will truncate the graph, which is
+# visualized by representing a node as a red box. Note that doxygen if the
+# number of direct children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note
+# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+
+DOT_GRAPH_MAX_NODES = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
+# graphs generated by dot. A depth value of 3 means that only nodes reachable
+# from the root by following a path via at most 3 edges will be shown. Nodes
+# that lay further from the root node will be omitted. Note that setting this
+# option to 1 or 2 may greatly reduce the computation time needed for large
+# code bases. Also note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+
+MAX_DOT_GRAPH_DEPTH = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not
+# seem to support this out of the box. Warning: Depending on the platform used,
+# enabling this option may lead to badly anti-aliased labels on the edges of
+# a graph (i.e. they become hard to read).
+
+DOT_TRANSPARENT = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10)
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermediate dot files that are used to generate
+# the various graphs.
+
+DOT_CLEANUP = YES

Added: sandbox/triplegit/trunk/SConscript
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/SConscript 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,94 @@
+import os, sys, platform
+
+Import("importedenv", "ARMcrosscompiler")
+env=importedenv.Clone()
+architecture=env['VARIANT'][:env['VARIANT'].find('/')]
+debugbuild="Debug" in env['VARIANT']
+if env['CC']=='cl':
+ if architecture=="x86":
+ if env.GetOption('sse')==1: env['CCFLAGS']+=[ "/arch:SSE" ]
+ elif env.GetOption('sse')>=2: env['CCFLAGS']+=[ "/arch:SSE2" ]
+ if env.GetOption('sse')>=3: env['CPPDEFINES']+=[("__SSE3__", 1)]
+ if env.GetOption('sse')>=4: env['CPPDEFINES']+=[("__SSE4__", 1)]
+ if architecture=="x86" or architecture=="x64":
+ if env.GetOption('avx')==1: env['CCFLAGS']+=[ "/arch:AVX" ]
+else:
+ if architecture=="x86":
+ env['CCFLAGS']+=["-m32"]
+ env['LINKFLAGS']+=["-m32"]
+ if env.GetOption('sse'):
+ env['CCFLAGS']+=["-mfpmath=sse"]
+ if env.GetOption('sse')>1: env['CCFLAGS']+=["-msse%s" % str(env.GetOption('sse'))]
+ else: env['CCFLAGS']+=["-msse"]
+ if architecture=="x86" or architecture=="x64":
+ if env.GetOption('avx'):
+ env['CCFLAGS']+=["-mfpmath=avx"]
+ if env.GetOption('avx')>1: env['CCFLAGS']+=["-mavx%s" % str(env.GetOption('avx'))]
+ else: env['CCFLAGS']+=["-mavx"]
+ if architecture=='ARMv7':
+ if ARMcrosscompiler:
+ env['CC']='arm-linux-gnueabi-gcc'
+ env['CXX']='arm-linux-gnueabi-g++'
+ env['CCFLAGS']+=['-mfpu=%s' % env.GetOption('fpu')]
+ if env.GetOption('thumb'):
+ env['CCFLAGS']+=['-mthumb']
+
+# Am I building a debug or release build?
+if debugbuild:
+ env['CPPDEFINES']+=["DEBUG", "_DEBUG"]
+else:
+ env['CPPDEFINES']+=["NDEBUG"]
+
+# Am I building for Windows or POSIX?
+if env['CC']=='cl':
+ env['CPPDEFINES']+=["WIN32", "_WINDOWS", "UNICODE", "_UNICODE"]
+ env['CXXFLAGS']+=["/EHsc"]
+ env['CCFLAGS']+=["/GF"] # Eliminate duplicate strings
+ env['CCFLAGS']+=["/Gy"] # Seperate COMDATs
+ env['CCFLAGS']+=["/Zi"] # Program database debug info
+ if debugbuild:
+ env['CCFLAGS']+=["/Od", "/MTd"]
+ else:
+ env['CCFLAGS']+=["/O2", "/MT"]
+ env['LIBS']+=[]
+ env['LINKFLAGS']+=["/DEBUG"] # Output debug symbols
+ env['LINKFLAGS']+=["/LARGEADDRESSAWARE"] # Works past 2Gb
+ env['LINKFLAGS']+=["/DYNAMICBASE"] # Doesn't mind being randomly placed
+ env['LINKFLAGS']+=["/NXCOMPAT"] # Likes no execute
+ env['LINKFLAGS']+=["/OPT:REF"] # Seems to puke on load on WinXP without
+ env['LINKFLAGS']+=["/MANIFEST"] # Be UAC compatible
+ env['LINKFLAGSEXE']=env['LINKFLAGS'][:]
+
+ env['LINKFLAGS']+=["/VERSION:1.00.0"] # Version
+
+ if not debugbuild:
+ env['LINKFLAGS']+=["/OPT:ICF"] # Eliminate redundants
+else:
+ env['CPPDEFINES']+=[]
+ env['CCFLAGS']+=["-fstrict-aliasing", "-fargument-noalias", "-Wstrict-aliasing"]
+ env['CCFLAGS']+=["-Wall", "-Wno-unused"]
+ if debugbuild:
+ env['CCFLAGS']+=["-O0", "-g"]
+ else:
+ env['CCFLAGS']+=["-O2", "-g"]
+ env['CXXFLAGS']+=["-std=c++0x"]
+ env['LIBS']+=["boost_atomic", "boost_filesystem", "boost_system", "boost_thread", "pthread"]
+ env['LINKFLAGS']+=[]
+ env['LINKFLAGSEXE']=env['LINKFLAGS'][:]
+
+outputs={}
+
+# Build the triplegit DLL
+outputs['mylibs']=SConscript("triplegit/SConscript")
+
+# Unit tests
+sources = env.SConscript(os.path.join("unittests", "SConscript"), 'importedenv')
+objects = env.Object(source = sources) # + [myliblib]
+testlibs=outputs['mylibs']['triplegitlib'][0] + outputs['mylibs']['NiallsCPP11Utilitieslib']
+
+testprogram_cpp = env.Program("tests", source = objects, LINKFLAGS=env['LINKFLAGSEXE'], LIBS = testlibs + env['LIBS'])
+outputs['unittests']=(testprogram_cpp, sources)
+
+# Remove triplegit lib contents from mylibs
+del outputs['mylibs']
+Return("outputs")

Added: sandbox/triplegit/trunk/SConstruct
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/SConstruct 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,258 @@
+import os, sys, platform, subprocess
+
+architectures = ["generic"]
+
+env = Environment()
+#print env['TOOLS']
+
+architecture="generic"
+ARMcrosscompiler=False
+if env['CC']=='cl':
+ # We're on windows
+ if os.environ.has_key('LIBPATH'):
+ if not env.GetOption('force32') and -1!=os.environ['LIBPATH'].find("\\amd64"):
+ architecture="x64"
+ elif -1!=os.environ['LIBPATH'].find("\\arm"):
+ architecture="ARMv7"
+ else:
+ architecture="x86"
+ architectures.append(architecture)
+else:
+ # We're on POSIX, so ask the compiler what it thinks it's building
+ output=''
+ try:
+ output=subprocess.check_output([env['CXX'], "--target-help"])
+ except:
+ try:
+ output=subprocess.check_output([env['CXX'], "--version"])
+ except:
+ output=platform.machine()
+ if 'armelf' in output:
+ architectures+=["ARMv7"]
+ architecture="ARMv7"
+ # Choose Intel in preference as otherwise it's probably a cross-compiler
+ if 'x64' in output or 'x86_64' in output:
+ architectures+=["x86", "x64"]
+ architecture="x64"
+ else:
+ for a in ['i386', 'i486', 'i586', 'i686']:
+ if a in output:
+ architectures+=["x86"]
+ architecture="x86"
+ break
+ # If not ARMv7 support, see if there is a cross-compiler
+ if "ARMv7" not in architectures:
+ output=''
+ try:
+ output=subprocess.check_output(['arm-linux-gnueabi-g++', "--target-help"])
+ except:
+ try:
+ output=subprocess.check_output(['arm-linux-gnueabi-g++', "--version"])
+ except:
+ output=platform.machine()
+ if 'armelf' in output:
+ architectures+=["ARMv7"]
+ ARMcrosscompiler=True
+print "*** Architectures detected as being available:", architectures
+print "*** Minimum architecture is:", architecture
+
+if sys.platform=="win32" and 'INCLUDE' not in os.environ:
+ env = Environment(tools=['mingw', 'msvs'])
+#print env['TOOLS']
+AddOption('--postfix', dest='postfix', nargs=1, default='_test', help='appends a string to the DLL name')
+AddOption('--debugbuild', dest='debug', nargs='?', const=True, help='enable debug build')
+AddOption('--static', dest='static', nargs='?', const=True, help='build a static library rather than shared library')
+AddOption('--useclang', dest='useclang', nargs=1, type='str', help='use clang if it is available')
+AddOption('--usegcc', dest='usegcc', nargs=1, type='str', help='use gcc if it is available')
+AddOption('--force32', dest='force32', help='force 32 bit build on 64 bit machine')
+AddOption('--archs', dest='archs', nargs=1, type='str', default='min', help='which architectures to build, comma separated. all means all. Defaults to min.')
+if 'x86' in architectures:
+ AddOption('--sse', dest='sse', nargs=1, type='int', default=2, help='set SSE used (0-4) on 32 bit x86. Defaults to 2 (SSE2).')
+ AddOption('--avx', dest='avx', nargs=1, type='int', default=0, help='set AVX used (0-2) on x86/x64. Defaults to 0 (No AVX).')
+if 'ARMv7' in architectures:
+ AddOption('--fpu', dest='fpu', nargs=1, type='str', default='neon', help='sets FPU used on ARMv7. Defaults to neon.')
+ AddOption('--thumb', dest='thumb', nargs='?', const=True, help='generate ARMv7 Thumb instructions instead of normal.')
+if env.GetOption('archs')!='min' and env.GetOption('archs')!='all':
+ archs=env.GetOption('archs').split(',')
+ for arch in archs:
+ assert arch in architectures
+ architectures=archs
+if architecture=='x64' and env.GetOption('force32'): architecture='x86'
+
+# Force scons to always use absolute paths in everything (helps debuggers to find source files)
+env['CCCOM'] = env['CCCOM'].replace('$CHANGED_SOURCES','$SOURCES.abspath')
+env['SHCCCOM'] = env['SHCCCOM'].replace('$CHANGED_SOURCES','$SOURCES.abspath')
+env['CXXCOM'] = env['CXXCOM'].replace('$CHANGED_SOURCES','$SOURCES.abspath')
+env['SHCXXCOM']= env['SHCXXCOM'].replace('$CHANGED_SOURCES','$SOURCES.abspath')
+env['CPPPATH']=[]
+env['CPPDEFINES']=[]
+env['CCFLAGS']=[]
+env['CXXFLAGS']=[]
+env['LIBS']=[]
+env['LIBPATH']=[]
+env['RPATH']=[]
+env['LINKFLAGS']=[]
+
+# Am I in a 32 or 64 bit environment? Note that not specifying --sse doesn't set any x86 or x64 specific options
+# so it's good to go for ANY platform
+if sys.platform=="win32" and 'INCLUDE' in os.environ:
+ # Even the very latest scons still screws this up :(
+ env['ENV']['INCLUDE']=os.environ['INCLUDE']
+ env['ENV']['LIB']=os.environ['LIB']
+ env['ENV']['PATH']=os.environ['PATH']
+else:
+ if sys.platform=="win32":
+ env['ENV']['PATH']=os.environ['PATH']
+ env['CPPDEFINES']+=["WIN32"]
+ # Test the build environment
+ def CheckHaveClang(cc):
+ cc.Message("Checking if clang is available ...")
+ try:
+ temp=env['CC']
+ except:
+ temp=[]
+ cc.env['CC']="clang"
+ result=cc.TryLink('int main(void) { return 0; }\n', '.c')
+ cc.env['CC']=temp
+ cc.Result(result)
+ return result
+ def CheckHaveGCC(cc):
+ cc.Message("Checking if gcc is available ...")
+ try:
+ temp=env['CC']
+ except:
+ temp=[]
+ cc.env['CC']="gcc"
+ result=cc.TryLink('int main(void) { return 0; }\n', '.c')
+ cc.env['CC']=temp
+ cc.Result(result)
+ return result
+ def CheckHaveVisibility(cc):
+ cc.Message("Checking for symbol visibility support ...")
+ try:
+ temp=cc.env['CPPFLAGS']
+ except:
+ temp=[]
+ cc.env['CPPFLAGS']=temp+["-fvisibility=hidden"]
+ result=cc.TryCompile('struct __attribute__ ((visibility("default"))) Foo { int foo; };\nint main(void) { Foo foo; return 0; }\n', '.cpp')
+ cc.env['CPPFLAGS']=temp
+ cc.Result(result)
+ return result
+ def CheckHaveOpenMP(cc):
+ cc.Message("Checking for OpenMP support ...")
+ try:
+ temp=cc.env['CPPFLAGS']
+ except:
+ temp=[]
+ cc.env['CPPFLAGS']=temp+["-fopenmp"]
+ result=cc.TryCompile('#include <omp.h>\nint main(void) { return 0; }\n', '.cpp')
+ cc.env['CPPFLAGS']=temp
+ cc.Result(result)
+ return result
+ def CheckHaveCPP11Features(cc):
+ cc.Message("Checking if can enable C++11 features ...")
+ try:
+ temp=cc.env['CPPFLAGS']
+ except:
+ temp=[]
+ cc.env['CPPFLAGS']=temp+["-std=c++11"]
+ result=cc.TryCompile('struct Foo { static const int gee=5; Foo(const char *) { } Foo(Foo &&a) { } };\nint main(void) { Foo foo(__func__); static_assert(Foo::gee==5, "Death!"); return 0; }\n', '.cpp')
+ cc.env['CPPFLAGS']=temp
+ cc.Result(result)
+ return result
+ def CheckHaveBoost(cc):
+ cc.Message("Checking for Boost C++ libraries ...")
+ try:
+ temp=cc.env['CPPFLAGS']
+ except:
+ temp=[]
+ result=cc.TryCompile('#include "boost/mpl/vector.hpp"\n', '.cpp')
+ cc.Result(result)
+ return result
+ conf=Configure(env, { "CheckHaveClang" : CheckHaveClang, "CheckHaveGCC" : CheckHaveGCC, "CheckHaveVisibility" : CheckHaveVisibility, "CheckHaveOpenMP" : CheckHaveOpenMP, "CheckHaveCPP11Features" : CheckHaveCPP11Features, "CheckHaveBoost" : CheckHaveBoost } )
+ if env.GetOption('useclang') and conf.CheckHaveClang():
+ env['CC']="clang"
+ env['CXX']=env.GetOption('useclang')
+ if env.GetOption('usegcc') and conf.CheckHaveGCC():
+ env['CC']="gcc"
+ env['CXX']=env.GetOption('usegcc')
+ if not conf.CheckLib("rt", "clock_gettime") and not conf.CheckLib("c", "clock_gettime"):
+ print "WARNING: Can't find clock_gettime() in librt or libc, code may not fully compile if your system headers say that this function is available"
+ if conf.CheckHaveVisibility():
+ env['CPPFLAGS']+=["-fvisibility=hidden"] # All symbols are hidden unless marked otherwise
+ env['CXXFLAGS']+=["-fvisibility-inlines-hidden" # All inlines are always hidden
+ ]
+ else:
+ print "Disabling -fvisibility support"
+ if conf.CheckHaveOpenMP():
+ env['CPPFLAGS']+=["-fopenmp"]
+ env['LINKFLAGS']+=["-fopenmp"]
+ else:
+ print "Disabling OpenMP support"
+
+ #if conf.CheckHaveCPP11Features():
+ # env['CXXFLAGS']+=["-std=c++11"]
+ #else:
+ # print "Disabling C++11 support"
+
+ boostpath=os.path.abspath(os.path.join(os.getcwd(), "boost"))
+ while not os.path.exists(boostpath):
+ #print(boostpath)
+ boostpath=os.path.dirname(os.path.dirname(boostpath))
+ if len(boostpath)<4: break
+ boostpath=os.path.join(boostpath, "boost")
+ if len(boostpath)>4 and os.path.exists(boostpath):
+ env['CPPPATH']+=[boostpath]
+ env['LIBPATH']+=[os.path.join(boostpath, 'stage', 'lib')]
+ env['RPATH']+=[os.path.join(boostpath, 'stage', 'lib')]
+ if not conf.CheckHaveBoost():
+ print("ERROR: I need the Boost libraries, either in the system or in a boost directory just above mine")
+ sys.exit(1)
+
+ env=conf.Finish()
+
+# Build
+mylibrary=None
+buildvariants={}
+for arch in architectures:
+ for buildtype in ["Debug", "Release"]:
+ env['VARIANT']=arch+"/"+buildtype
+ Export(importedenv=env, ARMcrosscompiler=ARMcrosscompiler)
+ mylibraryvariant=env.SConscript("SConscript", variant_dir=env['VARIANT'], duplicate=False)
+ buildvariants[(buildtype, arch)]=mylibraryvariant
+
+if env.GetOption('archs')=='min':
+ print "*** Build variant preferred by environment is", "Debug" if env.GetOption("debug") else "Release", architecture, "using compiler", env['CC']
+ mylibrary=buildvariants[("Debug" if env.GetOption("debug") else "Release", architecture)]
+ #print(mylibrary)
+ Default([x[0] for x in mylibrary.values()])
+else:
+ #print(buildvariants)
+ mylibrary=[x.values()[0][0] for x in buildvariants.values()]
+ #print(mylibrary)
+ Default(mylibrary)
+
+# Set up the MSVC project files
+if 'win32'==sys.platform:
+ includes = [ "include/triplegit.hpp" ]
+ variants = []
+ projs = {}
+ for buildvariant, output in buildvariants.items():
+ variant = buildvariant[0]+'|'+("Win32" if buildvariant[1]=="x86" else buildvariant[1])
+ variants+=[variant]
+ for program, builditems in output.items():
+ if not program in projs: projs[program]={}
+ projs[program][variant]=builditems
+ variants.sort()
+ msvsprojs = []
+ for program, items in projs.items():
+ buildtargets = items.items()
+ buildtargets.sort()
+ #print buildtargets
+ #print [str(x[1][0][0]) for x in buildtargets]
+ msvsprojs+=env.MSVSProject(program+env['MSVSPROJECTSUFFIX'], srcs=items.values()[0][1], incs=includes, misc="Readme.txt", buildtarget=[x[1][0][0] for x in buildtargets], runfile=[str(x[1][0][0]) for x in buildtargets], variant=[x[0] for x in buildtargets], auto_build_solution=0)
+ msvssolution = env.MSVSSolution("triplegit.sln", projects=msvsprojs, variant=variants)
+ Depends(msvssolution, msvsprojs)
+ Alias("msvcproj", msvssolution)
+
+Return("mylibrary")

Added: sandbox/triplegit/trunk/TripleGit.sln
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/TripleGit.sln 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,103 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Express 2012 for Windows Desktop
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TripleGit", "TripleGit\TripleGit.vcxproj", "{D733647B-03E2-449A-9B5C-D33840F1520F}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unittests", "unittests\unittests.vcxproj", "{5D87A57F-B41E-49D3-BEE8-9D35492F62F8}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "NiallsCPP11Utilities", "NiallsCPP11Utilities\NiallsCPP11Utilities.vcxproj", "{CF7497EF-702B-4237-BB7C-AD72C297B88E}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "NiallsCPP11UtilitiesTests", "NiallsCPP11Utilities\NiallsCPP11UtilitiesTests.vcxproj", "{ADFA2590-0D0C-47AA-AD88-0441D46328C7}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "NiallsCPP11UtilitiesSIMDTests", "NiallsCPP11Utilities\NiallsCPP11UtilitiesSIMDTests.vcxproj", "{87B7C149-73E3-49C3-8D78-E120367AE900}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|ARM = Debug|ARM
+ Debug|Mixed Platforms = Debug|Mixed Platforms
+ Debug|Win32 = Debug|Win32
+ Debug|x64 = Debug|x64
+ Release|ARM = Release|ARM
+ Release|Mixed Platforms = Release|Mixed Platforms
+ Release|Win32 = Release|Win32
+ Release|x64 = Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {D733647B-03E2-449A-9B5C-D33840F1520F}.Debug|ARM.ActiveCfg = Debug|ARM
+ {D733647B-03E2-449A-9B5C-D33840F1520F}.Debug|ARM.Build.0 = Debug|ARM
+ {D733647B-03E2-449A-9B5C-D33840F1520F}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
+ {D733647B-03E2-449A-9B5C-D33840F1520F}.Debug|Mixed Platforms.Build.0 = Debug|Win32
+ {D733647B-03E2-449A-9B5C-D33840F1520F}.Debug|Win32.ActiveCfg = Debug|Win32
+ {D733647B-03E2-449A-9B5C-D33840F1520F}.Debug|Win32.Build.0 = Debug|Win32
+ {D733647B-03E2-449A-9B5C-D33840F1520F}.Debug|x64.ActiveCfg = Debug|x64
+ {D733647B-03E2-449A-9B5C-D33840F1520F}.Debug|x64.Build.0 = Debug|x64
+ {D733647B-03E2-449A-9B5C-D33840F1520F}.Release|ARM.ActiveCfg = Release|ARM
+ {D733647B-03E2-449A-9B5C-D33840F1520F}.Release|ARM.Build.0 = Release|ARM
+ {D733647B-03E2-449A-9B5C-D33840F1520F}.Release|Mixed Platforms.ActiveCfg = Release|Win32
+ {D733647B-03E2-449A-9B5C-D33840F1520F}.Release|Mixed Platforms.Build.0 = Release|Win32
+ {D733647B-03E2-449A-9B5C-D33840F1520F}.Release|Win32.ActiveCfg = Release|Win32
+ {D733647B-03E2-449A-9B5C-D33840F1520F}.Release|Win32.Build.0 = Release|Win32
+ {D733647B-03E2-449A-9B5C-D33840F1520F}.Release|x64.ActiveCfg = Release|x64
+ {D733647B-03E2-449A-9B5C-D33840F1520F}.Release|x64.Build.0 = Release|x64
+ {5D87A57F-B41E-49D3-BEE8-9D35492F62F8}.Debug|ARM.ActiveCfg = Debug|ARM
+ {5D87A57F-B41E-49D3-BEE8-9D35492F62F8}.Debug|ARM.Build.0 = Debug|ARM
+ {5D87A57F-B41E-49D3-BEE8-9D35492F62F8}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
+ {5D87A57F-B41E-49D3-BEE8-9D35492F62F8}.Debug|Mixed Platforms.Build.0 = Debug|Win32
+ {5D87A57F-B41E-49D3-BEE8-9D35492F62F8}.Debug|Win32.ActiveCfg = Debug|Win32
+ {5D87A57F-B41E-49D3-BEE8-9D35492F62F8}.Debug|Win32.Build.0 = Debug|Win32
+ {5D87A57F-B41E-49D3-BEE8-9D35492F62F8}.Debug|x64.ActiveCfg = Debug|x64
+ {5D87A57F-B41E-49D3-BEE8-9D35492F62F8}.Debug|x64.Build.0 = Debug|x64
+ {5D87A57F-B41E-49D3-BEE8-9D35492F62F8}.Release|ARM.ActiveCfg = Release|ARM
+ {5D87A57F-B41E-49D3-BEE8-9D35492F62F8}.Release|ARM.Build.0 = Release|ARM
+ {5D87A57F-B41E-49D3-BEE8-9D35492F62F8}.Release|Mixed Platforms.ActiveCfg = Release|Win32
+ {5D87A57F-B41E-49D3-BEE8-9D35492F62F8}.Release|Mixed Platforms.Build.0 = Release|Win32
+ {5D87A57F-B41E-49D3-BEE8-9D35492F62F8}.Release|Win32.ActiveCfg = Release|Win32
+ {5D87A57F-B41E-49D3-BEE8-9D35492F62F8}.Release|Win32.Build.0 = Release|Win32
+ {5D87A57F-B41E-49D3-BEE8-9D35492F62F8}.Release|x64.ActiveCfg = Release|x64
+ {5D87A57F-B41E-49D3-BEE8-9D35492F62F8}.Release|x64.Build.0 = Release|x64
+ {CF7497EF-702B-4237-BB7C-AD72C297B88E}.Debug|ARM.ActiveCfg = Debug|Win32
+ {CF7497EF-702B-4237-BB7C-AD72C297B88E}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
+ {CF7497EF-702B-4237-BB7C-AD72C297B88E}.Debug|Mixed Platforms.Build.0 = Debug|Win32
+ {CF7497EF-702B-4237-BB7C-AD72C297B88E}.Debug|Win32.ActiveCfg = Debug|Win32
+ {CF7497EF-702B-4237-BB7C-AD72C297B88E}.Debug|Win32.Build.0 = Debug|Win32
+ {CF7497EF-702B-4237-BB7C-AD72C297B88E}.Debug|x64.ActiveCfg = Debug|x64
+ {CF7497EF-702B-4237-BB7C-AD72C297B88E}.Debug|x64.Build.0 = Debug|x64
+ {CF7497EF-702B-4237-BB7C-AD72C297B88E}.Release|ARM.ActiveCfg = Release|Win32
+ {CF7497EF-702B-4237-BB7C-AD72C297B88E}.Release|Mixed Platforms.ActiveCfg = Release|Win32
+ {CF7497EF-702B-4237-BB7C-AD72C297B88E}.Release|Mixed Platforms.Build.0 = Release|Win32
+ {CF7497EF-702B-4237-BB7C-AD72C297B88E}.Release|Win32.ActiveCfg = Release|Win32
+ {CF7497EF-702B-4237-BB7C-AD72C297B88E}.Release|Win32.Build.0 = Release|Win32
+ {CF7497EF-702B-4237-BB7C-AD72C297B88E}.Release|x64.ActiveCfg = Release|x64
+ {CF7497EF-702B-4237-BB7C-AD72C297B88E}.Release|x64.Build.0 = Release|x64
+ {ADFA2590-0D0C-47AA-AD88-0441D46328C7}.Debug|ARM.ActiveCfg = Debug|Win32
+ {ADFA2590-0D0C-47AA-AD88-0441D46328C7}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
+ {ADFA2590-0D0C-47AA-AD88-0441D46328C7}.Debug|Mixed Platforms.Build.0 = Debug|Win32
+ {ADFA2590-0D0C-47AA-AD88-0441D46328C7}.Debug|Win32.ActiveCfg = Debug|Win32
+ {ADFA2590-0D0C-47AA-AD88-0441D46328C7}.Debug|Win32.Build.0 = Debug|Win32
+ {ADFA2590-0D0C-47AA-AD88-0441D46328C7}.Debug|x64.ActiveCfg = Debug|x64
+ {ADFA2590-0D0C-47AA-AD88-0441D46328C7}.Debug|x64.Build.0 = Debug|x64
+ {ADFA2590-0D0C-47AA-AD88-0441D46328C7}.Release|ARM.ActiveCfg = Release|Win32
+ {ADFA2590-0D0C-47AA-AD88-0441D46328C7}.Release|Mixed Platforms.ActiveCfg = Release|Win32
+ {ADFA2590-0D0C-47AA-AD88-0441D46328C7}.Release|Mixed Platforms.Build.0 = Release|Win32
+ {ADFA2590-0D0C-47AA-AD88-0441D46328C7}.Release|Win32.ActiveCfg = Release|Win32
+ {ADFA2590-0D0C-47AA-AD88-0441D46328C7}.Release|Win32.Build.0 = Release|Win32
+ {ADFA2590-0D0C-47AA-AD88-0441D46328C7}.Release|x64.ActiveCfg = Release|x64
+ {ADFA2590-0D0C-47AA-AD88-0441D46328C7}.Release|x64.Build.0 = Release|x64
+ {87B7C149-73E3-49C3-8D78-E120367AE900}.Debug|ARM.ActiveCfg = Debug|Win32
+ {87B7C149-73E3-49C3-8D78-E120367AE900}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
+ {87B7C149-73E3-49C3-8D78-E120367AE900}.Debug|Mixed Platforms.Build.0 = Debug|Win32
+ {87B7C149-73E3-49C3-8D78-E120367AE900}.Debug|Win32.ActiveCfg = Debug|Win32
+ {87B7C149-73E3-49C3-8D78-E120367AE900}.Debug|Win32.Build.0 = Debug|Win32
+ {87B7C149-73E3-49C3-8D78-E120367AE900}.Debug|x64.ActiveCfg = Debug|x64
+ {87B7C149-73E3-49C3-8D78-E120367AE900}.Debug|x64.Build.0 = Debug|x64
+ {87B7C149-73E3-49C3-8D78-E120367AE900}.Release|ARM.ActiveCfg = Release|Win32
+ {87B7C149-73E3-49C3-8D78-E120367AE900}.Release|Mixed Platforms.ActiveCfg = Release|Win32
+ {87B7C149-73E3-49C3-8D78-E120367AE900}.Release|Mixed Platforms.Build.0 = Release|Win32
+ {87B7C149-73E3-49C3-8D78-E120367AE900}.Release|Win32.ActiveCfg = Release|Win32
+ {87B7C149-73E3-49C3-8D78-E120367AE900}.Release|Win32.Build.0 = Release|Win32
+ {87B7C149-73E3-49C3-8D78-E120367AE900}.Release|x64.ActiveCfg = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal

Added: sandbox/triplegit/trunk/footer.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/footer.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,3 @@
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/annotated.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/annotated.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,119 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: Class List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li class="current">Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li class="current">Class List</li>
+ <li>Class Index</li>
+ <li>Class Hierarchy</li>
+ <li>Class Members</li>
+ </ul>
+ </div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">Class List</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock">Here are the classes, structs, unions and interfaces with brief descriptions:</div><div class="directory">
+<div class="levels">[detail level <span onclick="javascript:toggleLevel(1);">1</span><span onclick="javascript:toggleLevel(2);">2</span><span onclick="javascript:toggleLevel(3);">3</span><span onclick="javascript:toggleLevel(4);">4</span>]</div><table class="directory">
+<tr id="row_0_" class="even"><td class="entry"><img id="arr_0_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('0_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>triplegit</b></td><td class="desc"></td></tr>
+<tr id="row_0_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_0_0_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('0_0_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><a class="el" href="namespacetriplegit_1_1async__io.html" target="_self">async_io</a></td><td class="desc">The namespace containing the Boost.ASIO asynchronous file i/o implementation</td></tr>
+<tr id="row_0_0_0_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_0_0_0_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('0_0_0_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>detail</b></td><td class="desc"></td></tr>
+<tr id="row_0_0_0_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html" target="_self">async_io_handle</a></td><td class="desc">May occasionally be useful to access to discover information about an open handle</td></tr>
+<tr id="row_0_0_1_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classtriplegit_1_1async__io_1_1future.html" target="_self">future</a></td><td class="desc">For now, this is boost's future. Will be replaced when C++'s future catches up with boost's</td></tr>
+<tr id="row_0_0_2_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classtriplegit_1_1async__io_1_1shared__future.html" target="_self">shared_future</a></td><td class="desc">For now, this is boost's <a class="el" href="classtriplegit_1_1async__io_1_1shared__future.html" title="For now, this is boost&#39;s shared_future. Will be replaced when C++&#39;s shared_future catches up with boo...">shared_future</a>. Will be replaced when C++'s <a class="el" href="classtriplegit_1_1async__io_1_1shared__future.html" title="For now, this is boost&#39;s shared_future. Will be replaced when C++&#39;s shared_future catches up with boo...">shared_future</a> catches up with boost's</td></tr>
+<tr id="row_0_0_3_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classtriplegit_1_1async__io_1_1promise.html" target="_self">promise</a></td><td class="desc">For now, this is boost's promise. Will be replaced when C++'s promise catches up with boost's</td></tr>
+<tr id="row_0_0_4_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classtriplegit_1_1async__io_1_1thread__pool.html" target="_self">thread_pool</a></td><td class="desc">A very simple thread pool based on Boost.ASIO and std::thread</td></tr>
+<tr id="row_0_0_5_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html" target="_self">async_file_io_dispatcher_base</a></td><td class="desc">Abstract base class for dispatching file i/o asynchronously</td></tr>
+<tr id="row_0_0_6_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html" target="_self">async_io_op</a></td><td class="desc">A reference to an async operation</td></tr>
+<tr id="row_0_0_7_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structtriplegit_1_1async__io_1_1async__path__op__req.html" target="_self">async_path_op_req</a></td><td class="desc">A convenience bundle of path and flags, with optional precondition</td></tr>
+<tr id="row_0_0_8_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" target="_self">async_data_op_req</a></td><td class="desc">A specialisation for any pointer to type T</td></tr>
+<tr id="row_0_0_9_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1vector_3_01_t_00_01_a_01_4_01_4.html" target="_self">async_data_op_req&lt; std::vector&lt; T, A &gt; &gt;</a></td><td class="desc">A specialisation for any std::vector&lt;T, A&gt;</td></tr>
+<tr id="row_0_0_10_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1array_3_01_t_00_01_n_01_4_01_4.html" target="_self">async_data_op_req&lt; std::array&lt; T, N &gt; &gt;</a></td><td class="desc">A specialisation for any std::array&lt;T, N&gt;</td></tr>
+<tr id="row_0_0_11_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1basic__string_3_01_c_00_01_t_00_01_a_01_4_01_4.html" target="_self">async_data_op_req&lt; std::basic_string&lt; C, T, A &gt; &gt;</a></td><td class="desc">A specialisation for any std::basic_string&lt;C, T, A&gt;</td></tr>
+<tr id="row_0_1_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_0_1_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('0_1_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>boost</b></td><td class="desc"></td></tr>
+<tr id="row_0_1_0_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classtriplegit_1_1boost_1_1adjacency__list.html" target="_self">adjacency_list</a></td><td class="desc">A stored Boost.Graph <a class="el" href="classtriplegit_1_1boost_1_1adjacency__list.html" title="A stored Boost.Graph adjacency_list.">adjacency_list</a></td></tr>
+<tr id="row_0_2_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classtriplegit_1_1unique__id.html" target="_self">unique_id</a></td><td class="desc">A unique id</td></tr>
+<tr id="row_0_3_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classtriplegit_1_1collection__id.html" target="_self">collection_id</a></td><td class="desc">A collection in a <a class="el" href="classtriplegit_1_1fs__store.html" title="A graph stored in the filing system.">fs_store</a></td></tr>
+<tr id="row_0_4_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classtriplegit_1_1base__store.html" target="_self">base_store</a></td><td class="desc">Base class for a stored graph</td></tr>
+<tr id="row_0_5_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classtriplegit_1_1fs__store.html" target="_self">fs_store</a></td><td class="desc">A graph stored in the filing system</td></tr>
+<tr id="row_0_6_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classtriplegit_1_1storable__vertices.html" target="_self">storable_vertices</a></td><td class="desc">The base class for a storable collection of vertices</td></tr>
+<tr id="row_1_" class="even"><td class="entry"><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classpackaged__task.html" target="_self">packaged_task</a></td><td class="desc">For now, this is an emulation of std::packaged_task based on boost's <a class="el" href="classpackaged__task.html" title="For now, this is an emulation of std::packaged_task based on boost&#39;s packaged_task. We have to drop the Args... support because it segfaults MSVC Nov 2012 CTP.">packaged_task</a>. We have to drop the Args... support because it segfaults MSVC Nov 2012 CTP</td></tr>
+</table>
+</div><!-- directory -->
+</div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/async__file__io_8hpp.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/async__file__io_8hpp.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,337 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: triplegit/include/async_file_io.hpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li>Classes</li>
+ <li class="current">Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>File List</li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_5702f8a2329a6e3cef9103a99d8690ff.html">triplegit</a></li><li class="navelem"><a class="el" href="dir_603090840fc3140f581dcce46ee211a4.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+Classes &#124;
+Namespaces &#124;
+Typedefs &#124;
+Functions </div>
+ <div class="headertitle">
+<div class="title">async_file_io.hpp File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Provides a batch asynchronous file i/o implementation based on Boost.ASIO.
+More...</p>
+<div class="textblock"><code>#include &quot;../../NiallsCPP11Utilities/NiallsCPP11Utilities.hpp&quot;</code><br/>
+<code>#include &quot;../../NiallsCPP11Utilities/std_filesystem.hpp&quot;</code><br/>
+<code>#include &lt;initializer_list&gt;</code><br/>
+<code>#include &lt;thread&gt;</code><br/>
+<code>#include &lt;atomic&gt;</code><br/>
+<code>#include &quot;boost/asio.hpp&quot;</code><br/>
+<code>#include &quot;boost/thread/thread.hpp&quot;</code><br/>
+<code>#include &quot;boost/thread/future.hpp&quot;</code><br/>
+</div>
+<p>Go to the source code of this file.</p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1future.html">triplegit::async_io::future&lt; T &gt;</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">For now, this is boost's future. Will be replaced when C++'s future catches up with boost's. More...<br/></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1shared__future.html">triplegit::async_io::shared_future&lt; T &gt;</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">For now, this is boost's <a class="el" href="classtriplegit_1_1async__io_1_1shared__future.html" title="For now, this is boost&#39;s shared_future. Will be replaced when C++&#39;s shared_future catches up with boo...">shared_future</a>. Will be replaced when C++'s <a class="el" href="classtriplegit_1_1async__io_1_1shared__future.html" title="For now, this is boost&#39;s shared_future. Will be replaced when C++&#39;s shared_future catches up with boo...">shared_future</a> catches up with boost's. More...<br/></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1promise.html">triplegit::async_io::promise&lt; T &gt;</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">For now, this is boost's promise. Will be replaced when C++'s promise catches up with boost's. More...<br/></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpackaged__task.html">packaged_task&lt; class &gt;</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">For now, this is an emulation of std::packaged_task based on boost's <a class="el" href="classpackaged__task.html" title="For now, this is an emulation of std::packaged_task based on boost&#39;s packaged_task. We have to drop the Args... support because it segfaults MSVC Nov 2012 CTP.">packaged_task</a>. We have to drop the Args... support because it segfaults MSVC Nov 2012 CTP. More...<br/></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1thread__pool.html">triplegit::async_io::thread_pool</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">A very simple thread pool based on Boost.ASIO and std::thread. More...<br/></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html">triplegit::async_io::detail::async_io_handle</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">May occasionally be useful to access to discover information about an open handle. More...<br/></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html">triplegit::async_io::async_file_io_dispatcher_base</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Abstract base class for dispatching file i/o asynchronously. More...<br/></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">triplegit::async_io::async_io_op</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">A reference to an async operation. More...<br/></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structtriplegit_1_1async__io_1_1async__path__op__req.html">triplegit::async_io::async_path_op_req</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">A convenience bundle of path and flags, with optional precondition. More...<br/></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req.html">triplegit::async_io::async_data_op_req&lt; T &gt;</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">A specialisation for any pointer to type T. More...<br/></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1vector_3_01_t_00_01_a_01_4_01_4.html">triplegit::async_io::async_data_op_req&lt; std::vector&lt; T, A &gt; &gt;</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">A specialisation for any std::vector&lt;T, A&gt; More...<br/></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1array_3_01_t_00_01_n_01_4_01_4.html">triplegit::async_io::async_data_op_req&lt; std::array&lt; T, N &gt; &gt;</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">A specialisation for any std::array&lt;T, N&gt; More...<br/></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1basic__string_3_01_c_00_01_t_00_01_a_01_4_01_4.html">triplegit::async_io::async_data_op_req&lt; std::basic_string&lt; C, T, A &gt; &gt;</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">A specialisation for any std::basic_string&lt;C, T, A&gt; More...<br/></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespacetriplegit_1_1async__io"><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacetriplegit_1_1async__io.html">triplegit::async_io</a></td></tr>
+<tr class="memdesc:namespacetriplegit_1_1async__io"><td class="mdescLeft">&#160;</td><td class="mdescRight">The namespace containing the Boost.ASIO asynchronous file i/o implementation. <br/></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:af28c26398a12ba760165fc40f2a74ca3"><td class="memItemLeft" align="right" valign="top">typedef boost::exception_ptr&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacetriplegit_1_1async__io.html#af28c26398a12ba760165fc40f2a74ca3">triplegit::async_io::exception_ptr</a></td></tr>
+<tr class="memdesc:af28c26398a12ba760165fc40f2a74ca3"><td class="mdescLeft">&#160;</td><td class="mdescRight">For now, this is boost's exception_ptr. Will be replaced when C++'s exception_ptr catches up with boost's. <br/></td></tr>
+<tr class="separator:af28c26398a12ba760165fc40f2a74ca3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a6743cd614fc8161dfce94144c36cfb85"><td class="memItemLeft" align="right" valign="top">thread_pool &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacetriplegit_1_1async__io.html#a6743cd614fc8161dfce94144c36cfb85">triplegit::async_io::process_threadpool</a> ()</td></tr>
+<tr class="memdesc:a6743cd614fc8161dfce94144c36cfb85"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the process threadpool. <br/></td></tr>
+<tr class="separator:a6743cd614fc8161dfce94144c36cfb85"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afc5e0576470c19d979b3b853305fc7d6"><td class="memTemplParams" colspan="2">template&lt;class InputIterator &gt; </td></tr>
+<tr class="memitem:afc5e0576470c19d979b3b853305fc7d6"><td class="memTemplItemLeft" align="right" valign="top">future&lt; std::vector&lt; typename <br class="typebreak"/>
+std::decay&lt; decltype(((typename <br class="typebreak"/>
+InputIterator::value_type *) 0) -&gt;<br class="typebreak"/>
+get())&gt;::type &gt;&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="namespacetriplegit_1_1async__io.html#afc5e0576470c19d979b3b853305fc7d6">triplegit::async_io::when_all</a> (InputIterator first, InputIterator last)</td></tr>
+<tr class="memdesc:afc5e0576470c19d979b3b853305fc7d6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a future vector of results from all the supplied futures. <br/></td></tr>
+<tr class="separator:afc5e0576470c19d979b3b853305fc7d6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac024775f7df8eb059d2aeee8de8f5ff9"><td class="memTemplParams" colspan="2">template&lt;class InputIterator &gt; </td></tr>
+<tr class="memitem:ac024775f7df8eb059d2aeee8de8f5ff9"><td class="memTemplItemLeft" align="right" valign="top">future&lt; std::pair&lt; size_t, <br class="typebreak"/>
+typename std::decay&lt; decltype(((typename <br class="typebreak"/>
+InputIterator::value_type *) 0) -&gt;<br class="typebreak"/>
+get())&gt;::type &gt;&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="namespacetriplegit_1_1async__io.html#ac024775f7df8eb059d2aeee8de8f5ff9">triplegit::async_io::when_any</a> (InputIterator first, InputIterator last)</td></tr>
+<tr class="memdesc:ac024775f7df8eb059d2aeee8de8f5ff9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a future tuple of results from all the supplied futures. <br/></td></tr>
+<tr class="separator:ac024775f7df8eb059d2aeee8de8f5ff9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afa6da488279e514281ae9d5904d8d426"><td class="memItemLeft" align="right" valign="top">std::shared_ptr<br class="typebreak"/>
+&lt; async_file_io_dispatcher_base &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacetriplegit_1_1async__io.html#afa6da488279e514281ae9d5904d8d426">triplegit::async_io::async_file_io_dispatcher</a> (thread_pool &amp;threadpool=process_threadpool(), file_flags flagsforce=file_flags::None, file_flags flagsmask=file_flags::None)</td></tr>
+<tr class="memdesc:afa6da488279e514281ae9d5904d8d426"><td class="mdescLeft">&#160;</td><td class="mdescRight">Instatiates the best available async_file_io_dispatcher implementation for this system. <br/></td></tr>
+<tr class="separator:afa6da488279e514281ae9d5904d8d426"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae692c0402d30c1350b8475c8d9c42c69"><td class="memItemLeft" align="right" valign="top">future&lt; std::vector<br class="typebreak"/>
+&lt; std::shared_ptr<br class="typebreak"/>
+&lt; detail::async_io_handle &gt; &gt; &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacetriplegit_1_1async__io.html#ae692c0402d30c1350b8475c8d9c42c69">triplegit::async_io::when_all</a> (std::nothrow_t, std::vector&lt; async_io_op &gt;::iterator first, std::vector&lt; async_io_op &gt;::iterator last)</td></tr>
+<tr class="memdesc:ae692c0402d30c1350b8475c8d9c42c69"><td class="mdescLeft">&#160;</td><td class="mdescRight">Convenience overload for a vector of <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a>. Does not retrieve exceptions. <br/></td></tr>
+<tr class="separator:ae692c0402d30c1350b8475c8d9c42c69"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab4c882426142e8f23d1e37d2835035fa"><td class="memItemLeft" align="right" valign="top">future&lt; std::vector<br class="typebreak"/>
+&lt; std::shared_ptr<br class="typebreak"/>
+&lt; detail::async_io_handle &gt; &gt; &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacetriplegit_1_1async__io.html#ab4c882426142e8f23d1e37d2835035fa">triplegit::async_io::when_all</a> (std::vector&lt; async_io_op &gt;::iterator first, std::vector&lt; async_io_op &gt;::iterator last)</td></tr>
+<tr class="memdesc:ab4c882426142e8f23d1e37d2835035fa"><td class="mdescLeft">&#160;</td><td class="mdescRight">Convenience overload for a vector of <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a>. Retrieves exceptions. <br/></td></tr>
+<tr class="separator:ab4c882426142e8f23d1e37d2835035fa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abb978d2fbe374855ddd0e539f38e5316"><td class="memItemLeft" align="right" valign="top">future&lt; std::vector<br class="typebreak"/>
+&lt; std::shared_ptr<br class="typebreak"/>
+&lt; detail::async_io_handle &gt; &gt; &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacetriplegit_1_1async__io.html#abb978d2fbe374855ddd0e539f38e5316">triplegit::async_io::when_all</a> (std::nothrow_t _, std::initializer_list&lt; async_io_op &gt; _ops)</td></tr>
+<tr class="memdesc:abb978d2fbe374855ddd0e539f38e5316"><td class="mdescLeft">&#160;</td><td class="mdescRight">Convenience overload for a list of <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a>. Does not retrieve exceptions. <br/></td></tr>
+<tr class="separator:abb978d2fbe374855ddd0e539f38e5316"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0503557b870c07ccf9e43f4e3096c446"><td class="memItemLeft" align="right" valign="top">future&lt; std::vector<br class="typebreak"/>
+&lt; std::shared_ptr<br class="typebreak"/>
+&lt; detail::async_io_handle &gt; &gt; &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacetriplegit_1_1async__io.html#a0503557b870c07ccf9e43f4e3096c446">triplegit::async_io::when_all</a> (std::initializer_list&lt; async_io_op &gt; _ops)</td></tr>
+<tr class="memdesc:a0503557b870c07ccf9e43f4e3096c446"><td class="mdescLeft">&#160;</td><td class="mdescRight">Convenience overload for a list of <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a>. Retrieves exceptions. <br/></td></tr>
+<tr class="separator:a0503557b870c07ccf9e43f4e3096c446"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Provides a batch asynchronous file i/o implementation based on Boost.ASIO. </p>
+<p>My Seagate 7200rpm drive: <hr/>
+ CrystalDiskMark 3.0.2 x64 (C) 2007-2013 hiyohiyo </p>
+<h2>Crystal Dew World : http://crystalmark.info/</h2>
+<p>MB/s = 1,000,000 byte/s [SATA/300 = 300,000,000 byte/s] </p>
+<pre class="fragment"> Sequential Read : 46.012 MB/s
+ Sequential Write : 44.849 MB/s
+ Random Read 512KB : 26.367 MB/s
+ Random Write 512KB : 23.521 MB/s
+</pre><p> Random Read 4KB (QD=1) : 0.487 MB/s [ 118.8 IOPS] Random Write 4KB (QD=1) : 0.771 MB/s [ 188.3 IOPS] Random Read 4KB (QD=32) : 0.819 MB/s [ 199.8 IOPS] Random Write 4KB (QD=32) : 0.789 MB/s [ 192.6 IOPS]</p>
+<p>Test : 1000 MB [G: 99.0% (178.2/180.1 GB)] (x5) Date : 2013/04/13 23:02:23 OS : Windows 8 [6.2 Build 9200] (x64)</p>
+<p>Windows IOCP backend, 3.5Ghz Ivy Bridge Windows 8 x64 on my Seagate 7200rpm drive:</p>
+<p>1000 file opens, writes 1 byte, closes, and deletes: It took 0.26311 secs to do all operations It took 0.0079942 secs to dispatch all operations It took 0.255116 secs to finish all operations</p>
+<p>It took 0.0899875 secs to do 11112.7 file opens per sec It took 0.0100023 secs to do 99977 file writes per sec It took 0.0210025 secs to do 47613.4 file closes per sec It took 0.142118 secs to do 7036.43 file deletions per sec</p>
+<p>1000 file opens, writes 64Kb, closes, and deletes: It took 1.01195 secs to do all operations It took 0.0079939 secs to dispatch all operations It took 1.00396 secs to finish all operations</p>
+<p>It took 0.10599 secs to do 9434.83 file opens per sec It took 0.0410053 secs to do 24387.1 file writes per sec It took 0.769099 secs to do 1300.22 file closes per sec It took 0.0958558 secs to do 10432.3 file deletions per sec</p>
+<p>1000 file opens, writes 1 byte, closes, and deletes with synchronous i/o: It took 9.28653 secs to do all operations It took 0.142254 secs to dispatch all operations It took 9.14427 secs to finish all operations</p>
+<p>It took 8.92534 secs to do 112.041 file opens per sec It took 0.112127 secs to do 8918.5 file writes per sec It took 0.177022 secs to do 5649.03 file closes per sec It took 0.0720397 secs to do 13881.2 file deletions per sec</p>
+<p>1000 file opens, writes 64Kb, closes, and deletes with synchronous i/o: It took 3.03522 secs to do all operations It took 0.0212259 secs to dispatch all operations It took 3.01399 secs to finish all operations</p>
+<p>It took 1.92052 secs to do 520.694 file opens per sec It took 0.0720104 secs to do 13886.9 file writes per sec It took 0.806102 secs to do 1240.54 file closes per sec It took 0.236588 secs to do 4226.75 file deletions per sec</p>
+<p>1000 file opens, writes 1 byte, closes, and deletes with autoflush i/o: It took 11.9628 secs to do all operations It took 0.0080006 secs to dispatch all operations It took 11.9548 secs to finish all operations</p>
+<p>It took 0.0940122 secs to do 10636.9 file opens per sec It took 0.46754 secs to do 2138.85 file writes per sec It took 11.2472 secs to do 88.9107 file closes per sec It took 0.154042 secs to do 6491.76 file deletions per sec</p>
+<p>1000 file opens, writes 64Kb, closes, and deletes with autoflush i/o: It took 14.5824 secs to do all operations It took 0.0080019 secs to dispatch all operations It took 14.5744 secs to finish all operations</p>
+<p>It took 0.0980132 secs to do 10202.7 file opens per sec It took 0.465669 secs to do 2147.45 file writes per sec It took 13.8906 secs to do 71.9913 file closes per sec It took 0.128166 secs to do 7802.36 file deletions per sec</p>
+<p>POSIX compat backend, 3.5Ghz Ivy Bridge Linux 3.2 x64 on my Seagate 7200rpm drive:</p>
+<p>1000 file opens, writes 1 byte, closes, and deletes: It took 0.03907 secs to do all operations It took 0.00425 secs to dispatch all operations It took 0.03482 secs to finish all operations</p>
+<p>It took 0.015097 secs to do 66238.3 file opens per sec It took 0.009744 secs to do 102627 file writes per sec It took 0.008307 secs to do 120380 file closes per sec It took 0.005922 secs to do 168862 file deletions per sec</p>
+<p>1000 file opens, writes 64Kb, closes, and deletes: It took 0.039257 secs to do all operations It took 0.004198 secs to dispatch all operations It took 0.035059 secs to finish all operations</p>
+<p>It took 0.017462 secs to do 57267.2 file opens per sec It took 0.010241 secs to do 97646.7 file writes per sec It took 0.007234 secs to do 138236 file closes per sec It took 0.00432 secs to do 231481 file deletions per sec</p>
+<p>1000 file opens, writes 1 byte, closes, and deletes with synchronous i/o: It took 7.53982 secs to do all operations It took 0.003997 secs to dispatch all operations It took 7.53582 secs to finish all operations</p>
+<p>It took 6.35027 secs to do 157.473 file opens per sec It took 1.18224 secs to do 845.848 file writes per sec It took 0.005773 secs to do 173220 file closes per sec It took 0.001528 secs to do 654450 file deletions per sec</p>
+<p>1000 file opens, writes 64Kb, closes, and deletes with synchronous i/o: It took 7.97113 secs to do all operations It took 0.004116 secs to dispatch all operations It took 7.96701 secs to finish all operations</p>
+<p>It took 6.32829 secs to do 158.021 file opens per sec It took 1.63634 secs to do 611.12 file writes per sec It took 0.004897 secs to do 204207 file closes per sec It took 0.001605 secs to do 623053 file deletions per sec</p>
+<p>1000 file opens, writes 1 byte, closes, and deletes with autoflush i/o: It took 7.46535 secs to do all operations It took 0.00405 secs to dispatch all operations It took 7.4613 secs to finish all operations</p>
+<p>It took 6.30895 secs to do 158.505 file opens per sec It took 1.12623 secs to do 887.922 file writes per sec It took 0.02834 secs to do 35285.8 file closes per sec It took 0.001838 secs to do 544070 file deletions per sec</p>
+<p>1000 file opens, writes 64Kb, closes, and deletes with autoflush i/o: It took 8.0235 secs to do all operations It took 0.00419 secs to dispatch all operations It took 8.01931 secs to finish all operations</p>
+<p>It took 6.29931 secs to do 158.748 file opens per sec It took 1.68728 secs to do 592.67 file writes per sec It took 0.035096 secs to do 28493.3 file closes per sec It took 0.001815 secs to do 550964 file deletions per sec</p>
+<h2>My Samsung 256Gb 830 SSD:</h2>
+<p>CrystalDiskMark 3.0.2 x64 (C) 2007-2013 hiyohiyo </p>
+<h2>Crystal Dew World : http://crystalmark.info/</h2>
+<p>MB/s = 1,000,000 byte/s [SATA/300 = 300,000,000 byte/s] </p>
+<pre class="fragment"> Sequential Read : 478.802 MB/s
+ Sequential Write : 406.425 MB/s
+ Random Read 512KB : 337.185 MB/s
+ Random Write 512KB : 390.353 MB/s
+</pre><p> Random Read 4KB (QD=1) : 21.235 MB/s [ 5184.4 IOPS] Random Write 4KB (QD=1) : 58.373 MB/s [ 14251.1 IOPS] Random Read 4KB (QD=32) : 301.170 MB/s [ 73527.7 IOPS] Random Write 4KB (QD=32) : 148.339 MB/s [ 36215.5 IOPS]</p>
+<p>Test : 1000 MB [C: 72.2% (57.3/79.4 GB)] (x5) Date : 2013/04/13 23:10:09 OS : Windows 8 [6.2 Build 9200] (x64)</p>
+<p>Windows IOCP backend, 3.5Ghz Ivy Bridge Windows 8 x64 on my Samsung 256Gb 830 SSD drive:</p>
+<p>1000 file opens, writes 1 byte, closes, and deletes: It took 0.187081 secs to do all operations It took 0.0079831 secs to dispatch all operations It took 0.179098 secs to finish all operations</p>
+<p>It took 0.0789921 secs to do 12659.5 file opens per sec It took 0.0110014 secs to do 90897.5 file writes per sec It took 0.0250035 secs to do 39994.4 file closes per sec It took 0.0720843 secs to do 13872.6 file deletions per sec</p>
+<p>1000 file opens, writes 64Kb, closes, and deletes: It took 0.924099 secs to do all operations It took 0.007996 secs to dispatch all operations It took 0.916103 secs to finish all operations</p>
+<p>It took 0.0859878 secs to do 11629.6 file opens per sec It took 0.0230033 secs to do 43472 file writes per sec It took 0.7571 secs to do 1320.83 file closes per sec It took 0.0580077 secs to do 17239.1 file deletions per sec</p>
+<p>1000 file opens, writes 1 byte, closes, and deletes with synchronous i/o: It took 2.98316 secs to do all operations It took 0.0446 secs to dispatch all operations It took 2.93856 secs to finish all operations</p>
+<p>It took 2.71914 secs to do 367.763 file opens per sec It took 0.0359893 secs to do 27786 file writes per sec It took 0.151021 secs to do 6621.6 file closes per sec It took 0.0770071 secs to do 12985.8 file deletions per sec</p>
+<p>1000 file opens, writes 64Kb, closes, and deletes with synchronous i/o: It took 1.65352 secs to do all operations It took 0.0149789 secs to dispatch all operations It took 1.63854 secs to finish all operations</p>
+<p>It took 0.714499 secs to do 1399.58 file opens per sec It took 0.0420066 secs to do 23805.8 file writes per sec It took 0.835109 secs to do 1197.45 file closes per sec It took 0.0619072 secs to do 16153.2 file deletions per sec</p>
+<p>1000 file opens, writes 1 byte, closes, and deletes with autoflush i/o: It took 2.70265 secs to do all operations It took 0.0089945 secs to dispatch all operations It took 2.69366 secs to finish all operations</p>
+<p>It took 0.0759873 secs to do 13160.1 file opens per sec It took 0.0334323 secs to do 29911.2 file writes per sec It took 2.46722 secs to do 405.315 file closes per sec It took 0.126015 secs to do 7935.54 file deletions per sec</p>
+<p>1000 file opens, writes 64Kb, closes, and deletes with autoflush i/o: It took 2.79222 secs to do all operations It took 0.0079943 secs to dispatch all operations It took 2.78422 secs to finish all operations</p>
+<p>It took 0.0829872 secs to do 12050.1 file opens per sec It took 0.0381194 secs to do 26233.4 file writes per sec It took 2.6111 secs to do 382.98 file closes per sec It took 0.0600064 secs to do 16664.9 file deletions per sec</p>
+<p>1000 file opens, writes 1 byte, closes, and deletes with direct i/o: It took 0.178027 secs to do all operations It took 0.0070116 secs to dispatch all operations It took 0.171015 secs to finish all operations</p>
+<p>It took 0.0629898 secs to do 15875.6 file opens per sec It took 0.0110008 secs to do 90902.5 file writes per sec It took 0.0190018 secs to do 52626.6 file closes per sec It took 0.0850346 secs to do 11759.9 file deletions per sec</p>
+<p>1000 file opens, writes 64Kb, closes, and deletes with direct i/o: It took 1.67592 secs to do all operations It took 0.0169852 secs to dispatch all operations It took 1.65893 secs to finish all operations</p>
+<p>It took 0.711476 secs to do 1405.53 file opens per sec It took 0.0163148 secs to do 61294 file writes per sec It took 0.890117 secs to do 1123.45 file closes per sec It took 0.058008 secs to do 17239 file deletions per sec</p>
+<p>1000 file opens, writes 1 byte, closes, and deletes with direct synchronous i/o:</p>
+<p>It took 0.309121 secs to do all operations It took 0.00698 secs to dispatch all operations It took 0.302141 secs to finish all operations</p>
+<p>It took 0.138198 secs to do 7235.99 file opens per sec It took 0.0142443 secs to do 70203.5 file writes per sec It took 0.0796398 secs to do 12556.5 file closes per sec It took 0.0770388 secs to do 12980.5 file deletions per sec</p>
+<p>1000 file opens, writes 64Kb, closes, and deletes with direct synchronous i/o: It took 1.95023 secs to do all operations It took 0.020987 secs to dispatch all operations It took 1.92924 secs to finish all operations</p>
+<p>It took 0.967097 secs to do 1034.02 file opens per sec It took 0.0290068 secs to do 34474.7 file writes per sec It took 0.901115 secs to do 1109.74 file closes per sec It took 0.0530077 secs to do 18865.2 file deletions per sec</p>
+<p>iozone -e -I -a -s 1000M -r 4k -r 512k -i 0 -i 1 -i 2 random random bkwd record stride KB reclen write rewrite read reread read write read rewrite read fwrite frewrite fread freread 1024000 4 2528 3044 12000 11693 11337 931 1024000 512 17393 17039 68703 68524 67958 3881</p>
+<p>iozone -e -I -s 31M -r 4k -t 32 -T -i 0 -i 2 </p>
+<pre class="fragment"> Children see throughput for 2 initial writers = 1502.15 KB/sec
+ Parent sees throughput for 2 initial writers = 1502.13 KB/sec
+ Min throughput per thread = 751.07 KB/sec
+ Max throughput per thread = 751.08 KB/sec
+ Avg throughput per thread = 751.07 KB/sec
+ Min xfer = 511992.00 KB
+
+ Children see throughput for 2 rewriters = 1537.12 KB/sec
+ Parent sees throughput for 2 rewriters = 1537.11 KB/sec
+ Min throughput per thread = 768.34 KB/sec
+ Max throughput per thread = 768.77 KB/sec
+ Avg throughput per thread = 768.56 KB/sec
+ Min xfer = 511716.00 KB
+
+ Children see throughput for 2 random readers = 9044.48 KB/sec
+ Parent sees throughput for 2 random readers = 9044.42 KB/sec
+ Min throughput per thread = 4521.79 KB/sec
+ Max throughput per thread = 4522.69 KB/sec
+ Avg throughput per thread = 4522.24 KB/sec
+ Min xfer = 511900.00 KB
+
+ Children see throughput for 2 random writers = 825.19 KB/sec
+ Parent sees throughput for 2 random writers = 825.14 KB/sec
+ Min throughput per thread = 412.52 KB/sec
+ Max throughput per thread = 412.67 KB/sec
+ Avg throughput per thread = 412.60 KB/sec
+ Min xfer = 511812.00 KB
+</pre><p>From these I infer: </p>
+<pre class="fragment"> Sequential Read : 67.09 MB/s
+ Sequential Write : 16.98 MB/s
+ Random Read 512KB : 66.36 MB/s
+ Random Write 512KB : 3.79 MB/s
+Random Read 4KB (QD=1) : 11.42 MB/s [ 2834.3 IOPS]
+</pre><p> Random Write 4KB (QD=1) : 0.91 MB/s [ 232.8 IOPS] Random Read 4KB (QD=32) : ? MB/s [ ? IOPS] Random Write 4KB (QD=32) : ? MB/s [ ? IOPS]</p>
+<p>POSIX compat backend, 1.7Ghz ARM Cortex-A15 Linux 3.4 on Samsung Chromebook eMMC internal drive:</p>
+<p>1000 file opens, writes 1 byte, closes, and deletes: It took 0.386876 secs to do all operations It took 0.110156 secs to dispatch all operations It took 0.27672 secs to finish all operations</p>
+<p>It took 0.181143 secs to do 5520.5 file opens per sec It took 0.094321 secs to do 10602.1 file writes per sec It took 0.070552 secs to do 14173.9 file closes per sec It took 0.04086 secs to do 24473.8 file deletions per sec</p>
+<p>1000 file opens, writes 64Kb, closes, and deletes: It took 0.425939 secs to do all operations It took 0.147966 secs to dispatch all operations It took 0.277973 secs to finish all operations</p>
+<p>It took 0.17901 secs to do 5586.28 file opens per sec It took 0.152722 secs to do 6547.85 file writes per sec It took 0.054538 secs to do 18335.8 file closes per sec It took 0.039669 secs to do 25208.6 file deletions per sec</p>
+<p>1000 file opens, writes 1 byte, closes, and deletes with synchronous i/o: It took 19.4941 secs to do all operations It took 0.07904 secs to dispatch all operations It took 19.4151 secs to finish all operations</p>
+<p>It took 13.323 secs to do 75.058 file opens per sec It took 6.06393 secs to do 164.909 file writes per sec It took 0.071753 secs to do 13936.7 file closes per sec It took 0.035389 secs to do 28257.4 file deletions per sec</p>
+<p>1000 file opens, writes 64Kb, closes, and deletes with synchronous i/o: It took 22.8757 secs to do all operations It took 0.102336 secs to dispatch all operations It took 22.7734 secs to finish all operations</p>
+<p>It took 5.35023 secs to do 186.908 file opens per sec It took 17.498 secs to do 57.1495 file writes per sec It took 0.014796 secs to do 67585.8 file closes per sec It took 0.012747 secs to do 78449.8 file deletions per sec</p>
+<p>1000 file opens, writes 1 byte, closes, and deletes with autoflush i/o: It took 13.2068 secs to do all operations It took 0.085519 secs to dispatch all operations It took 13.1213 secs to finish all operations</p>
+<p>It took 9.65411 secs to do 103.583 file opens per sec It took 3.40673 secs to do 293.537 file writes per sec It took 0.119205 secs to do 8388.91 file closes per sec It took 0.02677 secs to do 37355.2 file deletions per sec</p>
+<p>1000 file opens, writes 64Kb, closes, and deletes with autoflush i/o: It took 24.0624 secs to do all operations It took 0.092833 secs to dispatch all operations It took 23.9695 secs to finish all operations</p>
+<p>It took 12.9862 secs to do 77.0047 file opens per sec It took 10.8002 secs to do 92.5906 file writes per sec It took 0.219705 secs to do 4551.56 file closes per sec It took 0.05619 secs to do 17796.8 file deletions per sec</p>
+<p>1000 file opens, writes 1 byte, closes, and deletes with direct i/o: [Started testing]</p>
+<p>[Running: async_io/works/1/direct] unittests/main.cpp:266: !(((size_t) &amp;towrite.front()) &amp; 4095) failed with unexpected exception with message: 'Invalid argument (22) in 'triplegit/src/async_file_io.cpp':dowrite:884' [Finished: 'async_io/works/1/direct' 1 test case failed (1 of 2 assertions failed)]</p>
+<p>1000 file opens, writes 64Kb, closes, and deletes with direct i/o: It took 6.84248 secs to do all operations It took 0.125639 secs to dispatch all operations It took 6.71684 secs to finish all operations</p>
+<p>It took 0.204354 secs to do 4893.47 file opens per sec It took 6.58176 secs to do 151.935 file writes per sec It took 0.025033 secs to do 39947.3 file closes per sec It took 0.031331 secs to do 31917.3 file deletions per sec</p>
+<p>1000 file opens, writes 1 byte, closes, and deletes with direct synchronous i/o: It took 7.00683 secs to do all operations It took 0.054578 secs to dispatch all operations It took 6.95225 secs to finish all operations</p>
+<p>It took 6.88883 secs to do 145.163 file opens per sec It took 0.057979 secs to do 17247.6 file writes per sec It took 0.030898 secs to do 32364.6 file closes per sec It took 0.029125 secs to do 34334.8 file deletions per sec</p>
+<p>1000 file opens, writes 64Kb, closes, and deletes with direct synchronous i/o: It took 24.9112 secs to do all operations It took 0.058847 secs to dispatch all operations It took 24.8524 secs to finish all operations</p>
+<p>It took 11.8282 secs to do 84.5438 file opens per sec It took 13.0079 secs to do 76.8762 file writes per sec It took 0.057255 secs to do 17465.7 file closes per sec It took 0.017878 secs to do 55934.7 file deletions per sec </p>
+</div></div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/async__file__io_8hpp_source.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/async__file__io_8hpp_source.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,782 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: triplegit/include/async_file_io.hpp Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li>Classes</li>
+ <li class="current">Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>File List</li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_5702f8a2329a6e3cef9103a99d8690ff.html">triplegit</a></li><li class="navelem"><a class="el" href="dir_603090840fc3140f581dcce46ee211a4.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">async_file_io.hpp</div> </div>
+</div><!--header-->
+<div class="contents">
+Go to the documentation of this file.<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">/* async_file_io</span></div>
+<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment">Provides a threadpool and asynchronous file i/o infrastructure based on Boost.ASIO, Boost.Iostreams and filesystem</span></div>
+<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment">(C) 2013 Niall Douglas http://www.nedprod.com/></div>
+<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment">File Created: Mar 2013</span></div>
+<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;</div>
+<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="preprocessor">#ifndef TRIPLEGIT_ASYNC_FILE_IO_H</span></div>
+<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="preprocessor"></span><span class="preprocessor">#define TRIPLEGIT_ASYNC_FILE_IO_H</span></div>
+<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="preprocessor"></span></div>
+<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="preprocessor">#include &quot;../../NiallsCPP11Utilities/NiallsCPP11Utilities.hpp&quot;</span></div>
+<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="preprocessor">#include &quot;../../NiallsCPP11Utilities/std_filesystem.hpp&quot;</span></div>
+<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="preprocessor">#include &lt;type_traits&gt;</span></div>
+<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="preprocessor">#include &lt;initializer_list&gt;</span></div>
+<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="preprocessor">#include &lt;thread&gt;</span></div>
+<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="preprocessor">#include &lt;atomic&gt;</span></div>
+<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="preprocessor">#if !defined(_WIN32_WINNT) &amp;&amp; defined(WIN32)</span></div>
+<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="preprocessor"></span><span class="preprocessor">#define _WIN32_WINNT 0x0501</span></div>
+<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="preprocessor"></span><span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="preprocessor"></span><span class="preprocessor">#define BOOST_THREAD_VERSION 4</span></div>
+<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="preprocessor"></span><span class="comment">//#define BOOST_THREAD_PROVIDES_VARIADIC_THREAD</span></div>
+<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="comment">//#define BOOST_THREAD_DONT_PROVIDE_FUTURE</span></div>
+<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;<span class="comment">//#define BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK</span></div>
+<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;<span class="preprocessor">#include &quot;boost/asio.hpp&quot;</span></div>
+<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="preprocessor">#include &quot;boost/thread/thread.hpp&quot;</span></div>
+<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="preprocessor">#include &quot;boost/thread/future.hpp&quot;</span></div>
+<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;</div>
+<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="preprocessor">#ifdef TRIPLEGIT_DLL_EXPORTS</span></div>
+<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;<span class="preprocessor"></span><span class="preprocessor">#define TRIPLEGIT_ASYNC_FILE_IO_API DLLEXPORTMARKUP</span></div>
+<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;<span class="preprocessor"></span><span class="preprocessor">#else</span></div>
+<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;<span class="preprocessor"></span><span class="preprocessor">#define TRIPLEGIT_ASYNC_FILE_IO_API DLLIMPORTMARKUP</span></div>
+<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;<span class="preprocessor"></span><span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160;<span class="preprocessor"></span></div>
+<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160;<span class="preprocessor">#ifdef _MSC_VER</span></div>
+<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160;<span class="preprocessor"></span><span class="preprocessor">#pragma warning(push)</span></div>
+<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160;<span class="preprocessor"></span><span class="preprocessor">#pragma warning(disable: 4251) // type needs to have dll-interface to be used by clients of class</span></div>
+<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;<span class="preprocessor"></span><span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160;<span class="preprocessor"></span></div>
+<div class="line"><a name="l00502"></a><span class="lineno"> 502</span>&#160;<span class="keyword">namespace </span>triplegit {</div>
+<div class="line"><a name="l00504"></a><span class="lineno"><a class="code" href="namespacetriplegit_1_1async__io.html"> 504</a></span>&#160;<span class="keyword">namespace </span>async_io {</div>
+<div class="line"><a name="l00505"></a><span class="lineno"> 505</span>&#160;</div>
+<div class="line"><a name="l00506"></a><span class="lineno"> 506</span>&#160;<span class="preprocessor">#ifdef __GNUC__</span></div>
+<div class="line"><a name="l00507"></a><span class="lineno"> 507</span>&#160;<span class="preprocessor"></span><span class="keyword">typedef</span> boost::thread thread;</div>
+<div class="line"><a name="l00508"></a><span class="lineno"> 508</span>&#160;<span class="preprocessor">#else</span></div>
+<div class="line"><a name="l00509"></a><span class="lineno"> 509</span>&#160;<span class="preprocessor"></span><span class="keyword">typedef</span> std::thread thread;</div>
+<div class="line"><a name="l00510"></a><span class="lineno"> 510</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l00511"></a><span class="lineno"> 511</span>&#160;<span class="preprocessor"></span></div>
+<div class="line"><a name="l00512"></a><span class="lineno"> 512</span>&#160;<span class="comment">// This isn&#39;t consistent on MSVC so hard code it</span></div>
+<div class="line"><a name="l00513"></a><span class="lineno"> 513</span>&#160;<span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span> off_t;</div>
+<div class="line"><a name="l00514"></a><span class="lineno"> 514</span>&#160;</div>
+<div class="line"><a name="l00515"></a><span class="lineno"> 515</span>&#160;<span class="preprocessor">#define ASYNC_FILE_IO_FORWARD_STL_IMPL(M, B) \</span></div>
+<div class="line"><a name="l00516"></a><span class="lineno"> 516</span>&#160;<span class="preprocessor">template&lt;class T&gt; class M : public B&lt;T&gt; \</span></div>
+<div class="line"><a name="l00517"></a><span class="lineno"> 517</span>&#160;<span class="preprocessor">{ \</span></div>
+<div class="line"><a name="l00518"></a><span class="lineno"> 518</span>&#160;<span class="preprocessor">public: \</span></div>
+<div class="line"><a name="l00519"></a><span class="lineno"> 519</span>&#160;<span class="preprocessor"> M() { } \</span></div>
+<div class="line"><a name="l00520"></a><span class="lineno"> 520</span>&#160;<span class="preprocessor"> M(const B&lt;T&gt; &amp;o) : B&lt;T&gt;(o) { } \</span></div>
+<div class="line"><a name="l00521"></a><span class="lineno"> 521</span>&#160;<span class="preprocessor"> M(B&lt;T&gt; &amp;&amp;o) : B&lt;T&gt;(std::move(o)) { } \</span></div>
+<div class="line"><a name="l00522"></a><span class="lineno"> 522</span>&#160;<span class="preprocessor"> M(const M &amp;o) : B&lt;T&gt;(o) { } \</span></div>
+<div class="line"><a name="l00523"></a><span class="lineno"> 523</span>&#160;<span class="preprocessor"> M(M &amp;&amp;o) : B&lt;T&gt;(std::move(o)) { } \</span></div>
+<div class="line"><a name="l00524"></a><span class="lineno"> 524</span>&#160;<span class="preprocessor"> M &amp;operator=(const B&lt;T&gt; &amp;o) { static_cast&lt;B&lt;T&gt; &amp;&amp;&gt;(*this)=o; return *this; } \</span></div>
+<div class="line"><a name="l00525"></a><span class="lineno"> 525</span>&#160;<span class="preprocessor"> M &amp;operator=(B&lt;T&gt; &amp;&amp;o) { static_cast&lt;B&lt;T&gt; &amp;&amp;&gt;(*this)=std::move(o); return *this; } \</span></div>
+<div class="line"><a name="l00526"></a><span class="lineno"> 526</span>&#160;<span class="preprocessor"> M &amp;operator=(const M &amp;o) { static_cast&lt;B&lt;T&gt; &amp;&amp;&gt;(*this)=o; return *this; } \</span></div>
+<div class="line"><a name="l00527"></a><span class="lineno"> 527</span>&#160;<span class="preprocessor"> M &amp;operator=(M &amp;&amp;o) { static_cast&lt;B&lt;T&gt; &amp;&amp;&gt;(*this)=std::move(o); return *this; } \</span></div>
+<div class="line"><a name="l00528"></a><span class="lineno"> 528</span>&#160;<span class="preprocessor">};</span></div>
+<div class="line"><a name="l00529"></a><span class="lineno"> 529</span>&#160;<span class="preprocessor"></span><span class="preprocessor">#define ASYNC_FILE_IO_FORWARD_STL_IMPL_NC(M, B) \</span></div>
+<div class="line"><a name="l00530"></a><span class="lineno"> 530</span>&#160;<span class="preprocessor">template&lt;class T&gt; class M : public B&lt;T&gt; \</span></div>
+<div class="line"><a name="l00531"></a><span class="lineno"> 531</span>&#160;<span class="preprocessor">{ \</span></div>
+<div class="line"><a name="l00532"></a><span class="lineno"> 532</span>&#160;<span class="preprocessor">public: \</span></div>
+<div class="line"><a name="l00533"></a><span class="lineno"> 533</span>&#160;<span class="preprocessor"> M() { } \</span></div>
+<div class="line"><a name="l00534"></a><span class="lineno"> 534</span>&#160;<span class="preprocessor"> M(B&lt;T&gt; &amp;&amp;o) : B&lt;T&gt;(std::move(o)) { } \</span></div>
+<div class="line"><a name="l00535"></a><span class="lineno"> 535</span>&#160;<span class="preprocessor"> M(M &amp;&amp;o) : B&lt;T&gt;(std::move(o)) { } \</span></div>
+<div class="line"><a name="l00536"></a><span class="lineno"> 536</span>&#160;<span class="preprocessor"> M &amp;operator=(B&lt;T&gt; &amp;&amp;o) { static_cast&lt;B&lt;T&gt; &amp;&amp;&gt;(*this)=std::move(o); return *this; } \</span></div>
+<div class="line"><a name="l00537"></a><span class="lineno"> 537</span>&#160;<span class="preprocessor"> M &amp;operator=(M &amp;&amp;o) { static_cast&lt;B&lt;T&gt; &amp;&amp;&gt;(*this)=std::move(o); return *this; } \</span></div>
+<div class="line"><a name="l00538"></a><span class="lineno"> 538</span>&#160;<span class="preprocessor">};</span></div>
+<div class="line"><a name="l00539"></a><span class="lineno"> 539</span>&#160;<span class="preprocessor"></span></div>
+<div class="line"><a name="l00544"></a><span class="lineno"><a class="code" href="classtriplegit_1_1async__io_1_1future.html"> 544</a></span>&#160;ASYNC_FILE_IO_FORWARD_STL_IMPL_NC(<a class="code" href="classtriplegit_1_1async__io_1_1future.html" title="For now, this is boost&#39;s future. Will be replaced when C++&#39;s future catches up with boost&#39;s...">future</a>, boost::future)</div>
+<div class="line"><a name="l00550"></a><span class="lineno"><a class="code" href="classtriplegit_1_1async__io_1_1shared__future.html"> 550</a></span>&#160;ASYNC_FILE_IO_FORWARD_STL_IMPL(<a class="code" href="classtriplegit_1_1async__io_1_1shared__future.html" title="For now, this is boost&#39;s shared_future. Will be replaced when C++&#39;s shared_future catches up with boo...">shared_future</a>, boost::shared_future)</div>
+<div class="line"><a name="l00554"></a><span class="lineno"><a class="code" href="classtriplegit_1_1async__io_1_1promise.html"> 554</a></span>&#160;ASYNC_FILE_IO_FORWARD_STL_IMPL(<a class="code" href="classtriplegit_1_1async__io_1_1promise.html" title="For now, this is boost&#39;s promise. Will be replaced when C++&#39;s promise catches up with boost&#39;s...">promise</a>, boost::promise)</div>
+<div class="line"><a name="l00557"></a><span class="lineno"><a class="code" href="namespacetriplegit_1_1async__io.html#af28c26398a12ba760165fc40f2a74ca3"> 557</a></span>&#160;typedef boost::<a class="code" href="namespacetriplegit_1_1async__io.html#af28c26398a12ba760165fc40f2a74ca3" title="For now, this is boost&#39;s exception_ptr. Will be replaced when C++&#39;s exception_ptr catches up with boo...">exception_ptr</a> <a class="code" href="namespacetriplegit_1_1async__io.html#af28c26398a12ba760165fc40f2a74ca3" title="For now, this is boost&#39;s exception_ptr. Will be replaced when C++&#39;s exception_ptr catches up with boo...">exception_ptr</a>;</div>
+<div class="line"><a name="l00558"></a><span class="lineno"> 558</span>&#160;template&lt;class T&gt; inline exception_ptr make_exception_ptr(const T &amp;e) { <span class="keywordflow">return</span> boost::copy_exception(e); }</div>
+<div class="line"><a name="l00559"></a><span class="lineno"> 559</span>&#160;<span class="keyword">using</span> std::current_exception;</div>
+<div class="line"><a name="l00563"></a><span class="lineno"><a class="code" href="classpackaged__task.html"> 563</a></span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">class</span>&gt; <span class="keyword">class </span><a class="code" href="classpackaged__task.html" title="For now, this is an emulation of std::packaged_task based on boost&#39;s packaged_task. We have to drop the Args... support because it segfaults MSVC Nov 2012 CTP.">packaged_task</a>;</div>
+<div class="line"><a name="l00564"></a><span class="lineno"> 564</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">class</span> R&gt; <span class="keyword">class </span><a class="code" href="classpackaged__task.html" title="For now, this is an emulation of std::packaged_task based on boost&#39;s packaged_task. We have to drop the Args... support because it segfaults MSVC Nov 2012 CTP.">packaged_task</a>&lt;R()&gt; : <span class="keyword">public</span> boost::packaged_task&lt;R()&gt;</div>
+<div class="line"><a name="l00565"></a><span class="lineno"> 565</span>&#160;{</div>
+<div class="line"><a name="l00566"></a><span class="lineno"> 566</span>&#160; <span class="keyword">typedef</span> boost::packaged_task&lt;R()&gt; Base;</div>
+<div class="line"><a name="l00567"></a><span class="lineno"> 567</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l00568"></a><span class="lineno"> 568</span>&#160; <a class="code" href="classpackaged__task.html" title="For now, this is an emulation of std::packaged_task based on boost&#39;s packaged_task. We have to drop the Args... support because it segfaults MSVC Nov 2012 CTP.">packaged_task</a>() { }</div>
+<div class="line"><a name="l00569"></a><span class="lineno"> 569</span>&#160; <a class="code" href="classpackaged__task.html" title="For now, this is an emulation of std::packaged_task based on boost&#39;s packaged_task. We have to drop the Args... support because it segfaults MSVC Nov 2012 CTP.">packaged_task</a>(Base &amp;&amp;o) : Base(std::move(o)) { }</div>
+<div class="line"><a name="l00570"></a><span class="lineno"> 570</span>&#160; <a class="code" href="classpackaged__task.html" title="For now, this is an emulation of std::packaged_task based on boost&#39;s packaged_task. We have to drop the Args... support because it segfaults MSVC Nov 2012 CTP.">packaged_task</a>(<a class="code" href="classpackaged__task.html" title="For now, this is an emulation of std::packaged_task based on boost&#39;s packaged_task. We have to drop the Args... support because it segfaults MSVC Nov 2012 CTP.">packaged_task</a> &amp;&amp;o) : Base(static_cast&lt;Base &amp;&amp;&gt;(o)) { }</div>
+<div class="line"><a name="l00571"></a><span class="lineno"> 571</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt; <a class="code" href="classpackaged__task.html" title="For now, this is an emulation of std::packaged_task based on boost&#39;s packaged_task. We have to drop the Args... support because it segfaults MSVC Nov 2012 CTP.">packaged_task</a>(T &amp;&amp;o) : Base(std::forward&lt;T&gt;(o)) { }</div>
+<div class="line"><a name="l00572"></a><span class="lineno"> 572</span>&#160; <a class="code" href="classpackaged__task.html" title="For now, this is an emulation of std::packaged_task based on boost&#39;s packaged_task. We have to drop the Args... support because it segfaults MSVC Nov 2012 CTP.">packaged_task</a> &amp;operator=(Base &amp;&amp;o) { <span class="keyword">static_cast&lt;</span>Base &amp;&amp;<span class="keyword">&gt;</span>(*this)=std::move(o); <span class="keywordflow">return</span> *<span class="keyword">this</span>; }</div>
+<div class="line"><a name="l00573"></a><span class="lineno"> 573</span>&#160; <a class="code" href="classpackaged__task.html" title="For now, this is an emulation of std::packaged_task based on boost&#39;s packaged_task. We have to drop the Args... support because it segfaults MSVC Nov 2012 CTP.">packaged_task</a> &amp;operator=(<a class="code" href="classpackaged__task.html" title="For now, this is an emulation of std::packaged_task based on boost&#39;s packaged_task. We have to drop the Args... support because it segfaults MSVC Nov 2012 CTP.">packaged_task</a> &amp;&amp;o) { <span class="keyword">static_cast&lt;</span>Base &amp;&amp;<span class="keyword">&gt;</span>(*this)=std::move(o); <span class="keywordflow">return</span> *<span class="keyword">this</span>; }</div>
+<div class="line"><a name="l00574"></a><span class="lineno"> 574</span>&#160;};</div>
+<div class="line"><a name="l00575"></a><span class="lineno"> 575</span>&#160;</div>
+<div class="line"><a name="l00579"></a><span class="lineno"><a class="code" href="classtriplegit_1_1async__io_1_1thread__pool.html"> 579</a></span>&#160;<span class="keyword">class </span><a class="code" href="classtriplegit_1_1async__io_1_1thread__pool.html" title="A very simple thread pool based on Boost.ASIO and std::thread.">thread_pool</a> {</div>
+<div class="line"><a name="l00580"></a><span class="lineno"> 580</span>&#160; <span class="keyword">class </span>worker</div>
+<div class="line"><a name="l00581"></a><span class="lineno"> 581</span>&#160; {</div>
+<div class="line"><a name="l00582"></a><span class="lineno"> 582</span>&#160; <a class="code" href="classtriplegit_1_1async__io_1_1thread__pool.html" title="A very simple thread pool based on Boost.ASIO and std::thread.">thread_pool</a> *pool;</div>
+<div class="line"><a name="l00583"></a><span class="lineno"> 583</span>&#160; <span class="keyword">public</span>:</div>
+<div class="line"><a name="l00584"></a><span class="lineno"> 584</span>&#160; <span class="keyword">explicit</span> worker(<a class="code" href="classtriplegit_1_1async__io_1_1thread__pool.html" title="A very simple thread pool based on Boost.ASIO and std::thread.">thread_pool</a> *p) : pool(p) { }</div>
+<div class="line"><a name="l00585"></a><span class="lineno"> 585</span>&#160; <span class="keywordtype">void</span> operator()()</div>
+<div class="line"><a name="l00586"></a><span class="lineno"> 586</span>&#160; {</div>
+<div class="line"><a name="l00587"></a><span class="lineno"> 587</span>&#160; pool-&gt;service.run();</div>
+<div class="line"><a name="l00588"></a><span class="lineno"> 588</span>&#160; }</div>
+<div class="line"><a name="l00589"></a><span class="lineno"> 589</span>&#160; };</div>
+<div class="line"><a name="l00590"></a><span class="lineno"> 590</span>&#160; <span class="keyword">friend</span> <span class="keyword">class </span>worker;</div>
+<div class="line"><a name="l00591"></a><span class="lineno"> 591</span>&#160;</div>
+<div class="line"><a name="l00592"></a><span class="lineno"> 592</span>&#160; std::vector&lt; std::unique_ptr&lt;thread&gt; &gt; workers;</div>
+<div class="line"><a name="l00593"></a><span class="lineno"> 593</span>&#160; boost::asio::io_service service;</div>
+<div class="line"><a name="l00594"></a><span class="lineno"> 594</span>&#160; boost::asio::io_service::work working;</div>
+<div class="line"><a name="l00595"></a><span class="lineno"> 595</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l00597"></a><span class="lineno"><a class="code" href="classtriplegit_1_1async__io_1_1thread__pool.html#ad55f84716fd629d7e895f109a150e83e"> 597</a></span>&#160; <span class="keyword">explicit</span> <a class="code" href="classtriplegit_1_1async__io_1_1thread__pool.html#ad55f84716fd629d7e895f109a150e83e" title="Constructs a thread pool of no workers.">thread_pool</a>(<span class="keywordtype">size_t</span> no) : working(service)</div>
+<div class="line"><a name="l00598"></a><span class="lineno"> 598</span>&#160; {</div>
+<div class="line"><a name="l00599"></a><span class="lineno"> 599</span>&#160; workers.reserve(no);</div>
+<div class="line"><a name="l00600"></a><span class="lineno"> 600</span>&#160; <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> n=0; n&lt;no; n++)</div>
+<div class="line"><a name="l00601"></a><span class="lineno"> 601</span>&#160; workers.push_back(std::unique_ptr&lt;thread&gt;(<span class="keyword">new</span> thread(worker(<span class="keyword">this</span>))));</div>
+<div class="line"><a name="l00602"></a><span class="lineno"> 602</span>&#160; }</div>
+<div class="line"><a name="l00603"></a><span class="lineno"> 603</span>&#160; ~<a class="code" href="classtriplegit_1_1async__io_1_1thread__pool.html" title="A very simple thread pool based on Boost.ASIO and std::thread.">thread_pool</a>()</div>
+<div class="line"><a name="l00604"></a><span class="lineno"> 604</span>&#160; {</div>
+<div class="line"><a name="l00605"></a><span class="lineno"> 605</span>&#160; service.stop();</div>
+<div class="line"><a name="l00606"></a><span class="lineno"> 606</span>&#160; <span class="keywordflow">for</span>(<span class="keyword">auto</span> &amp;i : workers)</div>
+<div class="line"><a name="l00607"></a><span class="lineno"> 607</span>&#160; i-&gt;join();</div>
+<div class="line"><a name="l00608"></a><span class="lineno"> 608</span>&#160; }</div>
+<div class="line"><a name="l00610"></a><span class="lineno"><a class="code" href="classtriplegit_1_1async__io_1_1thread__pool.html#a67f5b5480be42f8cb94878c5ff95b245"> 610</a></span>&#160; boost::asio::io_service &amp;<a class="code" href="classtriplegit_1_1async__io_1_1thread__pool.html#a67f5b5480be42f8cb94878c5ff95b245" title="Returns the underlying io_service.">io_service</a>() { <span class="keywordflow">return</span> service; }</div>
+<div class="line"><a name="l00612"></a><span class="lineno"><a class="code" href="classtriplegit_1_1async__io_1_1thread__pool.html#a1197a18cb30a52bb1ee02cd2ef742bff"> 612</a></span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> F&gt; <a class="code" href="classtriplegit_1_1async__io_1_1future.html" title="For now, this is boost&#39;s future. Will be replaced when C++&#39;s future catches up with boost&#39;s...">future&lt;typename std::result_of&lt;F()&gt;::type</a>&gt; <a class="code" href="classtriplegit_1_1async__io_1_1thread__pool.html#a1197a18cb30a52bb1ee02cd2ef742bff" title="Sends some callable entity to the thread pool for execution.">enqueue</a>(F f)</div>
+<div class="line"><a name="l00613"></a><span class="lineno"> 613</span>&#160; {</div>
+<div class="line"><a name="l00614"></a><span class="lineno"> 614</span>&#160; <span class="keyword">typedef</span> <span class="keyword">typename</span> std::result_of&lt;F()&gt;::type R;</div>
+<div class="line"><a name="l00615"></a><span class="lineno"> 615</span>&#160; <span class="comment">// Somewhat annoyingly, io_service.post() needs its parameter to be copy constructible,</span></div>
+<div class="line"><a name="l00616"></a><span class="lineno"> 616</span>&#160; <span class="comment">// and packaged_task is only move constructible, so ...</span></div>
+<div class="line"><a name="l00617"></a><span class="lineno"> 617</span>&#160; <span class="keyword">auto</span> task=std::make_shared&lt;packaged_task&lt;R()&gt;&gt;(std::move(f));</div>
+<div class="line"><a name="l00618"></a><span class="lineno"> 618</span>&#160; service.post(std::bind([](std::shared_ptr&lt;<a class="code" href="classpackaged__task.html" title="For now, this is an emulation of std::packaged_task based on boost&#39;s packaged_task. We have to drop the Args... support because it segfaults MSVC Nov 2012 CTP.">packaged_task</a>&lt;R()&gt;&gt; t) { (*t)(); }, task));</div>
+<div class="line"><a name="l00619"></a><span class="lineno"> 619</span>&#160; <span class="keywordflow">return</span> task-&gt;get_future();</div>
+<div class="line"><a name="l00620"></a><span class="lineno"> 620</span>&#160; }</div>
+<div class="line"><a name="l00621"></a><span class="lineno"> 621</span>&#160;};</div>
+<div class="line"><a name="l00623"></a><span class="lineno"> 623</span>&#160;<span class="keyword">extern</span> TRIPLEGIT_ASYNC_FILE_IO_API thread_pool &amp;<a class="code" href="namespacetriplegit_1_1async__io.html#a6743cd614fc8161dfce94144c36cfb85" title="Returns the process threadpool.">process_threadpool</a>();</div>
+<div class="line"><a name="l00624"></a><span class="lineno"> 624</span>&#160;</div>
+<div class="line"><a name="l00625"></a><span class="lineno"> 625</span>&#160;<span class="keyword">namespace </span>detail {</div>
+<div class="line"><a name="l00626"></a><span class="lineno"> 626</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> returns_t, <span class="keyword">class</span> future_type&gt; <span class="keyword">inline</span> returns_t when_all_do(std::shared_ptr&lt;std::vector&lt;future_type&gt;&gt; futures)</div>
+<div class="line"><a name="l00627"></a><span class="lineno"> 627</span>&#160; {</div>
+<div class="line"><a name="l00628"></a><span class="lineno"> 628</span>&#160; boost::wait_for_all(futures-&gt;begin(), futures-&gt;end());</div>
+<div class="line"><a name="l00629"></a><span class="lineno"> 629</span>&#160; returns_t ret;</div>
+<div class="line"><a name="l00630"></a><span class="lineno"> 630</span>&#160; ret.reserve(futures-&gt;size());</div>
+<div class="line"><a name="l00631"></a><span class="lineno"> 631</span>&#160; std::for_each(futures-&gt;begin(), futures-&gt;end(), [&amp;ret](future_type &amp;f) { ret.push_back(std::move(f.get())); });</div>
+<div class="line"><a name="l00632"></a><span class="lineno"> 632</span>&#160; <span class="keywordflow">return</span> ret;</div>
+<div class="line"><a name="l00633"></a><span class="lineno"> 633</span>&#160; }</div>
+<div class="line"><a name="l00634"></a><span class="lineno"> 634</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> returns_t, <span class="keyword">class</span> future_type&gt; <span class="keyword">inline</span> returns_t when_any_do(std::shared_ptr&lt;std::vector&lt;future_type&gt;&gt; futures)</div>
+<div class="line"><a name="l00635"></a><span class="lineno"> 635</span>&#160; {</div>
+<div class="line"><a name="l00636"></a><span class="lineno"> 636</span>&#160; <span class="keyword">typename</span> std::vector&lt;future_type&gt;::iterator it=boost::wait_for_any(futures-&gt;begin(), futures-&gt;end());</div>
+<div class="line"><a name="l00637"></a><span class="lineno"> 637</span>&#160; <span class="keywordflow">return</span> std::make_pair(std::distance(futures-&gt;begin(), it), std::move(it-&gt;get()));</div>
+<div class="line"><a name="l00638"></a><span class="lineno"> 638</span>&#160; }</div>
+<div class="line"><a name="l00639"></a><span class="lineno"> 639</span>&#160;}</div>
+<div class="line"><a name="l00641"></a><span class="lineno"><a class="code" href="namespacetriplegit_1_1async__io.html#afc5e0576470c19d979b3b853305fc7d6"> 641</a></span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">class</span> InputIterator&gt; <span class="keyword">inline</span> <a class="code" href="classtriplegit_1_1async__io_1_1future.html" title="For now, this is boost&#39;s future. Will be replaced when C++&#39;s future catches up with boost&#39;s...">future</a>&lt;std::vector&lt;<span class="keyword">typename</span> std::decay&lt;decltype(((<span class="keyword">typename</span> InputIterator::value_type *) 0)-&gt;<span class="keyword">get</span>())&gt;::type&gt;&gt; <a class="code" href="namespacetriplegit_1_1async__io.html#afc5e0576470c19d979b3b853305fc7d6" title="Returns a future vector of results from all the supplied futures.">when_all</a>(InputIterator first, InputIterator last)</div>
+<div class="line"><a name="l00642"></a><span class="lineno"> 642</span>&#160;{</div>
+<div class="line"><a name="l00643"></a><span class="lineno"> 643</span>&#160; <span class="keyword">typedef</span> <span class="keyword">typename</span> InputIterator::value_type future_type;</div>
+<div class="line"><a name="l00644"></a><span class="lineno"> 644</span>&#160; <span class="keyword">typedef</span> <span class="keyword">typename</span> std::decay&lt;decltype(((<span class="keyword">typename</span> InputIterator::value_type *) 0)-&gt;<span class="keyword">get</span>())&gt;::type value_type;</div>
+<div class="line"><a name="l00645"></a><span class="lineno"> 645</span>&#160; <span class="keyword">typedef</span> std::vector&lt;value_type&gt; returns_t;</div>
+<div class="line"><a name="l00646"></a><span class="lineno"> 646</span>&#160; <span class="comment">// Take a copy of the futures supplied to us (which may invalidate them)</span></div>
+<div class="line"><a name="l00647"></a><span class="lineno"> 647</span>&#160; <span class="keyword">auto</span> futures=std::make_shared&lt;std::vector&lt;future_type&gt;&gt;(std::make_move_iterator(first), std::make_move_iterator(last));</div>
+<div class="line"><a name="l00648"></a><span class="lineno"> 648</span>&#160; <span class="comment">// Bind to my delegate and invoke</span></div>
+<div class="line"><a name="l00649"></a><span class="lineno"> 649</span>&#160; std::function&lt;returns_t ()&gt; waitforall(std::move(std::bind(&amp;detail::when_all_do&lt;returns_t, future_type&gt;, futures)));</div>
+<div class="line"><a name="l00650"></a><span class="lineno"> 650</span>&#160; <span class="keywordflow">return</span> <a class="code" href="namespacetriplegit_1_1async__io.html#a6743cd614fc8161dfce94144c36cfb85" title="Returns the process threadpool.">process_threadpool</a>().<a class="code" href="classtriplegit_1_1async__io_1_1thread__pool.html#a1197a18cb30a52bb1ee02cd2ef742bff" title="Sends some callable entity to the thread pool for execution.">enqueue</a>(std::move(waitforall));</div>
+<div class="line"><a name="l00651"></a><span class="lineno"> 651</span>&#160;}</div>
+<div class="line"><a name="l00653"></a><span class="lineno"> 653</span>&#160;<span class="comment">//template &lt;typename... T&gt; inline future&lt;std::tuple&lt;typename std::decay&lt;T...&gt;::type&gt;&gt; when_all(T&amp;&amp;... futures);</span></div>
+<div class="line"><a name="l00655"></a><span class="lineno"><a class="code" href="namespacetriplegit_1_1async__io.html#ac024775f7df8eb059d2aeee8de8f5ff9"> 655</a></span>&#160;<span class="comment"></span><span class="keyword">template</span> &lt;<span class="keyword">class</span> InputIterator&gt; <span class="keyword">inline</span> <a class="code" href="classtriplegit_1_1async__io_1_1future.html" title="For now, this is boost&#39;s future. Will be replaced when C++&#39;s future catches up with boost&#39;s...">future</a>&lt;std::pair&lt;size_t, <span class="keyword">typename</span> std::decay&lt;decltype(((<span class="keyword">typename</span> InputIterator::value_type *) 0)-&gt;<span class="keyword">get</span>())&gt;::type&gt;&gt; <a class="code" href="namespacetriplegit_1_1async__io.html#ac024775f7df8eb059d2aeee8de8f5ff9" title="Returns a future tuple of results from all the supplied futures.">when_any</a>(InputIterator first, InputIterator last)</div>
+<div class="line"><a name="l00656"></a><span class="lineno"> 656</span>&#160;{</div>
+<div class="line"><a name="l00657"></a><span class="lineno"> 657</span>&#160; <span class="keyword">typedef</span> <span class="keyword">typename</span> InputIterator::value_type future_type;</div>
+<div class="line"><a name="l00658"></a><span class="lineno"> 658</span>&#160; <span class="keyword">typedef</span> <span class="keyword">typename</span> std::decay&lt;decltype(((<span class="keyword">typename</span> InputIterator::value_type *) 0)-&gt;<span class="keyword">get</span>())&gt;::type value_type;</div>
+<div class="line"><a name="l00659"></a><span class="lineno"> 659</span>&#160; <span class="keyword">typedef</span> std::pair&lt;size_t, <span class="keyword">typename</span> std::decay&lt;decltype(((<span class="keyword">typename</span> InputIterator::value_type *) 0)-&gt;<span class="keyword">get</span>())&gt;::type&gt; returns_t;</div>
+<div class="line"><a name="l00660"></a><span class="lineno"> 660</span>&#160; <span class="comment">// Take a copy of the futures supplied to us (which may invalidate them)</span></div>
+<div class="line"><a name="l00661"></a><span class="lineno"> 661</span>&#160; <span class="keyword">auto</span> futures=std::make_shared&lt;std::vector&lt;future_type&gt;&gt;(std::make_move_iterator(first), std::make_move_iterator(last));</div>
+<div class="line"><a name="l00662"></a><span class="lineno"> 662</span>&#160; <span class="comment">// Bind to my delegate and invoke</span></div>
+<div class="line"><a name="l00663"></a><span class="lineno"> 663</span>&#160; std::function&lt;returns_t ()&gt; waitforall(std::move(std::bind(&amp;detail::when_any_do&lt;returns_t, future_type&gt;, futures)));</div>
+<div class="line"><a name="l00664"></a><span class="lineno"> 664</span>&#160; <span class="keywordflow">return</span> <a class="code" href="namespacetriplegit_1_1async__io.html#a6743cd614fc8161dfce94144c36cfb85" title="Returns the process threadpool.">process_threadpool</a>().<a class="code" href="classtriplegit_1_1async__io_1_1thread__pool.html#a1197a18cb30a52bb1ee02cd2ef742bff" title="Sends some callable entity to the thread pool for execution.">enqueue</a>(std::move(waitforall));</div>
+<div class="line"><a name="l00665"></a><span class="lineno"> 665</span>&#160;}</div>
+<div class="line"><a name="l00667"></a><span class="lineno"> 667</span>&#160;<span class="comment">/*template &lt;typename... T&gt; inline future&lt;std::pair&lt;size_t, typename std::decay&lt;T&gt;::type&gt;&gt; when_any(T&amp;&amp;... futures)</span></div>
+<div class="line"><a name="l00668"></a><span class="lineno"> 668</span>&#160;<span class="comment">{</span></div>
+<div class="line"><a name="l00669"></a><span class="lineno"> 669</span>&#160;<span class="comment"> std::array&lt;T..., sizeof...(T)&gt; f={ futures...};</span></div>
+<div class="line"><a name="l00670"></a><span class="lineno"> 670</span>&#160;<span class="comment"> return when_any(f.begin(), f.end());</span></div>
+<div class="line"><a name="l00671"></a><span class="lineno"> 671</span>&#160;<span class="comment">}*/</span></div>
+<div class="line"><a name="l00672"></a><span class="lineno"> 672</span>&#160;</div>
+<div class="line"><a name="l00673"></a><span class="lineno"> 673</span>&#160;<span class="keyword">class </span>async_file_io_dispatcher_base;</div>
+<div class="line"><a name="l00674"></a><span class="lineno"> 674</span>&#160;<span class="keyword">struct </span>async_io_op;</div>
+<div class="line"><a name="l00675"></a><span class="lineno"> 675</span>&#160;<span class="keyword">struct </span>async_path_op_req;</div>
+<div class="line"><a name="l00676"></a><span class="lineno"> 676</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt; <span class="keyword">struct </span>async_data_op_req;</div>
+<div class="line"><a name="l00677"></a><span class="lineno"> 677</span>&#160;</div>
+<div class="line"><a name="l00678"></a><span class="lineno"> 678</span>&#160;<span class="keyword">namespace </span>detail {</div>
+<div class="line"><a name="l00679"></a><span class="lineno"> 679</span>&#160;</div>
+<div class="line"><a name="l00680"></a><span class="lineno"> 680</span>&#160; <span class="keyword">struct </span>async_io_handle_posix;</div>
+<div class="line"><a name="l00681"></a><span class="lineno"> 681</span>&#160; <span class="keyword">struct </span>async_io_handle_windows;</div>
+<div class="line"><a name="l00682"></a><span class="lineno"> 682</span>&#160; <span class="keyword">struct </span>async_file_io_dispatcher_base_p;</div>
+<div class="line"><a name="l00683"></a><span class="lineno"> 683</span>&#160; <span class="keyword">class </span>async_file_io_dispatcher_compat;</div>
+<div class="line"><a name="l00684"></a><span class="lineno"> 684</span>&#160; <span class="keyword">class </span>async_file_io_dispatcher_windows;</div>
+<div class="line"><a name="l00685"></a><span class="lineno"> 685</span>&#160; <span class="keyword">class </span>async_file_io_dispatcher_linux;</div>
+<div class="line"><a name="l00686"></a><span class="lineno"> 686</span>&#160; <span class="keyword">class </span>async_file_io_dispatcher_qnx;</div>
+<div class="line"><a name="l00688"></a><span class="lineno"><a class="code" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html"> 688</a></span>&#160; <span class="keyword">class </span><a class="code" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html" title="May occasionally be useful to access to discover information about an open handle.">async_io_handle</a> : <span class="keyword">public</span> std::enable_shared_from_this&lt;async_io_handle&gt;</div>
+<div class="line"><a name="l00689"></a><span class="lineno"> 689</span>&#160; {</div>
+<div class="line"><a name="l00690"></a><span class="lineno"> 690</span>&#160; <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html" title="Abstract base class for dispatching file i/o asynchronously.">async_file_io_dispatcher_base</a>;</div>
+<div class="line"><a name="l00691"></a><span class="lineno"> 691</span>&#160; <span class="keyword">friend</span> <span class="keyword">struct </span>async_io_handle_posix;</div>
+<div class="line"><a name="l00692"></a><span class="lineno"> 692</span>&#160; <span class="keyword">friend</span> <span class="keyword">struct </span>async_io_handle_windows;</div>
+<div class="line"><a name="l00693"></a><span class="lineno"> 693</span>&#160; <span class="keyword">friend</span> <span class="keyword">class </span>async_file_io_dispatcher_compat;</div>
+<div class="line"><a name="l00694"></a><span class="lineno"> 694</span>&#160; <span class="keyword">friend</span> <span class="keyword">class </span>async_file_io_dispatcher_windows;</div>
+<div class="line"><a name="l00695"></a><span class="lineno"> 695</span>&#160; <span class="keyword">friend</span> <span class="keyword">class </span>async_file_io_dispatcher_linux;</div>
+<div class="line"><a name="l00696"></a><span class="lineno"> 696</span>&#160; <span class="keyword">friend</span> <span class="keyword">class </span>async_file_io_dispatcher_qnx;</div>
+<div class="line"><a name="l00697"></a><span class="lineno"> 697</span>&#160;</div>
+<div class="line"><a name="l00698"></a><span class="lineno"> 698</span>&#160; <a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html" title="Abstract base class for dispatching file i/o asynchronously.">async_file_io_dispatcher_base</a> *_parent;</div>
+<div class="line"><a name="l00699"></a><span class="lineno"> 699</span>&#160; std::chrono::system_clock::time_point _opened;</div>
+<div class="line"><a name="l00700"></a><span class="lineno"> 700</span>&#160; std::filesystem::path _path; <span class="comment">// guaranteed canonical</span></div>
+<div class="line"><a name="l00701"></a><span class="lineno"> 701</span>&#160; <span class="keyword">protected</span>:</div>
+<div class="line"><a name="l00702"></a><span class="lineno"> 702</span>&#160; std::atomic&lt;off_t&gt; bytesread, byteswritten, byteswrittenatlastfsync;</div>
+<div class="line"><a name="l00703"></a><span class="lineno"> 703</span>&#160; <a class="code" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html" title="May occasionally be useful to access to discover information about an open handle.">async_io_handle</a>(<a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html" title="Abstract base class for dispatching file i/o asynchronously.">async_file_io_dispatcher_base</a> *<a class="code" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#ab254a7c8d7512075368b2807621db5f5" title="Returns the parent of this io handle.">parent</a>, <span class="keyword">const</span> std::filesystem::path &amp;<a class="code" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#abfff6c04e97084d71c44e811cc5d99d6" title="Returns the path of this io handle.">path</a>) : _parent(parent), _opened(std::chrono::system_clock::now()), _path(path), bytesread(0), byteswritten(0), byteswrittenatlastf
sync(0) { }</div>
+<div class="line"><a name="l00704"></a><span class="lineno"> 704</span>&#160; <span class="keyword">public</span>:</div>
+<div class="line"><a name="l00705"></a><span class="lineno"> 705</span>&#160; <span class="keyword">virtual</span> ~<a class="code" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html" title="May occasionally be useful to access to discover information about an open handle.">async_io_handle</a>() { }</div>
+<div class="line"><a name="l00707"></a><span class="lineno"><a class="code" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#ab254a7c8d7512075368b2807621db5f5"> 707</a></span>&#160; <a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html" title="Abstract base class for dispatching file i/o asynchronously.">async_file_io_dispatcher_base</a> *<a class="code" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#ab254a7c8d7512075368b2807621db5f5" title="Returns the parent of this io handle.">parent</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> _parent; }</div>
+<div class="line"><a name="l00709"></a><span class="lineno"> 709</span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> *<a class="code" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#af58d73f18065864e4e6026464116ee6e" title="Returns the native handle of this io handle.">native_handle</a>() <span class="keyword">const</span>=0;</div>
+<div class="line"><a name="l00711"></a><span class="lineno"><a class="code" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#a00eaad37ed049b6577c750aa16736cc5"> 711</a></span>&#160; <span class="keyword">const</span> std::chrono::system_clock::time_point &amp;<a class="code" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#a00eaad37ed049b6577c750aa16736cc5" title="Returns when this handle was opened.">opened</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> _opened; }</div>
+<div class="line"><a name="l00713"></a><span class="lineno"><a class="code" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#abfff6c04e97084d71c44e811cc5d99d6"> 713</a></span>&#160; <span class="keyword">const</span> std::filesystem::path &amp;<a class="code" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#abfff6c04e97084d71c44e811cc5d99d6" title="Returns the path of this io handle.">path</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> _path; }</div>
+<div class="line"><a name="l00715"></a><span class="lineno"><a class="code" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#a9e138be2ed4a0522a1710e693cd6377c"> 715</a></span>&#160; off_t <a class="code" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#a9e138be2ed4a0522a1710e693cd6377c" title="Returns how many bytes have been read since this handle was opened.">read_count</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> bytesread; }</div>
+<div class="line"><a name="l00717"></a><span class="lineno"><a class="code" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#ae96b546a730964e57bd0a50781237222"> 717</a></span>&#160; off_t <a class="code" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#ae96b546a730964e57bd0a50781237222" title="Returns how many bytes have been written since this handle was opened.">write_count</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> byteswritten; }</div>
+<div class="line"><a name="l00719"></a><span class="lineno"><a class="code" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#a1ad31d5e35f7e8562787415f12ab5f7d"> 719</a></span>&#160; off_t <a class="code" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#a1ad31d5e35f7e8562787415f12ab5f7d" title="Returns how many bytes have been written since this handle was last fsynced.">write_count_since_fsync</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> byteswritten-byteswrittenatlastfsync; }</div>
+<div class="line"><a name="l00720"></a><span class="lineno"> 720</span>&#160; };</div>
+<div class="line"><a name="l00721"></a><span class="lineno"> 721</span>&#160; <span class="keyword">struct </span>immediate_async_ops;</div>
+<div class="line"><a name="l00722"></a><span class="lineno"> 722</span>&#160;}</div>
+<div class="line"><a name="l00723"></a><span class="lineno"> 723</span>&#160;</div>
+<div class="line"><a name="l00724"></a><span class="lineno"> 724</span>&#160;</div>
+<div class="line"><a name="l00725"></a><span class="lineno"> 725</span>&#160;<span class="preprocessor">#define ASYNC_FILEIO_DECLARE_CLASS_ENUM_AS_BITFIELD(type) \</span></div>
+<div class="line"><a name="l00726"></a><span class="lineno"> 726</span>&#160;<span class="preprocessor">inline type operator&amp;(type a, type b) \</span></div>
+<div class="line"><a name="l00727"></a><span class="lineno"> 727</span>&#160;<span class="preprocessor">{ \</span></div>
+<div class="line"><a name="l00728"></a><span class="lineno"> 728</span>&#160;<span class="preprocessor"> return static_cast&lt;type&gt;(static_cast&lt;size_t&gt;(a) &amp; static_cast&lt;size_t&gt;(b)); \</span></div>
+<div class="line"><a name="l00729"></a><span class="lineno"> 729</span>&#160;<span class="preprocessor">} \</span></div>
+<div class="line"><a name="l00730"></a><span class="lineno"> 730</span>&#160;<span class="preprocessor">inline type operator|(type a, type b) \</span></div>
+<div class="line"><a name="l00731"></a><span class="lineno"> 731</span>&#160;<span class="preprocessor">{ \</span></div>
+<div class="line"><a name="l00732"></a><span class="lineno"> 732</span>&#160;<span class="preprocessor"> return static_cast&lt;type&gt;(static_cast&lt;size_t&gt;(a) | static_cast&lt;size_t&gt;(b)); \</span></div>
+<div class="line"><a name="l00733"></a><span class="lineno"> 733</span>&#160;<span class="preprocessor">} \</span></div>
+<div class="line"><a name="l00734"></a><span class="lineno"> 734</span>&#160;<span class="preprocessor">inline type operator~(type a) \</span></div>
+<div class="line"><a name="l00735"></a><span class="lineno"> 735</span>&#160;<span class="preprocessor">{ \</span></div>
+<div class="line"><a name="l00736"></a><span class="lineno"> 736</span>&#160;<span class="preprocessor"> return static_cast&lt;type&gt;(~static_cast&lt;size_t&gt;(a)); \</span></div>
+<div class="line"><a name="l00737"></a><span class="lineno"> 737</span>&#160;<span class="preprocessor">} \</span></div>
+<div class="line"><a name="l00738"></a><span class="lineno"> 738</span>&#160;<span class="preprocessor">inline bool operator!(type a) \</span></div>
+<div class="line"><a name="l00739"></a><span class="lineno"> 739</span>&#160;<span class="preprocessor">{ \</span></div>
+<div class="line"><a name="l00740"></a><span class="lineno"> 740</span>&#160;<span class="preprocessor"> return 0==static_cast&lt;size_t&gt;(a); \</span></div>
+<div class="line"><a name="l00741"></a><span class="lineno"> 741</span>&#160;<span class="preprocessor">}</span></div>
+<div class="line"><a name="l00742"></a><span class="lineno"> 742</span>&#160;<span class="preprocessor"></span></div>
+<div class="line"><a name="l00745"></a><span class="lineno"> 745</span>&#160;<span class="keyword">enum class</span> file_flags : size_t</div>
+<div class="line"><a name="l00746"></a><span class="lineno"> 746</span>&#160;{</div>
+<div class="line"><a name="l00747"></a><span class="lineno"> 747</span>&#160; None=0, </div>
+<div class="line"><a name="l00748"></a><span class="lineno"> 748</span>&#160; Read=1, </div>
+<div class="line"><a name="l00749"></a><span class="lineno"> 749</span>&#160; Write=2, </div>
+<div class="line"><a name="l00750"></a><span class="lineno"> 750</span>&#160; Append=4, </div>
+<div class="line"><a name="l00751"></a><span class="lineno"> 751</span>&#160; Truncate=8, </div>
+<div class="line"><a name="l00752"></a><span class="lineno"> 752</span>&#160; Create=16, </div>
+<div class="line"><a name="l00753"></a><span class="lineno"> 753</span>&#160; CreateOnlyIfNotExist=32, </div>
+<div class="line"><a name="l00754"></a><span class="lineno"> 754</span>&#160; AutoFlush=64, </div>
+<div class="line"><a name="l00755"></a><span class="lineno"> 755</span>&#160; WillBeSequentiallyAccessed=128, </div>
+<div class="line"><a name="l00756"></a><span class="lineno"> 756</span>&#160;</div>
+<div class="line"><a name="l00757"></a><span class="lineno"> 757</span>&#160; OSDirect=(1&lt;&lt;16), </div>
+<div class="line"><a name="l00758"></a><span class="lineno"> 758</span>&#160; OSSync=(1&lt;&lt;17) </div>
+<div class="line"><a name="l00759"></a><span class="lineno"> 759</span>&#160;</div>
+<div class="line"><a name="l00760"></a><span class="lineno"> 760</span>&#160;};</div>
+<div class="line"><a name="l00761"></a><span class="lineno"> 761</span>&#160;ASYNC_FILEIO_DECLARE_CLASS_ENUM_AS_BITFIELD(file_flags)</div>
+<div class="line"><a name="l00762"></a><span class="lineno"> 762</span>&#160;enum class async_op_flags : <span class="keywordtype">size_t</span></div>
+<div class="line"><a name="l00763"></a><span class="lineno"> 763</span>&#160;{</div>
+<div class="line"><a name="l00764"></a><span class="lineno"> 764</span>&#160; None=0, </div>
+<div class="line"><a name="l00765"></a><span class="lineno"> 765</span>&#160; DetachedFuture=1, </div>
+<div class="line"><a name="l00766"></a><span class="lineno"> 766</span>&#160; ImmediateCompletion=2 </div>
+<div class="line"><a name="l00767"></a><span class="lineno"> 767</span>&#160;};</div>
+<div class="line"><a name="l00768"></a><span class="lineno"> 768</span>&#160;ASYNC_FILEIO_DECLARE_CLASS_ENUM_AS_BITFIELD(async_op_flags)</div>
+<div class="line"><a name="l00769"></a><span class="lineno"> 769</span>&#160;</div>
+<div class="line"><a name="l00770"></a><span class="lineno"> 770</span>&#160;</div>
+<div class="line"><a name="l00771"></a><span class="lineno"> 771</span>&#160;</div>
+<div class="line"><a name="l00774"></a><span class="lineno"><a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html"> 774</a></span>&#160;class TRIPLEGIT_ASYNC_FILE_IO_API <a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html" title="Abstract base class for dispatching file i/o asynchronously.">async_file_io_dispatcher_base</a> : public std::enable_shared_from_this&lt;<a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html" title="Abstract base class for dispatching file i/o asynchronously.">async_file_io_dispatcher_base</a>&gt;</div>
+<div class="line"><a name="l00775"></a><span class="lineno"> 775</span>&#160;{</div>
+<div class="line"><a name="l00776"></a><span class="lineno"> 776</span>&#160; <span class="comment">//friend TRIPLEGIT_ASYNC_FILE_IO_API std::shared_ptr&lt;async_file_io_dispatcher_base&gt; async_file_io_dispatcher(thread_pool &amp;threadpool=process_threadpool(), file_flags flagsforce=file_flags::None, file_flags flagsmask=file_flags::None);</span></div>
+<div class="line"><a name="l00777"></a><span class="lineno"> 777</span>&#160; <span class="keyword">friend</span> <span class="keyword">struct </span>detail::async_io_handle_posix;</div>
+<div class="line"><a name="l00778"></a><span class="lineno"> 778</span>&#160; <span class="keyword">friend</span> <span class="keyword">struct </span>detail::async_io_handle_windows;</div>
+<div class="line"><a name="l00779"></a><span class="lineno"> 779</span>&#160; <span class="keyword">friend</span> <span class="keyword">class </span>detail::async_file_io_dispatcher_compat;</div>
+<div class="line"><a name="l00780"></a><span class="lineno"> 780</span>&#160; <span class="keyword">friend</span> <span class="keyword">class </span>detail::async_file_io_dispatcher_windows;</div>
+<div class="line"><a name="l00781"></a><span class="lineno"> 781</span>&#160; <span class="keyword">friend</span> <span class="keyword">class </span>detail::async_file_io_dispatcher_linux;</div>
+<div class="line"><a name="l00782"></a><span class="lineno"> 782</span>&#160; <span class="keyword">friend</span> <span class="keyword">class </span>detail::async_file_io_dispatcher_qnx;</div>
+<div class="line"><a name="l00783"></a><span class="lineno"> 783</span>&#160;</div>
+<div class="line"><a name="l00784"></a><span class="lineno"> 784</span>&#160; detail::async_file_io_dispatcher_base_p *p;</div>
+<div class="line"><a name="l00785"></a><span class="lineno"> 785</span>&#160; <span class="keywordtype">void</span> int_add_io_handle(<span class="keywordtype">void</span> *key, std::shared_ptr&lt;detail::async_io_handle&gt; h);</div>
+<div class="line"><a name="l00786"></a><span class="lineno"> 786</span>&#160; <span class="keywordtype">void</span> int_del_io_handle(<span class="keywordtype">void</span> *key);</div>
+<div class="line"><a name="l00787"></a><span class="lineno"> 787</span>&#160;<span class="keyword">protected</span>:</div>
+<div class="line"><a name="l00788"></a><span class="lineno"> 788</span>&#160; async_file_io_dispatcher_base(<a class="code" href="classtriplegit_1_1async__io_1_1thread__pool.html" title="A very simple thread pool based on Boost.ASIO and std::thread.">thread_pool</a> &amp;threadpool, file_flags flagsforce, file_flags flagsmask);</div>
+<div class="line"><a name="l00789"></a><span class="lineno"> 789</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l00790"></a><span class="lineno"> 790</span>&#160; <span class="keyword">virtual</span> ~async_file_io_dispatcher_base();</div>
+<div class="line"><a name="l00791"></a><span class="lineno"> 791</span>&#160;</div>
+<div class="line"><a name="l00793"></a><span class="lineno"> 793</span>&#160; <a class="code" href="classtriplegit_1_1async__io_1_1thread__pool.html" title="A very simple thread pool based on Boost.ASIO and std::thread.">thread_pool</a> &amp;threadpool() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00795"></a><span class="lineno"> 795</span>&#160; file_flags fileflags(file_flags flags) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00797"></a><span class="lineno"> 797</span>&#160; <span class="keywordtype">size_t</span> wait_queue_depth() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00799"></a><span class="lineno"> 799</span>&#160; <span class="keywordtype">size_t</span> count() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00800"></a><span class="lineno"> 800</span>&#160;</div>
+<div class="line"><a name="l00801"></a><span class="lineno"> 801</span>&#160; <span class="keyword">typedef</span> std::pair&lt;bool, std::shared_ptr&lt;detail::async_io_handle&gt;&gt; completion_returntype;</div>
+<div class="line"><a name="l00802"></a><span class="lineno"> 802</span>&#160; <span class="keyword">typedef</span> completion_returntype completion_t(<span class="keywordtype">size_t</span>, std::shared_ptr&lt;detail::async_io_handle&gt;);</div>
+<div class="line"><a name="l00804"></a><span class="lineno"> 804</span>&#160; std::vector&lt;async_io_op&gt; completion(<span class="keyword">const</span> std::vector&lt;async_io_op&gt; &amp;ops, <span class="keyword">const</span> std::vector&lt;std::pair&lt;async_op_flags, std::function&lt;completion_t&gt;&gt;&gt; &amp;callbacks);</div>
+<div class="line"><a name="l00806"></a><span class="lineno"> 806</span>&#160; <span class="keyword">inline</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a> completion(<span class="keyword">const</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a> &amp;req, <span class="keyword">const</span> std::pair&lt;async_op_flags, std::function&lt;completion_t&gt;&gt; &amp;callback);</div>
+<div class="line"><a name="l00807"></a><span class="lineno"> 807</span>&#160;</div>
+<div class="line"><a name="l00809"></a><span class="lineno"> 809</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> R&gt; <span class="keyword">inline</span> std::pair&lt;std::vector&lt;future&lt;R&gt;&gt;, std::vector&lt;async_io_op&gt;&gt; call(<span class="keyword">const</span> std::vector&lt;async_io_op&gt; &amp;ops, <span class="keyword">const</span> std::vector&lt;std::function&lt;R()&gt;&gt; &amp;callables);</div>
+<div class="line"><a name="l00811"></a><span class="lineno"> 811</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class </span>C, <span class="keyword">class</span>... Args&gt; <span class="keyword">inline</span> std::pair&lt;<a class="code" href="classtriplegit_1_1async__io_1_1future.html" title="For now, this is boost&#39;s future. Will be replaced when C++&#39;s future catches up with boost&#39;s...">future</a>&lt;<span class="keyword">typename</span> std::result_of&lt;C(Args...)&gt;::type&gt;, <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a>&gt; call(<span class="keyword">const</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a> &amp;req, C callback, Args... args);</div>
+<div class="line"><a name="l00812"></a><span class="lineno"> 812</span>&#160;</div>
+<div class="line"><a name="l00814"></a><span class="lineno"> 814</span>&#160; <span class="keyword">virtual</span> std::vector&lt;async_io_op&gt; dir(<span class="keyword">const</span> std::vector&lt;async_path_op_req&gt; &amp;reqs)=0;</div>
+<div class="line"><a name="l00816"></a><span class="lineno"> 816</span>&#160; <span class="keyword">inline</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a> dir(<span class="keyword">const</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__path__op__req.html" title="A convenience bundle of path and flags, with optional precondition.">async_path_op_req</a> &amp;req);</div>
+<div class="line"><a name="l00818"></a><span class="lineno"> 818</span>&#160; <span class="keyword">virtual</span> std::vector&lt;async_io_op&gt; rmdir(<span class="keyword">const</span> std::vector&lt;async_path_op_req&gt; &amp;reqs)=0;</div>
+<div class="line"><a name="l00820"></a><span class="lineno"> 820</span>&#160; <span class="keyword">inline</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a> rmdir(<span class="keyword">const</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__path__op__req.html" title="A convenience bundle of path and flags, with optional precondition.">async_path_op_req</a> &amp;req);</div>
+<div class="line"><a name="l00822"></a><span class="lineno"> 822</span>&#160; <span class="keyword">virtual</span> std::vector&lt;async_io_op&gt; file(<span class="keyword">const</span> std::vector&lt;async_path_op_req&gt; &amp;reqs)=0;</div>
+<div class="line"><a name="l00824"></a><span class="lineno"> 824</span>&#160; <span class="keyword">inline</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a> file(<span class="keyword">const</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__path__op__req.html" title="A convenience bundle of path and flags, with optional precondition.">async_path_op_req</a> &amp;req);</div>
+<div class="line"><a name="l00826"></a><span class="lineno"> 826</span>&#160; <span class="keyword">virtual</span> std::vector&lt;async_io_op&gt; rmfile(<span class="keyword">const</span> std::vector&lt;async_path_op_req&gt; &amp;reqs)=0;</div>
+<div class="line"><a name="l00828"></a><span class="lineno"> 828</span>&#160; <span class="keyword">inline</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a> rmfile(<span class="keyword">const</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__path__op__req.html" title="A convenience bundle of path and flags, with optional precondition.">async_path_op_req</a> &amp;req);</div>
+<div class="line"><a name="l00830"></a><span class="lineno"> 830</span>&#160; <span class="keyword">virtual</span> std::vector&lt;async_io_op&gt; sync(<span class="keyword">const</span> std::vector&lt;async_io_op&gt; &amp;ops)=0;</div>
+<div class="line"><a name="l00832"></a><span class="lineno"> 832</span>&#160; <span class="keyword">inline</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a> sync(<span class="keyword">const</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a> &amp;req);</div>
+<div class="line"><a name="l00834"></a><span class="lineno"> 834</span>&#160; <span class="keyword">virtual</span> std::vector&lt;async_io_op&gt; close(<span class="keyword">const</span> std::vector&lt;async_io_op&gt; &amp;ops)=0;</div>
+<div class="line"><a name="l00836"></a><span class="lineno"> 836</span>&#160; <span class="keyword">inline</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a> close(<span class="keyword">const</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a> &amp;req);</div>
+<div class="line"><a name="l00837"></a><span class="lineno"> 837</span>&#160;</div>
+<div class="line"><a name="l00839"></a><span class="lineno"> 839</span>&#160; <span class="keyword">virtual</span> std::vector&lt;async_io_op&gt; read(<span class="keyword">const</span> std::vector&lt;<a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req&lt;void&gt;</a>&gt; &amp;ops)=0;</div>
+<div class="line"><a name="l00841"></a><span class="lineno"> 841</span>&#160; <span class="keyword">inline</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a> read(<span class="keyword">const</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req&lt;void&gt;</a> &amp;req);</div>
+<div class="line"><a name="l00843"></a><span class="lineno"> 843</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt; <span class="keyword">inline</span> std::vector&lt;async_io_op&gt; read(<span class="keyword">const</span> std::vector&lt;<a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req&lt;T&gt;</a>&gt; &amp;ops);</div>
+<div class="line"><a name="l00845"></a><span class="lineno"> 845</span>&#160; <span class="keyword">virtual</span> std::vector&lt;async_io_op&gt; write(<span class="keyword">const</span> std::vector&lt;<a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req&lt;const void&gt;</a>&gt; &amp;ops)=0;</div>
+<div class="line"><a name="l00847"></a><span class="lineno"> 847</span>&#160; <span class="keyword">inline</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a> write(<span class="keyword">const</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req&lt;const void&gt;</a> &amp;req);</div>
+<div class="line"><a name="l00849"></a><span class="lineno"> 849</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt; <span class="keyword">inline</span> std::vector&lt;async_io_op&gt; write(<span class="keyword">const</span> std::vector&lt;<a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req&lt;T&gt;</a>&gt; &amp;ops);</div>
+<div class="line"><a name="l00850"></a><span class="lineno"> 850</span>&#160;</div>
+<div class="line"><a name="l00852"></a><span class="lineno"> 852</span>&#160; <span class="keyword">inline</span> std::vector&lt;async_io_op&gt; truncate(<span class="keyword">const</span> std::vector&lt;async_io_op&gt; &amp;ops, <span class="keyword">const</span> std::vector&lt;off_t&gt; &amp;sizes);</div>
+<div class="line"><a name="l00854"></a><span class="lineno"> 854</span>&#160; <span class="keyword">inline</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a> truncate(<span class="keyword">const</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a> &amp;op, off_t newsize);</div>
+<div class="line"><a name="l00855"></a><span class="lineno"> 855</span>&#160;<span class="keyword">protected</span>:</div>
+<div class="line"><a name="l00856"></a><span class="lineno"> 856</span>&#160; <span class="keywordtype">void</span> complete_async_op(<span class="keywordtype">size_t</span> <span class="keywordtype">id</span>, std::shared_ptr&lt;detail::async_io_handle&gt; h, <a class="code" href="namespacetriplegit_1_1async__io.html#af28c26398a12ba760165fc40f2a74ca3" title="For now, this is boost&#39;s exception_ptr. Will be replaced when C++&#39;s exception_ptr catches up with boo...">exception_ptr</a> e=<a class="code" href="namespacetriplegit_1_1async__io.html#af28c26398a12ba760165fc40f2a74ca3" title="For now, this is boost&#39;s exception_ptr. Will be replaced when C++&#39;s exception_ptr catches up with boo...">exception_ptr</a>());</div>
+<div class="line"><a name="l00857"></a><span class="lineno"> 857</span>&#160; completion_returntype invoke_user_completion(<span class="keywordtype">size_t</span> <span class="keywordtype">id</span>, std::shared_ptr&lt;detail::async_io_handle&gt; h, std::function&lt;completion_t&gt; callback);</div>
+<div class="line"><a name="l00858"></a><span class="lineno"> 858</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class </span>F, <span class="keyword">class</span>... Args&gt; std::shared_ptr&lt;detail::async_io_handle&gt; invoke_async_op_completions(<span class="keywordtype">size_t</span> <span class="keywordtype">id</span>, std::shared_ptr&lt;detail::async_io_handle&gt; h, completion_returntype (F::*f)(<span class="keywordtype">size_t</span>, std::shared_ptr&lt;detail::async_io_handle&gt;, Args...), Args... args);</div>
+<div class="line"><a name="l00859"></a><span class="lineno"> 859</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class </span>F, <span class="keyword">class</span>... Args&gt; <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a> chain_async_op(detail::immediate_async_ops &amp;immediates, <span class="keywordtype">int</span> optype, <span class="keyword">const</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a> &amp;precondition, async_op_flags flags, completion_returntype (F::*f)(<span class="keywordtype">size_t</span>, std::shared_ptr&lt;detail::async_io_handle&gt;, Args...), Args... args);</div>
+<div class="line"><a name="l00860"></a><span class="lineno"> 860</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> F, <span class="keyword">class</span> T&gt; std::vector&lt;async_io_op&gt; chain_async_ops(<span class="keywordtype">int</span> optype, <span class="keyword">const</span> std::vector&lt;T&gt; &amp;container, async_op_flags flags, completion_returntype (F::*f)(<span class="keywordtype">size_t</span>, std::shared_ptr&lt;detail::async_io_handle&gt;, T));</div>
+<div class="line"><a name="l00861"></a><span class="lineno"> 861</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> F&gt; std::vector&lt;async_io_op&gt; chain_async_ops(<span class="keywordtype">int</span> optype, <span class="keyword">const</span> std::vector&lt;async_path_op_req&gt; &amp;container, async_op_flags flags, completion_returntype (F::*f)(<span class="keywordtype">size_t</span>, std::shared_ptr&lt;detail::async_io_handle&gt;, <a class="code" href="structtriplegit_1_1async__io_1_1async__path__op__req.html" title="A convenience bundle of path and flags, with optional precondition.">async_path_op_req</a>));</div>
+<div class="line"><a name="l00862"></a><span class="lineno"> 862</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> F, <span class="keyword">class</span> T&gt; std::vector&lt;async_io_op&gt; chain_async_ops(<span class="keywordtype">int</span> optype, <span class="keyword">const</span> std::vector&lt;<a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req&lt;T&gt;</a>&gt; &amp;container, async_op_flags flags, completion_returntype (F::*f)(<span class="keywordtype">size_t</span>, std::shared_ptr&lt;detail::async_io_handle&gt;, <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req&lt;T&gt;</a>));</div>
+<div class="line"><a name="l00863"></a><span class="lineno"> 863</span>&#160;};</div>
+<div class="line"><a name="l00872"></a><span class="lineno"> 872</span>&#160;<span class="keyword">extern</span> TRIPLEGIT_ASYNC_FILE_IO_API std::shared_ptr&lt;async_file_io_dispatcher_base&gt; <a class="code" href="namespacetriplegit_1_1async__io.html#afa6da488279e514281ae9d5904d8d426" title="Instatiates the best available async_file_io_dispatcher implementation for this system.">async_file_io_dispatcher</a>(<a class="code" href="classtriplegit_1_1async__io_1_1thread__pool.html" title="A very simple thread pool based on Boost.ASIO and std::thread.">thread_pool</a> &amp;threadpool=<a class="code" href="namespacetriplegit_1_1async__io.html#a6743cd614fc8161dfce94144c36cfb85" title="Returns the process threadpool.">process_threadpool</a>(), file_flags flagsforce=file_flags::None, file_flags flagsmask=file_flags::None);</div>
+<div class="line"><a name="l00873"></a><span class="lineno"> 873</span>&#160;</div>
+<div class="line"><a name="l00877"></a><span class="lineno"><a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html"> 877</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a></div>
+<div class="line"><a name="l00878"></a><span class="lineno"> 878</span>&#160;{</div>
+<div class="line"><a name="l00879"></a><span class="lineno"><a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html#aa7f06f1a66943a0557c8a52c58b39bd6"> 879</a></span>&#160; std::shared_ptr&lt;async_file_io_dispatcher_base&gt; <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html#aa7f06f1a66943a0557c8a52c58b39bd6" title="The parent dispatcher.">parent</a>; </div>
+<div class="line"><a name="l00880"></a><span class="lineno"><a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html#af303d1a104de71b2c6c6b2ce47d514c6"> 880</a></span>&#160; <span class="keywordtype">size_t</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html#af303d1a104de71b2c6c6b2ce47d514c6" title="A unique id for this operation.">id</a>; </div>
+<div class="line"><a name="l00881"></a><span class="lineno"><a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html#a64a2053bd93c75a0a77261ff8402f817"> 881</a></span>&#160; <a class="code" href="classtriplegit_1_1async__io_1_1shared__future.html" title="For now, this is boost&#39;s shared_future. Will be replaced when C++&#39;s shared_future catches up with boo...">shared_future&lt;std::shared_ptr&lt;detail::async_io_handle&gt;</a>&gt; <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html#a64a2053bd93c75a0a77261ff8402f817" title="A future handle to the item being operated upon.">h</a>; </div>
+<div class="line"><a name="l00882"></a><span class="lineno"> 882</span>&#160;</div>
+<div class="line"><a name="l00883"></a><span class="lineno"> 883</span>&#160; <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a>() : <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html#af303d1a104de71b2c6c6b2ce47d514c6" title="A unique id for this operation.">id</a>(0) { }</div>
+<div class="line"><a name="l00884"></a><span class="lineno"> 884</span>&#160; <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a>(<span class="keyword">const</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a> &amp;o) : <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html#aa7f06f1a66943a0557c8a52c58b39bd6" title="The parent dispatcher.">parent</a>(o.<a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html#aa7f06f1a66943a0557c8a52c58b39bd6" title="The parent dispatcher.">parent</a>), <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html#af303d1a104de71b2c6c6b2ce47d514c6" title="A unique id for this operation.">id</a>(o.<a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html#af303d1a104de71b2c6c6b2ce47d514c6" title="A unique id for this operation.">id</a>), <a class="c
ode" href="structtriplegit_1_1async__io_1_1async__io__op.html#a64a2053bd93c75a0a77261ff8402f817" title="A future handle to the item being operated upon.">h</a>(o.<a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html#a64a2053bd93c75a0a77261ff8402f817" title="A future handle to the item being operated upon.">h</a>) { }</div>
+<div class="line"><a name="l00885"></a><span class="lineno"> 885</span>&#160; async_io_op(async_io_op &amp;&amp;o) : <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html#aa7f06f1a66943a0557c8a52c58b39bd6" title="The parent dispatcher.">parent</a>(std::move(o.<a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html#aa7f06f1a66943a0557c8a52c58b39bd6" title="The parent dispatcher.">parent</a>)), <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html#af303d1a104de71b2c6c6b2ce47d514c6" title="A unique id for this operation.">id</a>(std::move(o.<a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html#af303d1a104de71b2c6c6b2ce47d514c6" title="A unique id for this operation.">id</a>)), <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html#a64a2053bd93c75a0a77261ff8402f817" title="A future handle to the item being operated upon.">h</a>(std::move(o.<a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html#a64a2
053bd93c75a0a77261ff8402f817" title="A future handle to the item being operated upon.">h</a>)) { }</div>
+<div class="line"><a name="l00886"></a><span class="lineno"> 886</span>&#160; async_io_op(std::shared_ptr&lt;async_file_io_dispatcher_base&gt; _parent, <span class="keywordtype">size_t</span> _id, shared_future&lt;std::shared_ptr&lt;detail::async_io_handle&gt;&gt; _handle) : <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html#aa7f06f1a66943a0557c8a52c58b39bd6" title="The parent dispatcher.">parent</a>(_parent), <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html#af303d1a104de71b2c6c6b2ce47d514c6" title="A unique id for this operation.">id</a>(_id), <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html#a64a2053bd93c75a0a77261ff8402f817" title="A future handle to the item being operated upon.">h</a>(std::move(_handle)) { }</div>
+<div class="line"><a name="l00887"></a><span class="lineno"> 887</span>&#160; async_io_op(std::shared_ptr&lt;async_file_io_dispatcher_base&gt; _parent, <span class="keywordtype">size_t</span> _id) : <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html#aa7f06f1a66943a0557c8a52c58b39bd6" title="The parent dispatcher.">parent</a>(_parent), <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html#af303d1a104de71b2c6c6b2ce47d514c6" title="A unique id for this operation.">id</a>(_id) { }</div>
+<div class="line"><a name="l00888"></a><span class="lineno"> 888</span>&#160; async_io_op &amp;operator=(<span class="keyword">const</span> async_io_op &amp;o) { <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html#aa7f06f1a66943a0557c8a52c58b39bd6" title="The parent dispatcher.">parent</a>=o.parent; <span class="keywordtype">id</span>=o.id; <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html#a64a2053bd93c75a0a77261ff8402f817" title="A future handle to the item being operated upon.">h</a>=o.h; <span class="keywordflow">return</span> *<span class="keyword">this</span>; }</div>
+<div class="line"><a name="l00889"></a><span class="lineno"> 889</span>&#160; async_io_op &amp;operator=(async_io_op &amp;&amp;o) { <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html#aa7f06f1a66943a0557c8a52c58b39bd6" title="The parent dispatcher.">parent</a>=std::move(o.parent); <span class="keywordtype">id</span>=std::move(o.id); <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html#a64a2053bd93c75a0a77261ff8402f817" title="A future handle to the item being operated upon.">h</a>=std::move(o.h); <span class="keywordflow">return</span> *<span class="keyword">this</span>; }</div>
+<div class="line"><a name="l00890"></a><span class="lineno"> 890</span>&#160;};</div>
+<div class="line"><a name="l00891"></a><span class="lineno"> 891</span>&#160;</div>
+<div class="line"><a name="l00892"></a><span class="lineno"> 892</span>&#160;<span class="keyword">namespace </span>detail</div>
+<div class="line"><a name="l00893"></a><span class="lineno"> 893</span>&#160;{</div>
+<div class="line"><a name="l00894"></a><span class="lineno"> 894</span>&#160; <span class="keyword">struct </span>when_all_count_completed_state</div>
+<div class="line"><a name="l00895"></a><span class="lineno"> 895</span>&#160; {</div>
+<div class="line"><a name="l00896"></a><span class="lineno"> 896</span>&#160; std::atomic&lt;size_t&gt; togo;</div>
+<div class="line"><a name="l00897"></a><span class="lineno"> 897</span>&#160; std::vector&lt;std::shared_ptr&lt;detail::async_io_handle&gt;&gt; out;</div>
+<div class="line"><a name="l00898"></a><span class="lineno"> 898</span>&#160; promise&lt;std::vector&lt;std::shared_ptr&lt;detail::async_io_handle&gt;&gt;&gt; done;</div>
+<div class="line"><a name="l00899"></a><span class="lineno"> 899</span>&#160; when_all_count_completed_state(<span class="keywordtype">size_t</span> outsize) : togo(outsize), out(outsize) { }</div>
+<div class="line"><a name="l00900"></a><span class="lineno"> 900</span>&#160; };</div>
+<div class="line"><a name="l00901"></a><span class="lineno"> 901</span>&#160; <span class="keyword">inline</span> async_file_io_dispatcher_base::completion_returntype when_all_count_completed_nothrow(<span class="keywordtype">size_t</span>, std::shared_ptr&lt;detail::async_io_handle&gt; h, std::shared_ptr&lt;detail::when_all_count_completed_state&gt; state, <span class="keywordtype">size_t</span> idx)</div>
+<div class="line"><a name="l00902"></a><span class="lineno"> 902</span>&#160; {</div>
+<div class="line"><a name="l00903"></a><span class="lineno"> 903</span>&#160; state-&gt;out[idx]=h; <span class="comment">// This might look thread unsafe, but each idx is unique</span></div>
+<div class="line"><a name="l00904"></a><span class="lineno"> 904</span>&#160; <span class="keywordflow">if</span>(!--state-&gt;togo)</div>
+<div class="line"><a name="l00905"></a><span class="lineno"> 905</span>&#160; state-&gt;done.set_value(state-&gt;out);</div>
+<div class="line"><a name="l00906"></a><span class="lineno"> 906</span>&#160; <span class="keywordflow">return</span> std::make_pair(<span class="keyword">true</span>, h);</div>
+<div class="line"><a name="l00907"></a><span class="lineno"> 907</span>&#160; }</div>
+<div class="line"><a name="l00908"></a><span class="lineno"> 908</span>&#160; <span class="keyword">inline</span> async_file_io_dispatcher_base::completion_returntype when_all_count_completed(<span class="keywordtype">size_t</span>, std::shared_ptr&lt;detail::async_io_handle&gt; h, std::shared_ptr&lt;detail::when_all_count_completed_state&gt; state, <span class="keywordtype">size_t</span> idx)</div>
+<div class="line"><a name="l00909"></a><span class="lineno"> 909</span>&#160; {</div>
+<div class="line"><a name="l00910"></a><span class="lineno"> 910</span>&#160; state-&gt;out[idx]=h; <span class="comment">// This might look thread unsafe, but each idx is unique</span></div>
+<div class="line"><a name="l00911"></a><span class="lineno"> 911</span>&#160; <span class="keywordflow">if</span>(!--state-&gt;togo)</div>
+<div class="line"><a name="l00912"></a><span class="lineno"> 912</span>&#160; {</div>
+<div class="line"><a name="l00913"></a><span class="lineno"> 913</span>&#160; <span class="keywordtype">bool</span> done=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00914"></a><span class="lineno"> 914</span>&#160; <span class="keywordflow">try</span></div>
+<div class="line"><a name="l00915"></a><span class="lineno"> 915</span>&#160; {</div>
+<div class="line"><a name="l00916"></a><span class="lineno"> 916</span>&#160; <span class="keywordflow">for</span>(<span class="keyword">auto</span> &amp;i : state-&gt;out)</div>
+<div class="line"><a name="l00917"></a><span class="lineno"> 917</span>&#160; i.get();</div>
+<div class="line"><a name="l00918"></a><span class="lineno"> 918</span>&#160; }</div>
+<div class="line"><a name="l00919"></a><span class="lineno"> 919</span>&#160;<span class="preprocessor">#ifdef _MSC_VER</span></div>
+<div class="line"><a name="l00920"></a><span class="lineno"> 920</span>&#160;<span class="preprocessor"></span> <span class="keywordflow">catch</span>(<span class="keyword">const</span> std::exception &amp;)</div>
+<div class="line"><a name="l00921"></a><span class="lineno"> 921</span>&#160;<span class="preprocessor">#else</span></div>
+<div class="line"><a name="l00922"></a><span class="lineno"> 922</span>&#160;<span class="preprocessor"></span> <span class="keywordflow">catch</span>(...)</div>
+<div class="line"><a name="l00923"></a><span class="lineno"> 923</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l00924"></a><span class="lineno"> 924</span>&#160;<span class="preprocessor"></span> {</div>
+<div class="line"><a name="l00925"></a><span class="lineno"> 925</span>&#160; <a class="code" href="namespacetriplegit_1_1async__io.html#af28c26398a12ba760165fc40f2a74ca3" title="For now, this is boost&#39;s exception_ptr. Will be replaced when C++&#39;s exception_ptr catches up with boo...">exception_ptr</a> e(async_io::make_exception_ptr(current_exception()));</div>
+<div class="line"><a name="l00926"></a><span class="lineno"> 926</span>&#160; state-&gt;done.set_exception(e);</div>
+<div class="line"><a name="l00927"></a><span class="lineno"> 927</span>&#160; done=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00928"></a><span class="lineno"> 928</span>&#160; }</div>
+<div class="line"><a name="l00929"></a><span class="lineno"> 929</span>&#160; <span class="keywordflow">if</span>(!done)</div>
+<div class="line"><a name="l00930"></a><span class="lineno"> 930</span>&#160; state-&gt;done.set_value(state-&gt;out);</div>
+<div class="line"><a name="l00931"></a><span class="lineno"> 931</span>&#160; }</div>
+<div class="line"><a name="l00932"></a><span class="lineno"> 932</span>&#160; <span class="keywordflow">return</span> std::make_pair(<span class="keyword">true</span>, h);</div>
+<div class="line"><a name="l00933"></a><span class="lineno"> 933</span>&#160; }</div>
+<div class="line"><a name="l00934"></a><span class="lineno"> 934</span>&#160;}</div>
+<div class="line"><a name="l00935"></a><span class="lineno"> 935</span>&#160;</div>
+<div class="line"><a name="l00937"></a><span class="lineno"><a class="code" href="namespacetriplegit_1_1async__io.html#ae692c0402d30c1350b8475c8d9c42c69"> 937</a></span>&#160;<span class="keyword">inline</span> <a class="code" href="classtriplegit_1_1async__io_1_1future.html" title="For now, this is boost&#39;s future. Will be replaced when C++&#39;s future catches up with boost&#39;s...">future&lt;std::vector&lt;std::shared_ptr&lt;detail::async_io_handle&gt;</a>&gt;&gt; <a class="code" href="namespacetriplegit_1_1async__io.html#afc5e0576470c19d979b3b853305fc7d6" title="Returns a future vector of results from all the supplied futures.">when_all</a>(std::nothrow_t, std::vector&lt;async_io_op&gt;::iterator first, std::vector&lt;async_io_op&gt;::iterator last)</div>
+<div class="line"><a name="l00938"></a><span class="lineno"> 938</span>&#160;{</div>
+<div class="line"><a name="l00939"></a><span class="lineno"> 939</span>&#160; <span class="keywordflow">if</span>(first==last)</div>
+<div class="line"><a name="l00940"></a><span class="lineno"> 940</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classtriplegit_1_1async__io_1_1future.html" title="For now, this is boost&#39;s future. Will be replaced when C++&#39;s future catches up with boost&#39;s...">future&lt;std::vector&lt;std::shared_ptr&lt;detail::async_io_handle&gt;</a>&gt;&gt;();</div>
+<div class="line"><a name="l00941"></a><span class="lineno"> 941</span>&#160; std::vector&lt;async_io_op&gt; inputs(first, last);</div>
+<div class="line"><a name="l00942"></a><span class="lineno"> 942</span>&#160; std::shared_ptr&lt;detail::when_all_count_completed_state&gt; state(<span class="keyword">new</span> detail::when_all_count_completed_state(inputs.size()));</div>
+<div class="line"><a name="l00943"></a><span class="lineno"> 943</span>&#160; std::vector&lt;std::pair&lt;async_op_flags, std::function&lt;async_file_io_dispatcher_base::completion_t&gt;&gt;&gt; callbacks;</div>
+<div class="line"><a name="l00944"></a><span class="lineno"> 944</span>&#160; callbacks.reserve(inputs.size());</div>
+<div class="line"><a name="l00945"></a><span class="lineno"> 945</span>&#160; <span class="keywordtype">size_t</span> idx=0;</div>
+<div class="line"><a name="l00946"></a><span class="lineno"> 946</span>&#160; <span class="keywordflow">for</span>(<span class="keyword">auto</span> &amp;i : inputs)</div>
+<div class="line"><a name="l00947"></a><span class="lineno"> 947</span>&#160; callbacks.push_back(std::make_pair(async_op_flags::ImmediateCompletion, std::bind(&amp;detail::when_all_count_completed_nothrow, std::placeholders::_1, std::placeholders::_2, state, idx++)));</div>
+<div class="line"><a name="l00948"></a><span class="lineno"> 948</span>&#160; inputs.front().parent-&gt;completion(inputs, callbacks);</div>
+<div class="line"><a name="l00949"></a><span class="lineno"> 949</span>&#160; <span class="keywordflow">return</span> state-&gt;done.get_future();</div>
+<div class="line"><a name="l00950"></a><span class="lineno"> 950</span>&#160;}</div>
+<div class="line"><a name="l00952"></a><span class="lineno"><a class="code" href="namespacetriplegit_1_1async__io.html#ab4c882426142e8f23d1e37d2835035fa"> 952</a></span>&#160;<span class="keyword">inline</span> <a class="code" href="classtriplegit_1_1async__io_1_1future.html" title="For now, this is boost&#39;s future. Will be replaced when C++&#39;s future catches up with boost&#39;s...">future&lt;std::vector&lt;std::shared_ptr&lt;detail::async_io_handle&gt;</a>&gt;&gt; <a class="code" href="namespacetriplegit_1_1async__io.html#afc5e0576470c19d979b3b853305fc7d6" title="Returns a future vector of results from all the supplied futures.">when_all</a>(std::vector&lt;async_io_op&gt;::iterator first, std::vector&lt;async_io_op&gt;::iterator last)</div>
+<div class="line"><a name="l00953"></a><span class="lineno"> 953</span>&#160;{</div>
+<div class="line"><a name="l00954"></a><span class="lineno"> 954</span>&#160; <span class="keywordflow">if</span>(first==last)</div>
+<div class="line"><a name="l00955"></a><span class="lineno"> 955</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classtriplegit_1_1async__io_1_1future.html" title="For now, this is boost&#39;s future. Will be replaced when C++&#39;s future catches up with boost&#39;s...">future&lt;std::vector&lt;std::shared_ptr&lt;detail::async_io_handle&gt;</a>&gt;&gt;();</div>
+<div class="line"><a name="l00956"></a><span class="lineno"> 956</span>&#160; std::vector&lt;async_io_op&gt; inputs(first, last);</div>
+<div class="line"><a name="l00957"></a><span class="lineno"> 957</span>&#160; std::shared_ptr&lt;detail::when_all_count_completed_state&gt; state(<span class="keyword">new</span> detail::when_all_count_completed_state(inputs.size()));</div>
+<div class="line"><a name="l00958"></a><span class="lineno"> 958</span>&#160; std::vector&lt;std::pair&lt;async_op_flags, std::function&lt;async_file_io_dispatcher_base::completion_t&gt;&gt;&gt; callbacks;</div>
+<div class="line"><a name="l00959"></a><span class="lineno"> 959</span>&#160; callbacks.reserve(inputs.size());</div>
+<div class="line"><a name="l00960"></a><span class="lineno"> 960</span>&#160; <span class="keywordtype">size_t</span> idx=0;</div>
+<div class="line"><a name="l00961"></a><span class="lineno"> 961</span>&#160; <span class="keywordflow">for</span>(<span class="keyword">auto</span> &amp;i : inputs)</div>
+<div class="line"><a name="l00962"></a><span class="lineno"> 962</span>&#160; callbacks.push_back(std::make_pair(async_op_flags::ImmediateCompletion, std::bind(&amp;detail::when_all_count_completed, std::placeholders::_1, std::placeholders::_2, state, idx++)));</div>
+<div class="line"><a name="l00963"></a><span class="lineno"> 963</span>&#160; inputs.front().parent-&gt;completion(inputs, callbacks);</div>
+<div class="line"><a name="l00964"></a><span class="lineno"> 964</span>&#160; <span class="keywordflow">return</span> state-&gt;done.get_future();</div>
+<div class="line"><a name="l00965"></a><span class="lineno"> 965</span>&#160;}</div>
+<div class="line"><a name="l00967"></a><span class="lineno"><a class="code" href="namespacetriplegit_1_1async__io.html#abb978d2fbe374855ddd0e539f38e5316"> 967</a></span>&#160;<span class="keyword">inline</span> <a class="code" href="classtriplegit_1_1async__io_1_1future.html" title="For now, this is boost&#39;s future. Will be replaced when C++&#39;s future catches up with boost&#39;s...">future&lt;std::vector&lt;std::shared_ptr&lt;detail::async_io_handle&gt;</a>&gt;&gt; <a class="code" href="namespacetriplegit_1_1async__io.html#afc5e0576470c19d979b3b853305fc7d6" title="Returns a future vector of results from all the supplied futures.">when_all</a>(std::nothrow_t _, std::initializer_list&lt;async_io_op&gt; _ops)</div>
+<div class="line"><a name="l00968"></a><span class="lineno"> 968</span>&#160;{</div>
+<div class="line"><a name="l00969"></a><span class="lineno"> 969</span>&#160; std::vector&lt;async_io_op&gt; ops;</div>
+<div class="line"><a name="l00970"></a><span class="lineno"> 970</span>&#160; ops.reserve(_ops.size());</div>
+<div class="line"><a name="l00971"></a><span class="lineno"> 971</span>&#160; <span class="keywordflow">for</span>(<span class="keyword">auto</span> &amp;&amp;i : _ops)</div>
+<div class="line"><a name="l00972"></a><span class="lineno"> 972</span>&#160; ops.push_back(std::move(i));</div>
+<div class="line"><a name="l00973"></a><span class="lineno"> 973</span>&#160; <span class="keywordflow">return</span> <a class="code" href="namespacetriplegit_1_1async__io.html#afc5e0576470c19d979b3b853305fc7d6" title="Returns a future vector of results from all the supplied futures.">when_all</a>(_, ops.begin(), ops.end());</div>
+<div class="line"><a name="l00974"></a><span class="lineno"> 974</span>&#160;}</div>
+<div class="line"><a name="l00976"></a><span class="lineno"><a class="code" href="namespacetriplegit_1_1async__io.html#a0503557b870c07ccf9e43f4e3096c446"> 976</a></span>&#160;<span class="keyword">inline</span> <a class="code" href="classtriplegit_1_1async__io_1_1future.html" title="For now, this is boost&#39;s future. Will be replaced when C++&#39;s future catches up with boost&#39;s...">future&lt;std::vector&lt;std::shared_ptr&lt;detail::async_io_handle&gt;</a>&gt;&gt; <a class="code" href="namespacetriplegit_1_1async__io.html#afc5e0576470c19d979b3b853305fc7d6" title="Returns a future vector of results from all the supplied futures.">when_all</a>(std::initializer_list&lt;async_io_op&gt; _ops)</div>
+<div class="line"><a name="l00977"></a><span class="lineno"> 977</span>&#160;{</div>
+<div class="line"><a name="l00978"></a><span class="lineno"> 978</span>&#160; std::vector&lt;async_io_op&gt; ops;</div>
+<div class="line"><a name="l00979"></a><span class="lineno"> 979</span>&#160; ops.reserve(_ops.size());</div>
+<div class="line"><a name="l00980"></a><span class="lineno"> 980</span>&#160; <span class="keywordflow">for</span>(<span class="keyword">auto</span> &amp;&amp;i : _ops)</div>
+<div class="line"><a name="l00981"></a><span class="lineno"> 981</span>&#160; ops.push_back(std::move(i));</div>
+<div class="line"><a name="l00982"></a><span class="lineno"> 982</span>&#160; <span class="keywordflow">return</span> <a class="code" href="namespacetriplegit_1_1async__io.html#afc5e0576470c19d979b3b853305fc7d6" title="Returns a future vector of results from all the supplied futures.">when_all</a>(ops.begin(), ops.end());</div>
+<div class="line"><a name="l00983"></a><span class="lineno"> 983</span>&#160;}</div>
+<div class="line"><a name="l00984"></a><span class="lineno"> 984</span>&#160;</div>
+<div class="line"><a name="l00988"></a><span class="lineno"><a class="code" href="structtriplegit_1_1async__io_1_1async__path__op__req.html"> 988</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structtriplegit_1_1async__io_1_1async__path__op__req.html" title="A convenience bundle of path and flags, with optional precondition.">async_path_op_req</a></div>
+<div class="line"><a name="l00989"></a><span class="lineno"> 989</span>&#160;{</div>
+<div class="line"><a name="l00990"></a><span class="lineno"> 990</span>&#160; std::filesystem::path path;</div>
+<div class="line"><a name="l00991"></a><span class="lineno"> 991</span>&#160; file_flags flags;</div>
+<div class="line"><a name="l00992"></a><span class="lineno"> 992</span>&#160; <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a> precondition;</div>
+<div class="line"><a name="l00993"></a><span class="lineno"> 993</span>&#160; <a class="code" href="structtriplegit_1_1async__io_1_1async__path__op__req.html" title="A convenience bundle of path and flags, with optional precondition.">async_path_op_req</a>() { }</div>
+<div class="line"><a name="l00995"></a><span class="lineno"><a class="code" href="structtriplegit_1_1async__io_1_1async__path__op__req.html#a140edf74812e339fea7051df405fc56c"> 995</a></span>&#160; <a class="code" href="structtriplegit_1_1async__io_1_1async__path__op__req.html#a140edf74812e339fea7051df405fc56c" title="Fails is path is not absolute.">async_path_op_req</a>(std::filesystem::path _path, file_flags _flags=file_flags::None) : path(_path), flags(_flags) { <span class="keywordflow">if</span>(!path.is_absolute()) <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">&quot;Non-absolute path&quot;</span>); }</div>
+<div class="line"><a name="l00997"></a><span class="lineno"><a class="code" href="structtriplegit_1_1async__io_1_1async__path__op__req.html#a5c35e56a49e31f12603b2cbbb1ffdae3"> 997</a></span>&#160; <a class="code" href="structtriplegit_1_1async__io_1_1async__path__op__req.html#a5c35e56a49e31f12603b2cbbb1ffdae3" title="Fails is path is not absolute.">async_path_op_req</a>(<a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a> _precondition, std::filesystem::path _path, file_flags _flags=file_flags::None) : path(_path), flags(_flags), precondition(std::move(_precondition)) { <span class="keywordflow">if</span>(!path.is_absolute()) <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">&quot;Non-absolute path&quot;</span>); }</div>
+<div class="line"><a name="l00999"></a><span class="lineno"><a class="code" href="structtriplegit_1_1async__io_1_1async__path__op__req.html#a2698273a17aede1d349179906511fc2f"> 999</a></span>&#160; <a class="code" href="structtriplegit_1_1async__io_1_1async__path__op__req.html#a2698273a17aede1d349179906511fc2f" title="Constructs on the basis of a string. make_preferred() and absolute() are called in this case...">async_path_op_req</a>(std::string _path, file_flags _flags=file_flags::None) : path(std::filesystem::absolute(std::filesystem::path(_path).make_preferred())), flags(_flags) { }</div>
+<div class="line"><a name="l01001"></a><span class="lineno"><a class="code" href="structtriplegit_1_1async__io_1_1async__path__op__req.html#a1a92f25371984a7476f3d13530b6f1cd"> 1001</a></span>&#160; <a class="code" href="structtriplegit_1_1async__io_1_1async__path__op__req.html#a1a92f25371984a7476f3d13530b6f1cd" title="Constructs on the basis of a string. make_preferred() and absolute() are called in this case...">async_path_op_req</a>(<a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a> _precondition, std::string _path, file_flags _flags=file_flags::None) : path(std::filesystem::absolute(std::filesystem::path(_path).make_preferred())), flags(_flags), precondition(std::move(_precondition)) { }</div>
+<div class="line"><a name="l01003"></a><span class="lineno"><a class="code" href="structtriplegit_1_1async__io_1_1async__path__op__req.html#a69fbf4bfcba29f732802abe554727484"> 1003</a></span>&#160; <a class="code" href="structtriplegit_1_1async__io_1_1async__path__op__req.html#a69fbf4bfcba29f732802abe554727484" title="Constructs on the basis of a string. make_preferred() and absolute() are called in this case...">async_path_op_req</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *_path, file_flags _flags=file_flags::None) : path(std::filesystem::absolute(std::filesystem::path(_path).make_preferred())), flags(_flags) { }</div>
+<div class="line"><a name="l01005"></a><span class="lineno"><a class="code" href="structtriplegit_1_1async__io_1_1async__path__op__req.html#a8da200394b59be098d23e4db27b7f80f"> 1005</a></span>&#160; <a class="code" href="structtriplegit_1_1async__io_1_1async__path__op__req.html#a8da200394b59be098d23e4db27b7f80f" title="Constructs on the basis of a string. make_preferred() and absolute() are called in this case...">async_path_op_req</a>(<a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a> _precondition, <span class="keyword">const</span> <span class="keywordtype">char</span> *_path, file_flags _flags=file_flags::None) : path(std::filesystem::absolute(std::filesystem::path(_path).make_preferred())), flags(_flags), precondition(std::move(_precondition)) { }</div>
+<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>&#160;};</div>
+<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>&#160;</div>
+<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>&#160;<span class="keyword">template</span>&lt;&gt; <span class="keyword">struct </span>async_data_op_req&lt;void&gt; <span class="comment">// For reading</span></div>
+<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>&#160;{</div>
+<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>&#160; async_io_op precondition;</div>
+<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>&#160; std::vector&lt;boost::asio::mutable_buffer&gt; buffers;</div>
+<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>&#160; off_t where;</div>
+<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>&#160; async_data_op_req() { }</div>
+<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>&#160; async_data_op_req(<span class="keyword">const</span> async_data_op_req &amp;o) : precondition(o.precondition), buffers(o.buffers), where(o.where) { }</div>
+<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>&#160; async_data_op_req(async_data_op_req &amp;&amp;o) : precondition(std::move(o.precondition)), buffers(std::move(o.buffers)), where(std::move(o.where)) { }</div>
+<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>&#160; async_data_op_req(async_io_op _precondition, <span class="keywordtype">void</span> *_buffer, <span class="keywordtype">size_t</span> _length, off_t _where) : precondition(std::move(_precondition)), where(_where) { buffers.reserve(1); buffers.push_back(boost::asio::mutable_buffer(_buffer, _length)); }</div>
+<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>&#160; async_data_op_req(async_io_op _precondition, std::vector&lt;boost::asio::mutable_buffer&gt; _buffers, off_t _where) : precondition(std::move(_precondition)), buffers(_buffers), where(_where) { }</div>
+<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>&#160;};</div>
+<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>&#160;<span class="keyword">template</span>&lt;&gt; <span class="keyword">struct </span>async_data_op_req&lt;const void&gt; <span class="comment">// For writing</span></div>
+<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>&#160;{</div>
+<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>&#160; async_io_op precondition;</div>
+<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>&#160; std::vector&lt;boost::asio::const_buffer&gt; buffers;</div>
+<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>&#160; off_t where;</div>
+<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>&#160; async_data_op_req() { }</div>
+<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>&#160; async_data_op_req(<span class="keyword">const</span> async_data_op_req &amp;o) : precondition(o.precondition), buffers(o.buffers), where(o.where) { }</div>
+<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>&#160; async_data_op_req(async_data_op_req &amp;&amp;o) : precondition(std::move(o.precondition)), buffers(std::move(o.buffers)), where(std::move(o.where)) { }</div>
+<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>&#160; async_data_op_req(<span class="keyword">const</span> async_data_op_req&lt;void&gt; &amp;o) : precondition(o.precondition), where(o.where) { buffers.reserve(o.buffers.capacity()); <span class="keywordflow">for</span>(<span class="keyword">auto</span> &amp;i: o.buffers) buffers.push_back(i); }</div>
+<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>&#160; async_data_op_req(async_data_op_req&lt;void&gt; &amp;&amp;o) : precondition(std::move(o.precondition)), where(o.where) { buffers.reserve(o.buffers.capacity()); <span class="keywordflow">for</span>(<span class="keyword">auto</span> &amp;&amp;i: o.buffers) buffers.push_back(std::move(i)); }</div>
+<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>&#160; async_data_op_req(async_io_op _precondition, <span class="keyword">const</span> <span class="keywordtype">void</span> *_buffer, <span class="keywordtype">size_t</span> _length, off_t _where) : precondition(std::move(_precondition)), where(_where) { buffers.reserve(1); buffers.push_back(boost::asio::const_buffer(_buffer, _length)); }</div>
+<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>&#160; async_data_op_req(async_io_op _precondition, std::vector&lt;boost::asio::const_buffer&gt; _buffers, off_t _where) : precondition(std::move(_precondition)), buffers(_buffers), where(_where) { }</div>
+<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>&#160;};</div>
+<div class="line"><a name="l01036"></a><span class="lineno"><a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html"> 1036</a></span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt; <span class="keyword">struct </span><a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req</a> : <span class="keyword">public</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req</a>&lt;void&gt;</div>
+<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>&#160;{</div>
+<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>&#160; <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req</a>() { }</div>
+<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>&#160; <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req</a>(<span class="keyword">const</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req</a> &amp;o) : <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req&lt;void&gt;</a>(o) { }</div>
+<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>&#160; <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req</a>(<a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req</a> &amp;&amp;o) : <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req&lt;void&gt;</a>(std::move(o)) { }</div>
+<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>&#160; <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req</a>(<a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a> _precondition, T *_buffer, <span class="keywordtype">size_t</span> _length, off_t _where) : <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req&lt;void&gt;</a>(std::move(_precondition), <span class="keyword">static_cast&lt;</span><span class="keywordtype">void</span> *<span class="keyword">&gt;</span>(_buffer), _length, _where) { }</div>
+<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>&#160;};</div>
+<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt; <span class="keyword">struct </span><a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req</a>&lt;const T&gt; : <span class="keyword">public</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req</a>&lt;const void&gt;</div>
+<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>&#160;{</div>
+<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>&#160; <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req</a>() { }</div>
+<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>&#160; async_data_op_req(<span class="keyword">const</span> async_data_op_req &amp;o) : async_data_op_req&lt;const void&gt;(o) { }</div>
+<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>&#160; async_data_op_req(async_data_op_req &amp;&amp;o) : async_data_op_req&lt;const void&gt;(std::move(o)) { }</div>
+<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>&#160; async_data_op_req(<span class="keyword">const</span> async_data_op_req&lt;T&gt; &amp;o) : async_data_op_req&lt;const void&gt;(o) { }</div>
+<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>&#160; async_data_op_req(async_data_op_req&lt;T&gt; &amp;&amp;o) : async_data_op_req&lt;const void&gt;(std::move(o)) { }</div>
+<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>&#160; async_data_op_req(async_io_op _precondition, <span class="keyword">const</span> T *_buffer, <span class="keywordtype">size_t</span> _length, off_t _where) : async_data_op_req&lt;const void&gt;(std::move(_precondition), static_cast&lt;const void *&gt;(_buffer), _length, _where) { }</div>
+<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>&#160;};</div>
+<div class="line"><a name="l01053"></a><span class="lineno"><a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1vector_3_01_t_00_01_a_01_4_01_4.html"> 1053</a></span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">class</span> T, <span class="keyword">class</span> A&gt; <span class="keyword">struct </span><a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req</a>&lt;std::vector&lt;T, A&gt;&gt; : <span class="keyword">public</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req</a>&lt;void&gt;</div>
+<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>&#160;{</div>
+<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>&#160; <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req</a>() { }</div>
+<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>&#160; <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req</a>(<span class="keyword">const</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req</a> &amp;o) : <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req&lt;void&gt;</a>(o) { }</div>
+<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>&#160; <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req</a>(<a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req</a> &amp;&amp;o) : <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req&lt;void&gt;</a>(std::move(o)) { }</div>
+<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>&#160; <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req</a>(<a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a> _precondition, std::vector&lt;T, A&gt; &amp;v, off_t _where) : <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req&lt;void&gt;</a>(std::move(_precondition), <span class="keyword">static_cast&lt;</span><span class="keywordtype">void</span> *<span class="keyword">&gt;</span>(&amp;v.front()), v.size()*<span class="keyword">sizeof</span>(T), _where) { }</div>
+<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>&#160;};</div>
+<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">class</span> T, <span class="keyword">class</span> A&gt; <span class="keyword">struct </span><a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req</a>&lt;const std::vector&lt;T, A&gt;&gt; : <span class="keyword">public</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req</a>&lt;const void&gt;</div>
+<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>&#160;{</div>
+<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>&#160; <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req</a>() { }</div>
+<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>&#160; async_data_op_req(<span class="keyword">const</span> async_data_op_req &amp;o) : async_data_op_req&lt;const void&gt;(o) { }</div>
+<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>&#160; async_data_op_req(async_data_op_req &amp;&amp;o) : async_data_op_req&lt;const void&gt;(std::move(o)) { }</div>
+<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>&#160; async_data_op_req(<span class="keyword">const</span> async_data_op_req&lt;std::vector&lt;T, A&gt;&gt; &amp;o) : async_data_op_req&lt;const void&gt;(o) { }</div>
+<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>&#160; async_data_op_req(async_data_op_req&lt;std::vector&lt;T, A&gt;&gt; &amp;&amp;o) : async_data_op_req&lt;const void&gt;(std::move(o)) { }</div>
+<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>&#160; async_data_op_req(async_io_op _precondition, <span class="keyword">const</span> std::vector&lt;T, A&gt; &amp;v, off_t _where) : async_data_op_req&lt;const void&gt;(std::move(_precondition), static_cast&lt;const void *&gt;(&amp;v.front()), v.size()*sizeof(T), _where) { }</div>
+<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>&#160;};</div>
+<div class="line"><a name="l01070"></a><span class="lineno"><a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1array_3_01_t_00_01_n_01_4_01_4.html"> 1070</a></span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">class</span> T, <span class="keywordtype">size_t</span> N&gt; <span class="keyword">struct </span><a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req</a>&lt;std::array&lt;T, N&gt;&gt; : <span class="keyword">public</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req</a>&lt;void&gt;</div>
+<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>&#160;{</div>
+<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>&#160; <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req</a>() { }</div>
+<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>&#160; <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req</a>(<span class="keyword">const</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req</a> &amp;o) : <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req&lt;void&gt;</a>(o) { }</div>
+<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>&#160; <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req</a>(<a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req</a> &amp;&amp;o) : <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req&lt;void&gt;</a>(std::move(o)) { }</div>
+<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>&#160; <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req</a>(<a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a> _precondition, std::array&lt;T, N&gt; &amp;v, off_t _where) : <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req&lt;void&gt;</a>(std::move(_precondition), <span class="keyword">static_cast&lt;</span><span class="keywordtype">void</span> *<span class="keyword">&gt;</span>(&amp;v.front()), v.size()*<span class="keyword">sizeof</span>(T), _where) { }</div>
+<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>&#160;};</div>
+<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">class</span> T, <span class="keywordtype">size_t</span> N&gt; <span class="keyword">struct </span><a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req</a>&lt;const std::array&lt;T, N&gt;&gt; : <span class="keyword">public</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req</a>&lt;const void&gt;</div>
+<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>&#160;{</div>
+<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>&#160; <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req</a>() { }</div>
+<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>&#160; async_data_op_req(<span class="keyword">const</span> async_data_op_req &amp;o) : async_data_op_req&lt;const void&gt;(o) { }</div>
+<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>&#160; async_data_op_req(async_data_op_req &amp;&amp;o) : async_data_op_req&lt;const void&gt;(std::move(o)) { }</div>
+<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>&#160; async_data_op_req(<span class="keyword">const</span> async_data_op_req&lt;std::array&lt;T, N&gt;&gt; &amp;o) : async_data_op_req&lt;const void&gt;(o) { }</div>
+<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>&#160; async_data_op_req(async_data_op_req&lt;std::array&lt;T, N&gt;&gt; &amp;&amp;o) : async_data_op_req&lt;const void&gt;(std::move(o)) { }</div>
+<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>&#160; async_data_op_req(async_io_op _precondition, <span class="keyword">const</span> std::array&lt;T, N&gt; &amp;v, off_t _where) : async_data_op_req&lt;const void&gt;(std::move(_precondition), static_cast&lt;const void *&gt;(&amp;v.front()), v.size()*sizeof(T), _where) { }</div>
+<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>&#160;};</div>
+<div class="line"><a name="l01087"></a><span class="lineno"><a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1basic__string_3_01_c_00_01_t_00_01_a_01_4_01_4.html"> 1087</a></span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">class</span> C, <span class="keyword">class</span> T, <span class="keyword">class</span> A&gt; <span class="keyword">struct </span><a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req</a>&lt;std::basic_string&lt;C, T, A&gt;&gt; : <span class="keyword">public</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req</a>&lt;void&gt;</div>
+<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>&#160;{</div>
+<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>&#160; <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req</a>() { }</div>
+<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>&#160; <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req</a>(<span class="keyword">const</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req</a> &amp;o) : <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req&lt;void&gt;</a>(o) { }</div>
+<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>&#160; <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req</a>(<a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req</a> &amp;&amp;o) : <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req&lt;void&gt;</a>(std::move(o)) { }</div>
+<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>&#160; <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req</a>(<a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a> _precondition, std::basic_string&lt;C, T, A&gt; &amp;v, off_t _where) : <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req&lt;void&gt;</a>(std::move(_precondition), <span class="keyword">static_cast&lt;</span><span class="keywordtype">void</span> *<span class="keyword">&gt;</span>(&amp;v.front()), v.size()*<span class="keyword">sizeof</span>(A), _where) { }</div>
+<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>&#160;};</div>
+<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">class</span> C, <span class="keyword">class</span> T, <span class="keyword">class</span> A&gt; <span class="keyword">struct </span><a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req</a>&lt;const std::basic_string&lt;C, T, A&gt;&gt; : <span class="keyword">public</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req</a>&lt;const void&gt;</div>
+<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>&#160;{</div>
+<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>&#160; <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req</a>() { }</div>
+<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>&#160; async_data_op_req(<span class="keyword">const</span> async_data_op_req &amp;o) : async_data_op_req&lt;const void&gt;(o) { }</div>
+<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>&#160; async_data_op_req(async_data_op_req &amp;&amp;o) : async_data_op_req&lt;const void&gt;(std::move(o)) { }</div>
+<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>&#160; async_data_op_req(<span class="keyword">const</span> async_data_op_req&lt;std::basic_string&lt;C, T, A&gt;&gt; &amp;o) : async_data_op_req&lt;const void&gt;(o) { }</div>
+<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>&#160; async_data_op_req(async_data_op_req&lt;std::basic_string&lt;C, T, A&gt;&gt; &amp;&amp;o) : async_data_op_req&lt;const void&gt;(std::move(o)) { }</div>
+<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>&#160; async_data_op_req(async_io_op _precondition, <span class="keyword">const</span> std::basic_string&lt;C, T, A&gt; &amp;v, off_t _where) : async_data_op_req&lt;const void&gt;(std::move(_precondition), static_cast&lt;const void *&gt;(&amp;v.front()), v.size()*sizeof(A), _where) { }</div>
+<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>&#160;};</div>
+<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>&#160;</div>
+<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>&#160;<span class="keyword">namespace </span>detail {</div>
+<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>&#160; <span class="keyword">template</span>&lt;<span class="keywordtype">bool</span> isconst&gt; <span class="keyword">struct </span>void_type_selector { <span class="keyword">typedef</span> <span class="keywordtype">void</span> type; };</div>
+<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>&#160; <span class="keyword">template</span>&lt;&gt; <span class="keyword">struct </span>void_type_selector&lt;true&gt; { <span class="keyword">typedef</span> <span class="keyword">const</span> <span class="keywordtype">void</span> type; };</div>
+<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt; <span class="keyword">struct </span>async_file_io_dispatcher_rwconverter</div>
+<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>&#160; {</div>
+<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>&#160; <span class="keyword">typedef</span> async_data_op_req&lt;typename void_type_selector&lt;std::is_const&lt;T&gt;::value&gt;::type&gt; return_type;</div>
+<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>&#160; <span class="keyword">const</span> std::vector&lt;return_type&gt; &amp;operator()(<span class="keyword">const</span> std::vector&lt;async_data_op_req&lt;T&gt;&gt; &amp;ops)</div>
+<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>&#160; {</div>
+<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>&#160; <span class="keyword">typedef</span> async_data_op_req&lt;T&gt; reqT;</div>
+<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>&#160; static_assert(std::is_convertible&lt;reqT, return_type&gt;::value, <span class="stringliteral">&quot;async_data_op_req&lt;T&gt; is not convertible to async_data_op_req&lt;[const] void&gt;&quot;</span>);</div>
+<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>&#160; static_assert(<span class="keyword">sizeof</span>(return_type)==<span class="keyword">sizeof</span>(reqT), <span class="stringliteral">&quot;async_data_op_req&lt;T&gt; does not have the same size as async_data_op_req&lt;[const] void&gt;&quot;</span>);</div>
+<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>&#160; <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>std::vector&lt;return_type&gt; &amp;<span class="keyword">&gt;</span>(ops);</div>
+<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>&#160; }</div>
+<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>&#160; };</div>
+<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>&#160;}</div>
+<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>&#160;</div>
+<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>&#160;<span class="keyword">inline</span> async_io_op <a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a6fa594bfd2e1ed2af9e1a3ea25be7da5" title="Invoke the specified function when each of the supplied operations complete.">async_file_io_dispatcher_base::completion</a>(<span class="keyword">const</span> async_io_op &amp;req, <span class="keyword">const</span> std::pair&lt;async_op_flags, std::function&lt;async_file_io_dispatcher_base::completion_t&gt;&gt; &amp;callback)</div>
+<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>&#160;{</div>
+<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>&#160; std::vector&lt;async_io_op&gt; r;</div>
+<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>&#160; std::vector&lt;std::pair&lt;async_op_flags, std::function&lt;async_file_io_dispatcher_base::completion_t&gt;&gt;&gt; i;</div>
+<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>&#160; r.reserve(1); i.reserve(1);</div>
+<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>&#160; r.push_back(req);</div>
+<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>&#160; i.push_back(callback);</div>
+<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>&#160; <span class="keywordflow">return</span> std::move(<a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a6fa594bfd2e1ed2af9e1a3ea25be7da5" title="Invoke the specified function when each of the supplied operations complete.">completion</a>(r, i).front());</div>
+<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>&#160;}</div>
+<div class="line"><a name="l01129"></a><span class="lineno"><a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#af5ec8648416926263780d9c597db35ed"> 1129</a></span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">class</span> R&gt; <span class="keyword">inline</span> std::pair&lt;std::vector&lt;future&lt;R&gt;&gt;, std::vector&lt;async_io_op&gt;&gt; <a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#af5ec8648416926263780d9c597db35ed" title="Invoke the specified callable when the supplied operation completes.">async_file_io_dispatcher_base::call</a>(<span class="keyword">const</span> std::vector&lt;async_io_op&gt; &amp;ops, <span class="keyword">const</span> std::vector&lt;std::function&lt;R()&gt;&gt; &amp;callables)</div>
+<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>&#160;{</div>
+<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>&#160; <span class="keyword">typedef</span> <a class="code" href="classpackaged__task.html" title="For now, this is an emulation of std::packaged_task based on boost&#39;s packaged_task. We have to drop the Args... support because it segfaults MSVC Nov 2012 CTP.">packaged_task&lt;R()&gt;</a> tasktype;</div>
+<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>&#160; std::vector&lt;future&lt;R&gt;&gt; retfutures;</div>
+<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>&#160; std::vector&lt;std::pair&lt;async_op_flags, std::function&lt;completion_t&gt;&gt;&gt; callbacks;</div>
+<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>&#160; retfutures.reserve(callables.size());</div>
+<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>&#160; callbacks.reserve(callables.size());</div>
+<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>&#160; <span class="keyword">auto</span> f=[](size_t, std::shared_ptr&lt;detail::async_io_handle&gt; _, std::shared_ptr&lt;tasktype&gt; c) {</div>
+<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>&#160; (*c)();</div>
+<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>&#160; <span class="keywordflow">return</span> std::make_pair(<span class="keyword">true</span>, _);</div>
+<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>&#160; };</div>
+<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>&#160; <span class="keywordflow">for</span>(<span class="keyword">auto</span> &amp;t : callables)</div>
+<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>&#160; {</div>
+<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>&#160; std::shared_ptr&lt;tasktype&gt; c(std::make_shared&lt;tasktype&gt;(t));</div>
+<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>&#160; retfutures.push_back(c-&gt;get_future());</div>
+<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>&#160; callbacks.push_back(std::make_pair(async_op_flags::None, std::bind(f, std::placeholders::_1, std::placeholders::_2, std::move(c))));</div>
+<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>&#160; }</div>
+<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>&#160; <span class="keywordflow">return</span> std::make_pair(std::move(retfutures), <a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a6fa594bfd2e1ed2af9e1a3ea25be7da5" title="Invoke the specified function when each of the supplied operations complete.">completion</a>(ops, callbacks));</div>
+<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>&#160;}</div>
+<div class="line"><a name="l01148"></a><span class="lineno"><a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a7057167ed1a46e3b24fa3806bd6172c1"> 1148</a></span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">class </span>C, <span class="keyword">class</span>... Args&gt; <span class="keyword">inline</span> std::pair&lt;<a class="code" href="classtriplegit_1_1async__io_1_1future.html" title="For now, this is boost&#39;s future. Will be replaced when C++&#39;s future catches up with boost&#39;s...">future</a>&lt;<span class="keyword">typename</span> std::result_of&lt;C(Args...)&gt;::type&gt;, <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a>&gt; <a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#af5ec8648416926263780d9c597db35ed" title="Invoke the specified callable when the supplied operation completes.">async_file_io_dispat
cher_base::call</a>(<span class="keyword">const</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a> &amp;req, C callback, Args... args)</div>
+<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>&#160;{</div>
+<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>&#160; <span class="keyword">typedef</span> <span class="keyword">typename</span> std::result_of&lt;C(Args...)&gt;::type rettype;</div>
+<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>&#160; std::vector&lt;async_io_op&gt; i;</div>
+<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>&#160; std::vector&lt;std::function&lt;rettype()&gt;&gt; c;</div>
+<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>&#160; i.reserve(1); c.reserve(1);</div>
+<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>&#160; i.push_back(req);</div>
+<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>&#160; c.push_back(std::move(std::bind&lt;rettype()&gt;(callback, args...)));</div>
+<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>&#160; std::pair&lt;std::vector&lt;future&lt;rettype&gt;&gt;, std::vector&lt;async_io_op&gt;&gt; ret(<a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#af5ec8648416926263780d9c597db35ed" title="Invoke the specified callable when the supplied operation completes.">call</a>(i, c));</div>
+<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>&#160; <span class="keywordflow">return</span> std::make_pair(std::move(ret.first.front()), ret.second.front());</div>
+<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>&#160;}</div>
+<div class="line"><a name="l01159"></a><span class="lineno"><a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a60be8d20fba4795a9838c706707041ef"> 1159</a></span>&#160;<span class="keyword">inline</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a> <a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a517359ced87c537caff44dc6fa35fb19" title="Asynchronously creates directories.">async_file_io_dispatcher_base::dir</a>(<span class="keyword">const</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__path__op__req.html" title="A convenience bundle of path and flags, with optional precondition.">async_path_op_req</a> &amp;req)</div>
+<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>&#160;{</div>
+<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>&#160; std::vector&lt;async_path_op_req&gt; i;</div>
+<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>&#160; i.reserve(1);</div>
+<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>&#160; i.push_back(req);</div>
+<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>&#160; <span class="keywordflow">return</span> std::move(<a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a517359ced87c537caff44dc6fa35fb19" title="Asynchronously creates directories.">dir</a>(i).front());</div>
+<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>&#160;}</div>
+<div class="line"><a name="l01166"></a><span class="lineno"><a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#ad60182955f83342b9cb237142e9c2ced"> 1166</a></span>&#160;<span class="keyword">inline</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a> <a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a4924392f3af3a7b429ca49d7c7a35b4e" title="Asynchronously deletes directories.">async_file_io_dispatcher_base::rmdir</a>(<span class="keyword">const</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__path__op__req.html" title="A convenience bundle of path and flags, with optional precondition.">async_path_op_req</a> &amp;req)</div>
+<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>&#160;{</div>
+<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>&#160; std::vector&lt;async_path_op_req&gt; i;</div>
+<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>&#160; i.reserve(1);</div>
+<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>&#160; i.push_back(req);</div>
+<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>&#160; <span class="keywordflow">return</span> std::move(<a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a4924392f3af3a7b429ca49d7c7a35b4e" title="Asynchronously deletes directories.">rmdir</a>(i).front());</div>
+<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>&#160;}</div>
+<div class="line"><a name="l01173"></a><span class="lineno"><a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a16b57f66a84c25904cb02bdfb9e71a27"> 1173</a></span>&#160;<span class="keyword">inline</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a> <a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a6e008acf9f33b3ff43b0c73901f5f9c7" title="Asynchronously opens or creates files.">async_file_io_dispatcher_base::file</a>(<span class="keyword">const</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__path__op__req.html" title="A convenience bundle of path and flags, with optional precondition.">async_path_op_req</a> &amp;req)</div>
+<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>&#160;{</div>
+<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>&#160; std::vector&lt;async_path_op_req&gt; i;</div>
+<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>&#160; i.reserve(1);</div>
+<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>&#160; i.push_back(req);</div>
+<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>&#160; <span class="keywordflow">return</span> std::move(<a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a6e008acf9f33b3ff43b0c73901f5f9c7" title="Asynchronously opens or creates files.">file</a>(i).front());</div>
+<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>&#160;}</div>
+<div class="line"><a name="l01180"></a><span class="lineno"><a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#ad5b54fca9b70f2899218119176cca111"> 1180</a></span>&#160;<span class="keyword">inline</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a> <a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a7839e9b1fc5e2caba5e37a4f5ecebbb7" title="Asynchronously deletes files.">async_file_io_dispatcher_base::rmfile</a>(<span class="keyword">const</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__path__op__req.html" title="A convenience bundle of path and flags, with optional precondition.">async_path_op_req</a> &amp;req)</div>
+<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>&#160;{</div>
+<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>&#160; std::vector&lt;async_path_op_req&gt; i;</div>
+<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>&#160; i.reserve(1);</div>
+<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>&#160; i.push_back(req);</div>
+<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>&#160; <span class="keywordflow">return</span> std::move(<a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a7839e9b1fc5e2caba5e37a4f5ecebbb7" title="Asynchronously deletes files.">rmfile</a>(i).front());</div>
+<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>&#160;}</div>
+<div class="line"><a name="l01187"></a><span class="lineno"><a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a8659dae5b8bbe2fe9e2a0b61579683d7"> 1187</a></span>&#160;<span class="keyword">inline</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a> <a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a20ac9ebe7fc8e9f898d3de8c85b03efd" title="Asynchronously synchronises items with physical storage once they complete.">async_file_io_dispatcher_base::sync</a>(<span class="keyword">const</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a> &amp;req)</div>
+<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>&#160;{</div>
+<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>&#160; std::vector&lt;async_io_op&gt; i;</div>
+<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>&#160; i.reserve(1);</div>
+<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>&#160; i.push_back(req);</div>
+<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>&#160; <span class="keywordflow">return</span> std::move(<a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a20ac9ebe7fc8e9f898d3de8c85b03efd" title="Asynchronously synchronises items with physical storage once they complete.">sync</a>(i).front());</div>
+<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>&#160;}</div>
+<div class="line"><a name="l01194"></a><span class="lineno"><a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a828b6f410645dfe2dca3075c86e054c7"> 1194</a></span>&#160;<span class="keyword">inline</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a> <a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#abffcc5e304efb9622ef184eca8d29868" title="Asynchronously closes connections to items once they complete.">async_file_io_dispatcher_base::close</a>(<span class="keyword">const</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a> &amp;req)</div>
+<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>&#160;{</div>
+<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>&#160; std::vector&lt;async_io_op&gt; i;</div>
+<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>&#160; i.reserve(1);</div>
+<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>&#160; i.push_back(req);</div>
+<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>&#160; <span class="keywordflow">return</span> std::move(<a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#abffcc5e304efb9622ef184eca8d29868" title="Asynchronously closes connections to items once they complete.">close</a>(i).front());</div>
+<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>&#160;}</div>
+<div class="line"><a name="l01201"></a><span class="lineno"><a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a4a855265b383c4db717040cc49b4fe1d"> 1201</a></span>&#160;<span class="keyword">inline</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a> <a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a21f6fce370f936a958ebbebe74eb08c4" title="Asynchronously reads data from items.">async_file_io_dispatcher_base::read</a>(<span class="keyword">const</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req&lt;void&gt;</a> &amp;req)</div>
+<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>&#160;{</div>
+<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>&#160; std::vector&lt;async_data_op_req&lt;void&gt;&gt; i;</div>
+<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>&#160; i.reserve(1);</div>
+<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>&#160; i.push_back(req);</div>
+<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>&#160; <span class="keywordflow">return</span> std::move(<a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a21f6fce370f936a958ebbebe74eb08c4" title="Asynchronously reads data from items.">read</a>(i).front());</div>
+<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>&#160;}</div>
+<div class="line"><a name="l01208"></a><span class="lineno"><a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#ad3b11ed98996a8b674329e05dce13841"> 1208</a></span>&#160;<span class="keyword">inline</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a> <a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#af087a1c53c619679a5e65fc828a7c652" title="Asynchronously writes data to items.">async_file_io_dispatcher_base::write</a>(<span class="keyword">const</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req&lt;const void&gt;</a> &amp;req)</div>
+<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>&#160;{</div>
+<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>&#160; std::vector&lt;async_data_op_req&lt;const void&gt;&gt; i;</div>
+<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>&#160; i.reserve(1);</div>
+<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>&#160; i.push_back(req);</div>
+<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>&#160; <span class="keywordflow">return</span> std::move(<a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#af087a1c53c619679a5e65fc828a7c652" title="Asynchronously writes data to items.">write</a>(i).front());</div>
+<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>&#160;}</div>
+<div class="line"><a name="l01215"></a><span class="lineno"><a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#aab459d62576fcfea288094ad30a211e7"> 1215</a></span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt; <span class="keyword">inline</span> std::vector&lt;async_io_op&gt; <a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a21f6fce370f936a958ebbebe74eb08c4" title="Asynchronously reads data from items.">async_file_io_dispatcher_base::read</a>(<span class="keyword">const</span> std::vector&lt;<a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req&lt;T&gt;</a>&gt; &amp;ops)</div>
+<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>&#160;{</div>
+<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a21f6fce370f936a958ebbebe74eb08c4" title="Asynchronously reads data from items.">read</a>(detail::async_file_io_dispatcher_rwconverter&lt;T&gt;()(ops));</div>
+<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>&#160;}</div>
+<div class="line"><a name="l01219"></a><span class="lineno"><a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#ab00ad1238d5b87b7e87940b4566f7491"> 1219</a></span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt; <span class="keyword">inline</span> std::vector&lt;async_io_op&gt; <a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#af087a1c53c619679a5e65fc828a7c652" title="Asynchronously writes data to items.">async_file_io_dispatcher_base::write</a>(<span class="keyword">const</span> std::vector&lt;<a class="code" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T.">async_data_op_req&lt;T&gt;</a>&gt; &amp;ops)</div>
+<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>&#160;{</div>
+<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#af087a1c53c619679a5e65fc828a7c652" title="Asynchronously writes data to items.">write</a>(detail::async_file_io_dispatcher_rwconverter&lt;T&gt;()(ops));</div>
+<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>&#160;}</div>
+<div class="line"><a name="l01223"></a><span class="lineno"><a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#afd50d52fec35330deac6153aece92d7d"> 1223</a></span>&#160;<span class="keyword">inline</span> std::vector&lt;async_io_op&gt; <a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#afd50d52fec35330deac6153aece92d7d" title="Convenience function for truncating the lengths of items via std::filesystem::resize_file()">async_file_io_dispatcher_base::truncate</a>(<span class="keyword">const</span> std::vector&lt;async_io_op&gt; &amp;ops, <span class="keyword">const</span> std::vector&lt;off_t&gt; &amp;sizes)</div>
+<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>&#160;{</div>
+<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>&#160; <span class="keyword">auto</span> dotruncate=[](size_t, std::shared_ptr&lt;detail::async_io_handle&gt; h, off_t newsize) {</div>
+<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>&#160; std::filesystem::resize_file(h-&gt;path(), newsize);</div>
+<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>&#160; <span class="keywordflow">return</span> std::make_pair(<span class="keyword">true</span>, h);</div>
+<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>&#160; };</div>
+<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>&#160; std::vector&lt;std::pair&lt;async_op_flags, std::function&lt;completion_t&gt;&gt;&gt; callbacks;</div>
+<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>&#160; callbacks.reserve(ops.size());</div>
+<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>&#160; <span class="keywordflow">for</span>(<span class="keyword">auto</span> &amp;i : sizes)</div>
+<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>&#160; callbacks.push_back(std::make_pair(async_op_flags::None, std::bind(dotruncate, std::placeholders::_1, std::placeholders::_2, i)));</div>
+<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a6fa594bfd2e1ed2af9e1a3ea25be7da5" title="Invoke the specified function when each of the supplied operations complete.">completion</a>(ops, callbacks);</div>
+<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>&#160;}</div>
+<div class="line"><a name="l01235"></a><span class="lineno"><a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#aedd6e17486c726c5b08be8132fe55776"> 1235</a></span>&#160;<span class="keyword">inline</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a> <a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#afd50d52fec35330deac6153aece92d7d" title="Convenience function for truncating the lengths of items via std::filesystem::resize_file()">async_file_io_dispatcher_base::truncate</a>(<span class="keyword">const</span> <a class="code" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a> &amp;op, off_t newsize)</div>
+<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>&#160;{</div>
+<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>&#160; std::vector&lt;async_io_op&gt; o;</div>
+<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>&#160; std::vector&lt;off_t&gt; i;</div>
+<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>&#160; o.reserve(1);</div>
+<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>&#160; o.push_back(op);</div>
+<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>&#160; i.reserve(1);</div>
+<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>&#160; i.push_back(newsize);</div>
+<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>&#160; <span class="keywordflow">return</span> std::move(<a class="code" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#afd50d52fec35330deac6153aece92d7d" title="Convenience function for truncating the lengths of items via std::filesystem::resize_file()">truncate</a>(o, i).front());</div>
+<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>&#160;}</div>
+<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>&#160;</div>
+<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>&#160;</div>
+<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>&#160;} } <span class="comment">// namespace</span></div>
+<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>&#160;</div>
+<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>&#160;<span class="preprocessor">#ifdef _MSC_VER</span></div>
+<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>&#160;<span class="preprocessor"></span><span class="preprocessor">#pragma warning(pop)</span></div>
+<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>&#160;<span class="preprocessor"></span><span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>&#160;<span class="preprocessor"></span></div>
+<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>&#160;<span class="preprocessor">#endif</span></div>
+</div><!-- fragment --></div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012
Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/bc_s.png
==============================================================================
Binary file. No diff available.

Added: sandbox/triplegit/trunk/html/bdwn.png
==============================================================================
Binary file. No diff available.

Added: sandbox/triplegit/trunk/html/classes.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/classes.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: Class Index</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li class="current">Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Class List</li>
+ <li class="current">Class Index</li>
+ <li>Class Hierarchy</li>
+ <li>Class Members</li>
+ </ul>
+ </div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">Class Index</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="qindex"><a class="qindex" href="#letter_A">A</a>&#160;|&#160;<a class="qindex" href="#letter_B">B</a>&#160;|&#160;<a class="qindex" href="#letter_C">C</a>&#160;|&#160;<a class="qindex" href="#letter_F">F</a>&#160;|&#160;<a class="qindex" href="#letter_P">P</a>&#160;|&#160;<a class="qindex" href="#letter_S">S</a>&#160;|&#160;<a class="qindex" href="#letter_T">T</a>&#160;|&#160;<a class="qindex" href="#letter_U">U</a></div>
+<table style="margin: 10px; white-space: nowrap;" align="center" width="95%" border="0" cellspacing="0" cellpadding="0">
+<tr><td rowspan="2" valign="bottom"><a name="letter_A"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;A&#160;&#160;</div></td></tr></table>
+</td><td valign="top"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html">async_file_io_dispatcher_base</a> (<a class="el" href="namespacetriplegit_1_1async__io.html">triplegit::async_io</a>)&#160;&#160;&#160;</td><td rowspan="2" valign="bottom"><a name="letter_C"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;C&#160;&#160;</div></td></tr></table>
+</td><td rowspan="2" valign="bottom"><a name="letter_P"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;P&#160;&#160;</div></td></tr></table>
+</td><td valign="top"><a class="el" href="classtriplegit_1_1storable__vertices.html">storable_vertices</a> (triplegit)&#160;&#160;&#160;</td></tr>
+<tr><td valign="top"><a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html">async_io_handle</a> (triplegit::async_io::detail)&#160;&#160;&#160;</td><td rowspan="2" valign="bottom"><a name="letter_T"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;T&#160;&#160;</div></td></tr></table>
+</td></tr>
+<tr><td valign="top"><a class="el" href="classtriplegit_1_1boost_1_1adjacency__list.html">adjacency_list</a> (triplegit::boost)&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> (<a class="el" href="namespacetriplegit_1_1async__io.html">triplegit::async_io</a>)&#160;&#160;&#160;</td><td valign="top"><a class="el" href="classtriplegit_1_1collection__id.html">collection_id</a> (triplegit)&#160;&#160;&#160;</td><td valign="top"><a class="el" href="classpackaged__task.html">packaged_task</a>&#160;&#160;&#160;</td></tr>
+<tr><td valign="top"><a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req.html">async_data_op_req</a> (<a class="el" href="namespacetriplegit_1_1async__io.html">triplegit::async_io</a>)&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structtriplegit_1_1async__io_1_1async__path__op__req.html">async_path_op_req</a> (<a class="el" href="namespacetriplegit_1_1async__io.html">triplegit::async_io</a>)&#160;&#160;&#160;</td><td rowspan="2" valign="bottom"><a name="letter_F"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;F&#160;&#160;</div></td></tr></table>
+</td><td valign="top"><a class="el" href="classtriplegit_1_1async__io_1_1promise.html">promise</a> (<a class="el" href="namespacetriplegit_1_1async__io.html">triplegit::async_io</a>)&#160;&#160;&#160;</td><td valign="top"><a class="el" href="classtriplegit_1_1async__io_1_1thread__pool.html">thread_pool</a> (<a class="el" href="namespacetriplegit_1_1async__io.html">triplegit::async_io</a>)&#160;&#160;&#160;</td></tr>
+<tr><td valign="top"><a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1array_3_01_t_00_01_n_01_4_01_4.html">async_data_op_req&lt; std::array&lt; T, N &gt; &gt;</a> (<a class="el" href="namespacetriplegit_1_1async__io.html">triplegit::async_io</a>)&#160;&#160;&#160;</td><td rowspan="2" valign="bottom"><a name="letter_B"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;B&#160;&#160;</div></td></tr></table>
+</td><td rowspan="2" valign="bottom"><a name="letter_S"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;S&#160;&#160;</div></td></tr></table>
+</td><td rowspan="2" valign="bottom"><a name="letter_U"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;U&#160;&#160;</div></td></tr></table>
+</td></tr>
+<tr><td valign="top"><a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1basic__string_3_01_c_00_01_t_00_01_a_01_4_01_4.html">async_data_op_req&lt; std::basic_string&lt; C, T, A &gt; &gt;</a> (<a class="el" href="namespacetriplegit_1_1async__io.html">triplegit::async_io</a>)&#160;&#160;&#160;</td><td valign="top"><a class="el" href="classtriplegit_1_1fs__store.html">fs_store</a> (triplegit)&#160;&#160;&#160;</td></tr>
+<tr><td valign="top"><a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1vector_3_01_t_00_01_a_01_4_01_4.html">async_data_op_req&lt; std::vector&lt; T, A &gt; &gt;</a> (<a class="el" href="namespacetriplegit_1_1async__io.html">triplegit::async_io</a>)&#160;&#160;&#160;</td><td valign="top"><a class="el" href="classtriplegit_1_1base__store.html">base_store</a> (triplegit)&#160;&#160;&#160;</td><td valign="top"><a class="el" href="classtriplegit_1_1async__io_1_1future.html">future</a> (<a class="el" href="namespacetriplegit_1_1async__io.html">triplegit::async_io</a>)&#160;&#160;&#160;</td><td valign="top"><a class="el" href="classtriplegit_1_1async__io_1_1shared__future.html">shared_future</a> (<a class="el" href="namespacetriplegit_1_1async__io.html">triplegit::async_io</a>)&#160;&#160;&#160;</td><td valign="top"><a class="el" href="classtriplegit_1_1unique__id.html">unique_id</a> (triplegit)&#160;&#160;&#160;</td></tr>
+<tr><td></td><td></td><td></td><td></td><td></td></tr>
+</table>
+<div class="qindex"><a class="qindex" href="#letter_A">A</a>&#160;|&#160;<a class="qindex" href="#letter_B">B</a>&#160;|&#160;<a class="qindex" href="#letter_C">C</a>&#160;|&#160;<a class="qindex" href="#letter_F">F</a>&#160;|&#160;<a class="qindex" href="#letter_P">P</a>&#160;|&#160;<a class="qindex" href="#letter_S">S</a>&#160;|&#160;<a class="qindex" href="#letter_T">T</a>&#160;|&#160;<a class="qindex" href="#letter_U">U</a></div>
+</div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/classpackaged__task.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/classpackaged__task.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,105 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: packaged_task&lt; class &gt; Class Template Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li class="current">Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Class List</li>
+ <li>Class Index</li>
+ <li>Class Hierarchy</li>
+ <li>Class Members</li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">packaged_task&lt; class &gt; Class Template Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>For now, this is an emulation of std::packaged_task based on boost's <a class="el" href="classpackaged__task.html" title="For now, this is an emulation of std::packaged_task based on boost&#39;s packaged_task. We have to drop the Args... support because it segfaults MSVC Nov 2012 CTP.">packaged_task</a>. We have to drop the Args... support because it segfaults MSVC Nov 2012 CTP.
+ More...</p>
+
+<p><code>#include &lt;<a class="el" href="async__file__io_8hpp_source.html">async_file_io.hpp</a>&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><h3>template&lt;class&gt;<br/>
+class packaged_task&lt; class &gt;</h3>
+
+<p>For now, this is an emulation of std::packaged_task based on boost's <a class="el" href="classpackaged__task.html" title="For now, this is an emulation of std::packaged_task based on boost&#39;s packaged_task. We have to drop the Args... support because it segfaults MSVC Nov 2012 CTP.">packaged_task</a>. We have to drop the Args... support because it segfaults MSVC Nov 2012 CTP. </p>
+</div><hr/>The documentation for this class was generated from the following file:<ul>
+<li>triplegit/include/<a class="el" href="async__file__io_8hpp_source.html">async_file_io.hpp</a></li>
+</ul>
+</div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base-members.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base-members.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,127 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li class="current">Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Class List</li>
+ <li>Class Index</li>
+ <li>Class Hierarchy</li>
+ <li>Class Members</li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><b>triplegit</b></li><li class="navelem"><a class="el" href="namespacetriplegit_1_1async__io.html">async_io</a></li><li class="navelem"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html">async_file_io_dispatcher_base</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">triplegit::async_io::async_file_io_dispatcher_base Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html">triplegit::async_io::async_file_io_dispatcher_base</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#af5ec8648416926263780d9c597db35ed">call</a>(const std::vector&lt; async_io_op &gt; &amp;ops, const std::vector&lt; std::function&lt; R()&gt;&gt; &amp;callables)</td><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html">triplegit::async_io::async_file_io_dispatcher_base</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a7057167ed1a46e3b24fa3806bd6172c1">call</a>(const async_io_op &amp;req, C callback, Args...args)</td><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html">triplegit::async_io::async_file_io_dispatcher_base</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#abffcc5e304efb9622ef184eca8d29868">close</a>(const std::vector&lt; async_io_op &gt; &amp;ops)=0</td><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html">triplegit::async_io::async_file_io_dispatcher_base</a></td><td class="entry"><span class="mlabel">pure virtual</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a828b6f410645dfe2dca3075c86e054c7">close</a>(const async_io_op &amp;req)</td><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html">triplegit::async_io::async_file_io_dispatcher_base</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a6fa594bfd2e1ed2af9e1a3ea25be7da5">completion</a>(const std::vector&lt; async_io_op &gt; &amp;ops, const std::vector&lt; std::pair&lt; async_op_flags, std::function&lt; completion_t &gt;&gt;&gt; &amp;callbacks)</td><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html">triplegit::async_io::async_file_io_dispatcher_base</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#af0627f7511cac82528dcd7ed490b5211">completion</a>(const async_io_op &amp;req, const std::pair&lt; async_op_flags, std::function&lt; completion_t &gt;&gt; &amp;callback)</td><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html">triplegit::async_io::async_file_io_dispatcher_base</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#aaee8e9e70ead7a56b5bfbdf7ac762450">count</a>() const </td><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html">triplegit::async_io::async_file_io_dispatcher_base</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a517359ced87c537caff44dc6fa35fb19">dir</a>(const std::vector&lt; async_path_op_req &gt; &amp;reqs)=0</td><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html">triplegit::async_io::async_file_io_dispatcher_base</a></td><td class="entry"><span class="mlabel">pure virtual</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a60be8d20fba4795a9838c706707041ef">dir</a>(const async_path_op_req &amp;req)</td><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html">triplegit::async_io::async_file_io_dispatcher_base</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a6e008acf9f33b3ff43b0c73901f5f9c7">file</a>(const std::vector&lt; async_path_op_req &gt; &amp;reqs)=0</td><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html">triplegit::async_io::async_file_io_dispatcher_base</a></td><td class="entry"><span class="mlabel">pure virtual</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a16b57f66a84c25904cb02bdfb9e71a27">file</a>(const async_path_op_req &amp;req)</td><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html">triplegit::async_io::async_file_io_dispatcher_base</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#ab1746bda51c77ef5c1691b3f6857a270">fileflags</a>(file_flags flags) const </td><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html">triplegit::async_io::async_file_io_dispatcher_base</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a21f6fce370f936a958ebbebe74eb08c4">read</a>(const std::vector&lt; async_data_op_req&lt; void &gt;&gt; &amp;ops)=0</td><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html">triplegit::async_io::async_file_io_dispatcher_base</a></td><td class="entry"><span class="mlabel">pure virtual</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a4a855265b383c4db717040cc49b4fe1d">read</a>(const async_data_op_req&lt; void &gt; &amp;req)</td><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html">triplegit::async_io::async_file_io_dispatcher_base</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#aab459d62576fcfea288094ad30a211e7">read</a>(const std::vector&lt; async_data_op_req&lt; T &gt;&gt; &amp;ops)</td><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html">triplegit::async_io::async_file_io_dispatcher_base</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a4924392f3af3a7b429ca49d7c7a35b4e">rmdir</a>(const std::vector&lt; async_path_op_req &gt; &amp;reqs)=0</td><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html">triplegit::async_io::async_file_io_dispatcher_base</a></td><td class="entry"><span class="mlabel">pure virtual</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#ad60182955f83342b9cb237142e9c2ced">rmdir</a>(const async_path_op_req &amp;req)</td><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html">triplegit::async_io::async_file_io_dispatcher_base</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a7839e9b1fc5e2caba5e37a4f5ecebbb7">rmfile</a>(const std::vector&lt; async_path_op_req &gt; &amp;reqs)=0</td><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html">triplegit::async_io::async_file_io_dispatcher_base</a></td><td class="entry"><span class="mlabel">pure virtual</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#ad5b54fca9b70f2899218119176cca111">rmfile</a>(const async_path_op_req &amp;req)</td><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html">triplegit::async_io::async_file_io_dispatcher_base</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a20ac9ebe7fc8e9f898d3de8c85b03efd">sync</a>(const std::vector&lt; async_io_op &gt; &amp;ops)=0</td><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html">triplegit::async_io::async_file_io_dispatcher_base</a></td><td class="entry"><span class="mlabel">pure virtual</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a8659dae5b8bbe2fe9e2a0b61579683d7">sync</a>(const async_io_op &amp;req)</td><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html">triplegit::async_io::async_file_io_dispatcher_base</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#ae17a53fb0dd440c3e26fb6ca648f9034">threadpool</a>() const </td><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html">triplegit::async_io::async_file_io_dispatcher_base</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#afd50d52fec35330deac6153aece92d7d">truncate</a>(const std::vector&lt; async_io_op &gt; &amp;ops, const std::vector&lt; off_t &gt; &amp;sizes)</td><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html">triplegit::async_io::async_file_io_dispatcher_base</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#aedd6e17486c726c5b08be8132fe55776">truncate</a>(const async_io_op &amp;op, off_t newsize)</td><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html">triplegit::async_io::async_file_io_dispatcher_base</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a2ed9d1f242fa0acd8bced12a75c13474">wait_queue_depth</a>() const </td><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html">triplegit::async_io::async_file_io_dispatcher_base</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#af087a1c53c619679a5e65fc828a7c652">write</a>(const std::vector&lt; async_data_op_req&lt; const void &gt;&gt; &amp;ops)=0</td><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html">triplegit::async_io::async_file_io_dispatcher_base</a></td><td class="entry"><span class="mlabel">pure virtual</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#ad3b11ed98996a8b674329e05dce13841">write</a>(const async_data_op_req&lt; const void &gt; &amp;req)</td><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html">triplegit::async_io::async_file_io_dispatcher_base</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#ab00ad1238d5b87b7e87940b4566f7491">write</a>(const std::vector&lt; async_data_op_req&lt; T &gt;&gt; &amp;ops)</td><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html">triplegit::async_io::async_file_io_dispatcher_base</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+</table></div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,967 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: triplegit::async_io::async_file_io_dispatcher_base Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li class="current">Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Class List</li>
+ <li>Class Index</li>
+ <li>Class Hierarchy</li>
+ <li>Class Members</li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><b>triplegit</b></li><li class="navelem"><a class="el" href="namespacetriplegit_1_1async__io.html">async_io</a></li><li class="navelem"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html">async_file_io_dispatcher_base</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+Public Member Functions &#124;
+List of all members </div>
+ <div class="headertitle">
+<div class="title">triplegit::async_io::async_file_io_dispatcher_base Class Reference<span class="mlabels"><span class="mlabel">abstract</span></span></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Abstract base class for dispatching file i/o asynchronously.
+ More...</p>
+
+<p><code>#include &lt;<a class="el" href="async__file__io_8hpp_source.html">async_file_io.hpp</a>&gt;</code></p>
+
+<p>Inherits enable_shared_from_this&lt; async_file_io_dispatcher_base &gt;.</p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:ae17a53fb0dd440c3e26fb6ca648f9034"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classtriplegit_1_1async__io_1_1thread__pool.html">thread_pool</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#ae17a53fb0dd440c3e26fb6ca648f9034">threadpool</a> () const </td></tr>
+<tr class="memdesc:ae17a53fb0dd440c3e26fb6ca648f9034"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the thread pool used by this dispatcher. <br/></td></tr>
+<tr class="separator:ae17a53fb0dd440c3e26fb6ca648f9034"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab1746bda51c77ef5c1691b3f6857a270"><td class="memItemLeft" align="right" valign="top">file_flags&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#ab1746bda51c77ef5c1691b3f6857a270">fileflags</a> (file_flags flags) const </td></tr>
+<tr class="memdesc:ab1746bda51c77ef5c1691b3f6857a270"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns file flags as would be used after forcing and masking. <br/></td></tr>
+<tr class="separator:ab1746bda51c77ef5c1691b3f6857a270"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2ed9d1f242fa0acd8bced12a75c13474"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a2ed9d1f242fa0acd8bced12a75c13474">wait_queue_depth</a> () const </td></tr>
+<tr class="memdesc:a2ed9d1f242fa0acd8bced12a75c13474"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the current wait queue depth of this dispatcher. <br/></td></tr>
+<tr class="separator:a2ed9d1f242fa0acd8bced12a75c13474"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaee8e9e70ead7a56b5bfbdf7ac762450"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#aaee8e9e70ead7a56b5bfbdf7ac762450">count</a> () const </td></tr>
+<tr class="memdesc:aaee8e9e70ead7a56b5bfbdf7ac762450"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the number of open items in this dispatcher. <br/></td></tr>
+<tr class="separator:aaee8e9e70ead7a56b5bfbdf7ac762450"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6fa594bfd2e1ed2af9e1a3ea25be7da5"><td class="memItemLeft" align="right" valign="top">std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a6fa594bfd2e1ed2af9e1a3ea25be7da5">completion</a> (const std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &gt; &amp;ops, const std::vector&lt; std::pair&lt; async_op_flags, std::function&lt; completion_t &gt;&gt;&gt; &amp;callbacks)</td></tr>
+<tr class="memdesc:a6fa594bfd2e1ed2af9e1a3ea25be7da5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Invoke the specified function when each of the supplied operations complete. <br/></td></tr>
+<tr class="separator:a6fa594bfd2e1ed2af9e1a3ea25be7da5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af0627f7511cac82528dcd7ed490b5211"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#af0627f7511cac82528dcd7ed490b5211">completion</a> (const <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &amp;req, const std::pair&lt; async_op_flags, std::function&lt; completion_t &gt;&gt; &amp;callback)</td></tr>
+<tr class="memdesc:af0627f7511cac82528dcd7ed490b5211"><td class="mdescLeft">&#160;</td><td class="mdescRight">Invoke the specified function when the supplied operation completes. <br/></td></tr>
+<tr class="separator:af0627f7511cac82528dcd7ed490b5211"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af5ec8648416926263780d9c597db35ed"><td class="memTemplParams" colspan="2">template&lt;class R &gt; </td></tr>
+<tr class="memitem:af5ec8648416926263780d9c597db35ed"><td class="memTemplItemLeft" align="right" valign="top">std::pair&lt; std::vector&lt; <a class="el" href="classtriplegit_1_1async__io_1_1future.html">future</a><br class="typebreak"/>
+&lt; R &gt; &gt;, std::vector<br class="typebreak"/>
+&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &gt; &gt;&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#af5ec8648416926263780d9c597db35ed">call</a> (const std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &gt; &amp;ops, const std::vector&lt; std::function&lt; R()&gt;&gt; &amp;callables)</td></tr>
+<tr class="memdesc:af5ec8648416926263780d9c597db35ed"><td class="mdescLeft">&#160;</td><td class="mdescRight">Invoke the specified callable when the supplied operation completes. <br/></td></tr>
+<tr class="separator:af5ec8648416926263780d9c597db35ed"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7057167ed1a46e3b24fa3806bd6172c1"><td class="memTemplParams" colspan="2">template&lt;class C , class... Args&gt; </td></tr>
+<tr class="memitem:a7057167ed1a46e3b24fa3806bd6172c1"><td class="memTemplItemLeft" align="right" valign="top">std::pair&lt; <a class="el" href="classtriplegit_1_1async__io_1_1future.html">future</a>&lt; typename <br class="typebreak"/>
+std::result_of&lt; C(Args...)&gt;<br class="typebreak"/>
+::type &gt;, <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &gt;&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a7057167ed1a46e3b24fa3806bd6172c1">call</a> (const <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &amp;req, C callback, Args...args)</td></tr>
+<tr class="memdesc:a7057167ed1a46e3b24fa3806bd6172c1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Invoke the specified callable when the supplied operation completes. <br/></td></tr>
+<tr class="separator:a7057167ed1a46e3b24fa3806bd6172c1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a517359ced87c537caff44dc6fa35fb19"><td class="memItemLeft" align="right" valign="top">virtual std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a517359ced87c537caff44dc6fa35fb19">dir</a> (const std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__path__op__req.html">async_path_op_req</a> &gt; &amp;reqs)=0</td></tr>
+<tr class="memdesc:a517359ced87c537caff44dc6fa35fb19"><td class="mdescLeft">&#160;</td><td class="mdescRight">Asynchronously creates directories. <br/></td></tr>
+<tr class="separator:a517359ced87c537caff44dc6fa35fb19"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a60be8d20fba4795a9838c706707041ef"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a60be8d20fba4795a9838c706707041ef">dir</a> (const <a class="el" href="structtriplegit_1_1async__io_1_1async__path__op__req.html">async_path_op_req</a> &amp;req)</td></tr>
+<tr class="memdesc:a60be8d20fba4795a9838c706707041ef"><td class="mdescLeft">&#160;</td><td class="mdescRight">Asynchronously creates a directory. <br/></td></tr>
+<tr class="separator:a60be8d20fba4795a9838c706707041ef"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4924392f3af3a7b429ca49d7c7a35b4e"><td class="memItemLeft" align="right" valign="top">virtual std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a4924392f3af3a7b429ca49d7c7a35b4e">rmdir</a> (const std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__path__op__req.html">async_path_op_req</a> &gt; &amp;reqs)=0</td></tr>
+<tr class="memdesc:a4924392f3af3a7b429ca49d7c7a35b4e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Asynchronously deletes directories. <br/></td></tr>
+<tr class="separator:a4924392f3af3a7b429ca49d7c7a35b4e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad60182955f83342b9cb237142e9c2ced"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#ad60182955f83342b9cb237142e9c2ced">rmdir</a> (const <a class="el" href="structtriplegit_1_1async__io_1_1async__path__op__req.html">async_path_op_req</a> &amp;req)</td></tr>
+<tr class="memdesc:ad60182955f83342b9cb237142e9c2ced"><td class="mdescLeft">&#160;</td><td class="mdescRight">Asynchronously deletes a directory. <br/></td></tr>
+<tr class="separator:ad60182955f83342b9cb237142e9c2ced"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6e008acf9f33b3ff43b0c73901f5f9c7"><td class="memItemLeft" align="right" valign="top">virtual std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a6e008acf9f33b3ff43b0c73901f5f9c7">file</a> (const std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__path__op__req.html">async_path_op_req</a> &gt; &amp;reqs)=0</td></tr>
+<tr class="memdesc:a6e008acf9f33b3ff43b0c73901f5f9c7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Asynchronously opens or creates files. <br/></td></tr>
+<tr class="separator:a6e008acf9f33b3ff43b0c73901f5f9c7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a16b57f66a84c25904cb02bdfb9e71a27"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a16b57f66a84c25904cb02bdfb9e71a27">file</a> (const <a class="el" href="structtriplegit_1_1async__io_1_1async__path__op__req.html">async_path_op_req</a> &amp;req)</td></tr>
+<tr class="memdesc:a16b57f66a84c25904cb02bdfb9e71a27"><td class="mdescLeft">&#160;</td><td class="mdescRight">Asynchronously opens or creates a file. <br/></td></tr>
+<tr class="separator:a16b57f66a84c25904cb02bdfb9e71a27"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7839e9b1fc5e2caba5e37a4f5ecebbb7"><td class="memItemLeft" align="right" valign="top">virtual std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a7839e9b1fc5e2caba5e37a4f5ecebbb7">rmfile</a> (const std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__path__op__req.html">async_path_op_req</a> &gt; &amp;reqs)=0</td></tr>
+<tr class="memdesc:a7839e9b1fc5e2caba5e37a4f5ecebbb7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Asynchronously deletes files. <br/></td></tr>
+<tr class="separator:a7839e9b1fc5e2caba5e37a4f5ecebbb7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad5b54fca9b70f2899218119176cca111"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#ad5b54fca9b70f2899218119176cca111">rmfile</a> (const <a class="el" href="structtriplegit_1_1async__io_1_1async__path__op__req.html">async_path_op_req</a> &amp;req)</td></tr>
+<tr class="memdesc:ad5b54fca9b70f2899218119176cca111"><td class="mdescLeft">&#160;</td><td class="mdescRight">Asynchronously deletes files. <br/></td></tr>
+<tr class="separator:ad5b54fca9b70f2899218119176cca111"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a20ac9ebe7fc8e9f898d3de8c85b03efd"><td class="memItemLeft" align="right" valign="top">virtual std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a20ac9ebe7fc8e9f898d3de8c85b03efd">sync</a> (const std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &gt; &amp;ops)=0</td></tr>
+<tr class="memdesc:a20ac9ebe7fc8e9f898d3de8c85b03efd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Asynchronously synchronises items with physical storage once they complete. <br/></td></tr>
+<tr class="separator:a20ac9ebe7fc8e9f898d3de8c85b03efd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8659dae5b8bbe2fe9e2a0b61579683d7"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a8659dae5b8bbe2fe9e2a0b61579683d7">sync</a> (const <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &amp;req)</td></tr>
+<tr class="memdesc:a8659dae5b8bbe2fe9e2a0b61579683d7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Asynchronously synchronises an item with physical storage once it completes. <br/></td></tr>
+<tr class="separator:a8659dae5b8bbe2fe9e2a0b61579683d7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abffcc5e304efb9622ef184eca8d29868"><td class="memItemLeft" align="right" valign="top">virtual std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#abffcc5e304efb9622ef184eca8d29868">close</a> (const std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &gt; &amp;ops)=0</td></tr>
+<tr class="memdesc:abffcc5e304efb9622ef184eca8d29868"><td class="mdescLeft">&#160;</td><td class="mdescRight">Asynchronously closes connections to items once they complete. <br/></td></tr>
+<tr class="separator:abffcc5e304efb9622ef184eca8d29868"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a828b6f410645dfe2dca3075c86e054c7"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a828b6f410645dfe2dca3075c86e054c7">close</a> (const <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &amp;req)</td></tr>
+<tr class="memdesc:a828b6f410645dfe2dca3075c86e054c7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Asynchronously closes the connection to an item once it completes. <br/></td></tr>
+<tr class="separator:a828b6f410645dfe2dca3075c86e054c7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a21f6fce370f936a958ebbebe74eb08c4"><td class="memItemLeft" align="right" valign="top">virtual std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a21f6fce370f936a958ebbebe74eb08c4">read</a> (const std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req.html">async_data_op_req</a>&lt; void &gt;&gt; &amp;ops)=0</td></tr>
+<tr class="memdesc:a21f6fce370f936a958ebbebe74eb08c4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Asynchronously reads data from items. <br/></td></tr>
+<tr class="separator:a21f6fce370f936a958ebbebe74eb08c4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4a855265b383c4db717040cc49b4fe1d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a4a855265b383c4db717040cc49b4fe1d">read</a> (const <a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req.html">async_data_op_req</a>&lt; void &gt; &amp;req)</td></tr>
+<tr class="memdesc:a4a855265b383c4db717040cc49b4fe1d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Asynchronously reads data from an item. <br/></td></tr>
+<tr class="separator:a4a855265b383c4db717040cc49b4fe1d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aab459d62576fcfea288094ad30a211e7"><td class="memTemplParams" colspan="2">template&lt;class T &gt; </td></tr>
+<tr class="memitem:aab459d62576fcfea288094ad30a211e7"><td class="memTemplItemLeft" align="right" valign="top">std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &gt;&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#aab459d62576fcfea288094ad30a211e7">read</a> (const std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req.html">async_data_op_req</a>&lt; T &gt;&gt; &amp;ops)</td></tr>
+<tr class="memdesc:aab459d62576fcfea288094ad30a211e7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Asynchronously reads data from items. <br/></td></tr>
+<tr class="separator:aab459d62576fcfea288094ad30a211e7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af087a1c53c619679a5e65fc828a7c652"><td class="memItemLeft" align="right" valign="top">virtual std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#af087a1c53c619679a5e65fc828a7c652">write</a> (const std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req.html">async_data_op_req</a>&lt; const void &gt;&gt; &amp;ops)=0</td></tr>
+<tr class="memdesc:af087a1c53c619679a5e65fc828a7c652"><td class="mdescLeft">&#160;</td><td class="mdescRight">Asynchronously writes data to items. <br/></td></tr>
+<tr class="separator:af087a1c53c619679a5e65fc828a7c652"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad3b11ed98996a8b674329e05dce13841"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#ad3b11ed98996a8b674329e05dce13841">write</a> (const <a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req.html">async_data_op_req</a>&lt; const void &gt; &amp;req)</td></tr>
+<tr class="memdesc:ad3b11ed98996a8b674329e05dce13841"><td class="mdescLeft">&#160;</td><td class="mdescRight">Asynchronously writes data to an item. <br/></td></tr>
+<tr class="separator:ad3b11ed98996a8b674329e05dce13841"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab00ad1238d5b87b7e87940b4566f7491"><td class="memTemplParams" colspan="2">template&lt;class T &gt; </td></tr>
+<tr class="memitem:ab00ad1238d5b87b7e87940b4566f7491"><td class="memTemplItemLeft" align="right" valign="top">std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &gt;&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#ab00ad1238d5b87b7e87940b4566f7491">write</a> (const std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req.html">async_data_op_req</a>&lt; T &gt;&gt; &amp;ops)</td></tr>
+<tr class="memdesc:ab00ad1238d5b87b7e87940b4566f7491"><td class="mdescLeft">&#160;</td><td class="mdescRight">Asynchronously writes data to items. <br/></td></tr>
+<tr class="separator:ab00ad1238d5b87b7e87940b4566f7491"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afd50d52fec35330deac6153aece92d7d"><td class="memItemLeft" align="right" valign="top">std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#afd50d52fec35330deac6153aece92d7d">truncate</a> (const std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &gt; &amp;ops, const std::vector&lt; off_t &gt; &amp;sizes)</td></tr>
+<tr class="memdesc:afd50d52fec35330deac6153aece92d7d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Convenience function for truncating the lengths of items via std::filesystem::resize_file() <br/></td></tr>
+<tr class="separator:afd50d52fec35330deac6153aece92d7d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aedd6e17486c726c5b08be8132fe55776"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#aedd6e17486c726c5b08be8132fe55776">truncate</a> (const <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &amp;op, off_t newsize)</td></tr>
+<tr class="memdesc:aedd6e17486c726c5b08be8132fe55776"><td class="mdescLeft">&#160;</td><td class="mdescRight">Convenience function for truncating the length of an item via std::filesystem::resize_file() <br/></td></tr>
+<tr class="separator:aedd6e17486c726c5b08be8132fe55776"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Abstract base class for dispatching file i/o asynchronously. </p>
+</div><h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="af5ec8648416926263780d9c597db35ed"></a>
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class R &gt; </div>
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">std::pair&lt; std::vector&lt; <a class="el" href="classtriplegit_1_1async__io_1_1future.html">future</a>&lt; R &gt; &gt;, std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &gt; &gt; triplegit::async_io::async_file_io_dispatcher_base::call </td>
+ <td>(</td>
+ <td class="paramtype">const std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &gt; &amp;&#160;</td>
+ <td class="paramname"><em>ops</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const std::vector&lt; std::function&lt; R()&gt;&gt; &amp;&#160;</td>
+ <td class="paramname"><em>callables</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Invoke the specified callable when the supplied operation completes. </p>
+
+</div>
+</div>
+<a class="anchor" id="a7057167ed1a46e3b24fa3806bd6172c1"></a>
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class C , class... Args&gt; </div>
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">std::pair&lt; <a class="el" href="classtriplegit_1_1async__io_1_1future.html">future</a>&lt; typename std::result_of&lt; C(Args...)&gt;::type &gt;, <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &gt; triplegit::async_io::async_file_io_dispatcher_base::call </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &amp;&#160;</td>
+ <td class="paramname"><em>req</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">C&#160;</td>
+ <td class="paramname"><em>callback</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">Args...&#160;</td>
+ <td class="paramname"><em>args</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Invoke the specified callable when the supplied operation completes. </p>
+
+</div>
+</div>
+<a class="anchor" id="abffcc5e304efb9622ef184eca8d29868"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual std::vector&lt;<a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a>&gt; triplegit::async_io::async_file_io_dispatcher_base::close </td>
+ <td>(</td>
+ <td class="paramtype">const std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &gt; &amp;&#160;</td>
+ <td class="paramname"><em>ops</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">pure virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Asynchronously closes connections to items once they complete. </p>
+
+</div>
+</div>
+<a class="anchor" id="a828b6f410645dfe2dca3075c86e054c7"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> triplegit::async_io::async_file_io_dispatcher_base::close </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &amp;&#160;</td>
+ <td class="paramname"><em>req</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Asynchronously closes the connection to an item once it completes. </p>
+
+</div>
+</div>
+<a class="anchor" id="a6fa594bfd2e1ed2af9e1a3ea25be7da5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">std::vector&lt;<a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a>&gt; triplegit::async_io::async_file_io_dispatcher_base::completion </td>
+ <td>(</td>
+ <td class="paramtype">const std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &gt; &amp;&#160;</td>
+ <td class="paramname"><em>ops</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const std::vector&lt; std::pair&lt; async_op_flags, std::function&lt; completion_t &gt;&gt;&gt; &amp;&#160;</td>
+ <td class="paramname"><em>callbacks</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Invoke the specified function when each of the supplied operations complete. </p>
+
+</div>
+</div>
+<a class="anchor" id="af0627f7511cac82528dcd7ed490b5211"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> triplegit::async_io::async_file_io_dispatcher_base::completion </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &amp;&#160;</td>
+ <td class="paramname"><em>req</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const std::pair&lt; async_op_flags, std::function&lt; completion_t &gt;&gt; &amp;&#160;</td>
+ <td class="paramname"><em>callback</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Invoke the specified function when the supplied operation completes. </p>
+
+</div>
+</div>
+<a class="anchor" id="aaee8e9e70ead7a56b5bfbdf7ac762450"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">size_t triplegit::async_io::async_file_io_dispatcher_base::count </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns the number of open items in this dispatcher. </p>
+
+</div>
+</div>
+<a class="anchor" id="a517359ced87c537caff44dc6fa35fb19"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual std::vector&lt;<a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a>&gt; triplegit::async_io::async_file_io_dispatcher_base::dir </td>
+ <td>(</td>
+ <td class="paramtype">const std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__path__op__req.html">async_path_op_req</a> &gt; &amp;&#160;</td>
+ <td class="paramname"><em>reqs</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">pure virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Asynchronously creates directories. </p>
+
+</div>
+</div>
+<a class="anchor" id="a60be8d20fba4795a9838c706707041ef"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> triplegit::async_io::async_file_io_dispatcher_base::dir </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="structtriplegit_1_1async__io_1_1async__path__op__req.html">async_path_op_req</a> &amp;&#160;</td>
+ <td class="paramname"><em>req</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Asynchronously creates a directory. </p>
+
+</div>
+</div>
+<a class="anchor" id="a6e008acf9f33b3ff43b0c73901f5f9c7"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual std::vector&lt;<a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a>&gt; triplegit::async_io::async_file_io_dispatcher_base::file </td>
+ <td>(</td>
+ <td class="paramtype">const std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__path__op__req.html">async_path_op_req</a> &gt; &amp;&#160;</td>
+ <td class="paramname"><em>reqs</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">pure virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Asynchronously opens or creates files. </p>
+
+</div>
+</div>
+<a class="anchor" id="a16b57f66a84c25904cb02bdfb9e71a27"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> triplegit::async_io::async_file_io_dispatcher_base::file </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="structtriplegit_1_1async__io_1_1async__path__op__req.html">async_path_op_req</a> &amp;&#160;</td>
+ <td class="paramname"><em>req</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Asynchronously opens or creates a file. </p>
+
+</div>
+</div>
+<a class="anchor" id="ab1746bda51c77ef5c1691b3f6857a270"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">file_flags triplegit::async_io::async_file_io_dispatcher_base::fileflags </td>
+ <td>(</td>
+ <td class="paramtype">file_flags&#160;</td>
+ <td class="paramname"><em>flags</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns file flags as would be used after forcing and masking. </p>
+
+</div>
+</div>
+<a class="anchor" id="a21f6fce370f936a958ebbebe74eb08c4"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual std::vector&lt;<a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a>&gt; triplegit::async_io::async_file_io_dispatcher_base::read </td>
+ <td>(</td>
+ <td class="paramtype">const std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req.html">async_data_op_req</a>&lt; void &gt;&gt; &amp;&#160;</td>
+ <td class="paramname"><em>ops</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">pure virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Asynchronously reads data from items. </p>
+
+</div>
+</div>
+<a class="anchor" id="a4a855265b383c4db717040cc49b4fe1d"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> triplegit::async_io::async_file_io_dispatcher_base::read </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req.html">async_data_op_req</a>&lt; void &gt; &amp;&#160;</td>
+ <td class="paramname"><em>req</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Asynchronously reads data from an item. </p>
+
+</div>
+</div>
+<a class="anchor" id="aab459d62576fcfea288094ad30a211e7"></a>
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class T &gt; </div>
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &gt; triplegit::async_io::async_file_io_dispatcher_base::read </td>
+ <td>(</td>
+ <td class="paramtype">const std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req.html">async_data_op_req</a>&lt; T &gt;&gt; &amp;&#160;</td>
+ <td class="paramname"><em>ops</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Asynchronously reads data from items. </p>
+
+</div>
+</div>
+<a class="anchor" id="a4924392f3af3a7b429ca49d7c7a35b4e"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual std::vector&lt;<a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a>&gt; triplegit::async_io::async_file_io_dispatcher_base::rmdir </td>
+ <td>(</td>
+ <td class="paramtype">const std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__path__op__req.html">async_path_op_req</a> &gt; &amp;&#160;</td>
+ <td class="paramname"><em>reqs</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">pure virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Asynchronously deletes directories. </p>
+
+</div>
+</div>
+<a class="anchor" id="ad60182955f83342b9cb237142e9c2ced"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> triplegit::async_io::async_file_io_dispatcher_base::rmdir </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="structtriplegit_1_1async__io_1_1async__path__op__req.html">async_path_op_req</a> &amp;&#160;</td>
+ <td class="paramname"><em>req</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Asynchronously deletes a directory. </p>
+
+</div>
+</div>
+<a class="anchor" id="a7839e9b1fc5e2caba5e37a4f5ecebbb7"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual std::vector&lt;<a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a>&gt; triplegit::async_io::async_file_io_dispatcher_base::rmfile </td>
+ <td>(</td>
+ <td class="paramtype">const std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__path__op__req.html">async_path_op_req</a> &gt; &amp;&#160;</td>
+ <td class="paramname"><em>reqs</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">pure virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Asynchronously deletes files. </p>
+
+</div>
+</div>
+<a class="anchor" id="ad5b54fca9b70f2899218119176cca111"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> triplegit::async_io::async_file_io_dispatcher_base::rmfile </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="structtriplegit_1_1async__io_1_1async__path__op__req.html">async_path_op_req</a> &amp;&#160;</td>
+ <td class="paramname"><em>req</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Asynchronously deletes files. </p>
+
+</div>
+</div>
+<a class="anchor" id="a20ac9ebe7fc8e9f898d3de8c85b03efd"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual std::vector&lt;<a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a>&gt; triplegit::async_io::async_file_io_dispatcher_base::sync </td>
+ <td>(</td>
+ <td class="paramtype">const std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &gt; &amp;&#160;</td>
+ <td class="paramname"><em>ops</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">pure virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Asynchronously synchronises items with physical storage once they complete. </p>
+
+</div>
+</div>
+<a class="anchor" id="a8659dae5b8bbe2fe9e2a0b61579683d7"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> triplegit::async_io::async_file_io_dispatcher_base::sync </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &amp;&#160;</td>
+ <td class="paramname"><em>req</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Asynchronously synchronises an item with physical storage once it completes. </p>
+
+</div>
+</div>
+<a class="anchor" id="ae17a53fb0dd440c3e26fb6ca648f9034"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classtriplegit_1_1async__io_1_1thread__pool.html">thread_pool</a>&amp; triplegit::async_io::async_file_io_dispatcher_base::threadpool </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns the thread pool used by this dispatcher. </p>
+
+</div>
+</div>
+<a class="anchor" id="afd50d52fec35330deac6153aece92d7d"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &gt; triplegit::async_io::async_file_io_dispatcher_base::truncate </td>
+ <td>(</td>
+ <td class="paramtype">const std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &gt; &amp;&#160;</td>
+ <td class="paramname"><em>ops</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const std::vector&lt; off_t &gt; &amp;&#160;</td>
+ <td class="paramname"><em>sizes</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Convenience function for truncating the lengths of items via std::filesystem::resize_file() </p>
+
+</div>
+</div>
+<a class="anchor" id="aedd6e17486c726c5b08be8132fe55776"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> triplegit::async_io::async_file_io_dispatcher_base::truncate </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &amp;&#160;</td>
+ <td class="paramname"><em>op</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">off_t&#160;</td>
+ <td class="paramname"><em>newsize</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Convenience function for truncating the length of an item via std::filesystem::resize_file() </p>
+
+</div>
+</div>
+<a class="anchor" id="a2ed9d1f242fa0acd8bced12a75c13474"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">size_t triplegit::async_io::async_file_io_dispatcher_base::wait_queue_depth </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns the current wait queue depth of this dispatcher. </p>
+
+</div>
+</div>
+<a class="anchor" id="af087a1c53c619679a5e65fc828a7c652"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual std::vector&lt;<a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a>&gt; triplegit::async_io::async_file_io_dispatcher_base::write </td>
+ <td>(</td>
+ <td class="paramtype">const std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req.html">async_data_op_req</a>&lt; const void &gt;&gt; &amp;&#160;</td>
+ <td class="paramname"><em>ops</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">pure virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Asynchronously writes data to items. </p>
+
+</div>
+</div>
+<a class="anchor" id="ad3b11ed98996a8b674329e05dce13841"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> triplegit::async_io::async_file_io_dispatcher_base::write </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req.html">async_data_op_req</a>&lt; const void &gt; &amp;&#160;</td>
+ <td class="paramname"><em>req</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Asynchronously writes data to an item. </p>
+
+</div>
+</div>
+<a class="anchor" id="ab00ad1238d5b87b7e87940b4566f7491"></a>
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class T &gt; </div>
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &gt; triplegit::async_io::async_file_io_dispatcher_base::write </td>
+ <td>(</td>
+ <td class="paramtype">const std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req.html">async_data_op_req</a>&lt; T &gt;&gt; &amp;&#160;</td>
+ <td class="paramname"><em>ops</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Asynchronously writes data to items. </p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>triplegit/include/<a class="el" href="async__file__io_8hpp_source.html">async_file_io.hpp</a></li>
+</ul>
+</div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/classtriplegit_1_1async__io_1_1detail_1_1async__io__handle-members.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/classtriplegit_1_1async__io_1_1detail_1_1async__io__handle-members.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,106 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li class="current">Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Class List</li>
+ <li>Class Index</li>
+ <li>Class Hierarchy</li>
+ <li>Class Members</li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><b>triplegit</b></li><li class="navelem"><a class="el" href="namespacetriplegit_1_1async__io.html">async_io</a></li><li class="navelem"><b>detail</b></li><li class="navelem"><a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html">async_io_handle</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">triplegit::async_io::detail::async_io_handle Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html">triplegit::async_io::detail::async_io_handle</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#af58d73f18065864e4e6026464116ee6e">native_handle</a>() const =0</td><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html">triplegit::async_io::detail::async_io_handle</a></td><td class="entry"><span class="mlabel">pure virtual</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#a00eaad37ed049b6577c750aa16736cc5">opened</a>() const </td><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html">triplegit::async_io::detail::async_io_handle</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#ab254a7c8d7512075368b2807621db5f5">parent</a>() const </td><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html">triplegit::async_io::detail::async_io_handle</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#abfff6c04e97084d71c44e811cc5d99d6">path</a>() const </td><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html">triplegit::async_io::detail::async_io_handle</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#a9e138be2ed4a0522a1710e693cd6377c">read_count</a>() const </td><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html">triplegit::async_io::detail::async_io_handle</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#ae96b546a730964e57bd0a50781237222">write_count</a>() const </td><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html">triplegit::async_io::detail::async_io_handle</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#a1ad31d5e35f7e8562787415f12ab5f7d">write_count_since_fsync</a>() const </td><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html">triplegit::async_io::detail::async_io_handle</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+</table></div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,313 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: triplegit::async_io::detail::async_io_handle Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li class="current">Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Class List</li>
+ <li>Class Index</li>
+ <li>Class Hierarchy</li>
+ <li>Class Members</li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><b>triplegit</b></li><li class="navelem"><a class="el" href="namespacetriplegit_1_1async__io.html">async_io</a></li><li class="navelem"><b>detail</b></li><li class="navelem"><a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html">async_io_handle</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+Public Member Functions &#124;
+List of all members </div>
+ <div class="headertitle">
+<div class="title">triplegit::async_io::detail::async_io_handle Class Reference<span class="mlabels"><span class="mlabel">abstract</span></span></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>May occasionally be useful to access to discover information about an open handle.
+ More...</p>
+
+<p><code>#include &lt;<a class="el" href="async__file__io_8hpp_source.html">async_file_io.hpp</a>&gt;</code></p>
+
+<p>Inherits enable_shared_from_this&lt; async_io_handle &gt;.</p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:ab254a7c8d7512075368b2807621db5f5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html">async_file_io_dispatcher_base</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#ab254a7c8d7512075368b2807621db5f5">parent</a> () const </td></tr>
+<tr class="memdesc:ab254a7c8d7512075368b2807621db5f5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the parent of this io handle. <br/></td></tr>
+<tr class="separator:ab254a7c8d7512075368b2807621db5f5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af58d73f18065864e4e6026464116ee6e"><td class="memItemLeft" align="right" valign="top">virtual void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#af58d73f18065864e4e6026464116ee6e">native_handle</a> () const =0</td></tr>
+<tr class="memdesc:af58d73f18065864e4e6026464116ee6e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the native handle of this io handle. <br/></td></tr>
+<tr class="separator:af58d73f18065864e4e6026464116ee6e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a00eaad37ed049b6577c750aa16736cc5"><td class="memItemLeft" align="right" valign="top">const <br class="typebreak"/>
+std::chrono::system_clock::time_point &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#a00eaad37ed049b6577c750aa16736cc5">opened</a> () const </td></tr>
+<tr class="memdesc:a00eaad37ed049b6577c750aa16736cc5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns when this handle was opened. <br/></td></tr>
+<tr class="separator:a00eaad37ed049b6577c750aa16736cc5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abfff6c04e97084d71c44e811cc5d99d6"><td class="memItemLeft" align="right" valign="top">const std::filesystem::path &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#abfff6c04e97084d71c44e811cc5d99d6">path</a> () const </td></tr>
+<tr class="memdesc:abfff6c04e97084d71c44e811cc5d99d6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the path of this io handle. <br/></td></tr>
+<tr class="separator:abfff6c04e97084d71c44e811cc5d99d6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9e138be2ed4a0522a1710e693cd6377c"><td class="memItemLeft" align="right" valign="top">off_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#a9e138be2ed4a0522a1710e693cd6377c">read_count</a> () const </td></tr>
+<tr class="memdesc:a9e138be2ed4a0522a1710e693cd6377c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns how many bytes have been read since this handle was opened. <br/></td></tr>
+<tr class="separator:a9e138be2ed4a0522a1710e693cd6377c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae96b546a730964e57bd0a50781237222"><td class="memItemLeft" align="right" valign="top">off_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#ae96b546a730964e57bd0a50781237222">write_count</a> () const </td></tr>
+<tr class="memdesc:ae96b546a730964e57bd0a50781237222"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns how many bytes have been written since this handle was opened. <br/></td></tr>
+<tr class="separator:ae96b546a730964e57bd0a50781237222"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1ad31d5e35f7e8562787415f12ab5f7d"><td class="memItemLeft" align="right" valign="top">off_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#a1ad31d5e35f7e8562787415f12ab5f7d">write_count_since_fsync</a> () const </td></tr>
+<tr class="memdesc:a1ad31d5e35f7e8562787415f12ab5f7d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns how many bytes have been written since this handle was last fsynced. <br/></td></tr>
+<tr class="separator:a1ad31d5e35f7e8562787415f12ab5f7d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>May occasionally be useful to access to discover information about an open handle. </p>
+</div><h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="af58d73f18065864e4e6026464116ee6e"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual void* triplegit::async_io::detail::async_io_handle::native_handle </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">pure virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Returns the native handle of this io handle. </p>
+
+</div>
+</div>
+<a class="anchor" id="a00eaad37ed049b6577c750aa16736cc5"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">const std::chrono::system_clock::time_point&amp; triplegit::async_io::detail::async_io_handle::opened </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Returns when this handle was opened. </p>
+
+</div>
+</div>
+<a class="anchor" id="ab254a7c8d7512075368b2807621db5f5"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html">async_file_io_dispatcher_base</a>* triplegit::async_io::detail::async_io_handle::parent </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Returns the parent of this io handle. </p>
+
+</div>
+</div>
+<a class="anchor" id="abfff6c04e97084d71c44e811cc5d99d6"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">const std::filesystem::path&amp; triplegit::async_io::detail::async_io_handle::path </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Returns the path of this io handle. </p>
+
+</div>
+</div>
+<a class="anchor" id="a9e138be2ed4a0522a1710e693cd6377c"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">off_t triplegit::async_io::detail::async_io_handle::read_count </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Returns how many bytes have been read since this handle was opened. </p>
+
+</div>
+</div>
+<a class="anchor" id="ae96b546a730964e57bd0a50781237222"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">off_t triplegit::async_io::detail::async_io_handle::write_count </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Returns how many bytes have been written since this handle was opened. </p>
+
+</div>
+</div>
+<a class="anchor" id="a1ad31d5e35f7e8562787415f12ab5f7d"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">off_t triplegit::async_io::detail::async_io_handle::write_count_since_fsync </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Returns how many bytes have been written since this handle was last fsynced. </p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>triplegit/include/<a class="el" href="async__file__io_8hpp_source.html">async_file_io.hpp</a></li>
+</ul>
+</div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/classtriplegit_1_1async__io_1_1future-members.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/classtriplegit_1_1async__io_1_1future-members.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,99 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li class="current">Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Class List</li>
+ <li>Class Index</li>
+ <li>Class Hierarchy</li>
+ <li>Class Members</li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><b>triplegit</b></li><li class="navelem"><a class="el" href="namespacetriplegit_1_1async__io.html">async_io</a></li><li class="navelem"><a class="el" href="classtriplegit_1_1async__io_1_1future.html">future</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">triplegit::async_io::future&lt; T &gt; Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classtriplegit_1_1async__io_1_1future.html">triplegit::async_io::future&lt; T &gt;</a>, including all inherited members.</p>
+<table class="directory">
+</table></div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/classtriplegit_1_1async__io_1_1future.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/classtriplegit_1_1async__io_1_1future.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,114 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: triplegit::async_io::future&lt; T &gt; Class Template Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li class="current">Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Class List</li>
+ <li>Class Index</li>
+ <li>Class Hierarchy</li>
+ <li>Class Members</li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><b>triplegit</b></li><li class="navelem"><a class="el" href="namespacetriplegit_1_1async__io.html">async_io</a></li><li class="navelem"><a class="el" href="classtriplegit_1_1async__io_1_1future.html">future</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+List of all members </div>
+ <div class="headertitle">
+<div class="title">triplegit::async_io::future&lt; T &gt; Class Template Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>For now, this is boost's future. Will be replaced when C++'s future catches up with boost's.
+ More...</p>
+
+<p><code>#include &lt;<a class="el" href="async__file__io_8hpp_source.html">async_file_io.hpp</a>&gt;</code></p>
+
+<p>Inherits future&lt; T &gt;.</p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><h3>template&lt;class T&gt;<br/>
+class triplegit::async_io::future&lt; T &gt;</h3>
+
+<p>For now, this is boost's future. Will be replaced when C++'s future catches up with boost's. </p>
+<p><a class="el" href="namespacetriplegit_1_1async__io.html#afc5e0576470c19d979b3b853305fc7d6" title="Returns a future vector of results from all the supplied futures.">when_all()</a> and <a class="el" href="namespacetriplegit_1_1async__io.html#ac024775f7df8eb059d2aeee8de8f5ff9" title="Returns a future tuple of results from all the supplied futures.">when_any()</a> definitions borrowed from http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3428.pdf </p>
+</div><hr/>The documentation for this class was generated from the following file:<ul>
+<li>triplegit/include/<a class="el" href="async__file__io_8hpp_source.html">async_file_io.hpp</a></li>
+</ul>
+</div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/classtriplegit_1_1async__io_1_1promise-members.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/classtriplegit_1_1async__io_1_1promise-members.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,99 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li class="current">Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Class List</li>
+ <li>Class Index</li>
+ <li>Class Hierarchy</li>
+ <li>Class Members</li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><b>triplegit</b></li><li class="navelem"><a class="el" href="namespacetriplegit_1_1async__io.html">async_io</a></li><li class="navelem"><a class="el" href="classtriplegit_1_1async__io_1_1promise.html">promise</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">triplegit::async_io::promise&lt; T &gt; Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classtriplegit_1_1async__io_1_1promise.html">triplegit::async_io::promise&lt; T &gt;</a>, including all inherited members.</p>
+<table class="directory">
+</table></div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/classtriplegit_1_1async__io_1_1promise.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/classtriplegit_1_1async__io_1_1promise.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,113 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: triplegit::async_io::promise&lt; T &gt; Class Template Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li class="current">Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Class List</li>
+ <li>Class Index</li>
+ <li>Class Hierarchy</li>
+ <li>Class Members</li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><b>triplegit</b></li><li class="navelem"><a class="el" href="namespacetriplegit_1_1async__io.html">async_io</a></li><li class="navelem"><a class="el" href="classtriplegit_1_1async__io_1_1promise.html">promise</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+List of all members </div>
+ <div class="headertitle">
+<div class="title">triplegit::async_io::promise&lt; T &gt; Class Template Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>For now, this is boost's promise. Will be replaced when C++'s promise catches up with boost's.
+ More...</p>
+
+<p><code>#include &lt;<a class="el" href="async__file__io_8hpp_source.html">async_file_io.hpp</a>&gt;</code></p>
+
+<p>Inherits promise&lt; T &gt;.</p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><h3>template&lt;class T&gt;<br/>
+class triplegit::async_io::promise&lt; T &gt;</h3>
+
+<p>For now, this is boost's promise. Will be replaced when C++'s promise catches up with boost's. </p>
+</div><hr/>The documentation for this class was generated from the following file:<ul>
+<li>triplegit/include/<a class="el" href="async__file__io_8hpp_source.html">async_file_io.hpp</a></li>
+</ul>
+</div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/classtriplegit_1_1async__io_1_1shared__future-members.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/classtriplegit_1_1async__io_1_1shared__future-members.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,99 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li class="current">Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Class List</li>
+ <li>Class Index</li>
+ <li>Class Hierarchy</li>
+ <li>Class Members</li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><b>triplegit</b></li><li class="navelem"><a class="el" href="namespacetriplegit_1_1async__io.html">async_io</a></li><li class="navelem"><a class="el" href="classtriplegit_1_1async__io_1_1shared__future.html">shared_future</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">triplegit::async_io::shared_future&lt; T &gt; Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classtriplegit_1_1async__io_1_1shared__future.html">triplegit::async_io::shared_future&lt; T &gt;</a>, including all inherited members.</p>
+<table class="directory">
+</table></div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/classtriplegit_1_1async__io_1_1shared__future.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/classtriplegit_1_1async__io_1_1shared__future.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,114 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: triplegit::async_io::shared_future&lt; T &gt; Class Template Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li class="current">Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Class List</li>
+ <li>Class Index</li>
+ <li>Class Hierarchy</li>
+ <li>Class Members</li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><b>triplegit</b></li><li class="navelem"><a class="el" href="namespacetriplegit_1_1async__io.html">async_io</a></li><li class="navelem"><a class="el" href="classtriplegit_1_1async__io_1_1shared__future.html">shared_future</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+List of all members </div>
+ <div class="headertitle">
+<div class="title">triplegit::async_io::shared_future&lt; T &gt; Class Template Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>For now, this is boost's <a class="el" href="classtriplegit_1_1async__io_1_1shared__future.html" title="For now, this is boost&#39;s shared_future. Will be replaced when C++&#39;s shared_future catches up with boo...">shared_future</a>. Will be replaced when C++'s <a class="el" href="classtriplegit_1_1async__io_1_1shared__future.html" title="For now, this is boost&#39;s shared_future. Will be replaced when C++&#39;s shared_future catches up with boo...">shared_future</a> catches up with boost's.
+ More...</p>
+
+<p><code>#include &lt;<a class="el" href="async__file__io_8hpp_source.html">async_file_io.hpp</a>&gt;</code></p>
+
+<p>Inherits shared_future&lt; T &gt;.</p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><h3>template&lt;class T&gt;<br/>
+class triplegit::async_io::shared_future&lt; T &gt;</h3>
+
+<p>For now, this is boost's <a class="el" href="classtriplegit_1_1async__io_1_1shared__future.html" title="For now, this is boost&#39;s shared_future. Will be replaced when C++&#39;s shared_future catches up with boo...">shared_future</a>. Will be replaced when C++'s <a class="el" href="classtriplegit_1_1async__io_1_1shared__future.html" title="For now, this is boost&#39;s shared_future. Will be replaced when C++&#39;s shared_future catches up with boo...">shared_future</a> catches up with boost's. </p>
+<p><a class="el" href="namespacetriplegit_1_1async__io.html#afc5e0576470c19d979b3b853305fc7d6" title="Returns a future vector of results from all the supplied futures.">when_all()</a> and <a class="el" href="namespacetriplegit_1_1async__io.html#ac024775f7df8eb059d2aeee8de8f5ff9" title="Returns a future tuple of results from all the supplied futures.">when_any()</a> definitions borrowed from http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3428.pdf </p>
+</div><hr/>The documentation for this class was generated from the following file:<ul>
+<li>triplegit/include/<a class="el" href="async__file__io_8hpp_source.html">async_file_io.hpp</a></li>
+</ul>
+</div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/classtriplegit_1_1async__io_1_1thread__pool-members.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/classtriplegit_1_1async__io_1_1thread__pool-members.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,102 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li class="current">Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Class List</li>
+ <li>Class Index</li>
+ <li>Class Hierarchy</li>
+ <li>Class Members</li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><b>triplegit</b></li><li class="navelem"><a class="el" href="namespacetriplegit_1_1async__io.html">async_io</a></li><li class="navelem"><a class="el" href="classtriplegit_1_1async__io_1_1thread__pool.html">thread_pool</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">triplegit::async_io::thread_pool Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classtriplegit_1_1async__io_1_1thread__pool.html">triplegit::async_io::thread_pool</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1thread__pool.html#a1197a18cb30a52bb1ee02cd2ef742bff">enqueue</a>(F f)</td><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1thread__pool.html">triplegit::async_io::thread_pool</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1thread__pool.html#a67f5b5480be42f8cb94878c5ff95b245">io_service</a>()</td><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1thread__pool.html">triplegit::async_io::thread_pool</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1thread__pool.html#ad55f84716fd629d7e895f109a150e83e">thread_pool</a>(size_t no)</td><td class="entry"><a class="el" href="classtriplegit_1_1async__io_1_1thread__pool.html">triplegit::async_io::thread_pool</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">explicit</span></td></tr>
+</table></div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/classtriplegit_1_1async__io_1_1thread__pool.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/classtriplegit_1_1async__io_1_1thread__pool.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,205 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: triplegit::async_io::thread_pool Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li class="current">Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Class List</li>
+ <li>Class Index</li>
+ <li>Class Hierarchy</li>
+ <li>Class Members</li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><b>triplegit</b></li><li class="navelem"><a class="el" href="namespacetriplegit_1_1async__io.html">async_io</a></li><li class="navelem"><a class="el" href="classtriplegit_1_1async__io_1_1thread__pool.html">thread_pool</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+Public Member Functions &#124;
+List of all members </div>
+ <div class="headertitle">
+<div class="title">triplegit::async_io::thread_pool Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>A very simple thread pool based on Boost.ASIO and std::thread.
+ More...</p>
+
+<p><code>#include &lt;<a class="el" href="async__file__io_8hpp_source.html">async_file_io.hpp</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:ad55f84716fd629d7e895f109a150e83e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1thread__pool.html#ad55f84716fd629d7e895f109a150e83e">thread_pool</a> (size_t no)</td></tr>
+<tr class="memdesc:ad55f84716fd629d7e895f109a150e83e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructs a thread pool of <em>no</em> workers. <br/></td></tr>
+<tr class="separator:ad55f84716fd629d7e895f109a150e83e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a67f5b5480be42f8cb94878c5ff95b245"><td class="memItemLeft" align="right" valign="top">boost::asio::io_service &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1thread__pool.html#a67f5b5480be42f8cb94878c5ff95b245">io_service</a> ()</td></tr>
+<tr class="memdesc:a67f5b5480be42f8cb94878c5ff95b245"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the underlying io_service. <br/></td></tr>
+<tr class="separator:a67f5b5480be42f8cb94878c5ff95b245"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1197a18cb30a52bb1ee02cd2ef742bff"><td class="memTemplParams" colspan="2">template&lt;class F &gt; </td></tr>
+<tr class="memitem:a1197a18cb30a52bb1ee02cd2ef742bff"><td class="memTemplItemLeft" align="right" valign="top"><a class="el" href="classtriplegit_1_1async__io_1_1future.html">future</a>&lt; typename <br class="typebreak"/>
+std::result_of&lt; F()&gt;::type &gt;&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1thread__pool.html#a1197a18cb30a52bb1ee02cd2ef742bff">enqueue</a> (F f)</td></tr>
+<tr class="memdesc:a1197a18cb30a52bb1ee02cd2ef742bff"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sends some callable entity to the thread pool for execution. <br/></td></tr>
+<tr class="separator:a1197a18cb30a52bb1ee02cd2ef742bff"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>A very simple thread pool based on Boost.ASIO and std::thread. </p>
+</div><h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" id="ad55f84716fd629d7e895f109a150e83e"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">triplegit::async_io::thread_pool::thread_pool </td>
+ <td>(</td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>no</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">explicit</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Constructs a thread pool of <em>no</em> workers. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="a1197a18cb30a52bb1ee02cd2ef742bff"></a>
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class F &gt; </div>
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classtriplegit_1_1async__io_1_1future.html">future</a>&lt;typename std::result_of&lt;F()&gt;::type&gt; triplegit::async_io::thread_pool::enqueue </td>
+ <td>(</td>
+ <td class="paramtype">F&#160;</td>
+ <td class="paramname"><em>f</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Sends some callable entity to the thread pool for execution. </p>
+
+</div>
+</div>
+<a class="anchor" id="a67f5b5480be42f8cb94878c5ff95b245"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">boost::asio::io_service&amp; triplegit::async_io::thread_pool::io_service </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Returns the underlying io_service. </p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>triplegit/include/<a class="el" href="async__file__io_8hpp_source.html">async_file_io.hpp</a></li>
+</ul>
+</div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/classtriplegit_1_1base__store-members.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/classtriplegit_1_1base__store-members.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,104 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li class="current">Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Class List</li>
+ <li>Class Index</li>
+ <li>Class Hierarchy</li>
+ <li>Class Members</li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><b>triplegit</b></li><li class="navelem"><a class="el" href="classtriplegit_1_1base__store.html">base_store</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">triplegit::base_store Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classtriplegit_1_1base__store.html">triplegit::base_store</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classtriplegit_1_1base__store.html#af1c4c71d3f7e240925439a456c7d2b36">checkCollectionId</a>(const collection_id &amp;id) const </td><td class="entry"><a class="el" href="classtriplegit_1_1base__store.html">triplegit::base_store</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classtriplegit_1_1base__store.html#aae2fc9e86358fb51548d35b4b1691aef">collections_t</a> typedef</td><td class="entry"><a class="el" href="classtriplegit_1_1base__store.html">triplegit::base_store</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classtriplegit_1_1base__store.html#a03deb45a9a388d839b6fc6832909668e">config</a>() const </td><td class="entry"><a class="el" href="classtriplegit_1_1base__store.html">triplegit::base_store</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classtriplegit_1_1base__store.html#a00b19473f5b199c72040057b4c27c72a">isFSReadOnly</a>() const </td><td class="entry"><a class="el" href="classtriplegit_1_1base__store.html">triplegit::base_store</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classtriplegit_1_1base__store.html#ae7c169da7d9faffe60cbc64b3e965e7f">isReadOnly</a>() const </td><td class="entry"><a class="el" href="classtriplegit_1_1base__store.html">triplegit::base_store</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/classtriplegit_1_1base__store.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/classtriplegit_1_1base__store.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,227 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: triplegit::base_store Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li class="current">Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Class List</li>
+ <li>Class Index</li>
+ <li>Class Hierarchy</li>
+ <li>Class Members</li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><b>triplegit</b></li><li class="navelem"><a class="el" href="classtriplegit_1_1base__store.html">base_store</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+Public Types &#124;
+Public Member Functions &#124;
+List of all members </div>
+ <div class="headertitle">
+<div class="title">triplegit::base_store Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Base class for a stored graph.
+ More...</p>
+
+<p><code>#include &lt;<a class="el" href="triplegit_8hpp_source.html">triplegit.hpp</a>&gt;</code></p>
+<div class="dynheader">
+Inheritance diagram for triplegit::base_store:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classtriplegit_1_1base__store.png" usemap="#triplegit::base_store_map" alt=""/>
+ <map id="triplegit::base_store_map" name="triplegit::base_store_map">
+<area href="classtriplegit_1_1fs__store.html" title="A graph stored in the filing system." alt="triplegit::fs_store" shape="rect" coords="0,56,121,80"/>
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-types"></a>
+Public Types</h2></td></tr>
+<tr class="memitem:aae2fc9e86358fb51548d35b4b1691aef"><td class="memItemLeft" align="right" valign="top">typedef std::unordered_set<br class="typebreak"/>
+&lt; <a class="el" href="classtriplegit_1_1collection__id.html">collection_id</a> &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1base__store.html#aae2fc9e86358fb51548d35b4b1691aef">collections_t</a></td></tr>
+<tr class="memdesc:aae2fc9e86358fb51548d35b4b1691aef"><td class="mdescLeft">&#160;</td><td class="mdescRight">A set of collections. <br/></td></tr>
+<tr class="separator:aae2fc9e86358fb51548d35b4b1691aef"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a03deb45a9a388d839b6fc6832909668e"><td class="memItemLeft" align="right" valign="top">const boost::property_tree::ptree &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1base__store.html#a03deb45a9a388d839b6fc6832909668e">config</a> () const </td></tr>
+<tr class="memdesc:a03deb45a9a388d839b6fc6832909668e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the configuration of this graph store. <br/></td></tr>
+<tr class="separator:a03deb45a9a388d839b6fc6832909668e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae7c169da7d9faffe60cbc64b3e965e7f"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1base__store.html#ae7c169da7d9faffe60cbc64b3e965e7f">isReadOnly</a> () const </td></tr>
+<tr class="memdesc:ae7c169da7d9faffe60cbc64b3e965e7f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns if this instance is read-only. <br/></td></tr>
+<tr class="separator:ae7c169da7d9faffe60cbc64b3e965e7f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a00b19473f5b199c72040057b4c27c72a"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1base__store.html#a00b19473f5b199c72040057b4c27c72a">isFSReadOnly</a> () const </td></tr>
+<tr class="memdesc:a00b19473f5b199c72040057b4c27c72a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns if this instance is read-only due to the filing system. <br/></td></tr>
+<tr class="separator:a00b19473f5b199c72040057b4c27c72a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af1c4c71d3f7e240925439a456c7d2b36"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1base__store.html#af1c4c71d3f7e240925439a456c7d2b36">checkCollectionId</a> (const <a class="el" href="classtriplegit_1_1collection__id.html">collection_id</a> &amp;id) const </td></tr>
+<tr class="memdesc:af1c4c71d3f7e240925439a456c7d2b36"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns if a collection id is unique. <br/></td></tr>
+<tr class="separator:af1c4c71d3f7e240925439a456c7d2b36"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Base class for a stored graph. </p>
+</div><h2 class="groupheader">Member Typedef Documentation</h2>
+<a class="anchor" id="aae2fc9e86358fb51548d35b4b1691aef"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">typedef std::unordered_set&lt;<a class="el" href="classtriplegit_1_1collection__id.html">collection_id</a>&gt; <a class="el" href="classtriplegit_1_1base__store.html#aae2fc9e86358fb51548d35b4b1691aef">triplegit::base_store::collections_t</a></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>A set of collections. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="af1c4c71d3f7e240925439a456c7d2b36"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool triplegit::base_store::checkCollectionId </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classtriplegit_1_1collection__id.html">collection_id</a> &amp;&#160;</td>
+ <td class="paramname"><em>id</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns if a collection id is unique. </p>
+
+</div>
+</div>
+<a class="anchor" id="a03deb45a9a388d839b6fc6832909668e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const boost::property_tree::ptree&amp; triplegit::base_store::config </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns the configuration of this graph store. </p>
+
+</div>
+</div>
+<a class="anchor" id="a00b19473f5b199c72040057b4c27c72a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool triplegit::base_store::isFSReadOnly </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns if this instance is read-only due to the filing system. </p>
+
+</div>
+</div>
+<a class="anchor" id="ae7c169da7d9faffe60cbc64b3e965e7f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool triplegit::base_store::isReadOnly </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns if this instance is read-only. </p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>triplegit/include/<a class="el" href="triplegit_8hpp_source.html">triplegit.hpp</a></li>
+</ul>
+</div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/classtriplegit_1_1base__store.png
==============================================================================
Binary file. No diff available.

Added: sandbox/triplegit/trunk/html/classtriplegit_1_1boost_1_1adjacency__list-members.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/classtriplegit_1_1boost_1_1adjacency__list-members.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,99 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li class="current">Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Class List</li>
+ <li>Class Index</li>
+ <li>Class Hierarchy</li>
+ <li>Class Members</li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><b>triplegit</b></li><li class="navelem"><b>boost</b></li><li class="navelem"><a class="el" href="classtriplegit_1_1boost_1_1adjacency__list.html">adjacency_list</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">triplegit::boost::adjacency_list&lt; OutEdgeListS, VertexListS, DirectedS, VertexProperty, EdgeProperty, GraphProperty, EdgeListS &gt; Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classtriplegit_1_1boost_1_1adjacency__list.html">triplegit::boost::adjacency_list&lt; OutEdgeListS, VertexListS, DirectedS, VertexProperty, EdgeProperty, GraphProperty, EdgeListS &gt;</a>, including all inherited members.</p>
+<table class="directory">
+</table></div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/classtriplegit_1_1boost_1_1adjacency__list.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/classtriplegit_1_1boost_1_1adjacency__list.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,148 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: triplegit::boost::adjacency_list&lt; OutEdgeListS, VertexListS, DirectedS, VertexProperty, EdgeProperty, GraphProperty, EdgeListS &gt; Class Template Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li class="current">Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Class List</li>
+ <li>Class Index</li>
+ <li>Class Hierarchy</li>
+ <li>Class Members</li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><b>triplegit</b></li><li class="navelem"><b>boost</b></li><li class="navelem"><a class="el" href="classtriplegit_1_1boost_1_1adjacency__list.html">adjacency_list</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+List of all members </div>
+ <div class="headertitle">
+<div class="title">triplegit::boost::adjacency_list&lt; OutEdgeListS, VertexListS, DirectedS, VertexProperty, EdgeProperty, GraphProperty, EdgeListS &gt; Class Template Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>A stored Boost.Graph <a class="el" href="classtriplegit_1_1boost_1_1adjacency__list.html" title="A stored Boost.Graph adjacency_list.">adjacency_list</a>.
+ More...</p>
+
+<p><code>#include &lt;<a class="el" href="triplegit_8hpp_source.html">triplegit.hpp</a>&gt;</code></p>
+<div class="dynheader">
+Inheritance diagram for triplegit::boost::adjacency_list&lt; OutEdgeListS, VertexListS, DirectedS, VertexProperty, EdgeProperty, GraphProperty, EdgeListS &gt;:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classtriplegit_1_1boost_1_1adjacency__list.png" usemap="#triplegit::boost::adjacency_list&lt; OutEdgeListS, VertexListS, DirectedS, VertexProperty, EdgeProperty, GraphProperty, EdgeListS &gt;_map" alt=""/>
+ <map id="triplegit::boost::adjacency_list&lt; OutEdgeListS, VertexListS, DirectedS, VertexProperty, EdgeProperty, GraphProperty, EdgeListS &gt;_map" name="triplegit::boost::adjacency_list&lt; OutEdgeListS, VertexListS, DirectedS, VertexProperty, EdgeProperty, GraphProperty, EdgeListS &gt;_map">
+<area href="classtriplegit_1_1storable__vertices.html" alt="triplegit::storable_vertices&lt; adjacency_list&lt; OutEdgeListS, VertexListS, DirectedS, VertexProperty, EdgeProperty, GraphProperty, EdgeListS &gt; &gt;" shape="rect" coords="0,0,839,24"/>
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="inherited"></a>
+Additional Inherited Members</h2></td></tr>
+<tr class="inherit_header pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td colspan="2" onclick="javascript:toggleInherit('pub_methods_classtriplegit_1_1detail_1_1storable__vertices')"><img src="closed.png" alt="-"/>&#160;Public Member Functions inherited from <a class="el" href="classtriplegit_1_1detail_1_1storable__vertices.html">triplegit::detail::storable_vertices</a></td></tr>
+<tr class="memitem:a07579601c833c308078538601ba1a0a8 inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><b>isLoaded</b> () const </td></tr>
+<tr class="memdesc:a07579601c833c308078538601ba1a0a8 inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns if loaded. <br/></td></tr>
+<tr class="separator:a07579601c833c308078538601ba1a0a8 inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1cd39b7dc537d7d43cbf7064714a5df8 inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><b>isDirty</b> () const </td></tr>
+<tr class="memdesc:a1cd39b7dc537d7d43cbf7064714a5df8 inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns if dirty. <br/></td></tr>
+<tr class="separator:a1cd39b7dc537d7d43cbf7064714a5df8 inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8ff7646bf769640b6d9130737adbdc50 inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classtriplegit_1_1async__io_1_1future.html">async_io::future</a>&lt; void &gt;&#160;</td><td class="memItemRight" valign="bottom"><b>begincommit</b> ()</td></tr>
+<tr class="memdesc:a8ff7646bf769640b6d9130737adbdc50 inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="mdescLeft">&#160;</td><td class="mdescRight">Begins a commit to attached storage. <br/></td></tr>
+<tr class="separator:a8ff7646bf769640b6d9130737adbdc50 inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afcc4cf8a061cdb51945ea4cc686d966a inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><b>attach</b> (<a class="el" href="classtriplegit_1_1base__store.html">base_store</a> &amp;store, <a class="el" href="classtriplegit_1_1collection__id.html">collection_id</a> id)</td></tr>
+<tr class="memdesc:afcc4cf8a061cdb51945ea4cc686d966a inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="mdescLeft">&#160;</td><td class="mdescRight">Attachs this collection of vertices to the given store. <br/></td></tr>
+<tr class="separator:afcc4cf8a061cdb51945ea4cc686d966a inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6927e644fff92f85f5534b1696843f70 inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="memTemplParams" colspan="2">template&lt;typename Iterator &gt; </td></tr>
+<tr class="memitem:a6927e644fff92f85f5534b1696843f70 inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="memTemplItemLeft" align="right" valign="top">void&#160;</td><td class="memTemplItemRight" valign="bottom"><b>attach</b> (Iterator begin, Iterator end)</td></tr>
+<tr class="memdesc:a6927e644fff92f85f5534b1696843f70 inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="mdescLeft">&#160;</td><td class="mdescRight">Attachs this collection of vertices to the given stores of std::pair&lt;base_store &amp;, collection_id&gt; <br/></td></tr>
+<tr class="separator:a6927e644fff92f85f5534b1696843f70 inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a41cc4c63093f8a523947b1fb13f269f8 inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><b>detach</b> (<a class="el" href="classtriplegit_1_1base__store.html">base_store</a> &amp;store, <a class="el" href="classtriplegit_1_1collection__id.html">collection_id</a> id)</td></tr>
+<tr class="memdesc:a41cc4c63093f8a523947b1fb13f269f8 inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="mdescLeft">&#160;</td><td class="mdescRight">Detachs this collection of vertices from the given store. <br/></td></tr>
+<tr class="separator:a41cc4c63093f8a523947b1fb13f269f8 inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8d34a45c42f2078aa4b90595c9b775e0 inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="memTemplParams" colspan="2">template&lt;typename Iterator &gt; </td></tr>
+<tr class="memitem:a8d34a45c42f2078aa4b90595c9b775e0 inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="memTemplItemLeft" align="right" valign="top">void&#160;</td><td class="memTemplItemRight" valign="bottom"><b>detach</b> (Iterator begin, Iterator end)</td></tr>
+<tr class="memdesc:a8d34a45c42f2078aa4b90595c9b775e0 inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="mdescLeft">&#160;</td><td class="mdescRight">Detachs this collection of vertices to the given stores of std::pair&lt;base_store &amp;, collection_id&gt; <br/></td></tr>
+<tr class="separator:a8d34a45c42f2078aa4b90595c9b775e0 inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><h3>template&lt;class OutEdgeListS = boost::vecS, class VertexListS = boost::vecS, class DirectedS = boost::directedS, class VertexProperty = boost::no_property, class EdgeProperty = boost::no_property, class GraphProperty = boost::no_property, class EdgeListS = boost::listS&gt;<br/>
+class triplegit::boost::adjacency_list&lt; OutEdgeListS, VertexListS, DirectedS, VertexProperty, EdgeProperty, GraphProperty, EdgeListS &gt;</h3>
+
+<p>A stored Boost.Graph <a class="el" href="classtriplegit_1_1boost_1_1adjacency__list.html" title="A stored Boost.Graph adjacency_list.">adjacency_list</a>. </p>
+</div><hr/>The documentation for this class was generated from the following file:<ul>
+<li>triplegit/include/<a class="el" href="triplegit_8hpp_source.html">triplegit.hpp</a></li>
+</ul>
+</div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/classtriplegit_1_1boost_1_1adjacency__list.png
==============================================================================
Binary file. No diff available.

Added: sandbox/triplegit/trunk/html/classtriplegit_1_1collection__id-members.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/classtriplegit_1_1collection__id-members.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,101 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li class="current">Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Class List</li>
+ <li>Class Index</li>
+ <li>Class Hierarchy</li>
+ <li>Class Members</li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><b>triplegit</b></li><li class="navelem"><a class="el" href="classtriplegit_1_1collection__id.html">collection_id</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">triplegit::collection_id Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classtriplegit_1_1collection__id.html">triplegit::collection_id</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classtriplegit_1_1collection__id.html#abf5fe0ca6383437bdc684e6219078c38">collection_id</a>(fs_store &amp;store)</td><td class="entry"><a class="el" href="classtriplegit_1_1collection__id.html">triplegit::collection_id</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classtriplegit_1_1collection__id.html#a60ccc9c03400843c050c4c7e9dcefcb1">collection_id</a>(fs_store &amp;store, const std::string &amp;name, bool mustBeUnique=false)</td><td class="entry"><a class="el" href="classtriplegit_1_1collection__id.html">triplegit::collection_id</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/classtriplegit_1_1collection__id.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/classtriplegit_1_1collection__id.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,181 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: triplegit::collection_id Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li class="current">Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Class List</li>
+ <li>Class Index</li>
+ <li>Class Hierarchy</li>
+ <li>Class Members</li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><b>triplegit</b></li><li class="navelem"><a class="el" href="classtriplegit_1_1collection__id.html">collection_id</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+Public Member Functions &#124;
+List of all members </div>
+ <div class="headertitle">
+<div class="title">triplegit::collection_id Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>A collection in a <a class="el" href="classtriplegit_1_1fs__store.html" title="A graph stored in the filing system.">fs_store</a>.
+ More...</p>
+
+<p><code>#include &lt;<a class="el" href="triplegit_8hpp_source.html">triplegit.hpp</a>&gt;</code></p>
+<div class="dynheader">
+Inheritance diagram for triplegit::collection_id:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classtriplegit_1_1collection__id.png" usemap="#triplegit::collection_id_map" alt=""/>
+ <map id="triplegit::collection_id_map" name="triplegit::collection_id_map">
+<area href="classtriplegit_1_1unique__id.html" alt="triplegit::unique_id&lt; NiallsCPP11Utilities::Int128, NiallsCPP11Utilities::Hash128 &gt;" shape="rect" coords="0,0,460,24"/>
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:abf5fe0ca6383437bdc684e6219078c38"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1collection__id.html#abf5fe0ca6383437bdc684e6219078c38">collection_id</a> (<a class="el" href="classtriplegit_1_1fs__store.html">fs_store</a> &amp;store)</td></tr>
+<tr class="memdesc:abf5fe0ca6383437bdc684e6219078c38"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a new, unique, anonymous collection id. <br/></td></tr>
+<tr class="separator:abf5fe0ca6383437bdc684e6219078c38"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a60ccc9c03400843c050c4c7e9dcefcb1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1collection__id.html#a60ccc9c03400843c050c4c7e9dcefcb1">collection_id</a> (<a class="el" href="classtriplegit_1_1fs__store.html">fs_store</a> &amp;store, const std::string &amp;name, bool mustBeUnique=false)</td></tr>
+<tr class="memdesc:a60ccc9c03400843c050c4c7e9dcefcb1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a named collection id. <br/></td></tr>
+<tr class="separator:a60ccc9c03400843c050c4c7e9dcefcb1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>A collection in a <a class="el" href="classtriplegit_1_1fs__store.html" title="A graph stored in the filing system.">fs_store</a>. </p>
+</div><h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" id="abf5fe0ca6383437bdc684e6219078c38"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">triplegit::collection_id::collection_id </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classtriplegit_1_1fs__store.html">fs_store</a> &amp;&#160;</td>
+ <td class="paramname"><em>store</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Creates a new, unique, anonymous collection id. </p>
+
+</div>
+</div>
+<a class="anchor" id="a60ccc9c03400843c050c4c7e9dcefcb1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">triplegit::collection_id::collection_id </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classtriplegit_1_1fs__store.html">fs_store</a> &amp;&#160;</td>
+ <td class="paramname"><em>store</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">bool&#160;</td>
+ <td class="paramname"><em>mustBeUnique</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Creates a named collection id. </p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>triplegit/include/<a class="el" href="triplegit_8hpp_source.html">triplegit.hpp</a></li>
+</ul>
+</div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/classtriplegit_1_1collection__id.png
==============================================================================
Binary file. No diff available.

Added: sandbox/triplegit/trunk/html/classtriplegit_1_1fs__store-members.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/classtriplegit_1_1fs__store-members.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,105 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li class="current">Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Class List</li>
+ <li>Class Index</li>
+ <li>Class Hierarchy</li>
+ <li>Class Members</li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><b>triplegit</b></li><li class="navelem"><a class="el" href="classtriplegit_1_1fs__store.html">fs_store</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">triplegit::fs_store Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classtriplegit_1_1fs__store.html">triplegit::fs_store</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classtriplegit_1_1base__store.html#af1c4c71d3f7e240925439a456c7d2b36">checkCollectionId</a>(const collection_id &amp;id) const </td><td class="entry"><a class="el" href="classtriplegit_1_1base__store.html">triplegit::base_store</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classtriplegit_1_1base__store.html#aae2fc9e86358fb51548d35b4b1691aef">collections_t</a> typedef</td><td class="entry"><a class="el" href="classtriplegit_1_1base__store.html">triplegit::base_store</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classtriplegit_1_1base__store.html#a03deb45a9a388d839b6fc6832909668e">config</a>() const </td><td class="entry"><a class="el" href="classtriplegit_1_1base__store.html">triplegit::base_store</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classtriplegit_1_1fs__store.html#ab7e25c70606385d88d069550c4816378">fs_store</a>(const std::filesystem::path &amp;path, bool readOnly=false)</td><td class="entry"><a class="el" href="classtriplegit_1_1fs__store.html">triplegit::fs_store</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classtriplegit_1_1base__store.html#a00b19473f5b199c72040057b4c27c72a">isFSReadOnly</a>() const </td><td class="entry"><a class="el" href="classtriplegit_1_1base__store.html">triplegit::base_store</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classtriplegit_1_1base__store.html#ae7c169da7d9faffe60cbc64b3e965e7f">isReadOnly</a>() const </td><td class="entry"><a class="el" href="classtriplegit_1_1base__store.html">triplegit::base_store</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/classtriplegit_1_1fs__store.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/classtriplegit_1_1fs__store.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,176 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: triplegit::fs_store Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li class="current">Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Class List</li>
+ <li>Class Index</li>
+ <li>Class Hierarchy</li>
+ <li>Class Members</li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><b>triplegit</b></li><li class="navelem"><a class="el" href="classtriplegit_1_1fs__store.html">fs_store</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+Public Member Functions &#124;
+List of all members </div>
+ <div class="headertitle">
+<div class="title">triplegit::fs_store Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>A graph stored in the filing system.
+ More...</p>
+
+<p><code>#include &lt;<a class="el" href="triplegit_8hpp_source.html">triplegit.hpp</a>&gt;</code></p>
+<div class="dynheader">
+Inheritance diagram for triplegit::fs_store:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classtriplegit_1_1fs__store.png" usemap="#triplegit::fs_store_map" alt=""/>
+ <map id="triplegit::fs_store_map" name="triplegit::fs_store_map">
+<area href="classtriplegit_1_1base__store.html" title="Base class for a stored graph." alt="triplegit::base_store" shape="rect" coords="0,0,121,24"/>
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:ab7e25c70606385d88d069550c4816378"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1fs__store.html#ab7e25c70606385d88d069550c4816378">fs_store</a> (const std::filesystem::path &amp;path, bool readOnly=false)</td></tr>
+<tr class="memdesc:ab7e25c70606385d88d069550c4816378"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructs an instance using <em>path</em>. <br/></td></tr>
+<tr class="separator:ab7e25c70606385d88d069550c4816378"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="inherit_header pub_methods_classtriplegit_1_1base__store"><td colspan="2" onclick="javascript:toggleInherit('pub_methods_classtriplegit_1_1base__store')"><img src="closed.png" alt="-"/>&#160;Public Member Functions inherited from <a class="el" href="classtriplegit_1_1base__store.html">triplegit::base_store</a></td></tr>
+<tr class="memitem:a03deb45a9a388d839b6fc6832909668e inherit pub_methods_classtriplegit_1_1base__store"><td class="memItemLeft" align="right" valign="top">const boost::property_tree::ptree &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1base__store.html#a03deb45a9a388d839b6fc6832909668e">config</a> () const </td></tr>
+<tr class="memdesc:a03deb45a9a388d839b6fc6832909668e inherit pub_methods_classtriplegit_1_1base__store"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the configuration of this graph store. <br/></td></tr>
+<tr class="separator:a03deb45a9a388d839b6fc6832909668e inherit pub_methods_classtriplegit_1_1base__store"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae7c169da7d9faffe60cbc64b3e965e7f inherit pub_methods_classtriplegit_1_1base__store"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1base__store.html#ae7c169da7d9faffe60cbc64b3e965e7f">isReadOnly</a> () const </td></tr>
+<tr class="memdesc:ae7c169da7d9faffe60cbc64b3e965e7f inherit pub_methods_classtriplegit_1_1base__store"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns if this instance is read-only. <br/></td></tr>
+<tr class="separator:ae7c169da7d9faffe60cbc64b3e965e7f inherit pub_methods_classtriplegit_1_1base__store"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a00b19473f5b199c72040057b4c27c72a inherit pub_methods_classtriplegit_1_1base__store"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1base__store.html#a00b19473f5b199c72040057b4c27c72a">isFSReadOnly</a> () const </td></tr>
+<tr class="memdesc:a00b19473f5b199c72040057b4c27c72a inherit pub_methods_classtriplegit_1_1base__store"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns if this instance is read-only due to the filing system. <br/></td></tr>
+<tr class="separator:a00b19473f5b199c72040057b4c27c72a inherit pub_methods_classtriplegit_1_1base__store"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af1c4c71d3f7e240925439a456c7d2b36 inherit pub_methods_classtriplegit_1_1base__store"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1base__store.html#af1c4c71d3f7e240925439a456c7d2b36">checkCollectionId</a> (const <a class="el" href="classtriplegit_1_1collection__id.html">collection_id</a> &amp;id) const </td></tr>
+<tr class="memdesc:af1c4c71d3f7e240925439a456c7d2b36 inherit pub_methods_classtriplegit_1_1base__store"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns if a collection id is unique. <br/></td></tr>
+<tr class="separator:af1c4c71d3f7e240925439a456c7d2b36 inherit pub_methods_classtriplegit_1_1base__store"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="inherited"></a>
+Additional Inherited Members</h2></td></tr>
+<tr class="inherit_header pub_types_classtriplegit_1_1base__store"><td colspan="2" onclick="javascript:toggleInherit('pub_types_classtriplegit_1_1base__store')"><img src="closed.png" alt="-"/>&#160;Public Types inherited from <a class="el" href="classtriplegit_1_1base__store.html">triplegit::base_store</a></td></tr>
+<tr class="memitem:aae2fc9e86358fb51548d35b4b1691aef inherit pub_types_classtriplegit_1_1base__store"><td class="memItemLeft" align="right" valign="top">typedef std::unordered_set<br class="typebreak"/>
+&lt; <a class="el" href="classtriplegit_1_1collection__id.html">collection_id</a> &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1base__store.html#aae2fc9e86358fb51548d35b4b1691aef">collections_t</a></td></tr>
+<tr class="memdesc:aae2fc9e86358fb51548d35b4b1691aef inherit pub_types_classtriplegit_1_1base__store"><td class="mdescLeft">&#160;</td><td class="mdescRight">A set of collections. <br/></td></tr>
+<tr class="separator:aae2fc9e86358fb51548d35b4b1691aef inherit pub_types_classtriplegit_1_1base__store"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>A graph stored in the filing system. </p>
+<p>If the filing system is read-only the store is automatically marked as read-only. </p>
+</div><h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" id="ab7e25c70606385d88d069550c4816378"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">triplegit::fs_store::fs_store </td>
+ <td>(</td>
+ <td class="paramtype">const std::filesystem::path &amp;&#160;</td>
+ <td class="paramname"><em>path</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">bool&#160;</td>
+ <td class="paramname"><em>readOnly</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Constructs an instance using <em>path</em>. </p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>triplegit/include/<a class="el" href="triplegit_8hpp_source.html">triplegit.hpp</a></li>
+</ul>
+</div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/classtriplegit_1_1fs__store.png
==============================================================================
Binary file. No diff available.

Added: sandbox/triplegit/trunk/html/classtriplegit_1_1storable__vertices-members.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/classtriplegit_1_1storable__vertices-members.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,99 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li class="current">Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Class List</li>
+ <li>Class Index</li>
+ <li>Class Hierarchy</li>
+ <li>Class Members</li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><b>triplegit</b></li><li class="navelem"><a class="el" href="classtriplegit_1_1storable__vertices.html">storable_vertices</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">triplegit::storable_vertices&lt; derived &gt; Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classtriplegit_1_1storable__vertices.html">triplegit::storable_vertices&lt; derived &gt;</a>, including all inherited members.</p>
+<table class="directory">
+</table></div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/classtriplegit_1_1storable__vertices.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/classtriplegit_1_1storable__vertices.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,141 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: triplegit::storable_vertices&lt; derived &gt; Class Template Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li class="current">Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Class List</li>
+ <li>Class Index</li>
+ <li>Class Hierarchy</li>
+ <li>Class Members</li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><b>triplegit</b></li><li class="navelem"><a class="el" href="classtriplegit_1_1storable__vertices.html">storable_vertices</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+List of all members </div>
+ <div class="headertitle">
+<div class="title">triplegit::storable_vertices&lt; derived &gt; Class Template Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>The base class for a storable collection of vertices.
+ More...</p>
+
+<p><code>#include &lt;<a class="el" href="triplegit_8hpp_source.html">triplegit.hpp</a>&gt;</code></p>
+
+<p>Inherits triplegit::detail::storable_vertices.</p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="inherited"></a>
+Additional Inherited Members</h2></td></tr>
+<tr class="inherit_header pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td colspan="2" onclick="javascript:toggleInherit('pub_methods_classtriplegit_1_1detail_1_1storable__vertices')"><img src="closed.png" alt="-"/>&#160;Public Member Functions inherited from <a class="el" href="classtriplegit_1_1detail_1_1storable__vertices.html">triplegit::detail::storable_vertices</a></td></tr>
+<tr class="memitem:a07579601c833c308078538601ba1a0a8 inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><b>isLoaded</b> () const </td></tr>
+<tr class="memdesc:a07579601c833c308078538601ba1a0a8 inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns if loaded. <br/></td></tr>
+<tr class="separator:a07579601c833c308078538601ba1a0a8 inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1cd39b7dc537d7d43cbf7064714a5df8 inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><b>isDirty</b> () const </td></tr>
+<tr class="memdesc:a1cd39b7dc537d7d43cbf7064714a5df8 inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns if dirty. <br/></td></tr>
+<tr class="separator:a1cd39b7dc537d7d43cbf7064714a5df8 inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8ff7646bf769640b6d9130737adbdc50 inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classtriplegit_1_1async__io_1_1future.html">async_io::future</a>&lt; void &gt;&#160;</td><td class="memItemRight" valign="bottom"><b>begincommit</b> ()</td></tr>
+<tr class="memdesc:a8ff7646bf769640b6d9130737adbdc50 inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="mdescLeft">&#160;</td><td class="mdescRight">Begins a commit to attached storage. <br/></td></tr>
+<tr class="separator:a8ff7646bf769640b6d9130737adbdc50 inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afcc4cf8a061cdb51945ea4cc686d966a inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><b>attach</b> (<a class="el" href="classtriplegit_1_1base__store.html">base_store</a> &amp;store, <a class="el" href="classtriplegit_1_1collection__id.html">collection_id</a> id)</td></tr>
+<tr class="memdesc:afcc4cf8a061cdb51945ea4cc686d966a inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="mdescLeft">&#160;</td><td class="mdescRight">Attachs this collection of vertices to the given store. <br/></td></tr>
+<tr class="separator:afcc4cf8a061cdb51945ea4cc686d966a inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6927e644fff92f85f5534b1696843f70 inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="memTemplParams" colspan="2">template&lt;typename Iterator &gt; </td></tr>
+<tr class="memitem:a6927e644fff92f85f5534b1696843f70 inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="memTemplItemLeft" align="right" valign="top">void&#160;</td><td class="memTemplItemRight" valign="bottom"><b>attach</b> (Iterator begin, Iterator end)</td></tr>
+<tr class="memdesc:a6927e644fff92f85f5534b1696843f70 inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="mdescLeft">&#160;</td><td class="mdescRight">Attachs this collection of vertices to the given stores of std::pair&lt;base_store &amp;, collection_id&gt; <br/></td></tr>
+<tr class="separator:a6927e644fff92f85f5534b1696843f70 inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a41cc4c63093f8a523947b1fb13f269f8 inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><b>detach</b> (<a class="el" href="classtriplegit_1_1base__store.html">base_store</a> &amp;store, <a class="el" href="classtriplegit_1_1collection__id.html">collection_id</a> id)</td></tr>
+<tr class="memdesc:a41cc4c63093f8a523947b1fb13f269f8 inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="mdescLeft">&#160;</td><td class="mdescRight">Detachs this collection of vertices from the given store. <br/></td></tr>
+<tr class="separator:a41cc4c63093f8a523947b1fb13f269f8 inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8d34a45c42f2078aa4b90595c9b775e0 inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="memTemplParams" colspan="2">template&lt;typename Iterator &gt; </td></tr>
+<tr class="memitem:a8d34a45c42f2078aa4b90595c9b775e0 inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="memTemplItemLeft" align="right" valign="top">void&#160;</td><td class="memTemplItemRight" valign="bottom"><b>detach</b> (Iterator begin, Iterator end)</td></tr>
+<tr class="memdesc:a8d34a45c42f2078aa4b90595c9b775e0 inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="mdescLeft">&#160;</td><td class="mdescRight">Detachs this collection of vertices to the given stores of std::pair&lt;base_store &amp;, collection_id&gt; <br/></td></tr>
+<tr class="separator:a8d34a45c42f2078aa4b90595c9b775e0 inherit pub_methods_classtriplegit_1_1detail_1_1storable__vertices"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><h3>template&lt;class derived&gt;<br/>
+class triplegit::storable_vertices&lt; derived &gt;</h3>
+
+<p>The base class for a storable collection of vertices. </p>
+</div><hr/>The documentation for this class was generated from the following file:<ul>
+<li>triplegit/include/<a class="el" href="triplegit_8hpp_source.html">triplegit.hpp</a></li>
+</ul>
+</div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/classtriplegit_1_1unique__id-members.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/classtriplegit_1_1unique__id-members.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,99 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li class="current">Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Class List</li>
+ <li>Class Index</li>
+ <li>Class Hierarchy</li>
+ <li>Class Members</li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><b>triplegit</b></li><li class="navelem"><a class="el" href="classtriplegit_1_1unique__id.html">unique_id</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">triplegit::unique_id&lt; T, hasher &gt; Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classtriplegit_1_1unique__id.html">triplegit::unique_id&lt; T, hasher &gt;</a>, including all inherited members.</p>
+<table class="directory">
+</table></div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/classtriplegit_1_1unique__id.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/classtriplegit_1_1unique__id.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,113 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: triplegit::unique_id&lt; T, hasher &gt; Class Template Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li class="current">Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Class List</li>
+ <li>Class Index</li>
+ <li>Class Hierarchy</li>
+ <li>Class Members</li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><b>triplegit</b></li><li class="navelem"><a class="el" href="classtriplegit_1_1unique__id.html">unique_id</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+List of all members </div>
+ <div class="headertitle">
+<div class="title">triplegit::unique_id&lt; T, hasher &gt; Class Template Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>A unique id.
+ More...</p>
+
+<p><code>#include &lt;<a class="el" href="triplegit_8hpp_source.html">triplegit.hpp</a>&gt;</code></p>
+
+<p>Inherits T.</p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><h3>template&lt;class T, class hasher&gt;<br/>
+class triplegit::unique_id&lt; T, hasher &gt;</h3>
+
+<p>A unique id. </p>
+</div><hr/>The documentation for this class was generated from the following file:<ul>
+<li>triplegit/include/<a class="el" href="triplegit_8hpp_source.html">triplegit.hpp</a></li>
+</ul>
+</div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/closed.png
==============================================================================
Binary file. No diff available.

Added: sandbox/triplegit/trunk/html/dir_5702f8a2329a6e3cef9103a99d8690ff.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/dir_5702f8a2329a6e3cef9103a99d8690ff.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,94 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: triplegit Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li>Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_5702f8a2329a6e3cef9103a99d8690ff.html">triplegit</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">triplegit Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+<tr class="memitem:dir_603090840fc3140f581dcce46ee211a4"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_603090840fc3140f581dcce46ee211a4.html">include</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/dir_603090840fc3140f581dcce46ee211a4.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/dir_603090840fc3140f581dcce46ee211a4.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,97 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: triplegit/include Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li>Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_5702f8a2329a6e3cef9103a99d8690ff.html">triplegit</a></li><li class="navelem"><a class="el" href="dir_603090840fc3140f581dcce46ee211a4.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">include Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:async__file__io_8hpp"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="async__file__io_8hpp.html">async_file_io.hpp</a> [code]</td></tr>
+<tr class="memdesc:async__file__io_8hpp"><td class="mdescLeft">&#160;</td><td class="mdescRight">Provides a batch asynchronous file i/o implementation based on Boost.ASIO. <br/></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:triplegit_8hpp"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><b>triplegit.hpp</b> [code]</td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/doxygen.css
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/doxygen.css 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,1172 @@
+/* The standard CSS for doxygen */
+
+body, table, div, p, dl {
+ font: 400 14px/19px Roboto,sans-serif;
+}
+
+/* @group Heading Levels */
+
+h1.groupheader {
+ font-size: 150%;
+}
+
+.title {
+ font-size: 150%;
+ font-weight: bold;
+ margin: 10px 2px;
+}
+
+h2.groupheader {
+ border-bottom: 1px solid #879ECB;
+ color: #354C7B;
+ font-size: 150%;
+ font-weight: normal;
+ margin-top: 1.75em;
+ padding-top: 8px;
+ padding-bottom: 4px;
+ width: 100%;
+}
+
+h3.groupheader {
+ font-size: 100%;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ -webkit-transition: text-shadow 0.5s linear;
+ -moz-transition: text-shadow 0.5s linear;
+ -ms-transition: text-shadow 0.5s linear;
+ -o-transition: text-shadow 0.5s linear;
+ transition: text-shadow 0.5s linear;
+ margin-right: 15px;
+}
+
+h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow {
+ text-shadow: 0 0 15px cyan;
+}
+
+dt {
+ font-weight: bold;
+}
+
+div.multicol {
+ -moz-column-gap: 1em;
+ -webkit-column-gap: 1em;
+ -moz-column-count: 3;
+ -webkit-column-count: 3;
+}
+
+p.startli, p.startdd, p.starttd {
+ margin-top: 2px;
+}
+
+p.endli {
+ margin-bottom: 0px;
+}
+
+p.enddd {
+ margin-bottom: 4px;
+}
+
+p.endtd {
+ margin-bottom: 2px;
+}
+
+/* @end */
+
+caption {
+ font-weight: bold;
+}
+
+span.legend {
+ font-size: 70%;
+ text-align: center;
+}
+
+h3.version {
+ font-size: 90%;
+ text-align: center;
+}
+
+div.qindex, div.navtab{
+ background-color: #EBEFF6;
+ border: 1px solid #A3B4D7;
+ text-align: center;
+}
+
+div.qindex, div.navpath {
+ width: 100%;
+ line-height: 140%;
+}
+
+div.navtab {
+ margin-right: 15px;
+}
+
+/* @group Link Styling */
+
+a {
+ color: #3D578C;
+ font-weight: normal;
+ text-decoration: none;
+}
+
+.contents a:visited {
+ color: #4665A2;
+}
+
+a:hover {
+ text-decoration: underline;
+}
+
+a.qindex {
+ font-weight: bold;
+}
+
+a.qindexHL {
+ font-weight: bold;
+ background-color: #9CAFD4;
+ color: #ffffff;
+ border: 1px double #869DCA;
+}
+
+.contents a.qindexHL:visited {
+ color: #ffffff;
+}
+
+a.el {
+ font-weight: bold;
+}
+
+a.elRef {
+}
+
+a.code, a.code:visited {
+ color: #4665A2;
+}
+
+a.codeRef, a.codeRef:visited {
+ color: #4665A2;
+}
+
+/* @end */
+
+dl.el {
+ margin-left: -1cm;
+}
+
+pre.fragment {
+ border: 1px solid #C4CFE5;
+ background-color: #FBFCFD;
+ padding: 4px 6px;
+ margin: 4px 8px 4px 2px;
+ overflow: auto;
+ word-wrap: break-word;
+ font-size: 9pt;
+ line-height: 125%;
+ font-family: monospace, fixed;
+ font-size: 105%;
+}
+
+div.fragment {
+ padding: 4px;
+ margin: 4px;
+ background-color: #FBFCFD;
+ border: 1px solid #C4CFE5;
+}
+
+div.line {
+ font-family: monospace, fixed;
+ font-size: 13px;
+ min-height: 13px;
+ line-height: 1.0;
+ text-wrap: unrestricted;
+ white-space: -moz-pre-wrap; /* Moz */
+ white-space: -pre-wrap; /* Opera 4-6 */
+ white-space: -o-pre-wrap; /* Opera 7 */
+ white-space: pre-wrap; /* CSS3 */
+ word-wrap: break-word; /* IE 5.5+ */
+ text-indent: -53px;
+ padding-left: 53px;
+ padding-bottom: 0px;
+ margin: 0px;
+ -webkit-transition-property: background-color, box-shadow;
+ -webkit-transition-duration: 0.5s;
+ -moz-transition-property: background-color, box-shadow;
+ -moz-transition-duration: 0.5s;
+ -ms-transition-property: background-color, box-shadow;
+ -ms-transition-duration: 0.5s;
+ -o-transition-property: background-color, box-shadow;
+ -o-transition-duration: 0.5s;
+ transition-property: background-color, box-shadow;
+ transition-duration: 0.5s;
+}
+
+div.line.glow {
+ background-color: cyan;
+ box-shadow: 0 0 10px cyan;
+}
+
+
+span.lineno {
+ padding-right: 4px;
+ text-align: right;
+ border-right: 2px solid #0F0;
+ background-color: #E8E8E8;
+ white-space: pre;
+}
+span.lineno a {
+ background-color: #D8D8D8;
+}
+
+span.lineno a:hover {
+ background-color: #C8C8C8;
+}
+
+div.ah {
+ background-color: black;
+ font-weight: bold;
+ color: #ffffff;
+ margin-bottom: 3px;
+ margin-top: 3px;
+ padding: 0.2em;
+ border: solid thin #333;
+ border-radius: 0.5em;
+ -webkit-border-radius: .5em;
+ -moz-border-radius: .5em;
+ box-shadow: 2px 2px 3px #999;
+ -webkit-box-shadow: 2px 2px 3px #999;
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444));
+ background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000);
+}
+
+div.groupHeader {
+ margin-left: 16px;
+ margin-top: 12px;
+ font-weight: bold;
+}
+
+div.groupText {
+ margin-left: 16px;
+ font-style: italic;
+}
+
+body {
+ background-color: white;
+ color: black;
+ margin: 0;
+}
+
+div.contents {
+ margin-top: 10px;
+ margin-left: 12px;
+ margin-right: 8px;
+}
+
+td.indexkey {
+ background-color: #EBEFF6;
+ font-weight: bold;
+ border: 1px solid #C4CFE5;
+ margin: 2px 0px 2px 0;
+ padding: 2px 10px;
+ white-space: nowrap;
+ vertical-align: top;
+}
+
+td.indexvalue {
+ background-color: #EBEFF6;
+ border: 1px solid #C4CFE5;
+ padding: 2px 10px;
+ margin: 2px 0px;
+}
+
+tr.memlist {
+ background-color: #EEF1F7;
+}
+
+p.formulaDsp {
+ text-align: center;
+}
+
+img.formulaDsp {
+
+}
+
+img.formulaInl {
+ vertical-align: middle;
+}
+
+div.center {
+ text-align: center;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ padding: 0px;
+}
+
+div.center img {
+ border: 0px;
+}
+
+address.footer {
+ text-align: right;
+ padding-right: 12px;
+}
+
+img.footer {
+ border: 0px;
+ vertical-align: middle;
+}
+
+/* @group Code Colorization */
+
+span.keyword {
+ color: #008000
+}
+
+span.keywordtype {
+ color: #604020
+}
+
+span.keywordflow {
+ color: #e08000
+}
+
+span.comment {
+ color: #800000
+}
+
+span.preprocessor {
+ color: #806020
+}
+
+span.stringliteral {
+ color: #002080
+}
+
+span.charliteral {
+ color: #008080
+}
+
+span.vhdldigit {
+ color: #ff00ff
+}
+
+span.vhdlchar {
+ color: #000000
+}
+
+span.vhdlkeyword {
+ color: #700070
+}
+
+span.vhdllogic {
+ color: #ff0000
+}
+
+blockquote {
+ background-color: #F7F8FB;
+ border-left: 2px solid #9CAFD4;
+ margin: 0 24px 0 4px;
+ padding: 0 12px 0 16px;
+}
+
+/* @end */
+
+/*
+.search {
+ color: #003399;
+ font-weight: bold;
+}
+
+form.search {
+ margin-bottom: 0px;
+ margin-top: 0px;
+}
+
+input.search {
+ font-size: 75%;
+ color: #000080;
+ font-weight: normal;
+ background-color: #e8eef2;
+}
+*/
+
+td.tiny {
+ font-size: 75%;
+}
+
+.dirtab {
+ padding: 4px;
+ border-collapse: collapse;
+ border: 1px solid #A3B4D7;
+}
+
+th.dirtab {
+ background: #EBEFF6;
+ font-weight: bold;
+}
+
+hr {
+ height: 0px;
+ border: none;
+ border-top: 1px solid #4A6AAA;
+}
+
+hr.footer {
+ height: 1px;
+}
+
+/* @group Member Descriptions */
+
+table.memberdecls {
+ border-spacing: 0px;
+ padding: 0px;
+}
+
+.memberdecls td, .fieldtable tr {
+ -webkit-transition-property: background-color, box-shadow;
+ -webkit-transition-duration: 0.5s;
+ -moz-transition-property: background-color, box-shadow;
+ -moz-transition-duration: 0.5s;
+ -ms-transition-property: background-color, box-shadow;
+ -ms-transition-duration: 0.5s;
+ -o-transition-property: background-color, box-shadow;
+ -o-transition-duration: 0.5s;
+ transition-property: background-color, box-shadow;
+ transition-duration: 0.5s;
+}
+
+.memberdecls td.glow, .fieldtable tr.glow {
+ background-color: cyan;
+ box-shadow: 0 0 15px cyan;
+}
+
+.mdescLeft, .mdescRight,
+.memItemLeft, .memItemRight,
+.memTemplItemLeft, .memTemplItemRight, .memTemplParams {
+ background-color: #F9FAFC;
+ border: none;
+ margin: 4px;
+ padding: 1px 0 0 8px;
+}
+
+.mdescLeft, .mdescRight {
+ padding: 0px 8px 4px 8px;
+ color: #555;
+}
+
+.memSeparator {
+ border-bottom: 1px solid #DEE4F0;
+ line-height: 1px;
+ margin: 0px;
+ padding: 0px;
+}
+
+.memItemLeft, .memTemplItemLeft {
+ white-space: nowrap;
+}
+
+.memItemRight {
+ width: 100%;
+}
+
+.memTemplParams {
+ color: #4665A2;
+ white-space: nowrap;
+ font-size: 80%;
+}
+
+/* @end */
+
+/* @group Member Details */
+
+/* Styles for detailed member documentation */
+
+.memtemplate {
+ font-size: 80%;
+ color: #4665A2;
+ font-weight: normal;
+ margin-left: 9px;
+}
+
+.memnav {
+ background-color: #EBEFF6;
+ border: 1px solid #A3B4D7;
+ text-align: center;
+ margin: 2px;
+ margin-right: 15px;
+ padding: 2px;
+}
+
+.mempage {
+ width: 100%;
+}
+
+.memitem {
+ padding: 0;
+ margin-bottom: 10px;
+ margin-right: 5px;
+ -webkit-transition: box-shadow 0.5s linear;
+ -moz-transition: box-shadow 0.5s linear;
+ -ms-transition: box-shadow 0.5s linear;
+ -o-transition: box-shadow 0.5s linear;
+ transition: box-shadow 0.5s linear;
+ display: table !important;
+ width: 100%;
+}
+
+.memitem.glow {
+ box-shadow: 0 0 15px cyan;
+}
+
+.memname {
+ font-weight: bold;
+ margin-left: 6px;
+}
+
+.memname td {
+ vertical-align: bottom;
+}
+
+.memproto, dl.reflist dt {
+ border-top: 1px solid #A8B8D9;
+ border-left: 1px solid #A8B8D9;
+ border-right: 1px solid #A8B8D9;
+ padding: 6px 0px 6px 0px;
+ color: #253555;
+ font-weight: bold;
+ text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+ background-image:url('nav_f.png');
+ background-repeat:repeat-x;
+ background-color: #E2E8F2;
+ /* opera specific markup */
+ box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ border-top-right-radius: 4px;
+ border-top-left-radius: 4px;
+ /* firefox specific markup */
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+ -moz-border-radius-topright: 4px;
+ -moz-border-radius-topleft: 4px;
+ /* webkit specific markup */
+ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ -webkit-border-top-right-radius: 4px;
+ -webkit-border-top-left-radius: 4px;
+
+}
+
+.memdoc, dl.reflist dd {
+ border-bottom: 1px solid #A8B8D9;
+ border-left: 1px solid #A8B8D9;
+ border-right: 1px solid #A8B8D9;
+ padding: 6px 10px 2px 10px;
+ background-color: #FBFCFD;
+ border-top-width: 0;
+ background-image:url('nav_g.png');
+ background-repeat:repeat-x;
+ background-color: #FFFFFF;
+ /* opera specific markup */
+ border-bottom-left-radius: 4px;
+ border-bottom-right-radius: 4px;
+ box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ /* firefox specific markup */
+ -moz-border-radius-bottomleft: 4px;
+ -moz-border-radius-bottomright: 4px;
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+ /* webkit specific markup */
+ -webkit-border-bottom-left-radius: 4px;
+ -webkit-border-bottom-right-radius: 4px;
+ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+}
+
+dl.reflist dt {
+ padding: 5px;
+}
+
+dl.reflist dd {
+ margin: 0px 0px 10px 0px;
+ padding: 5px;
+}
+
+.paramkey {
+ text-align: right;
+}
+
+.paramtype {
+ white-space: nowrap;
+}
+
+.paramname {
+ color: #602020;
+ white-space: nowrap;
+}
+.paramname em {
+ font-style: normal;
+}
+.paramname code {
+ line-height: 14px;
+}
+
+.params, .retval, .exception, .tparams {
+ margin-left: 0px;
+ padding-left: 0px;
+}
+
+.params .paramname, .retval .paramname {
+ font-weight: bold;
+ vertical-align: top;
+}
+
+.params .paramtype {
+ font-style: italic;
+ vertical-align: top;
+}
+
+.params .paramdir {
+ font-family: "courier new",courier,monospace;
+ vertical-align: top;
+}
+
+table.mlabels {
+ border-spacing: 0px;
+}
+
+td.mlabels-left {
+ width: 100%;
+ padding: 0px;
+}
+
+td.mlabels-right {
+ vertical-align: bottom;
+ padding: 0px;
+ white-space: nowrap;
+}
+
+span.mlabels {
+ margin-left: 8px;
+}
+
+span.mlabel {
+ background-color: #728DC1;
+ border-top:1px solid #5373B4;
+ border-left:1px solid #5373B4;
+ border-right:1px solid #C4CFE5;
+ border-bottom:1px solid #C4CFE5;
+ text-shadow: none;
+ color: white;
+ margin-right: 4px;
+ padding: 2px 3px;
+ border-radius: 3px;
+ font-size: 7pt;
+ white-space: nowrap;
+ vertical-align: middle;
+}
+
+
+
+/* @end */
+
+/* these are for tree view when not used as main index */
+
+div.directory {
+ margin: 10px 0px;
+ border-top: 1px solid #A8B8D9;
+ border-bottom: 1px solid #A8B8D9;
+ width: 100%;
+}
+
+.directory table {
+ border-collapse:collapse;
+}
+
+.directory td {
+ margin: 0px;
+ padding: 0px;
+ vertical-align: top;
+}
+
+.directory td.entry {
+ white-space: nowrap;
+ padding-right: 6px;
+}
+
+.directory td.entry a {
+ outline:none;
+}
+
+.directory td.entry a img {
+ border: none;
+}
+
+.directory td.desc {
+ width: 100%;
+ padding-left: 6px;
+ padding-right: 6px;
+ padding-top: 3px;
+ border-left: 1px solid rgba(0,0,0,0.05);
+}
+
+.directory tr.even {
+ padding-left: 6px;
+ background-color: #F7F8FB;
+}
+
+.directory img {
+ vertical-align: -30%;
+}
+
+.directory .levels {
+ white-space: nowrap;
+ width: 100%;
+ text-align: right;
+ font-size: 9pt;
+}
+
+.directory .levels span {
+ cursor: pointer;
+ padding-left: 2px;
+ padding-right: 2px;
+ color: #3D578C;
+}
+
+div.dynheader {
+ margin-top: 8px;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+address {
+ font-style: normal;
+ color: #2A3D61;
+}
+
+table.doxtable {
+ border-collapse:collapse;
+ margin-top: 4px;
+ margin-bottom: 4px;
+}
+
+table.doxtable td, table.doxtable th {
+ border: 1px solid #2D4068;
+ padding: 3px 7px 2px;
+}
+
+table.doxtable th {
+ background-color: #374F7F;
+ color: #FFFFFF;
+ font-size: 110%;
+ padding-bottom: 4px;
+ padding-top: 5px;
+}
+
+table.fieldtable {
+ width: 100%;
+ margin-bottom: 10px;
+ border: 1px solid #A8B8D9;
+ border-spacing: 0px;
+ -moz-border-radius: 4px;
+ -webkit-border-radius: 4px;
+ border-radius: 4px;
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
+ -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
+ box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
+}
+
+.fieldtable td, .fieldtable th {
+ padding: 3px 7px 2px;
+}
+
+.fieldtable td.fieldtype, .fieldtable td.fieldname {
+ white-space: nowrap;
+ border-right: 1px solid #A8B8D9;
+ border-bottom: 1px solid #A8B8D9;
+ vertical-align: top;
+}
+
+.fieldtable td.fielddoc {
+ border-bottom: 1px solid #A8B8D9;
+ width: 100%;
+}
+
+.fieldtable tr:last-child td {
+ border-bottom: none;
+}
+
+.fieldtable th {
+ background-image:url('nav_f.png');
+ background-repeat:repeat-x;
+ background-color: #E2E8F2;
+ font-size: 90%;
+ color: #253555;
+ padding-bottom: 4px;
+ padding-top: 5px;
+ text-align:left;
+ -moz-border-radius-topleft: 4px;
+ -moz-border-radius-topright: 4px;
+ -webkit-border-top-left-radius: 4px;
+ -webkit-border-top-right-radius: 4px;
+ border-top-left-radius: 4px;
+ border-top-right-radius: 4px;
+ border-bottom: 1px solid #A8B8D9;
+}
+
+
+.tabsearch {
+ top: 0px;
+ left: 10px;
+ height: 36px;
+ background-image: url('tab_b.png');
+ z-index: 101;
+ overflow: hidden;
+ font-size: 13px;
+}
+
+.navpath ul
+{
+ font-size: 11px;
+ background-image:url('tab_b.png');
+ background-repeat:repeat-x;
+ background-position: 0 -5px;
+ height:30px;
+ line-height:30px;
+ color:#8AA0CC;
+ border:solid 1px #C2CDE4;
+ overflow:hidden;
+ margin:0px;
+ padding:0px;
+}
+
+.navpath li
+{
+ list-style-type:none;
+ float:left;
+ padding-left:10px;
+ padding-right:15px;
+ background-image:url('bc_s.png');
+ background-repeat:no-repeat;
+ background-position:right;
+ color:#364D7C;
+}
+
+.navpath li.navelem a
+{
+ height:32px;
+ display:block;
+ text-decoration: none;
+ outline: none;
+ color: #283A5D;
+ font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;
+ text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+ text-decoration: none;
+}
+
+.navpath li.navelem a:hover
+{
+ color:#6884BD;
+}
+
+.navpath li.footer
+{
+ list-style-type:none;
+ float:right;
+ padding-left:10px;
+ padding-right:15px;
+ background-image:none;
+ background-repeat:no-repeat;
+ background-position:right;
+ color:#364D7C;
+ font-size: 8pt;
+}
+
+
+div.summary
+{
+ float: right;
+ font-size: 8pt;
+ padding-right: 5px;
+ width: 50%;
+ text-align: right;
+}
+
+div.summary a
+{
+ white-space: nowrap;
+}
+
+div.ingroups
+{
+ font-size: 8pt;
+ width: 50%;
+ text-align: left;
+}
+
+div.ingroups a
+{
+ white-space: nowrap;
+}
+
+div.header
+{
+ background-image:url('nav_h.png');
+ background-repeat:repeat-x;
+ background-color: #F9FAFC;
+ margin: 0px;
+ border-bottom: 1px solid #C4CFE5;
+}
+
+div.headertitle
+{
+ padding: 5px 5px 5px 10px;
+}
+
+dl
+{
+ padding: 0 0 0 10px;
+}
+
+/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug */
+dl.section
+{
+ margin-left: 0px;
+ padding-left: 0px;
+}
+
+dl.note
+{
+ margin-left:-7px;
+ padding-left: 3px;
+ border-left:4px solid;
+ border-color: #D0C000;
+}
+
+dl.warning, dl.attention
+{
+ margin-left:-7px;
+ padding-left: 3px;
+ border-left:4px solid;
+ border-color: #FF0000;
+}
+
+dl.pre, dl.post, dl.invariant
+{
+ margin-left:-7px;
+ padding-left: 3px;
+ border-left:4px solid;
+ border-color: #00D000;
+}
+
+dl.deprecated
+{
+ margin-left:-7px;
+ padding-left: 3px;
+ border-left:4px solid;
+ border-color: #505050;
+}
+
+dl.todo
+{
+ margin-left:-7px;
+ padding-left: 3px;
+ border-left:4px solid;
+ border-color: #00C0E0;
+}
+
+dl.test
+{
+ margin-left:-7px;
+ padding-left: 3px;
+ border-left:4px solid;
+ border-color: #3030E0;
+}
+
+dl.bug
+{
+ margin-left:-7px;
+ padding-left: 3px;
+ border-left:4px solid;
+ border-color: #C08050;
+}
+
+dl.section dd {
+ margin-bottom: 6px;
+}
+
+
+#projectlogo
+{
+ text-align: center;
+ vertical-align: bottom;
+ border-collapse: separate;
+}
+
+#projectlogo img
+{
+ border: 0px none;
+}
+
+#projectname
+{
+ font: 300% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 2px 0px;
+}
+
+#projectbrief
+{
+ font: 120% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 0px;
+}
+
+#projectnumber
+{
+ font: 50% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 0px;
+}
+
+#titlearea
+{
+ padding: 0px;
+ margin: 0px;
+ width: 100%;
+ border-bottom: 1px solid #5373B4;
+}
+
+.image
+{
+ text-align: center;
+}
+
+.dotgraph
+{
+ text-align: center;
+}
+
+.mscgraph
+{
+ text-align: center;
+}
+
+.caption
+{
+ font-weight: bold;
+}
+
+div.zoom
+{
+ border: 1px solid #90A5CE;
+}
+
+dl.citelist {
+ margin-bottom:50px;
+}
+
+dl.citelist dt {
+ color:#334975;
+ float:left;
+ font-weight:bold;
+ margin-right:10px;
+ padding:5px;
+}
+
+dl.citelist dd {
+ margin:2px 0;
+ padding:5px 0;
+}
+
+div.toc {
+ padding: 14px 25px;
+ background-color: #F4F6FA;
+ border: 1px solid #D8DFEE;
+ border-radius: 7px 7px 7px 7px;
+ float: right;
+ height: auto;
+ margin: 0 20px 10px 10px;
+ width: 200px;
+}
+
+div.toc li {
+ background: url("bdwn.png") no-repeat scroll 0 5px transparent;
+ font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif;
+ margin-top: 5px;
+ padding-left: 10px;
+ padding-top: 2px;
+}
+
+div.toc h3 {
+ font: bold 12px/1.2 Arial,FreeSans,sans-serif;
+ color: #4665A2;
+ border-bottom: 0 none;
+ margin: 0;
+}
+
+div.toc ul {
+ list-style: none outside none;
+ border: medium none;
+ padding: 0px;
+}
+
+div.toc li.level1 {
+ margin-left: 0px;
+}
+
+div.toc li.level2 {
+ margin-left: 15px;
+}
+
+div.toc li.level3 {
+ margin-left: 30px;
+}
+
+div.toc li.level4 {
+ margin-left: 45px;
+}
+
+.inherit_header {
+ font-weight: bold;
+ color: gray;
+ cursor: pointer;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+.inherit_header td {
+ padding: 6px 0px 2px 5px;
+}
+
+.inherit {
+ display: none;
+}
+
+tr.heading h2 {
+ margin-top: 12px;
+ margin-bottom: 4px;
+}
+
+@media print
+{
+ #top { display: none; }
+ #side-nav { display: none; }
+ #nav-path { display: none; }
+ body { overflow:visible; }
+ h1, h2, h3, h4, h5, h6 { page-break-after: avoid; }
+ .summary { display: none; }
+ .memitem { page-break-inside: avoid; }
+ #doc-content
+ {
+ margin-left:0 !important;
+ height:auto !important;
+ width:auto !important;
+ overflow:inherit;
+ display:inline;
+ }
+}
+

Added: sandbox/triplegit/trunk/html/doxygen.png
==============================================================================
Binary file. No diff available.

Added: sandbox/triplegit/trunk/html/dynsections.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/dynsections.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,78 @@
+function toggleVisibility(linkObj)
+{
+ var base = $(linkObj).attr('id');
+ var summary = $('#'+base+'-summary');
+ var content = $('#'+base+'-content');
+ var trigger = $('#'+base+'-trigger');
+ var src=$(trigger).attr('src');
+ if (content.is(':visible')===true) {
+ content.hide();
+ summary.show();
+ $(linkObj).addClass('closed').removeClass('opened');
+ $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png');
+ } else {
+ content.show();
+ summary.hide();
+ $(linkObj).removeClass('closed').addClass('opened');
+ $(trigger).attr('src',src.substring(0,src.length-10)+'open.png');
+ }
+ return false;
+}
+
+function updateStripes()
+{
+ $('table.directory tr').
+ removeClass('even').filter(':visible:even').addClass('even');
+}
+function toggleLevel(level)
+{
+ $('table.directory tr').each(function(){
+ var l = this.id.split('_').length-1;
+ var i = $('#img'+this.id.substring(3));
+ var a = $('#arr'+this.id.substring(3));
+ if (l<level+1) {
+ i.attr('src','ftv2folderopen.png');
+ a.attr('src','ftv2mnode.png');
+ $(this).show();
+ } else if (l==level+1) {
+ i.attr('src','ftv2folderclosed.png');
+ a.attr('src','ftv2pnode.png');
+ $(this).show();
+ } else {
+ $(this).hide();
+ }
+ });
+ updateStripes();
+}
+function toggleFolder(id)
+{
+ var n = $('[id^=row_'+id+']');
+ var i = $('[id^=img_'+id+']');
+ var a = $('[id^=arr_'+id+']');
+ var c = n.slice(1);
+ if (c.filter(':first').is(':visible')===true) {
+ i.attr('src','ftv2folderclosed.png');
+ a.attr('src','ftv2pnode.png');
+ c.hide();
+ } else {
+ i.attr('src','ftv2folderopen.png');
+ a.attr('src','ftv2mnode.png');
+ c.show();
+ }
+ updateStripes();
+}
+
+function toggleInherit(id)
+{
+ var rows = $('tr.inherit.'+id);
+ var img = $('tr.inherit_header.'+id+' img');
+ var src = $(img).attr('src');
+ if (rows.filter(':first').is(':visible')===true) {
+ rows.css('display','none');
+ $(img).attr('src',src.substring(0,src.length-8)+'closed.png');
+ } else {
+ rows.css('display','table-row'); // using show() causes jump in firefox
+ $(img).attr('src',src.substring(0,src.length-10)+'open.png');
+ }
+}
+

Added: sandbox/triplegit/trunk/html/files.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/files.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,97 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: File List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li>Classes</li>
+ <li class="current">Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li class="current">File List</li>
+ </ul>
+ </div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">File List</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock">Here is a list of all documented files with brief descriptions:</div><div class="directory">
+<div class="levels">[detail level <span onclick="javascript:toggleLevel(1);">1</span><span onclick="javascript:toggleLevel(2);">2</span><span onclick="javascript:toggleLevel(3);">3</span>]</div><table class="directory">
+<tr id="row_0_" class="even"><td class="entry"><img id="arr_0_" src="ftv2mlastnode.png" alt="\" width="16" height="22" onclick="toggleFolder('0_')"/><img id="img_0_" src="ftv2folderopen.png" alt="-" width="24" height="22" onclick="toggleFolder('0_')"/><a class="el" href="dir_5702f8a2329a6e3cef9103a99d8690ff.html" target="_self">triplegit</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_"><td class="entry"><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img id="arr_0_0_" src="ftv2mlastnode.png" alt="\" width="16" height="22" onclick="toggleFolder('0_0_')"/><img id="img_0_0_" src="ftv2folderopen.png" alt="-" width="24" height="22" onclick="toggleFolder('0_0_')"/><a class="el" href="dir_603090840fc3140f581dcce46ee211a4.html" target="_self">include</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_0_" class="even"><td class="entry"><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" />*<a class="el" href="async__file__io_8hpp.html" target="_self">async_file_io.hpp</a></td><td class="desc">Provides a batch asynchronous file i/o implementation based on Boost.ASIO</td></tr>
+<tr id="row_0_0_1_"><td class="entry"><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" />*<b>triplegit.hpp</b></td><td class="desc"></td></tr>
+</table>
+</div><!-- directory -->
+</div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/ftv2blank.png
==============================================================================
Binary file. No diff available.

Added: sandbox/triplegit/trunk/html/ftv2cl.png
==============================================================================
Binary file. No diff available.

Added: sandbox/triplegit/trunk/html/ftv2doc.png
==============================================================================
Binary file. No diff available.

Added: sandbox/triplegit/trunk/html/ftv2folderclosed.png
==============================================================================
Binary file. No diff available.

Added: sandbox/triplegit/trunk/html/ftv2folderopen.png
==============================================================================
Binary file. No diff available.

Added: sandbox/triplegit/trunk/html/ftv2lastnode.png
==============================================================================
Binary file. No diff available.

Added: sandbox/triplegit/trunk/html/ftv2link.png
==============================================================================
Binary file. No diff available.

Added: sandbox/triplegit/trunk/html/ftv2mlastnode.png
==============================================================================
Binary file. No diff available.

Added: sandbox/triplegit/trunk/html/ftv2mnode.png
==============================================================================
Binary file. No diff available.

Added: sandbox/triplegit/trunk/html/ftv2mo.png
==============================================================================
Binary file. No diff available.

Added: sandbox/triplegit/trunk/html/ftv2node.png
==============================================================================
Binary file. No diff available.

Added: sandbox/triplegit/trunk/html/ftv2ns.png
==============================================================================
Binary file. No diff available.

Added: sandbox/triplegit/trunk/html/ftv2plastnode.png
==============================================================================
Binary file. No diff available.

Added: sandbox/triplegit/trunk/html/ftv2pnode.png
==============================================================================
Binary file. No diff available.

Added: sandbox/triplegit/trunk/html/ftv2splitbar.png
==============================================================================
Binary file. No diff available.

Added: sandbox/triplegit/trunk/html/ftv2vertline.png
==============================================================================
Binary file. No diff available.

Added: sandbox/triplegit/trunk/html/functions.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/functions.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,276 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li class="current">Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Class List</li>
+ <li>Class Index</li>
+ <li>Class Hierarchy</li>
+ <li class="current">Class Members</li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current">All</li>
+ <li>Functions</li>
+ <li>Variables</li>
+ <li>Typedefs</li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li>a</li>
+ <li>c</li>
+ <li>d</li>
+ <li>e</li>
+ <li>f</li>
+ <li>h</li>
+ <li>i</li>
+ <li>n</li>
+ <li>o</li>
+ <li>p</li>
+ <li>r</li>
+ <li>s</li>
+ <li>t</li>
+ <li>w</li>
+ </ul>
+ </div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all documented class members with links to the class documentation for each member:</div>
+
+<h3><a class="anchor" id="index_a"></a>- a -</h3><ul>
+<li>async_path_op_req()
+: <a class="el" href="structtriplegit_1_1async__io_1_1async__path__op__req.html#a140edf74812e339fea7051df405fc56c">triplegit::async_io::async_path_op_req</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_c"></a>- c -</h3><ul>
+<li>call()
+: <a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#af5ec8648416926263780d9c597db35ed">triplegit::async_io::async_file_io_dispatcher_base</a>
+</li>
+<li>checkCollectionId()
+: <a class="el" href="classtriplegit_1_1base__store.html#af1c4c71d3f7e240925439a456c7d2b36">triplegit::base_store</a>
+</li>
+<li>close()
+: <a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#abffcc5e304efb9622ef184eca8d29868">triplegit::async_io::async_file_io_dispatcher_base</a>
+</li>
+<li>collection_id()
+: <a class="el" href="classtriplegit_1_1collection__id.html#abf5fe0ca6383437bdc684e6219078c38">triplegit::collection_id</a>
+</li>
+<li>collections_t
+: <a class="el" href="classtriplegit_1_1base__store.html#aae2fc9e86358fb51548d35b4b1691aef">triplegit::base_store</a>
+</li>
+<li>completion()
+: <a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#af0627f7511cac82528dcd7ed490b5211">triplegit::async_io::async_file_io_dispatcher_base</a>
+</li>
+<li>config()
+: <a class="el" href="classtriplegit_1_1base__store.html#a03deb45a9a388d839b6fc6832909668e">triplegit::base_store</a>
+</li>
+<li>count()
+: <a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#aaee8e9e70ead7a56b5bfbdf7ac762450">triplegit::async_io::async_file_io_dispatcher_base</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_d"></a>- d -</h3><ul>
+<li>dir()
+: <a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a517359ced87c537caff44dc6fa35fb19">triplegit::async_io::async_file_io_dispatcher_base</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_e"></a>- e -</h3><ul>
+<li>enqueue()
+: <a class="el" href="classtriplegit_1_1async__io_1_1thread__pool.html#a1197a18cb30a52bb1ee02cd2ef742bff">triplegit::async_io::thread_pool</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_f"></a>- f -</h3><ul>
+<li>file()
+: <a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a6e008acf9f33b3ff43b0c73901f5f9c7">triplegit::async_io::async_file_io_dispatcher_base</a>
+</li>
+<li>fileflags()
+: <a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#ab1746bda51c77ef5c1691b3f6857a270">triplegit::async_io::async_file_io_dispatcher_base</a>
+</li>
+<li>fs_store()
+: <a class="el" href="classtriplegit_1_1fs__store.html#ab7e25c70606385d88d069550c4816378">triplegit::fs_store</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_h"></a>- h -</h3><ul>
+<li>h
+: <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html#a64a2053bd93c75a0a77261ff8402f817">triplegit::async_io::async_io_op</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_i"></a>- i -</h3><ul>
+<li>id
+: <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html#af303d1a104de71b2c6c6b2ce47d514c6">triplegit::async_io::async_io_op</a>
+</li>
+<li>io_service()
+: <a class="el" href="classtriplegit_1_1async__io_1_1thread__pool.html#a67f5b5480be42f8cb94878c5ff95b245">triplegit::async_io::thread_pool</a>
+</li>
+<li>isFSReadOnly()
+: <a class="el" href="classtriplegit_1_1base__store.html#a00b19473f5b199c72040057b4c27c72a">triplegit::base_store</a>
+</li>
+<li>isReadOnly()
+: <a class="el" href="classtriplegit_1_1base__store.html#ae7c169da7d9faffe60cbc64b3e965e7f">triplegit::base_store</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_n"></a>- n -</h3><ul>
+<li>native_handle()
+: <a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#af58d73f18065864e4e6026464116ee6e">triplegit::async_io::detail::async_io_handle</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_o"></a>- o -</h3><ul>
+<li>opened()
+: <a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#a00eaad37ed049b6577c750aa16736cc5">triplegit::async_io::detail::async_io_handle</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_p"></a>- p -</h3><ul>
+<li>parent
+: <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html#aa7f06f1a66943a0557c8a52c58b39bd6">triplegit::async_io::async_io_op</a>
+, <a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#ab254a7c8d7512075368b2807621db5f5">triplegit::async_io::detail::async_io_handle</a>
+</li>
+<li>path()
+: <a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#abfff6c04e97084d71c44e811cc5d99d6">triplegit::async_io::detail::async_io_handle</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_r"></a>- r -</h3><ul>
+<li>read()
+: <a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a21f6fce370f936a958ebbebe74eb08c4">triplegit::async_io::async_file_io_dispatcher_base</a>
+</li>
+<li>read_count()
+: <a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#a9e138be2ed4a0522a1710e693cd6377c">triplegit::async_io::detail::async_io_handle</a>
+</li>
+<li>rmdir()
+: <a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a4924392f3af3a7b429ca49d7c7a35b4e">triplegit::async_io::async_file_io_dispatcher_base</a>
+</li>
+<li>rmfile()
+: <a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#ad5b54fca9b70f2899218119176cca111">triplegit::async_io::async_file_io_dispatcher_base</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_s"></a>- s -</h3><ul>
+<li>sync()
+: <a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a20ac9ebe7fc8e9f898d3de8c85b03efd">triplegit::async_io::async_file_io_dispatcher_base</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_t"></a>- t -</h3><ul>
+<li>thread_pool()
+: <a class="el" href="classtriplegit_1_1async__io_1_1thread__pool.html#ad55f84716fd629d7e895f109a150e83e">triplegit::async_io::thread_pool</a>
+</li>
+<li>threadpool()
+: <a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#ae17a53fb0dd440c3e26fb6ca648f9034">triplegit::async_io::async_file_io_dispatcher_base</a>
+</li>
+<li>truncate()
+: <a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#afd50d52fec35330deac6153aece92d7d">triplegit::async_io::async_file_io_dispatcher_base</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_w"></a>- w -</h3><ul>
+<li>wait_queue_depth()
+: <a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a2ed9d1f242fa0acd8bced12a75c13474">triplegit::async_io::async_file_io_dispatcher_base</a>
+</li>
+<li>write()
+: <a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#af087a1c53c619679a5e65fc828a7c652">triplegit::async_io::async_file_io_dispatcher_base</a>
+</li>
+<li>write_count()
+: <a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#ae96b546a730964e57bd0a50781237222">triplegit::async_io::detail::async_io_handle</a>
+</li>
+<li>write_count_since_fsync()
+: <a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#a1ad31d5e35f7e8562787415f12ab5f7d">triplegit::async_io::detail::async_io_handle</a>
+</li>
+</ul>
+</div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/functions_func.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/functions_func.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,261 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li class="current">Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Class List</li>
+ <li>Class Index</li>
+ <li>Class Hierarchy</li>
+ <li class="current">Class Members</li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li>All</li>
+ <li class="current">Functions</li>
+ <li>Variables</li>
+ <li>Typedefs</li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li>a</li>
+ <li>c</li>
+ <li>d</li>
+ <li>e</li>
+ <li>f</li>
+ <li>i</li>
+ <li>n</li>
+ <li>o</li>
+ <li>p</li>
+ <li>r</li>
+ <li>s</li>
+ <li>t</li>
+ <li>w</li>
+ </ul>
+ </div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_a"></a>- a -</h3><ul>
+<li>async_path_op_req()
+: <a class="el" href="structtriplegit_1_1async__io_1_1async__path__op__req.html#a140edf74812e339fea7051df405fc56c">triplegit::async_io::async_path_op_req</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_c"></a>- c -</h3><ul>
+<li>call()
+: <a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#af5ec8648416926263780d9c597db35ed">triplegit::async_io::async_file_io_dispatcher_base</a>
+</li>
+<li>checkCollectionId()
+: <a class="el" href="classtriplegit_1_1base__store.html#af1c4c71d3f7e240925439a456c7d2b36">triplegit::base_store</a>
+</li>
+<li>close()
+: <a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#abffcc5e304efb9622ef184eca8d29868">triplegit::async_io::async_file_io_dispatcher_base</a>
+</li>
+<li>collection_id()
+: <a class="el" href="classtriplegit_1_1collection__id.html#a60ccc9c03400843c050c4c7e9dcefcb1">triplegit::collection_id</a>
+</li>
+<li>completion()
+: <a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#af0627f7511cac82528dcd7ed490b5211">triplegit::async_io::async_file_io_dispatcher_base</a>
+</li>
+<li>config()
+: <a class="el" href="classtriplegit_1_1base__store.html#a03deb45a9a388d839b6fc6832909668e">triplegit::base_store</a>
+</li>
+<li>count()
+: <a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#aaee8e9e70ead7a56b5bfbdf7ac762450">triplegit::async_io::async_file_io_dispatcher_base</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_d"></a>- d -</h3><ul>
+<li>dir()
+: <a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a517359ced87c537caff44dc6fa35fb19">triplegit::async_io::async_file_io_dispatcher_base</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_e"></a>- e -</h3><ul>
+<li>enqueue()
+: <a class="el" href="classtriplegit_1_1async__io_1_1thread__pool.html#a1197a18cb30a52bb1ee02cd2ef742bff">triplegit::async_io::thread_pool</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_f"></a>- f -</h3><ul>
+<li>file()
+: <a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a6e008acf9f33b3ff43b0c73901f5f9c7">triplegit::async_io::async_file_io_dispatcher_base</a>
+</li>
+<li>fileflags()
+: <a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#ab1746bda51c77ef5c1691b3f6857a270">triplegit::async_io::async_file_io_dispatcher_base</a>
+</li>
+<li>fs_store()
+: <a class="el" href="classtriplegit_1_1fs__store.html#ab7e25c70606385d88d069550c4816378">triplegit::fs_store</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_i"></a>- i -</h3><ul>
+<li>io_service()
+: <a class="el" href="classtriplegit_1_1async__io_1_1thread__pool.html#a67f5b5480be42f8cb94878c5ff95b245">triplegit::async_io::thread_pool</a>
+</li>
+<li>isFSReadOnly()
+: <a class="el" href="classtriplegit_1_1base__store.html#a00b19473f5b199c72040057b4c27c72a">triplegit::base_store</a>
+</li>
+<li>isReadOnly()
+: <a class="el" href="classtriplegit_1_1base__store.html#ae7c169da7d9faffe60cbc64b3e965e7f">triplegit::base_store</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_n"></a>- n -</h3><ul>
+<li>native_handle()
+: <a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#af58d73f18065864e4e6026464116ee6e">triplegit::async_io::detail::async_io_handle</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_o"></a>- o -</h3><ul>
+<li>opened()
+: <a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#a00eaad37ed049b6577c750aa16736cc5">triplegit::async_io::detail::async_io_handle</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_p"></a>- p -</h3><ul>
+<li>parent()
+: <a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#ab254a7c8d7512075368b2807621db5f5">triplegit::async_io::detail::async_io_handle</a>
+</li>
+<li>path()
+: <a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#abfff6c04e97084d71c44e811cc5d99d6">triplegit::async_io::detail::async_io_handle</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_r"></a>- r -</h3><ul>
+<li>read()
+: <a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a21f6fce370f936a958ebbebe74eb08c4">triplegit::async_io::async_file_io_dispatcher_base</a>
+</li>
+<li>read_count()
+: <a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#a9e138be2ed4a0522a1710e693cd6377c">triplegit::async_io::detail::async_io_handle</a>
+</li>
+<li>rmdir()
+: <a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a4924392f3af3a7b429ca49d7c7a35b4e">triplegit::async_io::async_file_io_dispatcher_base</a>
+</li>
+<li>rmfile()
+: <a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#ad5b54fca9b70f2899218119176cca111">triplegit::async_io::async_file_io_dispatcher_base</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_s"></a>- s -</h3><ul>
+<li>sync()
+: <a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a20ac9ebe7fc8e9f898d3de8c85b03efd">triplegit::async_io::async_file_io_dispatcher_base</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_t"></a>- t -</h3><ul>
+<li>thread_pool()
+: <a class="el" href="classtriplegit_1_1async__io_1_1thread__pool.html#ad55f84716fd629d7e895f109a150e83e">triplegit::async_io::thread_pool</a>
+</li>
+<li>threadpool()
+: <a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#ae17a53fb0dd440c3e26fb6ca648f9034">triplegit::async_io::async_file_io_dispatcher_base</a>
+</li>
+<li>truncate()
+: <a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#afd50d52fec35330deac6153aece92d7d">triplegit::async_io::async_file_io_dispatcher_base</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_w"></a>- w -</h3><ul>
+<li>wait_queue_depth()
+: <a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a2ed9d1f242fa0acd8bced12a75c13474">triplegit::async_io::async_file_io_dispatcher_base</a>
+</li>
+<li>write()
+: <a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#af087a1c53c619679a5e65fc828a7c652">triplegit::async_io::async_file_io_dispatcher_base</a>
+</li>
+<li>write_count()
+: <a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#ae96b546a730964e57bd0a50781237222">triplegit::async_io::detail::async_io_handle</a>
+</li>
+<li>write_count_since_fsync()
+: <a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#a1ad31d5e35f7e8562787415f12ab5f7d">triplegit::async_io::detail::async_io_handle</a>
+</li>
+</ul>
+</div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/functions_type.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/functions_type.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,101 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: Class Members - Typedefs</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li class="current">Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Class List</li>
+ <li>Class Index</li>
+ <li>Class Hierarchy</li>
+ <li class="current">Class Members</li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li>All</li>
+ <li>Functions</li>
+ <li>Variables</li>
+ <li class="current">Typedefs</li>
+ </ul>
+ </div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;<ul>
+<li>collections_t
+: <a class="el" href="classtriplegit_1_1base__store.html#aae2fc9e86358fb51548d35b4b1691aef">triplegit::base_store</a>
+</li>
+</ul>
+</div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/functions_vars.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/functions_vars.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: Class Members - Variables</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li class="current">Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Class List</li>
+ <li>Class Index</li>
+ <li>Class Hierarchy</li>
+ <li class="current">Class Members</li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li>All</li>
+ <li>Functions</li>
+ <li class="current">Variables</li>
+ <li>Typedefs</li>
+ </ul>
+ </div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;<ul>
+<li>h
+: <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html#a64a2053bd93c75a0a77261ff8402f817">triplegit::async_io::async_io_op</a>
+</li>
+<li>id
+: <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html#af303d1a104de71b2c6c6b2ce47d514c6">triplegit::async_io::async_io_op</a>
+</li>
+<li>parent
+: <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html#aa7f06f1a66943a0557c8a52c58b39bd6">triplegit::async_io::async_io_op</a>
+</li>
+</ul>
+</div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/hierarchy.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/hierarchy.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,121 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: Class Hierarchy</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li class="current">Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Class List</li>
+ <li>Class Index</li>
+ <li class="current">Class Hierarchy</li>
+ <li>Class Members</li>
+ </ul>
+ </div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">Class Hierarchy</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock">This inheritance list is sorted roughly, but not completely, alphabetically:</div><div class="directory">
+<div class="levels">[detail level <span onclick="javascript:toggleLevel(1);">1</span><span onclick="javascript:toggleLevel(2);">2</span>]</div><table class="directory">
+<tr id="row_0_" class="even"><td class="entry"><img id="arr_0_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('0_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" target="_self">triplegit::async_io::async_data_op_req&lt; T &gt;</a></td><td class="desc">A specialisation for any pointer to type T</td></tr>
+<tr id="row_0_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1array_3_01_t_00_01_n_01_4_01_4.html" target="_self">triplegit::async_io::async_data_op_req&lt; std::array&lt; T, N &gt; &gt;</a></td><td class="desc">A specialisation for any std::array&lt;T, N&gt;</td></tr>
+<tr id="row_0_1_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1basic__string_3_01_c_00_01_t_00_01_a_01_4_01_4.html" target="_self">triplegit::async_io::async_data_op_req&lt; std::basic_string&lt; C, T, A &gt; &gt;</a></td><td class="desc">A specialisation for any std::basic_string&lt;C, T, A&gt;</td></tr>
+<tr id="row_0_2_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1vector_3_01_t_00_01_a_01_4_01_4.html" target="_self">triplegit::async_io::async_data_op_req&lt; std::vector&lt; T, A &gt; &gt;</a></td><td class="desc">A specialisation for any std::vector&lt;T, A&gt;</td></tr>
+<tr id="row_1_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" target="_self">triplegit::async_io::async_data_op_req&lt; const void &gt;</a></td><td class="desc"></td></tr>
+<tr id="row_2_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req.html" target="_self">triplegit::async_io::async_data_op_req&lt; void &gt;</a></td><td class="desc"></td></tr>
+<tr id="row_3_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html" target="_self">triplegit::async_io::async_file_io_dispatcher_base</a></td><td class="desc">Abstract base class for dispatching file i/o asynchronously</td></tr>
+<tr id="row_4_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html" target="_self">triplegit::async_io::detail::async_io_handle</a></td><td class="desc">May occasionally be useful to access to discover information about an open handle</td></tr>
+<tr id="row_5_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html" target="_self">triplegit::async_io::async_io_op</a></td><td class="desc">A reference to an async operation</td></tr>
+<tr id="row_6_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structtriplegit_1_1async__io_1_1async__path__op__req.html" target="_self">triplegit::async_io::async_path_op_req</a></td><td class="desc">A convenience bundle of path and flags, with optional precondition</td></tr>
+<tr id="row_7_" class="even"><td class="entry"><img id="arr_7_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('7_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classtriplegit_1_1base__store.html" target="_self">triplegit::base_store</a></td><td class="desc">Base class for a stored graph</td></tr>
+<tr id="row_7_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classtriplegit_1_1fs__store.html" target="_self">triplegit::fs_store</a></td><td class="desc">A graph stored in the filing system</td></tr>
+<tr id="row_8_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classtriplegit_1_1async__io_1_1future.html" target="_self">triplegit::async_io::future&lt; T &gt;</a></td><td class="desc">For now, this is boost's future. Will be replaced when C++'s future catches up with boost's</td></tr>
+<tr id="row_9_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classpackaged__task.html" target="_self">packaged_task&lt; class &gt;</a></td><td class="desc">For now, this is an emulation of std::packaged_task based on boost's <a class="el" href="classpackaged__task.html" title="For now, this is an emulation of std::packaged_task based on boost&#39;s packaged_task. We have to drop the Args... support because it segfaults MSVC Nov 2012 CTP.">packaged_task</a>. We have to drop the Args... support because it segfaults MSVC Nov 2012 CTP</td></tr>
+<tr id="row_10_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classtriplegit_1_1async__io_1_1promise.html" target="_self">triplegit::async_io::promise&lt; T &gt;</a></td><td class="desc">For now, this is boost's promise. Will be replaced when C++'s promise catches up with boost's</td></tr>
+<tr id="row_11_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classtriplegit_1_1async__io_1_1promise.html" target="_self">triplegit::async_io::promise&lt; std::vector&lt; std::shared_ptr&lt; detail::async_io_handle &gt; &gt; &gt;</a></td><td class="desc"></td></tr>
+<tr id="row_12_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classtriplegit_1_1async__io_1_1shared__future.html" target="_self">triplegit::async_io::shared_future&lt; T &gt;</a></td><td class="desc">For now, this is boost's <a class="el" href="classtriplegit_1_1async__io_1_1shared__future.html" title="For now, this is boost&#39;s shared_future. Will be replaced when C++&#39;s shared_future catches up with boo...">shared_future</a>. Will be replaced when C++'s <a class="el" href="classtriplegit_1_1async__io_1_1shared__future.html" title="For now, this is boost&#39;s shared_future. Will be replaced when C++&#39;s shared_future catches up with boo...">shared_future</a> catches up with boost's</td></tr>
+<tr id="row_13_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classtriplegit_1_1async__io_1_1shared__future.html" target="_self">triplegit::async_io::shared_future&lt; std::shared_ptr&lt; detail::async_io_handle &gt; &gt;</a></td><td class="desc"></td></tr>
+<tr id="row_14_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classtriplegit_1_1storable__vertices.html" target="_self">triplegit::storable_vertices&lt; derived &gt;</a></td><td class="desc">The base class for a storable collection of vertices</td></tr>
+<tr id="row_15_"><td class="entry"><img id="arr_15_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('15_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classtriplegit_1_1storable__vertices.html" target="_self">triplegit::storable_vertices&lt; adjacency_list&lt; OutEdgeListS, VertexListS, DirectedS, VertexProperty, EdgeProperty, GraphProperty, EdgeListS &gt; &gt;</a></td><td class="desc"></td></tr>
+<tr id="row_15_0_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classtriplegit_1_1boost_1_1adjacency__list.html" target="_self">triplegit::boost::adjacency_list&lt; OutEdgeListS, VertexListS, DirectedS, VertexProperty, EdgeProperty, GraphProperty, EdgeListS &gt;</a></td><td class="desc">A stored Boost.Graph <a class="el" href="classtriplegit_1_1boost_1_1adjacency__list.html" title="A stored Boost.Graph adjacency_list.">adjacency_list</a></td></tr>
+<tr id="row_16_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classtriplegit_1_1async__io_1_1thread__pool.html" target="_self">triplegit::async_io::thread_pool</a></td><td class="desc">A very simple thread pool based on Boost.ASIO and std::thread</td></tr>
+<tr id="row_17_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classtriplegit_1_1unique__id.html" target="_self">triplegit::unique_id&lt; T, hasher &gt;</a></td><td class="desc">A unique id</td></tr>
+<tr id="row_18_"><td class="entry"><img id="arr_18_" src="ftv2mlastnode.png" alt="\" width="16" height="22" onclick="toggleFolder('18_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classtriplegit_1_1unique__id.html" target="_self">triplegit::unique_id&lt; NiallsCPP11Utilities::Int128, NiallsCPP11Utilities::Hash128 &gt;</a></td><td class="desc"></td></tr>
+<tr id="row_18_0_" class="even"><td class="entry"><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classtriplegit_1_1collection__id.html" target="_self">triplegit::collection_id</a></td><td class="desc">A collection in a <a class="el" href="classtriplegit_1_1fs__store.html" title="A graph stored in the filing system.">fs_store</a></td></tr>
+</table>
+</div><!-- directory -->
+</div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/index.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/index.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,84 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: Main Page</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li class="current">Main Page</li>
+ <li>Namespaces</li>
+ <li>Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">TripleGit Documentation</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/jquery.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/jquery.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,8 @@
+/*! jQuery v1.7.1 jquery.com | jquery.org/license */
+(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===
1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function cb(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function ca(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bE.test(a)?d(a,e):ca(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)ca(a+"["+e+"]",b[e],c,d);else d(a,b)}function b
_(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function b$(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bT,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=b$(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=b$(a,c,d,e,"*",g));return l}function bZ(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bP),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bC(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bx:by,g=0,h=e.length;if(d>0){if(c!=="border")for(;g<h;g++)c||(d-=parseFloat(f.css(a,"padding"+e[g]))||0),c==="margin"?d+=parseFloat(f.css(a,c+e[g]))||0:d-=parseFloat(f.css(a,"border"+e[g]+"Width"))||0;return d+"px"}d=bz(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0;if(c)for(;g<h;g++)d+=parseFloat(f.css(
a,"padding"+e[g]))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+e[g]+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+e[g]))||0);return d+"px"}function bp(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bm)}function bm(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bk(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")
b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c+(i[c][d].namespace?".":"")+i[c][d].namespace,i[c][d],i[c][d].data)}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,
function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c<d;c++)b
[a[c]]=!0;return b}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;ret
urn this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[t
his.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=
this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J
()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=ne
w ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:fun
ction(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j
],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(" ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener(
"DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h==="array"?m(g):h==="function"&&(!a.unique||!o.has(g))&&c.push(g)},n=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,l=j||0,j=0,k=c.length;for(;c&&l<k;l++)if(c[l].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}i=!1,c&&(a.once?e===!0?o.disable():c=[]:d&&d.length&&(e=d.shift(),o.fireWith(e[0],e[1])))},o={add:function(){if(c){var a=c.length;m(arguments),i?k=c.length:e&&e!==!0&&(j=a,n(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){i&&f<=k&&(k--,f<=l&&l--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:functi
on(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&&o.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&&(i?a.once||d.push([b,c]):(!a.once||!e)&&n(b,c));return this},fire:function(){o.fireWith(this,arguments);return this},fired:function(){return!!e}};return o};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks("once memory"),c=f.Callbacks("once memory"),d=f.Callbacks("memory"),e="pending",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function()
+{g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+"With"]=g[j].fireWith;i.done(function(){e="resolved"},c.disable,d.lock).fail(function(){e="rejected"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p,q=c.createElem
ent("div"),r=c.documentElement;q.setAttribute("className","t"),q.innerHTML=" <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliable
MarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.rem
oveChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="<div "+n+"><div></div></div>"+"<table "+n+" cellpadding='0' cellspacing='0'>"+"<tr><td></td></tr></table>",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.displ
ay="",q.innerHTML="<div style='width:4px;'></div>",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cac
he:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.
nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h=null;if(typeof a=="undefined"){if(this.length){h=f.data(this[0]);if(this[0].nodeType===1&&!f._data(this[0],"parsedAttrs")){e=this[0].attributes;for(var i=0,j=e.length;i<j;i++)g=e[i].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),l(this[0],g,h[g]));f._data(this[0],"parsedAttrs",!0)}}return h}if(typeof a=="object")return this.each(function(){f.data(this,a)});d=a.split("."),d[1]=d[1]?"."+d[1]:"";if(c===b){h=this.triggerHandler("getData"+d[1]+"!",[d[0]]),h===b&&this.length&&(h=f.data(this[0],a),h=l(this[0],a,h));return h===b&&d[1]?this.data(d[0]):h}return this.each(function(){var b=f(this),e=[d[0],c];b.triggerHandler("setData"+d[1]+"!",e),f.data(this,a,c),b.triggerHandler("changeData"+d[1]+"!",e)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:fu
nction(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return thi
s.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks("once memory"),!0))h++,l.add(m);m();return d.promise()}});var o=/[\n\t\r]/g,p=/\s+/,q=/\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))retur
n this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(o," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(p);w
hile(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(o," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHook
s:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!f.nodeName(e.parentNode,"optgroup"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAtt
r(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h<g;h++)e=d[h],e&&(c=f.propFix[e]||e,f.attr(a,e,""),a.removeAttribute(v?e:c),u.test(e)&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(w&&f.nodeName(a,"button"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,"button"))return w.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSp
an",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&"set"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&"get"in g&&(e=g.get(a,c))!==null?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue!=="":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.create
Attribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.attrHooks.tabindex.set=w.set,f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===""&&(b="false"),w.set(a,b,c)}}),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype="encoding"),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("val
ue")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};
+f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:G(g),namespace:n.join(".")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent("on"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a,b,c,d,e){var g=f.hasDa
ta(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||"")).split(" ");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp("(^|\\.)"+l.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d==="**"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.handle,q&&(q.elem=null),f.removeData(a,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f.event.triggered))return;h.indexOf("!")>=0&&(h=h.s
lice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,"events")||{})[c.type]&&f._data(m,"handle"),q&&q.apply(m,d),q=o&&m[o],q&&f.accep
tData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)&&o&&e[h]&&(h!=="focus"&&h!=="blur"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,"events")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=[],j,k,l,m,n,o,p,q,r,s,t;g[0]=c,c.delegateTarget=this;if(e&&!c.target.disabled&&(!c.button||c.type!=="click")){m=f(this),m.context=this.ownerDocument||this;for(l=c.target;l!=this;l=l.parentNode||this){o={},q=[],m[0]=l;for(j=0;j<e;j++)r=d[j],s=r.selector,o[s]===b&&(o[s]=r.quick?H(l,r.quick):m.is(s)),o[s]&&q.push(r);q.length&&i.push({elem:l,matches:q})}}d.length>e&&i.push({elem:this,matches:d.slice(e)});for(j=0;j<i.length&&!c.isPropagationStopped();j++){p=i[j],c.currentTarge
t=p.elem;for(k=0;k<p.matches.length&&!c.isImmediatePropagationStopped();k++){r=p.matches[k];if(h||!c.namespace&&!r.namespace||c.namespace_re&&c.namespace_re.test(r.namespace))c.data=r.data,c.handleObj=r,n=((f.event.special[r.origType]||{}).handle||r.handler).apply(p.elem,g),n!==b&&(c.result=n,n===!1&&(c.preventDefault(),c.stopPropagation()))}}return c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.sc
rollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatc
h.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isI
mmediatePropagationStopped:J},f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,"form"))return!1;f.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=f.nodeName(c,"input")||f.nodeName(c,"button")?c.form:b;d&&!d._submit_attached&&(f.event.add(d,"submit._submit",function(a){this.parentNode&&!a.isTrigger&&f.event.simulate("submit",this.parentNode,a,!0)}),d._submit_attached=!0)})},teardown:function(){if(f.nodeName(this,"form"))return!1;f.event.remove(this,"._submit")}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")f.event.add(this,"propertychange._change",function(a){
a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),f.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate("change",this,a,!0))});return!1}f.event.add(this,"beforeactivate._change",function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate("change",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,"._change");return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,
!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a=="object"){typeof c!="string"&&(d=c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on.call(this,a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.type+"."+e.namespace:e.type,e.selector,e.handler);return this}if(typeof a=="object"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c=="function")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:fun
ction(a,b){f(this.context).off(a,this.selector||"**",b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,"lastToggle"+a.guid)||0)%d;f._data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.on(
b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!="string"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(
d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.con
tains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!=="\\"){g[1]=(g[1]||"").replace(j,""),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)==="\\")continue;s===r&&(r
=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],"");if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e="";if(d){if(d===1||d===9){if(typeof a.textContent=="string")return a.textContent;if(typeof a.innerText=="string")return a.innerText.replace(k,"");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|
\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!l.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&m.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d
+&&m.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(j,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].repl
ace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected=
==!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"
},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case"only":case"first":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k==="first")return!0;l=a;case"last":while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case"nth":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g=a.parentNode;if(g&&(g[d
]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))
/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.leng
th,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&
d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q
=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;
o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[":"]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.POS,R={children:!0
,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),"not",a)},filter:function(a){return this.pushStack(T(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?Q.test(a)?f(a,this.context).index(this[0])>=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!="str
ing"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAl
l:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===
1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp("<(?:"+V+")","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*<!(?:\[CDATA\[|\-\-)/,bg={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup
=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this
.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),
+f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function()
+{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(functi
on(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bp)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDoc
umentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for
(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1></$2>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.
length)=="number")for(i=0;i<r;i++)bn(k[i]);else bn(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||be.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bq=/alpha\([^)]*\)/i,br=/opacity=([^)]*)/,bs=/([A-Z]|^ms)/g,bt=/^-?\d+(?:px)?$/i,bu=/^-?\d/,bv=/^([\-+])=([\-+.\de]+)/,bw={position:"absolute",vis
ibility:"hidden",display:"block"},bx=["Left","Right"],by=["Top","Bottom"],bz,bA,bB;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bz(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bv.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.c
amelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bz)return bz(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bC(a,b,d);f.swap(a,bw,function(){e=bC(a,b,d)});return e}},set:function(a,b){if(!bt.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||
(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"di
splay"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f
.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c)
{return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;e
lse try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.p
romise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified
&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);r
eturn d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{scr
ipt:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c)
+{if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,
cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cv(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cu("hide",3),a,b,c);var d,e,g=0,h=this.length;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,"display"),e!=="none"&&!f._data(d,"olddisplay")&&f._data(d,"olddisplay",e));for(g=0;g<h;g++)this[g].style&&(this[g].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean
";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cu("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){function g(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(!f.support.inlineBlockNeedsLayout||cv(this.nodeName)==="inline"?this.style.display="i
nline-block":this.style.zoom=1))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)j=new f.fx(this,b,i),h=a[i],cn.test(h)?(o=f._data(this,"toggle"+i)||(h==="toggle"?d?"show":"hide":0),o?(f._data(this,"toggle"+i,o==="show"?"hide":"show"),j[o]()):j[h]()):(k=co.exec(h),l=j.cur(),k?(m=parseFloat(k[2]),n=k[3]||(f.cssNumber[i]?"":"px"),n!=="px"&&(f.style(this,i,(m||1)+n),l=(m||1)/j.cur()*l,f.style(this,i,l+n)),k[1]&&(m=(k[1]==="-="?-1:1)*m+l),j.custom(l,m,n)):j.custom(l,h,""));return!0}var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&&g[b].stop&&b.indexOf(".run")===b.length-4&&h(this,g,b);else g[b=a+".run"]&&g[b].stop&&h(this,g,b);for(b=e.length;
b--;)e[b].elem===this&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:cu("show",1),slideUp:cu("hide",1),slideToggle:cu("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,
b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;this.startTime=cr||cs(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?"":"px"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){e.options.hide&&f._data(e.elem,"fxshow"+e.prop)===b&&f._data(e.elem,"fxshow"+e.prop,e.start)},h()&&f.timers.push(h)&&!cp&&(cp=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop==="widt
h"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,"fxshow"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cr||cs(),g=!0,h=this.elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),thi
s.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cp),cp=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=a.now}}}),f.each(["width","height"],function(a,b){f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g
=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cy(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.support.fixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndCells||!cw.test(b.nodeName))&&(l+=parseFl
oat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.support.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.support.fixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=nu
ll&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).
scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(wind
ow);

Added: sandbox/triplegit/trunk/html/namespacemembers.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/namespacemembers.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,110 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: Namespace Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li class="current">Namespaces</li>
+ <li>Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Namespace List</li>
+ <li class="current">Namespace Members</li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current">All</li>
+ <li>Functions</li>
+ <li>Typedefs</li>
+ </ul>
+ </div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all documented namespace members with links to the namespaces they belong to:</div><ul>
+<li>async_file_io_dispatcher()
+: <a class="el" href="namespacetriplegit_1_1async__io.html#afa6da488279e514281ae9d5904d8d426">triplegit::async_io</a>
+</li>
+<li>exception_ptr
+: <a class="el" href="namespacetriplegit_1_1async__io.html#af28c26398a12ba760165fc40f2a74ca3">triplegit::async_io</a>
+</li>
+<li>process_threadpool()
+: <a class="el" href="namespacetriplegit_1_1async__io.html#a6743cd614fc8161dfce94144c36cfb85">triplegit::async_io</a>
+</li>
+<li>when_all()
+: <a class="el" href="namespacetriplegit_1_1async__io.html#afc5e0576470c19d979b3b853305fc7d6">triplegit::async_io</a>
+</li>
+<li>when_any()
+: <a class="el" href="namespacetriplegit_1_1async__io.html#ac024775f7df8eb059d2aeee8de8f5ff9">triplegit::async_io</a>
+</li>
+</ul>
+</div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/namespacemembers_func.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/namespacemembers_func.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: Namespace Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li class="current">Namespaces</li>
+ <li>Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Namespace List</li>
+ <li class="current">Namespace Members</li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li>All</li>
+ <li class="current">Functions</li>
+ <li>Typedefs</li>
+ </ul>
+ </div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;<ul>
+<li>async_file_io_dispatcher()
+: <a class="el" href="namespacetriplegit_1_1async__io.html#afa6da488279e514281ae9d5904d8d426">triplegit::async_io</a>
+</li>
+<li>process_threadpool()
+: <a class="el" href="namespacetriplegit_1_1async__io.html#a6743cd614fc8161dfce94144c36cfb85">triplegit::async_io</a>
+</li>
+<li>when_all()
+: <a class="el" href="namespacetriplegit_1_1async__io.html#afc5e0576470c19d979b3b853305fc7d6">triplegit::async_io</a>
+</li>
+<li>when_any()
+: <a class="el" href="namespacetriplegit_1_1async__io.html#ac024775f7df8eb059d2aeee8de8f5ff9">triplegit::async_io</a>
+</li>
+</ul>
+</div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/namespacemembers_type.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/namespacemembers_type.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,98 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: Namespace Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li class="current">Namespaces</li>
+ <li>Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Namespace List</li>
+ <li class="current">Namespace Members</li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li>All</li>
+ <li>Functions</li>
+ <li class="current">Typedefs</li>
+ </ul>
+ </div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;<ul>
+<li>exception_ptr
+: <a class="el" href="namespacetriplegit_1_1async__io.html#af28c26398a12ba760165fc40f2a74ca3">triplegit::async_io</a>
+</li>
+</ul>
+</div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/namespaces.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/namespaces.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,96 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: Namespace List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li class="current">Namespaces</li>
+ <li>Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li class="current">Namespace List</li>
+ <li>Namespace Members</li>
+ </ul>
+ </div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">Namespace List</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock">Here is a list of all documented namespaces with brief descriptions:</div><div class="directory">
+<div class="levels">[detail level <span onclick="javascript:toggleLevel(1);">1</span><span onclick="javascript:toggleLevel(2);">2</span>]</div><table class="directory">
+<tr id="row_0_" class="even"><td class="entry"><img id="arr_0_" src="ftv2mlastnode.png" alt="\" width="16" height="22" onclick="toggleFolder('0_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>triplegit</b></td><td class="desc"></td></tr>
+<tr id="row_0_0_"><td class="entry"><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2ns.png" alt="N" width="24" height="22" /><a class="el" href="namespacetriplegit_1_1async__io.html" target="_self">async_io</a></td><td class="desc">The namespace containing the Boost.ASIO asynchronous file i/o implementation</td></tr>
+</table>
+</div><!-- directory -->
+</div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/namespacetriplegit_1_1async__io.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/namespacetriplegit_1_1async__io.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,476 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: triplegit::async_io Namespace Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li class="current">Namespaces</li>
+ <li>Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Namespace List</li>
+ <li>Namespace Members</li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><b>triplegit</b></li><li class="navelem"><a class="el" href="namespacetriplegit_1_1async__io.html">async_io</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+Classes &#124;
+Typedefs &#124;
+Functions </div>
+ <div class="headertitle">
+<div class="title">triplegit::async_io Namespace Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>The namespace containing the Boost.ASIO asynchronous file i/o implementation.
+More...</p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1future.html">future</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">For now, this is boost's future. Will be replaced when C++'s future catches up with boost's. More...<br/></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1shared__future.html">shared_future</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">For now, this is boost's <a class="el" href="classtriplegit_1_1async__io_1_1shared__future.html" title="For now, this is boost&#39;s shared_future. Will be replaced when C++&#39;s shared_future catches up with boo...">shared_future</a>. Will be replaced when C++'s <a class="el" href="classtriplegit_1_1async__io_1_1shared__future.html" title="For now, this is boost&#39;s shared_future. Will be replaced when C++&#39;s shared_future catches up with boo...">shared_future</a> catches up with boost's. More...<br/></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1promise.html">promise</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">For now, this is boost's promise. Will be replaced when C++'s promise catches up with boost's. More...<br/></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1thread__pool.html">thread_pool</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">A very simple thread pool based on Boost.ASIO and std::thread. More...<br/></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html">async_file_io_dispatcher_base</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Abstract base class for dispatching file i/o asynchronously. More...<br/></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">A reference to an async operation. More...<br/></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structtriplegit_1_1async__io_1_1async__path__op__req.html">async_path_op_req</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">A convenience bundle of path and flags, with optional precondition. More...<br/></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req.html">async_data_op_req</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">A specialisation for any pointer to type T. More...<br/></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1vector_3_01_t_00_01_a_01_4_01_4.html">async_data_op_req&lt; std::vector&lt; T, A &gt; &gt;</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">A specialisation for any std::vector&lt;T, A&gt; More...<br/></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1array_3_01_t_00_01_n_01_4_01_4.html">async_data_op_req&lt; std::array&lt; T, N &gt; &gt;</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">A specialisation for any std::array&lt;T, N&gt; More...<br/></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1basic__string_3_01_c_00_01_t_00_01_a_01_4_01_4.html">async_data_op_req&lt; std::basic_string&lt; C, T, A &gt; &gt;</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">A specialisation for any std::basic_string&lt;C, T, A&gt; More...<br/></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:af28c26398a12ba760165fc40f2a74ca3"><td class="memItemLeft" align="right" valign="top">typedef boost::exception_ptr&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacetriplegit_1_1async__io.html#af28c26398a12ba760165fc40f2a74ca3">exception_ptr</a></td></tr>
+<tr class="memdesc:af28c26398a12ba760165fc40f2a74ca3"><td class="mdescLeft">&#160;</td><td class="mdescRight">For now, this is boost's exception_ptr. Will be replaced when C++'s exception_ptr catches up with boost's. <br/></td></tr>
+<tr class="separator:af28c26398a12ba760165fc40f2a74ca3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a6743cd614fc8161dfce94144c36cfb85"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classtriplegit_1_1async__io_1_1thread__pool.html">thread_pool</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacetriplegit_1_1async__io.html#a6743cd614fc8161dfce94144c36cfb85">process_threadpool</a> ()</td></tr>
+<tr class="memdesc:a6743cd614fc8161dfce94144c36cfb85"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the process threadpool. <br/></td></tr>
+<tr class="separator:a6743cd614fc8161dfce94144c36cfb85"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afc5e0576470c19d979b3b853305fc7d6"><td class="memTemplParams" colspan="2">template&lt;class InputIterator &gt; </td></tr>
+<tr class="memitem:afc5e0576470c19d979b3b853305fc7d6"><td class="memTemplItemLeft" align="right" valign="top"><a class="el" href="classtriplegit_1_1async__io_1_1future.html">future</a>&lt; std::vector&lt; typename <br class="typebreak"/>
+std::decay&lt; decltype(((typename <br class="typebreak"/>
+InputIterator::value_type *) 0) -&gt;<br class="typebreak"/>
+get())&gt;::type &gt;&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="namespacetriplegit_1_1async__io.html#afc5e0576470c19d979b3b853305fc7d6">when_all</a> (InputIterator first, InputIterator last)</td></tr>
+<tr class="memdesc:afc5e0576470c19d979b3b853305fc7d6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a future vector of results from all the supplied futures. <br/></td></tr>
+<tr class="separator:afc5e0576470c19d979b3b853305fc7d6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac024775f7df8eb059d2aeee8de8f5ff9"><td class="memTemplParams" colspan="2">template&lt;class InputIterator &gt; </td></tr>
+<tr class="memitem:ac024775f7df8eb059d2aeee8de8f5ff9"><td class="memTemplItemLeft" align="right" valign="top"><a class="el" href="classtriplegit_1_1async__io_1_1future.html">future</a>&lt; std::pair&lt; size_t, <br class="typebreak"/>
+typename std::decay&lt; decltype(((typename <br class="typebreak"/>
+InputIterator::value_type *) 0) -&gt;<br class="typebreak"/>
+get())&gt;::type &gt;&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="namespacetriplegit_1_1async__io.html#ac024775f7df8eb059d2aeee8de8f5ff9">when_any</a> (InputIterator first, InputIterator last)</td></tr>
+<tr class="memdesc:ac024775f7df8eb059d2aeee8de8f5ff9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a future tuple of results from all the supplied futures. <br/></td></tr>
+<tr class="separator:ac024775f7df8eb059d2aeee8de8f5ff9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afa6da488279e514281ae9d5904d8d426"><td class="memItemLeft" align="right" valign="top">std::shared_ptr<br class="typebreak"/>
+&lt; <a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html">async_file_io_dispatcher_base</a> &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacetriplegit_1_1async__io.html#afa6da488279e514281ae9d5904d8d426">async_file_io_dispatcher</a> (<a class="el" href="classtriplegit_1_1async__io_1_1thread__pool.html">thread_pool</a> &amp;threadpool=<a class="el" href="namespacetriplegit_1_1async__io.html#a6743cd614fc8161dfce94144c36cfb85">process_threadpool</a>(), file_flags flagsforce=file_flags::None, file_flags flagsmask=file_flags::None)</td></tr>
+<tr class="memdesc:afa6da488279e514281ae9d5904d8d426"><td class="mdescLeft">&#160;</td><td class="mdescRight">Instatiates the best available async_file_io_dispatcher implementation for this system. <br/></td></tr>
+<tr class="separator:afa6da488279e514281ae9d5904d8d426"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae692c0402d30c1350b8475c8d9c42c69"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classtriplegit_1_1async__io_1_1future.html">future</a>&lt; std::vector<br class="typebreak"/>
+&lt; std::shared_ptr<br class="typebreak"/>
+&lt; <a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html">detail::async_io_handle</a> &gt; &gt; &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacetriplegit_1_1async__io.html#ae692c0402d30c1350b8475c8d9c42c69">when_all</a> (std::nothrow_t, std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &gt;::iterator first, std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &gt;::iterator last)</td></tr>
+<tr class="memdesc:ae692c0402d30c1350b8475c8d9c42c69"><td class="mdescLeft">&#160;</td><td class="mdescRight">Convenience overload for a vector of <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a>. Does not retrieve exceptions. <br/></td></tr>
+<tr class="separator:ae692c0402d30c1350b8475c8d9c42c69"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab4c882426142e8f23d1e37d2835035fa"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classtriplegit_1_1async__io_1_1future.html">future</a>&lt; std::vector<br class="typebreak"/>
+&lt; std::shared_ptr<br class="typebreak"/>
+&lt; <a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html">detail::async_io_handle</a> &gt; &gt; &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacetriplegit_1_1async__io.html#ab4c882426142e8f23d1e37d2835035fa">when_all</a> (std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &gt;::iterator first, std::vector&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &gt;::iterator last)</td></tr>
+<tr class="memdesc:ab4c882426142e8f23d1e37d2835035fa"><td class="mdescLeft">&#160;</td><td class="mdescRight">Convenience overload for a vector of <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a>. Retrieves exceptions. <br/></td></tr>
+<tr class="separator:ab4c882426142e8f23d1e37d2835035fa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abb978d2fbe374855ddd0e539f38e5316"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classtriplegit_1_1async__io_1_1future.html">future</a>&lt; std::vector<br class="typebreak"/>
+&lt; std::shared_ptr<br class="typebreak"/>
+&lt; <a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html">detail::async_io_handle</a> &gt; &gt; &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacetriplegit_1_1async__io.html#abb978d2fbe374855ddd0e539f38e5316">when_all</a> (std::nothrow_t _, std::initializer_list&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &gt; _ops)</td></tr>
+<tr class="memdesc:abb978d2fbe374855ddd0e539f38e5316"><td class="mdescLeft">&#160;</td><td class="mdescRight">Convenience overload for a list of <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a>. Does not retrieve exceptions. <br/></td></tr>
+<tr class="separator:abb978d2fbe374855ddd0e539f38e5316"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0503557b870c07ccf9e43f4e3096c446"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classtriplegit_1_1async__io_1_1future.html">future</a>&lt; std::vector<br class="typebreak"/>
+&lt; std::shared_ptr<br class="typebreak"/>
+&lt; <a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html">detail::async_io_handle</a> &gt; &gt; &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacetriplegit_1_1async__io.html#a0503557b870c07ccf9e43f4e3096c446">when_all</a> (std::initializer_list&lt; <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> &gt; _ops)</td></tr>
+<tr class="memdesc:a0503557b870c07ccf9e43f4e3096c446"><td class="mdescLeft">&#160;</td><td class="mdescRight">Convenience overload for a list of <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a>. Retrieves exceptions. <br/></td></tr>
+<tr class="separator:a0503557b870c07ccf9e43f4e3096c446"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>The namespace containing the Boost.ASIO asynchronous file i/o implementation. </p>
+</div><h2 class="groupheader">Typedef Documentation</h2>
+<a class="anchor" id="af28c26398a12ba760165fc40f2a74ca3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">typedef boost::exception_ptr <a class="el" href="namespacetriplegit_1_1async__io.html#af28c26398a12ba760165fc40f2a74ca3">triplegit::async_io::exception_ptr</a></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>For now, this is boost's exception_ptr. Will be replaced when C++'s exception_ptr catches up with boost's. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="afa6da488279e514281ae9d5904d8d426"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">std::shared_ptr&lt;<a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html">async_file_io_dispatcher_base</a>&gt; triplegit::async_io::async_file_io_dispatcher </td>
+ <td>(</td>
+ <td class="paramtype">thread_pool &amp;&#160;</td>
+ <td class="paramname"><em>threadpool</em> = <code>process_threadpool()</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">file_flags&#160;</td>
+ <td class="paramname"><em>flagsforce</em> = <code>file_flags::None</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">file_flags&#160;</td>
+ <td class="paramname"><em>flagsmask</em> = <code>file_flags::None</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Instatiates the best available async_file_io_dispatcher implementation for this system. </p>
+<p><em>flagsforce</em> is ORed with any opened file flags. The NOT of <em>flags</em> mask is ANDed with any opened flags.</p>
+<p>Note that the number of threads in the threadpool supplied is the maximum non-async op queue depth (e.g. file opens, closes etc.). For fast SSDs, there isn't much gain after eight-sixteen threads, so the process threadpool is set to eight by default. For slow hard drives, or worse, SANs, a queue depth of 64 or higher might deliver significant benefits. </p>
+
+</div>
+</div>
+<a class="anchor" id="a6743cd614fc8161dfce94144c36cfb85"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classtriplegit_1_1async__io_1_1thread__pool.html">thread_pool</a>&amp; triplegit::async_io::process_threadpool </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns the process threadpool. </p>
+
+</div>
+</div>
+<a class="anchor" id="afc5e0576470c19d979b3b853305fc7d6"></a>
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class InputIterator &gt; </div>
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classtriplegit_1_1async__io_1_1future.html">future</a>&lt;std::vector&lt;typename std::decay&lt;decltype(((typename InputIterator::value_type *) 0)-&gt;get())&gt;::type&gt; triplegit::async_io::when_all </td>
+ <td>(</td>
+ <td class="paramtype">InputIterator&#160;</td>
+ <td class="paramname"><em>first</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">InputIterator&#160;</td>
+ <td class="paramname"><em>last</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Returns a future vector of results from all the supplied futures. </p>
+
+</div>
+</div>
+<a class="anchor" id="ae692c0402d30c1350b8475c8d9c42c69"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classtriplegit_1_1async__io_1_1future.html">future</a>&lt;std::vector&lt;std::shared_ptr&lt;<a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html">detail::async_io_handle</a>&gt; &gt; &gt; triplegit::async_io::when_all </td>
+ <td>(</td>
+ <td class="paramtype">std::nothrow_t&#160;</td>
+ <td class="paramname">, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">std::vector&lt; async_io_op &gt;::iterator&#160;</td>
+ <td class="paramname"><em>first</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">std::vector&lt; async_io_op &gt;::iterator&#160;</td>
+ <td class="paramname"><em>last</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Convenience overload for a vector of <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a>. Does not retrieve exceptions. </p>
+
+</div>
+</div>
+<a class="anchor" id="ab4c882426142e8f23d1e37d2835035fa"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classtriplegit_1_1async__io_1_1future.html">future</a>&lt;std::vector&lt;std::shared_ptr&lt;<a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html">detail::async_io_handle</a>&gt; &gt; &gt; triplegit::async_io::when_all </td>
+ <td>(</td>
+ <td class="paramtype">std::vector&lt; async_io_op &gt;::iterator&#160;</td>
+ <td class="paramname"><em>first</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">std::vector&lt; async_io_op &gt;::iterator&#160;</td>
+ <td class="paramname"><em>last</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Convenience overload for a vector of <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a>. Retrieves exceptions. </p>
+
+</div>
+</div>
+<a class="anchor" id="abb978d2fbe374855ddd0e539f38e5316"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classtriplegit_1_1async__io_1_1future.html">future</a>&lt;std::vector&lt;std::shared_ptr&lt;<a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html">detail::async_io_handle</a>&gt; &gt; &gt; triplegit::async_io::when_all </td>
+ <td>(</td>
+ <td class="paramtype">std::nothrow_t&#160;</td>
+ <td class="paramname"><em>_</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">std::initializer_list&lt; async_io_op &gt;&#160;</td>
+ <td class="paramname"><em>_ops</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Convenience overload for a list of <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a>. Does not retrieve exceptions. </p>
+
+</div>
+</div>
+<a class="anchor" id="a0503557b870c07ccf9e43f4e3096c446"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classtriplegit_1_1async__io_1_1future.html">future</a>&lt;std::vector&lt;std::shared_ptr&lt;<a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html">detail::async_io_handle</a>&gt; &gt; &gt; triplegit::async_io::when_all </td>
+ <td>(</td>
+ <td class="paramtype">std::initializer_list&lt; async_io_op &gt;&#160;</td>
+ <td class="paramname"><em>_ops</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Convenience overload for a list of <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html" title="A reference to an async operation.">async_io_op</a>. Retrieves exceptions. </p>
+
+</div>
+</div>
+<a class="anchor" id="ac024775f7df8eb059d2aeee8de8f5ff9"></a>
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class InputIterator &gt; </div>
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classtriplegit_1_1async__io_1_1future.html">future</a>&lt;std::pair&lt;size_t, typename std::decay&lt;decltype(((typename InputIterator::value_type *) 0)-&gt;get())&gt;::type&gt; triplegit::async_io::when_any </td>
+ <td>(</td>
+ <td class="paramtype">InputIterator&#160;</td>
+ <td class="paramname"><em>first</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">InputIterator&#160;</td>
+ <td class="paramname"><em>last</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Returns a future tuple of results from all the supplied futures. </p>
+<p>Returns a future result from the first of the supplied futures </p>
+
+</div>
+</div>
+</div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/nav_f.png
==============================================================================
Binary file. No diff available.

Added: sandbox/triplegit/trunk/html/nav_g.png
==============================================================================
Binary file. No diff available.

Added: sandbox/triplegit/trunk/html/nav_h.png
==============================================================================
Binary file. No diff available.

Added: sandbox/triplegit/trunk/html/open.png
==============================================================================
Binary file. No diff available.

Added: sandbox/triplegit/trunk/html/search/all_61.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/all_61.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_61.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/all_61.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/all_61.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,17 @@
+var searchData=
+[
+ ['adjacency_5flist',['adjacency_list',['../classtriplegit_1_1boost_1_1adjacency__list.html',1,'triplegit::boost']]],
+ ['async_5fdata_5fop_5freq',['async_data_op_req',['../structtriplegit_1_1async__io_1_1async__data__op__req.html',1,'triplegit::async_io']]],
+ ['async_5fdata_5fop_5freq_3c_20const_20void_20_3e',['async_data_op_req&lt; const void &gt;',['../structtriplegit_1_1async__io_1_1async__data__op__req.html',1,'triplegit::async_io']]],
+ ['async_5fdata_5fop_5freq_3c_20std_3a_3aarray_3c_20t_2c_20n_20_3e_20_3e',['async_data_op_req&lt; std::array&lt; T, N &gt; &gt;',['../structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1array_3_01_t_00_01_n_01_4_01_4.html',1,'triplegit::async_io']]],
+ ['async_5fdata_5fop_5freq_3c_20std_3a_3abasic_5fstring_3c_20c_2c_20t_2c_20a_20_3e_20_3e',['async_data_op_req&lt; std::basic_string&lt; C, T, A &gt; &gt;',['../structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1basic__string_3_01_c_00_01_t_00_01_a_01_4_01_4.html',1,'triplegit::async_io']]],
+ ['async_5fdata_5fop_5freq_3c_20std_3a_3avector_3c_20t_2c_20a_20_3e_20_3e',['async_data_op_req&lt; std::vector&lt; T, A &gt; &gt;',['../structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1vector_3_01_t_00_01_a_01_4_01_4.html',1,'triplegit::async_io']]],
+ ['async_5fdata_5fop_5freq_3c_20void_20_3e',['async_data_op_req&lt; void &gt;',['../structtriplegit_1_1async__io_1_1async__data__op__req.html',1,'triplegit::async_io']]],
+ ['async_5ffile_5fio_2ehpp',['async_file_io.hpp',['../async__file__io_8hpp.html',1,'']]],
+ ['async_5ffile_5fio_5fdispatcher',['async_file_io_dispatcher',['../namespacetriplegit_1_1async__io.html#afa6da488279e514281ae9d5904d8d426',1,'triplegit::async_io']]],
+ ['async_5ffile_5fio_5fdispatcher_5fbase',['async_file_io_dispatcher_base',['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html',1,'triplegit::async_io']]],
+ ['async_5fio_5fhandle',['async_io_handle',['../classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html',1,'triplegit::async_io::detail']]],
+ ['async_5fio_5fop',['async_io_op',['../structtriplegit_1_1async__io_1_1async__io__op.html',1,'triplegit::async_io']]],
+ ['async_5fpath_5fop_5freq',['async_path_op_req',['../structtriplegit_1_1async__io_1_1async__path__op__req.html',1,'triplegit::async_io']]],
+ ['async_5fpath_5fop_5freq',['async_path_op_req',['../structtriplegit_1_1async__io_1_1async__path__op__req.html#a140edf74812e339fea7051df405fc56c',1,'triplegit::async_io::async_path_op_req::async_path_op_req(std::filesystem::path _path, file_flags _flags=file_flags::None)'],['../structtriplegit_1_1async__io_1_1async__path__op__req.html#a5c35e56a49e31f12603b2cbbb1ffdae3',1,'triplegit::async_io::async_path_op_req::async_path_op_req(async_io_op _precondition, std::filesystem::path _path, file_flags _flags=file_flags::None)'],['../structtriplegit_1_1async__io_1_1async__path__op__req.html#a2698273a17aede1d349179906511fc2f',1,'triplegit::async_io::async_path_op_req::async_path_op_req(std::string _path, file_flags _flags=file_flags::None)'],['../structtriplegit_1_1async__io_1_1async__path__op__req.html#a1a92f25371984a7476f3d13530b6f1cd',1,'triplegit::async_io::async_path_op_req::async_path_op_req(async_io_op _precondition, std::string _path, file_flags _flags=file_flags::None)'],['../structtriplegit_1_1async__io_
1_1async__path__op__req.html#a69fbf4bfcba29f732802abe554727484',1,'triplegit::async_io::async_path_op_req::async_path_op_req(const char *_path, file_flags _flags=file_flags::None)'],['../structtriplegit_1_1async__io_1_1async__path__op__req.html#a8da200394b59be098d23e4db27b7f80f',1,'triplegit::async_io::async_path_op_req::async_path_op_req(async_io_op _precondition, const char *_path, file_flags _flags=file_flags::None)']]]
+];

Added: sandbox/triplegit/trunk/html/search/all_62.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/all_62.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_62.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/all_62.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/all_62.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['base_5fstore',['base_store',['../classtriplegit_1_1base__store.html',1,'triplegit']]]
+];

Added: sandbox/triplegit/trunk/html/search/all_63.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/all_63.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_63.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/all_63.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/all_63.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,12 @@
+var searchData=
+[
+ ['call',['call',['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#af5ec8648416926263780d9c597db35ed',1,'triplegit::async_io::async_file_io_dispatcher_base::call(const std::vector&lt; async_io_op &gt; &amp;ops, const std::vector&lt; std::function&lt; R()&gt;&gt; &amp;callables)'],['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a7057167ed1a46e3b24fa3806bd6172c1',1,'triplegit::async_io::async_file_io_dispatcher_base::call(const async_io_op &amp;req, C callback, Args...args)']]],
+ ['checkcollectionid',['checkCollectionId',['../classtriplegit_1_1base__store.html#af1c4c71d3f7e240925439a456c7d2b36',1,'triplegit::base_store']]],
+ ['close',['close',['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#abffcc5e304efb9622ef184eca8d29868',1,'triplegit::async_io::async_file_io_dispatcher_base::close(const std::vector&lt; async_io_op &gt; &amp;ops)=0'],['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a828b6f410645dfe2dca3075c86e054c7',1,'triplegit::async_io::async_file_io_dispatcher_base::close(const async_io_op &amp;req)']]],
+ ['collection_5fid',['collection_id',['../classtriplegit_1_1collection__id.html',1,'triplegit']]],
+ ['collection_5fid',['collection_id',['../classtriplegit_1_1collection__id.html#abf5fe0ca6383437bdc684e6219078c38',1,'triplegit::collection_id::collection_id(fs_store &amp;store)'],['../classtriplegit_1_1collection__id.html#a60ccc9c03400843c050c4c7e9dcefcb1',1,'triplegit::collection_id::collection_id(fs_store &amp;store, const std::string &amp;name, bool mustBeUnique=false)']]],
+ ['collections_5ft',['collections_t',['../classtriplegit_1_1base__store.html#aae2fc9e86358fb51548d35b4b1691aef',1,'triplegit::base_store']]],
+ ['completion',['completion',['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a6fa594bfd2e1ed2af9e1a3ea25be7da5',1,'triplegit::async_io::async_file_io_dispatcher_base::completion(const std::vector&lt; async_io_op &gt; &amp;ops, const std::vector&lt; std::pair&lt; async_op_flags, std::function&lt; completion_t &gt;&gt;&gt; &amp;callbacks)'],['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#af0627f7511cac82528dcd7ed490b5211',1,'triplegit::async_io::async_file_io_dispatcher_base::completion(const async_io_op &amp;req, const std::pair&lt; async_op_flags, std::function&lt; completion_t &gt;&gt; &amp;callback)']]],
+ ['config',['config',['../classtriplegit_1_1base__store.html#a03deb45a9a388d839b6fc6832909668e',1,'triplegit::base_store']]],
+ ['count',['count',['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#aaee8e9e70ead7a56b5bfbdf7ac762450',1,'triplegit::async_io::async_file_io_dispatcher_base']]]
+];

Added: sandbox/triplegit/trunk/html/search/all_64.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/all_64.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_64.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/all_64.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/all_64.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['dir',['dir',['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a517359ced87c537caff44dc6fa35fb19',1,'triplegit::async_io::async_file_io_dispatcher_base::dir(const std::vector&lt; async_path_op_req &gt; &amp;reqs)=0'],['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a60be8d20fba4795a9838c706707041ef',1,'triplegit::async_io::async_file_io_dispatcher_base::dir(const async_path_op_req &amp;req)']]]
+];

Added: sandbox/triplegit/trunk/html/search/all_65.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/all_65.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_65.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/all_65.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/all_65.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['enqueue',['enqueue',['../classtriplegit_1_1async__io_1_1thread__pool.html#a1197a18cb30a52bb1ee02cd2ef742bff',1,'triplegit::async_io::thread_pool']]],
+ ['exception_5fptr',['exception_ptr',['../namespacetriplegit_1_1async__io.html#af28c26398a12ba760165fc40f2a74ca3',1,'triplegit::async_io']]]
+];

Added: sandbox/triplegit/trunk/html/search/all_66.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/all_66.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_66.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/all_66.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/all_66.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,8 @@
+var searchData=
+[
+ ['file',['file',['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a6e008acf9f33b3ff43b0c73901f5f9c7',1,'triplegit::async_io::async_file_io_dispatcher_base::file(const std::vector&lt; async_path_op_req &gt; &amp;reqs)=0'],['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a16b57f66a84c25904cb02bdfb9e71a27',1,'triplegit::async_io::async_file_io_dispatcher_base::file(const async_path_op_req &amp;req)']]],
+ ['fileflags',['fileflags',['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#ab1746bda51c77ef5c1691b3f6857a270',1,'triplegit::async_io::async_file_io_dispatcher_base']]],
+ ['fs_5fstore',['fs_store',['../classtriplegit_1_1fs__store.html#ab7e25c70606385d88d069550c4816378',1,'triplegit::fs_store']]],
+ ['fs_5fstore',['fs_store',['../classtriplegit_1_1fs__store.html',1,'triplegit']]],
+ ['future',['future',['../classtriplegit_1_1async__io_1_1future.html',1,'triplegit::async_io']]]
+];

Added: sandbox/triplegit/trunk/html/search/all_68.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/all_68.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_68.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/all_68.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/all_68.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['h',['h',['../structtriplegit_1_1async__io_1_1async__io__op.html#a64a2053bd93c75a0a77261ff8402f817',1,'triplegit::async_io::async_io_op']]]
+];

Added: sandbox/triplegit/trunk/html/search/all_69.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/all_69.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_69.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/all_69.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/all_69.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['id',['id',['../structtriplegit_1_1async__io_1_1async__io__op.html#af303d1a104de71b2c6c6b2ce47d514c6',1,'triplegit::async_io::async_io_op']]],
+ ['io_5fservice',['io_service',['../classtriplegit_1_1async__io_1_1thread__pool.html#a67f5b5480be42f8cb94878c5ff95b245',1,'triplegit::async_io::thread_pool']]],
+ ['isfsreadonly',['isFSReadOnly',['../classtriplegit_1_1base__store.html#a00b19473f5b199c72040057b4c27c72a',1,'triplegit::base_store']]],
+ ['isreadonly',['isReadOnly',['../classtriplegit_1_1base__store.html#ae7c169da7d9faffe60cbc64b3e965e7f',1,'triplegit::base_store']]]
+];

Added: sandbox/triplegit/trunk/html/search/all_6e.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/all_6e.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_6e.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/all_6e.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/all_6e.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['native_5fhandle',['native_handle',['../classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#af58d73f18065864e4e6026464116ee6e',1,'triplegit::async_io::detail::async_io_handle']]]
+];

Added: sandbox/triplegit/trunk/html/search/all_6f.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/all_6f.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_6f.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/all_6f.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/all_6f.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['opened',['opened',['../classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#a00eaad37ed049b6577c750aa16736cc5',1,'triplegit::async_io::detail::async_io_handle']]]
+];

Added: sandbox/triplegit/trunk/html/search/all_70.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/all_70.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_70.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/all_70.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/all_70.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,9 @@
+var searchData=
+[
+ ['packaged_5ftask',['packaged_task',['../classpackaged__task.html',1,'']]],
+ ['parent',['parent',['../structtriplegit_1_1async__io_1_1async__io__op.html#aa7f06f1a66943a0557c8a52c58b39bd6',1,'triplegit::async_io::async_io_op::parent()'],['../classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#ab254a7c8d7512075368b2807621db5f5',1,'triplegit::async_io::detail::async_io_handle::parent()']]],
+ ['path',['path',['../classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#abfff6c04e97084d71c44e811cc5d99d6',1,'triplegit::async_io::detail::async_io_handle']]],
+ ['process_5fthreadpool',['process_threadpool',['../namespacetriplegit_1_1async__io.html#a6743cd614fc8161dfce94144c36cfb85',1,'triplegit::async_io']]],
+ ['promise',['promise',['../classtriplegit_1_1async__io_1_1promise.html',1,'triplegit::async_io']]],
+ ['promise_3c_20std_3a_3avector_3c_20std_3a_3ashared_5fptr_3c_20detail_3a_3aasync_5fio_5fhandle_20_3e_20_3e_20_3e',['promise&lt; std::vector&lt; std::shared_ptr&lt; detail::async_io_handle &gt; &gt; &gt;',['../classtriplegit_1_1async__io_1_1promise.html',1,'triplegit::async_io']]]
+];

Added: sandbox/triplegit/trunk/html/search/all_72.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/all_72.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_72.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/all_72.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/all_72.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['read',['read',['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a21f6fce370f936a958ebbebe74eb08c4',1,'triplegit::async_io::async_file_io_dispatcher_base::read(const std::vector&lt; async_data_op_req&lt; void &gt;&gt; &amp;ops)=0'],['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a4a855265b383c4db717040cc49b4fe1d',1,'triplegit::async_io::async_file_io_dispatcher_base::read(const async_data_op_req&lt; void &gt; &amp;req)'],['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#aab459d62576fcfea288094ad30a211e7',1,'triplegit::async_io::async_file_io_dispatcher_base::read(const std::vector&lt; async_data_op_req&lt; T &gt;&gt; &amp;ops)']]],
+ ['read_5fcount',['read_count',['../classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#a9e138be2ed4a0522a1710e693cd6377c',1,'triplegit::async_io::detail::async_io_handle']]],
+ ['rmdir',['rmdir',['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a4924392f3af3a7b429ca49d7c7a35b4e',1,'triplegit::async_io::async_file_io_dispatcher_base::rmdir(const std::vector&lt; async_path_op_req &gt; &amp;reqs)=0'],['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#ad60182955f83342b9cb237142e9c2ced',1,'triplegit::async_io::async_file_io_dispatcher_base::rmdir(const async_path_op_req &amp;req)']]],
+ ['rmfile',['rmfile',['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a7839e9b1fc5e2caba5e37a4f5ecebbb7',1,'triplegit::async_io::async_file_io_dispatcher_base::rmfile(const std::vector&lt; async_path_op_req &gt; &amp;reqs)=0'],['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#ad5b54fca9b70f2899218119176cca111',1,'triplegit::async_io::async_file_io_dispatcher_base::rmfile(const async_path_op_req &amp;req)']]]
+];

Added: sandbox/triplegit/trunk/html/search/all_73.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/all_73.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_73.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/all_73.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/all_73.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,8 @@
+var searchData=
+[
+ ['shared_5ffuture',['shared_future',['../classtriplegit_1_1async__io_1_1shared__future.html',1,'triplegit::async_io']]],
+ ['shared_5ffuture_3c_20std_3a_3ashared_5fptr_3c_20detail_3a_3aasync_5fio_5fhandle_20_3e_20_3e',['shared_future&lt; std::shared_ptr&lt; detail::async_io_handle &gt; &gt;',['../classtriplegit_1_1async__io_1_1shared__future.html',1,'triplegit::async_io']]],
+ ['storable_5fvertices',['storable_vertices',['../classtriplegit_1_1storable__vertices.html',1,'triplegit']]],
+ ['storable_5fvertices_3c_20adjacency_5flist_3c_20outedgelists_2c_20vertexlists_2c_20directeds_2c_20vertexproperty_2c_20edgeproperty_2c_20graphproperty_2c_20edgelists_20_3e_20_3e',['storable_vertices&lt; adjacency_list&lt; OutEdgeListS, VertexListS, DirectedS, VertexProperty, EdgeProperty, GraphProperty, EdgeListS &gt; &gt;',['../classtriplegit_1_1storable__vertices.html',1,'triplegit']]],
+ ['sync',['sync',['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a20ac9ebe7fc8e9f898d3de8c85b03efd',1,'triplegit::async_io::async_file_io_dispatcher_base::sync(const std::vector&lt; async_io_op &gt; &amp;ops)=0'],['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a8659dae5b8bbe2fe9e2a0b61579683d7',1,'triplegit::async_io::async_file_io_dispatcher_base::sync(const async_io_op &amp;req)']]]
+];

Added: sandbox/triplegit/trunk/html/search/all_74.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/all_74.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_74.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/all_74.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/all_74.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,8 @@
+var searchData=
+[
+ ['async_5fio',['async_io',['../namespacetriplegit_1_1async__io.html',1,'triplegit']]],
+ ['thread_5fpool',['thread_pool',['../classtriplegit_1_1async__io_1_1thread__pool.html',1,'triplegit::async_io']]],
+ ['thread_5fpool',['thread_pool',['../classtriplegit_1_1async__io_1_1thread__pool.html#ad55f84716fd629d7e895f109a150e83e',1,'triplegit::async_io::thread_pool']]],
+ ['threadpool',['threadpool',['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#ae17a53fb0dd440c3e26fb6ca648f9034',1,'triplegit::async_io::async_file_io_dispatcher_base']]],
+ ['truncate',['truncate',['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#afd50d52fec35330deac6153aece92d7d',1,'triplegit::async_io::async_file_io_dispatcher_base::truncate(const std::vector&lt; async_io_op &gt; &amp;ops, const std::vector&lt; off_t &gt; &amp;sizes)'],['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#aedd6e17486c726c5b08be8132fe55776',1,'triplegit::async_io::async_file_io_dispatcher_base::truncate(const async_io_op &amp;op, off_t newsize)']]]
+];

Added: sandbox/triplegit/trunk/html/search/all_75.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/all_75.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_75.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/all_75.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/all_75.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['unique_5fid',['unique_id',['../classtriplegit_1_1unique__id.html',1,'triplegit']]],
+ ['unique_5fid_3c_20niallscpp11utilities_3a_3aint128_2c_20niallscpp11utilities_3a_3ahash128_20_3e',['unique_id&lt; NiallsCPP11Utilities::Int128, NiallsCPP11Utilities::Hash128 &gt;',['../classtriplegit_1_1unique__id.html',1,'triplegit']]]
+];

Added: sandbox/triplegit/trunk/html/search/all_77.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/all_77.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_77.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/all_77.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/all_77.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,9 @@
+var searchData=
+[
+ ['wait_5fqueue_5fdepth',['wait_queue_depth',['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a2ed9d1f242fa0acd8bced12a75c13474',1,'triplegit::async_io::async_file_io_dispatcher_base']]],
+ ['when_5fall',['when_all',['../namespacetriplegit_1_1async__io.html#afc5e0576470c19d979b3b853305fc7d6',1,'triplegit::async_io::when_all(InputIterator first, InputIterator last)'],['../namespacetriplegit_1_1async__io.html#ae692c0402d30c1350b8475c8d9c42c69',1,'triplegit::async_io::when_all(std::nothrow_t, std::vector&lt; async_io_op &gt;::iterator first, std::vector&lt; async_io_op &gt;::iterator last)'],['../namespacetriplegit_1_1async__io.html#ab4c882426142e8f23d1e37d2835035fa',1,'triplegit::async_io::when_all(std::vector&lt; async_io_op &gt;::iterator first, std::vector&lt; async_io_op &gt;::iterator last)'],['../namespacetriplegit_1_1async__io.html#abb978d2fbe374855ddd0e539f38e5316',1,'triplegit::async_io::when_all(std::nothrow_t _, std::initializer_list&lt; async_io_op &gt; _ops)'],['../namespacetriplegit_1_1async__io.html#a0503557b870c07ccf9e43f4e3096c446',1,'triplegit::async_io::when_all(std::initializer_list&lt; async_io_op &gt; _ops)']]],
+ ['when_5fany',['when_any',['../namespacetriplegit_1_1async__io.html#ac024775f7df8eb059d2aeee8de8f5ff9',1,'triplegit::async_io']]],
+ ['write',['write',['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#af087a1c53c619679a5e65fc828a7c652',1,'triplegit::async_io::async_file_io_dispatcher_base::write(const std::vector&lt; async_data_op_req&lt; const void &gt;&gt; &amp;ops)=0'],['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#ad3b11ed98996a8b674329e05dce13841',1,'triplegit::async_io::async_file_io_dispatcher_base::write(const async_data_op_req&lt; const void &gt; &amp;req)'],['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#ab00ad1238d5b87b7e87940b4566f7491',1,'triplegit::async_io::async_file_io_dispatcher_base::write(const std::vector&lt; async_data_op_req&lt; T &gt;&gt; &amp;ops)']]],
+ ['write_5fcount',['write_count',['../classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#ae96b546a730964e57bd0a50781237222',1,'triplegit::async_io::detail::async_io_handle']]],
+ ['write_5fcount_5fsince_5ffsync',['write_count_since_fsync',['../classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#a1ad31d5e35f7e8562787415f12ab5f7d',1,'triplegit::async_io::detail::async_io_handle']]]
+];

Added: sandbox/triplegit/trunk/html/search/classes_61.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/classes_61.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_61.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/classes_61.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/classes_61.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,14 @@
+var searchData=
+[
+ ['adjacency_5flist',['adjacency_list',['../classtriplegit_1_1boost_1_1adjacency__list.html',1,'triplegit::boost']]],
+ ['async_5fdata_5fop_5freq',['async_data_op_req',['../structtriplegit_1_1async__io_1_1async__data__op__req.html',1,'triplegit::async_io']]],
+ ['async_5fdata_5fop_5freq_3c_20const_20void_20_3e',['async_data_op_req&lt; const void &gt;',['../structtriplegit_1_1async__io_1_1async__data__op__req.html',1,'triplegit::async_io']]],
+ ['async_5fdata_5fop_5freq_3c_20std_3a_3aarray_3c_20t_2c_20n_20_3e_20_3e',['async_data_op_req&lt; std::array&lt; T, N &gt; &gt;',['../structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1array_3_01_t_00_01_n_01_4_01_4.html',1,'triplegit::async_io']]],
+ ['async_5fdata_5fop_5freq_3c_20std_3a_3abasic_5fstring_3c_20c_2c_20t_2c_20a_20_3e_20_3e',['async_data_op_req&lt; std::basic_string&lt; C, T, A &gt; &gt;',['../structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1basic__string_3_01_c_00_01_t_00_01_a_01_4_01_4.html',1,'triplegit::async_io']]],
+ ['async_5fdata_5fop_5freq_3c_20std_3a_3avector_3c_20t_2c_20a_20_3e_20_3e',['async_data_op_req&lt; std::vector&lt; T, A &gt; &gt;',['../structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1vector_3_01_t_00_01_a_01_4_01_4.html',1,'triplegit::async_io']]],
+ ['async_5fdata_5fop_5freq_3c_20void_20_3e',['async_data_op_req&lt; void &gt;',['../structtriplegit_1_1async__io_1_1async__data__op__req.html',1,'triplegit::async_io']]],
+ ['async_5ffile_5fio_5fdispatcher_5fbase',['async_file_io_dispatcher_base',['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html',1,'triplegit::async_io']]],
+ ['async_5fio_5fhandle',['async_io_handle',['../classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html',1,'triplegit::async_io::detail']]],
+ ['async_5fio_5fop',['async_io_op',['../structtriplegit_1_1async__io_1_1async__io__op.html',1,'triplegit::async_io']]],
+ ['async_5fpath_5fop_5freq',['async_path_op_req',['../structtriplegit_1_1async__io_1_1async__path__op__req.html',1,'triplegit::async_io']]]
+];

Added: sandbox/triplegit/trunk/html/search/classes_62.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/classes_62.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_62.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/classes_62.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/classes_62.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['base_5fstore',['base_store',['../classtriplegit_1_1base__store.html',1,'triplegit']]]
+];

Added: sandbox/triplegit/trunk/html/search/classes_63.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/classes_63.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_63.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/classes_63.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/classes_63.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['collection_5fid',['collection_id',['../classtriplegit_1_1collection__id.html',1,'triplegit']]]
+];

Added: sandbox/triplegit/trunk/html/search/classes_66.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/classes_66.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_66.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/classes_66.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/classes_66.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['fs_5fstore',['fs_store',['../classtriplegit_1_1fs__store.html',1,'triplegit']]],
+ ['future',['future',['../classtriplegit_1_1async__io_1_1future.html',1,'triplegit::async_io']]]
+];

Added: sandbox/triplegit/trunk/html/search/classes_70.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/classes_70.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_70.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/classes_70.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/classes_70.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,6 @@
+var searchData=
+[
+ ['packaged_5ftask',['packaged_task',['../classpackaged__task.html',1,'']]],
+ ['promise',['promise',['../classtriplegit_1_1async__io_1_1promise.html',1,'triplegit::async_io']]],
+ ['promise_3c_20std_3a_3avector_3c_20std_3a_3ashared_5fptr_3c_20detail_3a_3aasync_5fio_5fhandle_20_3e_20_3e_20_3e',['promise&lt; std::vector&lt; std::shared_ptr&lt; detail::async_io_handle &gt; &gt; &gt;',['../classtriplegit_1_1async__io_1_1promise.html',1,'triplegit::async_io']]]
+];

Added: sandbox/triplegit/trunk/html/search/classes_73.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/classes_73.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_73.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/classes_73.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/classes_73.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['shared_5ffuture',['shared_future',['../classtriplegit_1_1async__io_1_1shared__future.html',1,'triplegit::async_io']]],
+ ['shared_5ffuture_3c_20std_3a_3ashared_5fptr_3c_20detail_3a_3aasync_5fio_5fhandle_20_3e_20_3e',['shared_future&lt; std::shared_ptr&lt; detail::async_io_handle &gt; &gt;',['../classtriplegit_1_1async__io_1_1shared__future.html',1,'triplegit::async_io']]],
+ ['storable_5fvertices',['storable_vertices',['../classtriplegit_1_1storable__vertices.html',1,'triplegit']]],
+ ['storable_5fvertices_3c_20adjacency_5flist_3c_20outedgelists_2c_20vertexlists_2c_20directeds_2c_20vertexproperty_2c_20edgeproperty_2c_20graphproperty_2c_20edgelists_20_3e_20_3e',['storable_vertices&lt; adjacency_list&lt; OutEdgeListS, VertexListS, DirectedS, VertexProperty, EdgeProperty, GraphProperty, EdgeListS &gt; &gt;',['../classtriplegit_1_1storable__vertices.html',1,'triplegit']]]
+];

Added: sandbox/triplegit/trunk/html/search/classes_74.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/classes_74.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_74.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/classes_74.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/classes_74.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['thread_5fpool',['thread_pool',['../classtriplegit_1_1async__io_1_1thread__pool.html',1,'triplegit::async_io']]]
+];

Added: sandbox/triplegit/trunk/html/search/classes_75.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/classes_75.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_75.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/classes_75.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/classes_75.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['unique_5fid',['unique_id',['../classtriplegit_1_1unique__id.html',1,'triplegit']]],
+ ['unique_5fid_3c_20niallscpp11utilities_3a_3aint128_2c_20niallscpp11utilities_3a_3ahash128_20_3e',['unique_id&lt; NiallsCPP11Utilities::Int128, NiallsCPP11Utilities::Hash128 &gt;',['../classtriplegit_1_1unique__id.html',1,'triplegit']]]
+];

Added: sandbox/triplegit/trunk/html/search/close.png
==============================================================================
Binary file. No diff available.

Added: sandbox/triplegit/trunk/html/search/files_61.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/files_61.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_61.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/files_61.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/files_61.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['async_5ffile_5fio_2ehpp',['async_file_io.hpp',['../async__file__io_8hpp.html',1,'']]]
+];

Added: sandbox/triplegit/trunk/html/search/functions_61.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/functions_61.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_61.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/functions_61.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/functions_61.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['async_5ffile_5fio_5fdispatcher',['async_file_io_dispatcher',['../namespacetriplegit_1_1async__io.html#afa6da488279e514281ae9d5904d8d426',1,'triplegit::async_io']]],
+ ['async_5fpath_5fop_5freq',['async_path_op_req',['../structtriplegit_1_1async__io_1_1async__path__op__req.html#a140edf74812e339fea7051df405fc56c',1,'triplegit::async_io::async_path_op_req::async_path_op_req(std::filesystem::path _path, file_flags _flags=file_flags::None)'],['../structtriplegit_1_1async__io_1_1async__path__op__req.html#a5c35e56a49e31f12603b2cbbb1ffdae3',1,'triplegit::async_io::async_path_op_req::async_path_op_req(async_io_op _precondition, std::filesystem::path _path, file_flags _flags=file_flags::None)'],['../structtriplegit_1_1async__io_1_1async__path__op__req.html#a2698273a17aede1d349179906511fc2f',1,'triplegit::async_io::async_path_op_req::async_path_op_req(std::string _path, file_flags _flags=file_flags::None)'],['../structtriplegit_1_1async__io_1_1async__path__op__req.html#a1a92f25371984a7476f3d13530b6f1cd',1,'triplegit::async_io::async_path_op_req::async_path_op_req(async_io_op _precondition, std::string _path, file_flags _flags=file_flags::None)'],['../structtriplegit_1_1async__io_
1_1async__path__op__req.html#a69fbf4bfcba29f732802abe554727484',1,'triplegit::async_io::async_path_op_req::async_path_op_req(const char *_path, file_flags _flags=file_flags::None)'],['../structtriplegit_1_1async__io_1_1async__path__op__req.html#a8da200394b59be098d23e4db27b7f80f',1,'triplegit::async_io::async_path_op_req::async_path_op_req(async_io_op _precondition, const char *_path, file_flags _flags=file_flags::None)']]]
+];

Added: sandbox/triplegit/trunk/html/search/functions_63.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/functions_63.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_63.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/functions_63.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/functions_63.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,10 @@
+var searchData=
+[
+ ['call',['call',['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#af5ec8648416926263780d9c597db35ed',1,'triplegit::async_io::async_file_io_dispatcher_base::call(const std::vector&lt; async_io_op &gt; &amp;ops, const std::vector&lt; std::function&lt; R()&gt;&gt; &amp;callables)'],['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a7057167ed1a46e3b24fa3806bd6172c1',1,'triplegit::async_io::async_file_io_dispatcher_base::call(const async_io_op &amp;req, C callback, Args...args)']]],
+ ['checkcollectionid',['checkCollectionId',['../classtriplegit_1_1base__store.html#af1c4c71d3f7e240925439a456c7d2b36',1,'triplegit::base_store']]],
+ ['close',['close',['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#abffcc5e304efb9622ef184eca8d29868',1,'triplegit::async_io::async_file_io_dispatcher_base::close(const std::vector&lt; async_io_op &gt; &amp;ops)=0'],['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a828b6f410645dfe2dca3075c86e054c7',1,'triplegit::async_io::async_file_io_dispatcher_base::close(const async_io_op &amp;req)']]],
+ ['collection_5fid',['collection_id',['../classtriplegit_1_1collection__id.html#abf5fe0ca6383437bdc684e6219078c38',1,'triplegit::collection_id::collection_id(fs_store &amp;store)'],['../classtriplegit_1_1collection__id.html#a60ccc9c03400843c050c4c7e9dcefcb1',1,'triplegit::collection_id::collection_id(fs_store &amp;store, const std::string &amp;name, bool mustBeUnique=false)']]],
+ ['completion',['completion',['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a6fa594bfd2e1ed2af9e1a3ea25be7da5',1,'triplegit::async_io::async_file_io_dispatcher_base::completion(const std::vector&lt; async_io_op &gt; &amp;ops, const std::vector&lt; std::pair&lt; async_op_flags, std::function&lt; completion_t &gt;&gt;&gt; &amp;callbacks)'],['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#af0627f7511cac82528dcd7ed490b5211',1,'triplegit::async_io::async_file_io_dispatcher_base::completion(const async_io_op &amp;req, const std::pair&lt; async_op_flags, std::function&lt; completion_t &gt;&gt; &amp;callback)']]],
+ ['config',['config',['../classtriplegit_1_1base__store.html#a03deb45a9a388d839b6fc6832909668e',1,'triplegit::base_store']]],
+ ['count',['count',['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#aaee8e9e70ead7a56b5bfbdf7ac762450',1,'triplegit::async_io::async_file_io_dispatcher_base']]]
+];

Added: sandbox/triplegit/trunk/html/search/functions_64.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/functions_64.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_64.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/functions_64.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/functions_64.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['dir',['dir',['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a517359ced87c537caff44dc6fa35fb19',1,'triplegit::async_io::async_file_io_dispatcher_base::dir(const std::vector&lt; async_path_op_req &gt; &amp;reqs)=0'],['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a60be8d20fba4795a9838c706707041ef',1,'triplegit::async_io::async_file_io_dispatcher_base::dir(const async_path_op_req &amp;req)']]]
+];

Added: sandbox/triplegit/trunk/html/search/functions_65.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/functions_65.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_65.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/functions_65.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/functions_65.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['enqueue',['enqueue',['../classtriplegit_1_1async__io_1_1thread__pool.html#a1197a18cb30a52bb1ee02cd2ef742bff',1,'triplegit::async_io::thread_pool']]]
+];

Added: sandbox/triplegit/trunk/html/search/functions_66.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/functions_66.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_66.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/functions_66.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/functions_66.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,6 @@
+var searchData=
+[
+ ['file',['file',['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a6e008acf9f33b3ff43b0c73901f5f9c7',1,'triplegit::async_io::async_file_io_dispatcher_base::file(const std::vector&lt; async_path_op_req &gt; &amp;reqs)=0'],['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a16b57f66a84c25904cb02bdfb9e71a27',1,'triplegit::async_io::async_file_io_dispatcher_base::file(const async_path_op_req &amp;req)']]],
+ ['fileflags',['fileflags',['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#ab1746bda51c77ef5c1691b3f6857a270',1,'triplegit::async_io::async_file_io_dispatcher_base']]],
+ ['fs_5fstore',['fs_store',['../classtriplegit_1_1fs__store.html#ab7e25c70606385d88d069550c4816378',1,'triplegit::fs_store']]]
+];

Added: sandbox/triplegit/trunk/html/search/functions_69.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/functions_69.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_69.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/functions_69.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/functions_69.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,6 @@
+var searchData=
+[
+ ['io_5fservice',['io_service',['../classtriplegit_1_1async__io_1_1thread__pool.html#a67f5b5480be42f8cb94878c5ff95b245',1,'triplegit::async_io::thread_pool']]],
+ ['isfsreadonly',['isFSReadOnly',['../classtriplegit_1_1base__store.html#a00b19473f5b199c72040057b4c27c72a',1,'triplegit::base_store']]],
+ ['isreadonly',['isReadOnly',['../classtriplegit_1_1base__store.html#ae7c169da7d9faffe60cbc64b3e965e7f',1,'triplegit::base_store']]]
+];

Added: sandbox/triplegit/trunk/html/search/functions_6e.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/functions_6e.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_6e.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/functions_6e.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/functions_6e.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['native_5fhandle',['native_handle',['../classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#af58d73f18065864e4e6026464116ee6e',1,'triplegit::async_io::detail::async_io_handle']]]
+];

Added: sandbox/triplegit/trunk/html/search/functions_6f.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/functions_6f.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_6f.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/functions_6f.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/functions_6f.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['opened',['opened',['../classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#a00eaad37ed049b6577c750aa16736cc5',1,'triplegit::async_io::detail::async_io_handle']]]
+];

Added: sandbox/triplegit/trunk/html/search/functions_70.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/functions_70.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_70.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/functions_70.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/functions_70.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,6 @@
+var searchData=
+[
+ ['parent',['parent',['../classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#ab254a7c8d7512075368b2807621db5f5',1,'triplegit::async_io::detail::async_io_handle']]],
+ ['path',['path',['../classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#abfff6c04e97084d71c44e811cc5d99d6',1,'triplegit::async_io::detail::async_io_handle']]],
+ ['process_5fthreadpool',['process_threadpool',['../namespacetriplegit_1_1async__io.html#a6743cd614fc8161dfce94144c36cfb85',1,'triplegit::async_io']]]
+];

Added: sandbox/triplegit/trunk/html/search/functions_72.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/functions_72.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_72.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/functions_72.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/functions_72.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['read',['read',['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a21f6fce370f936a958ebbebe74eb08c4',1,'triplegit::async_io::async_file_io_dispatcher_base::read(const std::vector&lt; async_data_op_req&lt; void &gt;&gt; &amp;ops)=0'],['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a4a855265b383c4db717040cc49b4fe1d',1,'triplegit::async_io::async_file_io_dispatcher_base::read(const async_data_op_req&lt; void &gt; &amp;req)'],['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#aab459d62576fcfea288094ad30a211e7',1,'triplegit::async_io::async_file_io_dispatcher_base::read(const std::vector&lt; async_data_op_req&lt; T &gt;&gt; &amp;ops)']]],
+ ['read_5fcount',['read_count',['../classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#a9e138be2ed4a0522a1710e693cd6377c',1,'triplegit::async_io::detail::async_io_handle']]],
+ ['rmdir',['rmdir',['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a4924392f3af3a7b429ca49d7c7a35b4e',1,'triplegit::async_io::async_file_io_dispatcher_base::rmdir(const std::vector&lt; async_path_op_req &gt; &amp;reqs)=0'],['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#ad60182955f83342b9cb237142e9c2ced',1,'triplegit::async_io::async_file_io_dispatcher_base::rmdir(const async_path_op_req &amp;req)']]],
+ ['rmfile',['rmfile',['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a7839e9b1fc5e2caba5e37a4f5ecebbb7',1,'triplegit::async_io::async_file_io_dispatcher_base::rmfile(const std::vector&lt; async_path_op_req &gt; &amp;reqs)=0'],['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#ad5b54fca9b70f2899218119176cca111',1,'triplegit::async_io::async_file_io_dispatcher_base::rmfile(const async_path_op_req &amp;req)']]]
+];

Added: sandbox/triplegit/trunk/html/search/functions_73.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/functions_73.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_73.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/functions_73.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/functions_73.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['sync',['sync',['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a20ac9ebe7fc8e9f898d3de8c85b03efd',1,'triplegit::async_io::async_file_io_dispatcher_base::sync(const std::vector&lt; async_io_op &gt; &amp;ops)=0'],['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a8659dae5b8bbe2fe9e2a0b61579683d7',1,'triplegit::async_io::async_file_io_dispatcher_base::sync(const async_io_op &amp;req)']]]
+];

Added: sandbox/triplegit/trunk/html/search/functions_74.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/functions_74.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_74.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/functions_74.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/functions_74.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,6 @@
+var searchData=
+[
+ ['thread_5fpool',['thread_pool',['../classtriplegit_1_1async__io_1_1thread__pool.html#ad55f84716fd629d7e895f109a150e83e',1,'triplegit::async_io::thread_pool']]],
+ ['threadpool',['threadpool',['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#ae17a53fb0dd440c3e26fb6ca648f9034',1,'triplegit::async_io::async_file_io_dispatcher_base']]],
+ ['truncate',['truncate',['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#afd50d52fec35330deac6153aece92d7d',1,'triplegit::async_io::async_file_io_dispatcher_base::truncate(const std::vector&lt; async_io_op &gt; &amp;ops, const std::vector&lt; off_t &gt; &amp;sizes)'],['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#aedd6e17486c726c5b08be8132fe55776',1,'triplegit::async_io::async_file_io_dispatcher_base::truncate(const async_io_op &amp;op, off_t newsize)']]]
+];

Added: sandbox/triplegit/trunk/html/search/functions_77.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/functions_77.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_77.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/functions_77.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/functions_77.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,9 @@
+var searchData=
+[
+ ['wait_5fqueue_5fdepth',['wait_queue_depth',['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#a2ed9d1f242fa0acd8bced12a75c13474',1,'triplegit::async_io::async_file_io_dispatcher_base']]],
+ ['when_5fall',['when_all',['../namespacetriplegit_1_1async__io.html#afc5e0576470c19d979b3b853305fc7d6',1,'triplegit::async_io::when_all(InputIterator first, InputIterator last)'],['../namespacetriplegit_1_1async__io.html#ae692c0402d30c1350b8475c8d9c42c69',1,'triplegit::async_io::when_all(std::nothrow_t, std::vector&lt; async_io_op &gt;::iterator first, std::vector&lt; async_io_op &gt;::iterator last)'],['../namespacetriplegit_1_1async__io.html#ab4c882426142e8f23d1e37d2835035fa',1,'triplegit::async_io::when_all(std::vector&lt; async_io_op &gt;::iterator first, std::vector&lt; async_io_op &gt;::iterator last)'],['../namespacetriplegit_1_1async__io.html#abb978d2fbe374855ddd0e539f38e5316',1,'triplegit::async_io::when_all(std::nothrow_t _, std::initializer_list&lt; async_io_op &gt; _ops)'],['../namespacetriplegit_1_1async__io.html#a0503557b870c07ccf9e43f4e3096c446',1,'triplegit::async_io::when_all(std::initializer_list&lt; async_io_op &gt; _ops)']]],
+ ['when_5fany',['when_any',['../namespacetriplegit_1_1async__io.html#ac024775f7df8eb059d2aeee8de8f5ff9',1,'triplegit::async_io']]],
+ ['write',['write',['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#af087a1c53c619679a5e65fc828a7c652',1,'triplegit::async_io::async_file_io_dispatcher_base::write(const std::vector&lt; async_data_op_req&lt; const void &gt;&gt; &amp;ops)=0'],['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#ad3b11ed98996a8b674329e05dce13841',1,'triplegit::async_io::async_file_io_dispatcher_base::write(const async_data_op_req&lt; const void &gt; &amp;req)'],['../classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html#ab00ad1238d5b87b7e87940b4566f7491',1,'triplegit::async_io::async_file_io_dispatcher_base::write(const std::vector&lt; async_data_op_req&lt; T &gt;&gt; &amp;ops)']]],
+ ['write_5fcount',['write_count',['../classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#ae96b546a730964e57bd0a50781237222',1,'triplegit::async_io::detail::async_io_handle']]],
+ ['write_5fcount_5fsince_5ffsync',['write_count_since_fsync',['../classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html#a1ad31d5e35f7e8562787415f12ab5f7d',1,'triplegit::async_io::detail::async_io_handle']]]
+];

Added: sandbox/triplegit/trunk/html/search/mag_sel.png
==============================================================================
Binary file. No diff available.

Added: sandbox/triplegit/trunk/html/search/namespaces_74.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/namespaces_74.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="namespaces_74.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/namespaces_74.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/namespaces_74.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['async_5fio',['async_io',['../namespacetriplegit_1_1async__io.html',1,'triplegit']]]
+];

Added: sandbox/triplegit/trunk/html/search/nomatches.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/nomatches.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,12 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="NoMatches">No Matches</div>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/search.css
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/search.css 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,238 @@
+/*---------------- Search Box */
+
+#FSearchBox {
+ float: left;
+}
+
+#MSearchBox {
+ white-space : nowrap;
+ position: absolute;
+ float: none;
+ display: inline;
+ margin-top: 8px;
+ right: 0px;
+ width: 170px;
+ z-index: 102;
+ background-color: white;
+}
+
+#MSearchBox .left
+{
+ display:block;
+ position:absolute;
+ left:10px;
+ width:20px;
+ height:19px;
+ background:url('search_l.png') no-repeat;
+ background-position:right;
+}
+
+#MSearchSelect {
+ display:block;
+ position:absolute;
+ width:20px;
+ height:19px;
+}
+
+.left #MSearchSelect {
+ left:4px;
+}
+
+.right #MSearchSelect {
+ right:5px;
+}
+
+#MSearchField {
+ display:block;
+ position:absolute;
+ height:19px;
+ background:url('search_m.png') repeat-x;
+ border:none;
+ width:116px;
+ margin-left:20px;
+ padding-left:4px;
+ color: #909090;
+ outline: none;
+ font: 9pt Arial, Verdana, sans-serif;
+}
+
+#FSearchBox #MSearchField {
+ margin-left:15px;
+}
+
+#MSearchBox .right {
+ display:block;
+ position:absolute;
+ right:10px;
+ top:0px;
+ width:20px;
+ height:19px;
+ background:url('search_r.png') no-repeat;
+ background-position:left;
+}
+
+#MSearchClose {
+ display: none;
+ position: absolute;
+ top: 4px;
+ background : none;
+ border: none;
+ margin: 0px 4px 0px 0px;
+ padding: 0px 0px;
+ outline: none;
+}
+
+.left #MSearchClose {
+ left: 6px;
+}
+
+.right #MSearchClose {
+ right: 2px;
+}
+
+.MSearchBoxActive #MSearchField {
+ color: #000000;
+}
+
+/*---------------- Search filter selection */
+
+#MSearchSelectWindow {
+ display: none;
+ position: absolute;
+ left: 0; top: 0;
+ border: 1px solid #90A5CE;
+ background-color: #F9FAFC;
+ z-index: 1;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ -moz-border-radius: 4px;
+ -webkit-border-top-left-radius: 4px;
+ -webkit-border-top-right-radius: 4px;
+ -webkit-border-bottom-left-radius: 4px;
+ -webkit-border-bottom-right-radius: 4px;
+ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+}
+
+.SelectItem {
+ font: 8pt Arial, Verdana, sans-serif;
+ padding-left: 2px;
+ padding-right: 12px;
+ border: 0px;
+}
+
+span.SelectionMark {
+ margin-right: 4px;
+ font-family: monospace;
+ outline-style: none;
+ text-decoration: none;
+}
+
+a.SelectItem {
+ display: block;
+ outline-style: none;
+ color: #000000;
+ text-decoration: none;
+ padding-left: 6px;
+ padding-right: 12px;
+}
+
+a.SelectItem:focus,
+a.SelectItem:active {
+ color: #000000;
+ outline-style: none;
+ text-decoration: none;
+}
+
+a.SelectItem:hover {
+ color: #FFFFFF;
+ background-color: #3D578C;
+ outline-style: none;
+ text-decoration: none;
+ cursor: pointer;
+ display: block;
+}
+
+/*---------------- Search results window */
+
+iframe#MSearchResults {
+ width: 60ex;
+ height: 15em;
+}
+
+#MSearchResultsWindow {
+ display: none;
+ position: absolute;
+ left: 0; top: 0;
+ border: 1px solid #000;
+ background-color: #EEF1F7;
+}
+
+/* ----------------------------------- */
+
+
+#SRIndex {
+ clear:both;
+ padding-bottom: 15px;
+}
+
+.SREntry {
+ font-size: 10pt;
+ padding-left: 1ex;
+}
+
+.SRPage .SREntry {
+ font-size: 8pt;
+ padding: 1px 5px;
+}
+
+body.SRPage {
+ margin: 5px 2px;
+}
+
+.SRChildren {
+ padding-left: 3ex; padding-bottom: .5em
+}
+
+.SRPage .SRChildren {
+ display: none;
+}
+
+.SRSymbol {
+ font-weight: bold;
+ color: #425E97;
+ font-family: Arial, Verdana, sans-serif;
+ text-decoration: none;
+ outline: none;
+}
+
+a.SRScope {
+ display: block;
+ color: #425E97;
+ font-family: Arial, Verdana, sans-serif;
+ text-decoration: none;
+ outline: none;
+}
+
+a.SRSymbol:focus, a.SRSymbol:active,
+a.SRScope:focus, a.SRScope:active {
+ text-decoration: underline;
+}
+
+span.SRScope {
+ padding-left: 4px;
+}
+
+.SRPage .SRStatus {
+ padding: 2px 5px;
+ font-size: 8pt;
+ font-style: italic;
+}
+
+.SRResult {
+ display: none;
+}
+
+DIV.searchresults {
+ margin-left: 10px;
+ margin-right: 10px;
+}

Added: sandbox/triplegit/trunk/html/search/search.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/search.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,807 @@
+// Search script generated by doxygen
+// Copyright (C) 2009 by Dimitri van Heesch.
+
+// The code in this file is loosly based on main.js, part of Natural Docs,
+// which is Copyright (C) 2003-2008 Greg Valure
+// Natural Docs is licensed under the GPL.
+
+var indexSectionsWithContent =
+{
+ 0: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111011000011101111010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ 1: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111001000000000100111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ 2: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ 3: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ 4: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101111001000011101110010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ 5: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ 6: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
+};
+
+var indexSectionNames =
+{
+ 0: "all",
+ 1: "classes",
+ 2: "namespaces",
+ 3: "files",
+ 4: "functions",
+ 5: "variables",
+ 6: "typedefs"
+};
+
+function convertToId(search)
+{
+ var result = '';
+ for (i=0;i<search.length;i++)
+ {
+ var c = search.charAt(i);
+ var cn = c.charCodeAt(0);
+ if (c.match(/[a-z0-9]/))
+ {
+ result+=c;
+ }
+ else if (cn<16)
+ {
+ result+="_0"+cn.toString(16);
+ }
+ else
+ {
+ result+="_"+cn.toString(16);
+ }
+ }
+ return result;
+}
+
+function getXPos(item)
+{
+ var x = 0;
+ if (item.offsetWidth)
+ {
+ while (item && item!=document.body)
+ {
+ x += item.offsetLeft;
+ item = item.offsetParent;
+ }
+ }
+ return x;
+}
+
+function getYPos(item)
+{
+ var y = 0;
+ if (item.offsetWidth)
+ {
+ while (item && item!=document.body)
+ {
+ y += item.offsetTop;
+ item = item.offsetParent;
+ }
+ }
+ return y;
+}
+
+/* A class handling everything associated with the search panel.
+
+ Parameters:
+ name - The name of the global variable that will be
+ storing this instance. Is needed to be able to set timeouts.
+ resultPath - path to use for external files
+*/
+function SearchBox(name, resultsPath, inFrame, label)
+{
+ if (!name || !resultsPath) { alert("Missing parameters to SearchBox."); }
+
+ // ---------- Instance variables
+ this.name = name;
+ this.resultsPath = resultsPath;
+ this.keyTimeout = 0;
+ this.keyTimeoutLength = 500;
+ this.closeSelectionTimeout = 300;
+ this.lastSearchValue = "";
+ this.lastResultsPage = "";
+ this.hideTimeout = 0;
+ this.searchIndex = 0;
+ this.searchActive = false;
+ this.insideFrame = inFrame;
+ this.searchLabel = label;
+
+ // ----------- DOM Elements
+
+ this.DOMSearchField = function()
+ { return document.getElementById("MSearchField"); }
+
+ this.DOMSearchSelect = function()
+ { return document.getElementById("MSearchSelect"); }
+
+ this.DOMSearchSelectWindow = function()
+ { return document.getElementById("MSearchSelectWindow"); }
+
+ this.DOMPopupSearchResults = function()
+ { return document.getElementById("MSearchResults"); }
+
+ this.DOMPopupSearchResultsWindow = function()
+ { return document.getElementById("MSearchResultsWindow"); }
+
+ this.DOMSearchClose = function()
+ { return document.getElementById("MSearchClose"); }
+
+ this.DOMSearchBox = function()
+ { return document.getElementById("MSearchBox"); }
+
+ // ------------ Event Handlers
+
+ // Called when focus is added or removed from the search field.
+ this.OnSearchFieldFocus = function(isActive)
+ {
+ this.Activate(isActive);
+ }
+
+ this.OnSearchSelectShow = function()
+ {
+ var searchSelectWindow = this.DOMSearchSelectWindow();
+ var searchField = this.DOMSearchSelect();
+
+ if (this.insideFrame)
+ {
+ var left = getXPos(searchField);
+ var top = getYPos(searchField);
+ left += searchField.offsetWidth + 6;
+ top += searchField.offsetHeight;
+
+ // show search selection popup
+ searchSelectWindow.style.display='block';
+ left -= searchSelectWindow.offsetWidth;
+ searchSelectWindow.style.left = left + 'px';
+ searchSelectWindow.style.top = top + 'px';
+ }
+ else
+ {
+ var left = getXPos(searchField);
+ var top = getYPos(searchField);
+ top += searchField.offsetHeight;
+
+ // show search selection popup
+ searchSelectWindow.style.display='block';
+ searchSelectWindow.style.left = left + 'px';
+ searchSelectWindow.style.top = top + 'px';
+ }
+
+ // stop selection hide timer
+ if (this.hideTimeout)
+ {
+ clearTimeout(this.hideTimeout);
+ this.hideTimeout=0;
+ }
+ return false; // to avoid "image drag" default event
+ }
+
+ this.OnSearchSelectHide = function()
+ {
+ this.hideTimeout = setTimeout(this.name +".CloseSelectionWindow()",
+ this.closeSelectionTimeout);
+ }
+
+ // Called when the content of the search field is changed.
+ this.OnSearchFieldChange = function(evt)
+ {
+ if (this.keyTimeout) // kill running timer
+ {
+ clearTimeout(this.keyTimeout);
+ this.keyTimeout = 0;
+ }
+
+ var e = (evt) ? evt : window.event; // for IE
+ if (e.keyCode==40 || e.keyCode==13)
+ {
+ if (e.shiftKey==1)
+ {
+ this.OnSearchSelectShow();
+ var win=this.DOMSearchSelectWindow();
+ for (i=0;i<win.childNodes.length;i++)
+ {
+ var child = win.childNodes[i]; // get span within a
+ if (child.className=='SelectItem')
+ {
+ child.focus();
+ return;
+ }
+ }
+ return;
+ }
+ else if (window.frames.MSearchResults.searchResults)
+ {
+ var elem = window.frames.MSearchResults.searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+ }
+ else if (e.keyCode==27) // Escape out of the search field
+ {
+ this.DOMSearchField().blur();
+ this.DOMPopupSearchResultsWindow().style.display = 'none';
+ this.DOMSearchClose().style.display = 'none';
+ this.lastSearchValue = '';
+ this.Activate(false);
+ return;
+ }
+
+ // strip whitespaces
+ var searchValue = this.DOMSearchField().value.replace(/ +/g, "");
+
+ if (searchValue != this.lastSearchValue) // search value has changed
+ {
+ if (searchValue != "") // non-empty search
+ {
+ // set timer for search update
+ this.keyTimeout = setTimeout(this.name + '.Search()',
+ this.keyTimeoutLength);
+ }
+ else // empty search field
+ {
+ this.DOMPopupSearchResultsWindow().style.display = 'none';
+ this.DOMSearchClose().style.display = 'none';
+ this.lastSearchValue = '';
+ }
+ }
+ }
+
+ this.SelectItemCount = function(id)
+ {
+ var count=0;
+ var win=this.DOMSearchSelectWindow();
+ for (i=0;i<win.childNodes.length;i++)
+ {
+ var child = win.childNodes[i]; // get span within a
+ if (child.className=='SelectItem')
+ {
+ count++;
+ }
+ }
+ return count;
+ }
+
+ this.SelectItemSet = function(id)
+ {
+ var i,j=0;
+ var win=this.DOMSearchSelectWindow();
+ for (i=0;i<win.childNodes.length;i++)
+ {
+ var child = win.childNodes[i]; // get span within a
+ if (child.className=='SelectItem')
+ {
+ var node = child.firstChild;
+ if (j==id)
+ {
+ node.innerHTML='&#8226;';
+ }
+ else
+ {
+ node.innerHTML='&#160;';
+ }
+ j++;
+ }
+ }
+ }
+
+ // Called when an search filter selection is made.
+ // set item with index id as the active item
+ this.OnSelectItem = function(id)
+ {
+ this.searchIndex = id;
+ this.SelectItemSet(id);
+ var searchValue = this.DOMSearchField().value.replace(/ +/g, "");
+ if (searchValue!="" && this.searchActive) // something was found -> do a search
+ {
+ this.Search();
+ }
+ }
+
+ this.OnSearchSelectKey = function(evt)
+ {
+ var e = (evt) ? evt : window.event; // for IE
+ if (e.keyCode==40 && this.searchIndex<this.SelectItemCount()) // Down
+ {
+ this.searchIndex++;
+ this.OnSelectItem(this.searchIndex);
+ }
+ else if (e.keyCode==38 && this.searchIndex>0) // Up
+ {
+ this.searchIndex--;
+ this.OnSelectItem(this.searchIndex);
+ }
+ else if (e.keyCode==13 || e.keyCode==27)
+ {
+ this.OnSelectItem(this.searchIndex);
+ this.CloseSelectionWindow();
+ this.DOMSearchField().focus();
+ }
+ return false;
+ }
+
+ // --------- Actions
+
+ // Closes the results window.
+ this.CloseResultsWindow = function()
+ {
+ this.DOMPopupSearchResultsWindow().style.display = 'none';
+ this.DOMSearchClose().style.display = 'none';
+ this.Activate(false);
+ }
+
+ this.CloseSelectionWindow = function()
+ {
+ this.DOMSearchSelectWindow().style.display = 'none';
+ }
+
+ // Performs a search.
+ this.Search = function()
+ {
+ this.keyTimeout = 0;
+
+ // strip leading whitespace
+ var searchValue = this.DOMSearchField().value.replace(/^ +/, "");
+
+ var code = searchValue.toLowerCase().charCodeAt(0);
+ var hexCode;
+ if (code<16)
+ {
+ hexCode="0"+code.toString(16);
+ }
+ else
+ {
+ hexCode=code.toString(16);
+ }
+
+ var resultsPage;
+ var resultsPageWithSearch;
+ var hasResultsPage;
+
+ if (indexSectionsWithContent[this.searchIndex].charAt(code) == '1')
+ {
+ resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html';
+ resultsPageWithSearch = resultsPage+'?'+escape(searchValue);
+ hasResultsPage = true;
+ }
+ else // nothing available for this search term
+ {
+ resultsPage = this.resultsPath + '/nomatches.html';
+ resultsPageWithSearch = resultsPage;
+ hasResultsPage = false;
+ }
+
+ window.frames.MSearchResults.location = resultsPageWithSearch;
+ var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow();
+
+ if (domPopupSearchResultsWindow.style.display!='block')
+ {
+ var domSearchBox = this.DOMSearchBox();
+ this.DOMSearchClose().style.display = 'inline';
+ if (this.insideFrame)
+ {
+ var domPopupSearchResults = this.DOMPopupSearchResults();
+ domPopupSearchResultsWindow.style.position = 'relative';
+ domPopupSearchResultsWindow.style.display = 'block';
+ var width = document.body.clientWidth - 8; // the -8 is for IE :-(
+ domPopupSearchResultsWindow.style.width = width + 'px';
+ domPopupSearchResults.style.width = width + 'px';
+ }
+ else
+ {
+ var domPopupSearchResults = this.DOMPopupSearchResults();
+ var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth;
+ var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1;
+ domPopupSearchResultsWindow.style.display = 'block';
+ left -= domPopupSearchResults.offsetWidth;
+ domPopupSearchResultsWindow.style.top = top + 'px';
+ domPopupSearchResultsWindow.style.left = left + 'px';
+ }
+ }
+
+ this.lastSearchValue = searchValue;
+ this.lastResultsPage = resultsPage;
+ }
+
+ // -------- Activation Functions
+
+ // Activates or deactivates the search panel, resetting things to
+ // their default values if necessary.
+ this.Activate = function(isActive)
+ {
+ if (isActive || // open it
+ this.DOMPopupSearchResultsWindow().style.display == 'block'
+ )
+ {
+ this.DOMSearchBox().className = 'MSearchBoxActive';
+
+ var searchField = this.DOMSearchField();
+
+ if (searchField.value == this.searchLabel) // clear "Search" term upon entry
+ {
+ searchField.value = '';
+ this.searchActive = true;
+ }
+ }
+ else if (!isActive) // directly remove the panel
+ {
+ this.DOMSearchBox().className = 'MSearchBoxInactive';
+ this.DOMSearchField().value = this.searchLabel;
+ this.searchActive = false;
+ this.lastSearchValue = ''
+ this.lastResultsPage = '';
+ }
+ }
+}
+
+// -----------------------------------------------------------------------
+
+// The class that handles everything on the search results page.
+function SearchResults(name)
+{
+ // The number of matches from the last run of <Search()>.
+ this.lastMatchCount = 0;
+ this.lastKey = 0;
+ this.repeatOn = false;
+
+ // Toggles the visibility of the passed element ID.
+ this.FindChildElement = function(id)
+ {
+ var parentElement = document.getElementById(id);
+ var element = parentElement.firstChild;
+
+ while (element && element!=parentElement)
+ {
+ if (element.nodeName == 'DIV' && element.className == 'SRChildren')
+ {
+ return element;
+ }
+
+ if (element.nodeName == 'DIV' && element.hasChildNodes())
+ {
+ element = element.firstChild;
+ }
+ else if (element.nextSibling)
+ {
+ element = element.nextSibling;
+ }
+ else
+ {
+ do
+ {
+ element = element.parentNode;
+ }
+ while (element && element!=parentElement && !element.nextSibling);
+
+ if (element && element!=parentElement)
+ {
+ element = element.nextSibling;
+ }
+ }
+ }
+ }
+
+ this.Toggle = function(id)
+ {
+ var element = this.FindChildElement(id);
+ if (element)
+ {
+ if (element.style.display == 'block')
+ {
+ element.style.display = 'none';
+ }
+ else
+ {
+ element.style.display = 'block';
+ }
+ }
+ }
+
+ // Searches for the passed string. If there is no parameter,
+ // it takes it from the URL query.
+ //
+ // Always returns true, since other documents may try to call it
+ // and that may or may not be possible.
+ this.Search = function(search)
+ {
+ if (!search) // get search word from URL
+ {
+ search = window.location.search;
+ search = search.substring(1); // Remove the leading '?'
+ search = unescape(search);
+ }
+
+ search = search.replace(/^ +/, ""); // strip leading spaces
+ search = search.replace(/ +$/, ""); // strip trailing spaces
+ search = search.toLowerCase();
+ search = convertToId(search);
+
+ var resultRows = document.getElementsByTagName("div");
+ var matches = 0;
+
+ var i = 0;
+ while (i < resultRows.length)
+ {
+ var row = resultRows.item(i);
+ if (row.className == "SRResult")
+ {
+ var rowMatchName = row.id.toLowerCase();
+ rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_'
+
+ if (search.length<=rowMatchName.length &&
+ rowMatchName.substr(0, search.length)==search)
+ {
+ row.style.display = 'block';
+ matches++;
+ }
+ else
+ {
+ row.style.display = 'none';
+ }
+ }
+ i++;
+ }
+ document.getElementById("Searching").style.display='none';
+ if (matches == 0) // no results
+ {
+ document.getElementById("NoMatches").style.display='block';
+ }
+ else // at least one result
+ {
+ document.getElementById("NoMatches").style.display='none';
+ }
+ this.lastMatchCount = matches;
+ return true;
+ }
+
+ // return the first item with index index or higher that is visible
+ this.NavNext = function(index)
+ {
+ var focusItem;
+ while (1)
+ {
+ var focusName = 'Item'+index;
+ focusItem = document.getElementById(focusName);
+ if (focusItem && focusItem.parentNode.parentNode.style.display=='block')
+ {
+ break;
+ }
+ else if (!focusItem) // last element
+ {
+ break;
+ }
+ focusItem=null;
+ index++;
+ }
+ return focusItem;
+ }
+
+ this.NavPrev = function(index)
+ {
+ var focusItem;
+ while (1)
+ {
+ var focusName = 'Item'+index;
+ focusItem = document.getElementById(focusName);
+ if (focusItem && focusItem.parentNode.parentNode.style.display=='block')
+ {
+ break;
+ }
+ else if (!focusItem) // last element
+ {
+ break;
+ }
+ focusItem=null;
+ index--;
+ }
+ return focusItem;
+ }
+
+ this.ProcessKeys = function(e)
+ {
+ if (e.type == "keydown")
+ {
+ this.repeatOn = false;
+ this.lastKey = e.keyCode;
+ }
+ else if (e.type == "keypress")
+ {
+ if (!this.repeatOn)
+ {
+ if (this.lastKey) this.repeatOn = true;
+ return false; // ignore first keypress after keydown
+ }
+ }
+ else if (e.type == "keyup")
+ {
+ this.lastKey = 0;
+ this.repeatOn = false;
+ }
+ return this.lastKey!=0;
+ }
+
+ this.Nav = function(evt,itemIndex)
+ {
+ var e = (evt) ? evt : window.event; // for IE
+ if (e.keyCode==13) return true;
+ if (!this.ProcessKeys(e)) return false;
+
+ if (this.lastKey==38) // Up
+ {
+ var newIndex = itemIndex-1;
+ var focusItem = this.NavPrev(newIndex);
+ if (focusItem)
+ {
+ var child = this.FindChildElement(focusItem.parentNode.parentNode.id);
+ if (child && child.style.display == 'block') // children visible
+ {
+ var n=0;
+ var tmpElem;
+ while (1) // search for last child
+ {
+ tmpElem = document.getElementById('Item'+newIndex+'_c'+n);
+ if (tmpElem)
+ {
+ focusItem = tmpElem;
+ }
+ else // found it!
+ {
+ break;
+ }
+ n++;
+ }
+ }
+ }
+ if (focusItem)
+ {
+ focusItem.focus();
+ }
+ else // return focus to search field
+ {
+ parent.document.getElementById("MSearchField").focus();
+ }
+ }
+ else if (this.lastKey==40) // Down
+ {
+ var newIndex = itemIndex+1;
+ var focusItem;
+ var item = document.getElementById('Item'+itemIndex);
+ var elem = this.FindChildElement(item.parentNode.parentNode.id);
+ if (elem && elem.style.display == 'block') // children visible
+ {
+ focusItem = document.getElementById('Item'+itemIndex+'_c0');
+ }
+ if (!focusItem) focusItem = this.NavNext(newIndex);
+ if (focusItem) focusItem.focus();
+ }
+ else if (this.lastKey==39) // Right
+ {
+ var item = document.getElementById('Item'+itemIndex);
+ var elem = this.FindChildElement(item.parentNode.parentNode.id);
+ if (elem) elem.style.display = 'block';
+ }
+ else if (this.lastKey==37) // Left
+ {
+ var item = document.getElementById('Item'+itemIndex);
+ var elem = this.FindChildElement(item.parentNode.parentNode.id);
+ if (elem) elem.style.display = 'none';
+ }
+ else if (this.lastKey==27) // Escape
+ {
+ parent.searchBox.CloseResultsWindow();
+ parent.document.getElementById("MSearchField").focus();
+ }
+ else if (this.lastKey==13) // Enter
+ {
+ return true;
+ }
+ return false;
+ }
+
+ this.NavChild = function(evt,itemIndex,childIndex)
+ {
+ var e = (evt) ? evt : window.event; // for IE
+ if (e.keyCode==13) return true;
+ if (!this.ProcessKeys(e)) return false;
+
+ if (this.lastKey==38) // Up
+ {
+ if (childIndex>0)
+ {
+ var newIndex = childIndex-1;
+ document.getElementById('Item'+itemIndex+'_c'+newIndex).focus();
+ }
+ else // already at first child, jump to parent
+ {
+ document.getElementById('Item'+itemIndex).focus();
+ }
+ }
+ else if (this.lastKey==40) // Down
+ {
+ var newIndex = childIndex+1;
+ var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex);
+ if (!elem) // last child, jump to parent next parent
+ {
+ elem = this.NavNext(itemIndex+1);
+ }
+ if (elem)
+ {
+ elem.focus();
+ }
+ }
+ else if (this.lastKey==27) // Escape
+ {
+ parent.searchBox.CloseResultsWindow();
+ parent.document.getElementById("MSearchField").focus();
+ }
+ else if (this.lastKey==13) // Enter
+ {
+ return true;
+ }
+ return false;
+ }
+}
+
+function setKeyActions(elem,action)
+{
+ elem.setAttribute('onkeydown',action);
+ elem.setAttribute('onkeypress',action);
+ elem.setAttribute('onkeyup',action);
+}
+
+function setClassAttr(elem,attr)
+{
+ elem.setAttribute('class',attr);
+ elem.setAttribute('className',attr);
+}
+
+function createResults()
+{
+ var results = document.getElementById("SRResults");
+ for (var e=0; e<searchData.length; e++)
+ {
+ var id = searchData[e][0];
+ var srResult = document.createElement('div');
+ srResult.setAttribute('id','SR_'+id);
+ setClassAttr(srResult,'SRResult');
+ var srEntry = document.createElement('div');
+ setClassAttr(srEntry,'SREntry');
+ var srLink = document.createElement('a');
+ srLink.setAttribute('id','Item'+e);
+ setKeyActions(srLink,'return searchResults.Nav(event,'+e+')');
+ setClassAttr(srLink,'SRSymbol');
+ srLink.innerHTML = searchData[e][1][0];
+ srEntry.appendChild(srLink);
+ if (searchData[e][1].length==2) // single result
+ {
+ srLink.setAttribute('href',searchData[e][1][1][0]);
+ if (searchData[e][1][1][1])
+ {
+ srLink.setAttribute('target','_parent');
+ }
+ var srScope = document.createElement('span');
+ setClassAttr(srScope,'SRScope');
+ srScope.innerHTML = searchData[e][1][1][2];
+ srEntry.appendChild(srScope);
+ }
+ else // multiple results
+ {
+ srLink.setAttribute('href','javascript:searchResults.Toggle("SR_'+id+'")');
+ var srChildren = document.createElement('div');
+ setClassAttr(srChildren,'SRChildren');
+ for (var c=0; c<searchData[e][1].length-1; c++)
+ {
+ var srChild = document.createElement('a');
+ srChild.setAttribute('id','Item'+e+'_c'+c);
+ setKeyActions(srChild,'return searchResults.NavChild(event,'+e+','+c+')');
+ setClassAttr(srChild,'SRScope');
+ srChild.setAttribute('href',searchData[e][1][c+1][0]);
+ if (searchData[e][1][c+1][1])
+ {
+ srChild.setAttribute('target','_parent');
+ }
+ srChild.innerHTML = searchData[e][1][c+1][2];
+ srChildren.appendChild(srChild);
+ }
+ srEntry.appendChild(srChildren);
+ }
+ srResult.appendChild(srEntry);
+ results.appendChild(srResult);
+ }
+}
+

Added: sandbox/triplegit/trunk/html/search/search_l.png
==============================================================================
Binary file. No diff available.

Added: sandbox/triplegit/trunk/html/search/search_m.png
==============================================================================
Binary file. No diff available.

Added: sandbox/triplegit/trunk/html/search/search_r.png
==============================================================================
Binary file. No diff available.

Added: sandbox/triplegit/trunk/html/search/typedefs_63.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/typedefs_63.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="typedefs_63.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/typedefs_63.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/typedefs_63.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['collections_5ft',['collections_t',['../classtriplegit_1_1base__store.html#aae2fc9e86358fb51548d35b4b1691aef',1,'triplegit::base_store']]]
+];

Added: sandbox/triplegit/trunk/html/search/typedefs_65.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/typedefs_65.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="typedefs_65.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/typedefs_65.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/typedefs_65.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['exception_5fptr',['exception_ptr',['../namespacetriplegit_1_1async__io.html#af28c26398a12ba760165fc40f2a74ca3',1,'triplegit::async_io']]]
+];

Added: sandbox/triplegit/trunk/html/search/variables_68.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/variables_68.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_68.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/variables_68.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/variables_68.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['h',['h',['../structtriplegit_1_1async__io_1_1async__io__op.html#a64a2053bd93c75a0a77261ff8402f817',1,'triplegit::async_io::async_io_op']]]
+];

Added: sandbox/triplegit/trunk/html/search/variables_69.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/variables_69.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_69.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/variables_69.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/variables_69.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['id',['id',['../structtriplegit_1_1async__io_1_1async__io__op.html#af303d1a104de71b2c6c6b2ce47d514c6',1,'triplegit::async_io::async_io_op']]]
+];

Added: sandbox/triplegit/trunk/html/search/variables_70.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/variables_70.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_70.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/search/variables_70.js
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/search/variables_70.js 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['parent',['parent',['../structtriplegit_1_1async__io_1_1async__io__op.html#aa7f06f1a66943a0557c8a52c58b39bd6',1,'triplegit::async_io::async_io_op']]]
+];

Added: sandbox/triplegit/trunk/html/structtriplegit_1_1async__io_1_1async__data__op__req-members.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/structtriplegit_1_1async__io_1_1async__data__op__req-members.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,99 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li class="current">Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Class List</li>
+ <li>Class Index</li>
+ <li>Class Hierarchy</li>
+ <li>Class Members</li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><b>triplegit</b></li><li class="navelem"><a class="el" href="namespacetriplegit_1_1async__io.html">async_io</a></li><li class="navelem"><a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req.html">async_data_op_req</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">triplegit::async_io::async_data_op_req&lt; T &gt; Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req.html">triplegit::async_io::async_data_op_req&lt; T &gt;</a>, including all inherited members.</p>
+<table class="directory">
+</table></div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/structtriplegit_1_1async__io_1_1async__data__op__req.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/structtriplegit_1_1async__io_1_1async__data__op__req.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,123 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: triplegit::async_io::async_data_op_req&lt; T &gt; Struct Template Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li class="current">Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Class List</li>
+ <li>Class Index</li>
+ <li>Class Hierarchy</li>
+ <li>Class Members</li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><b>triplegit</b></li><li class="navelem"><a class="el" href="namespacetriplegit_1_1async__io.html">async_io</a></li><li class="navelem"><a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req.html">async_data_op_req</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+List of all members </div>
+ <div class="headertitle">
+<div class="title">triplegit::async_io::async_data_op_req&lt; T &gt; Struct Template Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>A specialisation for any pointer to type T.
+ More...</p>
+
+<p><code>#include &lt;<a class="el" href="async__file__io_8hpp_source.html">async_file_io.hpp</a>&gt;</code></p>
+<div class="dynheader">
+Inheritance diagram for triplegit::async_io::async_data_op_req&lt; T &gt;:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="structtriplegit_1_1async__io_1_1async__data__op__req.png" usemap="#triplegit::async_io::async_data_op_req&lt; T &gt;_map" alt=""/>
+ <map id="triplegit::async_io::async_data_op_req&lt; T &gt;_map" name="triplegit::async_io::async_data_op_req&lt; T &gt;_map">
+<area href="structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1array_3_01_t_00_01_n_01_4_01_4.html" title="A specialisation for any std::array&lt;T, N&gt;" alt="triplegit::async_io::async_data_op_req&lt; std::array&lt; T, N &gt; &gt;" shape="rect" coords="0,56,408,80"/>
+<area href="structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1basic__string_3_01_c_00_01_t_00_01_a_01_4_01_4.html" title="A specialisation for any std::basic_string&lt;C, T, A&gt;" alt="triplegit::async_io::async_data_op_req&lt; std::basic_string&lt; C, T, A &gt; &gt;" shape="rect" coords="418,56,826,80"/>
+<area href="structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1vector_3_01_t_00_01_a_01_4_01_4.html" title="A specialisation for any std::vector&lt;T, A&gt;" alt="triplegit::async_io::async_data_op_req&lt; std::vector&lt; T, A &gt; &gt;" shape="rect" coords="836,56,1244,80"/>
+</map>
+ </div></div>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><h3>template&lt;class T&gt;<br/>
+struct triplegit::async_io::async_data_op_req&lt; T &gt;</h3>
+
+<p>A specialisation for any pointer to type T. </p>
+<p>A convenience bundle of precondition, data and where. Data <b>MUST</b> stay around until the operation completes. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>triplegit/include/<a class="el" href="async__file__io_8hpp_source.html">async_file_io.hpp</a></li>
+</ul>
+</div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/structtriplegit_1_1async__io_1_1async__data__op__req.png
==============================================================================
Binary file. No diff available.

Added: sandbox/triplegit/trunk/html/structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1array_3_01_t_00_01_n_01_4_01_4-members.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1array_3_01_t_00_01_n_01_4_01_4-members.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,99 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li class="current">Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Class List</li>
+ <li>Class Index</li>
+ <li>Class Hierarchy</li>
+ <li>Class Members</li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><b>triplegit</b></li><li class="navelem"><a class="el" href="namespacetriplegit_1_1async__io.html">async_io</a></li><li class="navelem"><a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1array_3_01_t_00_01_n_01_4_01_4.html">async_data_op_req< std::array< T, N > ></a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">triplegit::async_io::async_data_op_req&lt; std::array&lt; T, N &gt; &gt; Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1array_3_01_t_00_01_n_01_4_01_4.html">triplegit::async_io::async_data_op_req&lt; std::array&lt; T, N &gt; &gt;</a>, including all inherited members.</p>
+<table class="directory">
+</table></div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1array_3_01_t_00_01_n_01_4_01_4.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1array_3_01_t_00_01_n_01_4_01_4.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,120 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: triplegit::async_io::async_data_op_req&lt; std::array&lt; T, N &gt; &gt; Struct Template Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li class="current">Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Class List</li>
+ <li>Class Index</li>
+ <li>Class Hierarchy</li>
+ <li>Class Members</li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><b>triplegit</b></li><li class="navelem"><a class="el" href="namespacetriplegit_1_1async__io.html">async_io</a></li><li class="navelem"><a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1array_3_01_t_00_01_n_01_4_01_4.html">async_data_op_req< std::array< T, N > ></a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+List of all members </div>
+ <div class="headertitle">
+<div class="title">triplegit::async_io::async_data_op_req&lt; std::array&lt; T, N &gt; &gt; Struct Template Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>A specialisation for any std::array&lt;T, N&gt;
+ More...</p>
+
+<p><code>#include &lt;<a class="el" href="async__file__io_8hpp_source.html">async_file_io.hpp</a>&gt;</code></p>
+<div class="dynheader">
+Inheritance diagram for triplegit::async_io::async_data_op_req&lt; std::array&lt; T, N &gt; &gt;:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1array_3_01_t_00_01_n_01_4_01_4.png" usemap="#triplegit::async_io::async_data_op_req&lt; std::array&lt; T, N &gt; &gt;_map" alt=""/>
+ <map id="triplegit::async_io::async_data_op_req&lt; std::array&lt; T, N &gt; &gt;_map" name="triplegit::async_io::async_data_op_req&lt; std::array&lt; T, N &gt; &gt;_map">
+<area href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T." alt="triplegit::async_io::async_data_op_req&lt; T &gt;" shape="rect" coords="0,0,353,24"/>
+</map>
+ </div></div>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><h3>template&lt;class T, size_t N&gt;<br/>
+struct triplegit::async_io::async_data_op_req&lt; std::array&lt; T, N &gt; &gt;</h3>
+
+<p>A specialisation for any std::array&lt;T, N&gt; </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>triplegit/include/<a class="el" href="async__file__io_8hpp_source.html">async_file_io.hpp</a></li>
+</ul>
+</div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1array_3_01_t_00_01_n_01_4_01_4.png
==============================================================================
Binary file. No diff available.

Added: sandbox/triplegit/trunk/html/structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1basic__string_3_01_c_00_01_t_00_01_a_01_4_01_4-members.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1basic__string_3_01_c_00_01_t_00_01_a_01_4_01_4-members.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,99 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li class="current">Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Class List</li>
+ <li>Class Index</li>
+ <li>Class Hierarchy</li>
+ <li>Class Members</li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><b>triplegit</b></li><li class="navelem"><a class="el" href="namespacetriplegit_1_1async__io.html">async_io</a></li><li class="navelem"><a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1basic__string_3_01_c_00_01_t_00_01_a_01_4_01_4.html">async_data_op_req< std::basic_string< C, T, A > ></a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">triplegit::async_io::async_data_op_req&lt; std::basic_string&lt; C, T, A &gt; &gt; Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1basic__string_3_01_c_00_01_t_00_01_a_01_4_01_4.html">triplegit::async_io::async_data_op_req&lt; std::basic_string&lt; C, T, A &gt; &gt;</a>, including all inherited members.</p>
+<table class="directory">
+</table></div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1basic__string_3_01_c_00_01_t_00_01_a_01_4_01_4.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1basic__string_3_01_c_00_01_t_00_01_a_01_4_01_4.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,120 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: triplegit::async_io::async_data_op_req&lt; std::basic_string&lt; C, T, A &gt; &gt; Struct Template Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li class="current">Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Class List</li>
+ <li>Class Index</li>
+ <li>Class Hierarchy</li>
+ <li>Class Members</li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><b>triplegit</b></li><li class="navelem"><a class="el" href="namespacetriplegit_1_1async__io.html">async_io</a></li><li class="navelem"><a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1basic__string_3_01_c_00_01_t_00_01_a_01_4_01_4.html">async_data_op_req< std::basic_string< C, T, A > ></a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+List of all members </div>
+ <div class="headertitle">
+<div class="title">triplegit::async_io::async_data_op_req&lt; std::basic_string&lt; C, T, A &gt; &gt; Struct Template Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>A specialisation for any std::basic_string&lt;C, T, A&gt;
+ More...</p>
+
+<p><code>#include &lt;<a class="el" href="async__file__io_8hpp_source.html">async_file_io.hpp</a>&gt;</code></p>
+<div class="dynheader">
+Inheritance diagram for triplegit::async_io::async_data_op_req&lt; std::basic_string&lt; C, T, A &gt; &gt;:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1basic__string_3_01_c_00_01_t_00_01_a_01_4_01_4.png" usemap="#triplegit::async_io::async_data_op_req&lt; std::basic_string&lt; C, T, A &gt; &gt;_map" alt=""/>
+ <map id="triplegit::async_io::async_data_op_req&lt; std::basic_string&lt; C, T, A &gt; &gt;_map" name="triplegit::async_io::async_data_op_req&lt; std::basic_string&lt; C, T, A &gt; &gt;_map">
+<area href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T." alt="triplegit::async_io::async_data_op_req&lt; T &gt;" shape="rect" coords="0,0,408,24"/>
+</map>
+ </div></div>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><h3>template&lt;class C, class T, class A&gt;<br/>
+struct triplegit::async_io::async_data_op_req&lt; std::basic_string&lt; C, T, A &gt; &gt;</h3>
+
+<p>A specialisation for any std::basic_string&lt;C, T, A&gt; </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>triplegit/include/<a class="el" href="async__file__io_8hpp_source.html">async_file_io.hpp</a></li>
+</ul>
+</div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1basic__string_3_01_c_00_01_t_00_01_a_01_4_01_4.png
==============================================================================
Binary file. No diff available.

Added: sandbox/triplegit/trunk/html/structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1vector_3_01_t_00_01_a_01_4_01_4-members.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1vector_3_01_t_00_01_a_01_4_01_4-members.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,99 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li class="current">Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Class List</li>
+ <li>Class Index</li>
+ <li>Class Hierarchy</li>
+ <li>Class Members</li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><b>triplegit</b></li><li class="navelem"><a class="el" href="namespacetriplegit_1_1async__io.html">async_io</a></li><li class="navelem"><a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1vector_3_01_t_00_01_a_01_4_01_4.html">async_data_op_req< std::vector< T, A > ></a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">triplegit::async_io::async_data_op_req&lt; std::vector&lt; T, A &gt; &gt; Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1vector_3_01_t_00_01_a_01_4_01_4.html">triplegit::async_io::async_data_op_req&lt; std::vector&lt; T, A &gt; &gt;</a>, including all inherited members.</p>
+<table class="directory">
+</table></div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1vector_3_01_t_00_01_a_01_4_01_4.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1vector_3_01_t_00_01_a_01_4_01_4.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,120 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: triplegit::async_io::async_data_op_req&lt; std::vector&lt; T, A &gt; &gt; Struct Template Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li class="current">Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Class List</li>
+ <li>Class Index</li>
+ <li>Class Hierarchy</li>
+ <li>Class Members</li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><b>triplegit</b></li><li class="navelem"><a class="el" href="namespacetriplegit_1_1async__io.html">async_io</a></li><li class="navelem"><a class="el" href="structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1vector_3_01_t_00_01_a_01_4_01_4.html">async_data_op_req< std::vector< T, A > ></a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+List of all members </div>
+ <div class="headertitle">
+<div class="title">triplegit::async_io::async_data_op_req&lt; std::vector&lt; T, A &gt; &gt; Struct Template Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>A specialisation for any std::vector&lt;T, A&gt;
+ More...</p>
+
+<p><code>#include &lt;<a class="el" href="async__file__io_8hpp_source.html">async_file_io.hpp</a>&gt;</code></p>
+<div class="dynheader">
+Inheritance diagram for triplegit::async_io::async_data_op_req&lt; std::vector&lt; T, A &gt; &gt;:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1vector_3_01_t_00_01_a_01_4_01_4.png" usemap="#triplegit::async_io::async_data_op_req&lt; std::vector&lt; T, A &gt; &gt;_map" alt=""/>
+ <map id="triplegit::async_io::async_data_op_req&lt; std::vector&lt; T, A &gt; &gt;_map" name="triplegit::async_io::async_data_op_req&lt; std::vector&lt; T, A &gt; &gt;_map">
+<area href="structtriplegit_1_1async__io_1_1async__data__op__req.html" title="A specialisation for any pointer to type T." alt="triplegit::async_io::async_data_op_req&lt; T &gt;" shape="rect" coords="0,0,358,24"/>
+</map>
+ </div></div>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><h3>template&lt;class T, class A&gt;<br/>
+struct triplegit::async_io::async_data_op_req&lt; std::vector&lt; T, A &gt; &gt;</h3>
+
+<p>A specialisation for any std::vector&lt;T, A&gt; </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>triplegit/include/<a class="el" href="async__file__io_8hpp_source.html">async_file_io.hpp</a></li>
+</ul>
+</div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/structtriplegit_1_1async__io_1_1async__data__op__req_3_01std_1_1vector_3_01_t_00_01_a_01_4_01_4.png
==============================================================================
Binary file. No diff available.

Added: sandbox/triplegit/trunk/html/structtriplegit_1_1async__io_1_1async__io__op-members.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/structtriplegit_1_1async__io_1_1async__io__op-members.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,102 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li class="current">Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Class List</li>
+ <li>Class Index</li>
+ <li>Class Hierarchy</li>
+ <li>Class Members</li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><b>triplegit</b></li><li class="navelem"><a class="el" href="namespacetriplegit_1_1async__io.html">async_io</a></li><li class="navelem"><a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">triplegit::async_io::async_io_op Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">triplegit::async_io::async_io_op</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html#a64a2053bd93c75a0a77261ff8402f817">h</a></td><td class="entry"><a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">triplegit::async_io::async_io_op</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html#af303d1a104de71b2c6c6b2ce47d514c6">id</a></td><td class="entry"><a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">triplegit::async_io::async_io_op</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html#aa7f06f1a66943a0557c8a52c58b39bd6">parent</a></td><td class="entry"><a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">triplegit::async_io::async_io_op</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/structtriplegit_1_1async__io_1_1async__io__op.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/structtriplegit_1_1async__io_1_1async__io__op.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,167 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: triplegit::async_io::async_io_op Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li class="current">Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Class List</li>
+ <li>Class Index</li>
+ <li>Class Hierarchy</li>
+ <li>Class Members</li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><b>triplegit</b></li><li class="navelem"><a class="el" href="namespacetriplegit_1_1async__io.html">async_io</a></li><li class="navelem"><a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+Public Attributes &#124;
+List of all members </div>
+ <div class="headertitle">
+<div class="title">triplegit::async_io::async_io_op Struct Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>A reference to an async operation.
+ More...</p>
+
+<p><code>#include &lt;<a class="el" href="async__file__io_8hpp_source.html">async_file_io.hpp</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Public Attributes</h2></td></tr>
+<tr class="memitem:aa7f06f1a66943a0557c8a52c58b39bd6"><td class="memItemLeft" align="right" valign="top">std::shared_ptr<br class="typebreak"/>
+&lt; <a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html">async_file_io_dispatcher_base</a> &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html#aa7f06f1a66943a0557c8a52c58b39bd6">parent</a></td></tr>
+<tr class="memdesc:aa7f06f1a66943a0557c8a52c58b39bd6"><td class="mdescLeft">&#160;</td><td class="mdescRight">The parent dispatcher. <br/></td></tr>
+<tr class="separator:aa7f06f1a66943a0557c8a52c58b39bd6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af303d1a104de71b2c6c6b2ce47d514c6"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html#af303d1a104de71b2c6c6b2ce47d514c6">id</a></td></tr>
+<tr class="memdesc:af303d1a104de71b2c6c6b2ce47d514c6"><td class="mdescLeft">&#160;</td><td class="mdescRight">A unique id for this operation. <br/></td></tr>
+<tr class="separator:af303d1a104de71b2c6c6b2ce47d514c6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a64a2053bd93c75a0a77261ff8402f817"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classtriplegit_1_1async__io_1_1shared__future.html">shared_future</a>&lt; std::shared_ptr<br class="typebreak"/>
+&lt; <a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html">detail::async_io_handle</a> &gt; &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html#a64a2053bd93c75a0a77261ff8402f817">h</a></td></tr>
+<tr class="memdesc:a64a2053bd93c75a0a77261ff8402f817"><td class="mdescLeft">&#160;</td><td class="mdescRight">A future handle to the item being operated upon. <br/></td></tr>
+<tr class="separator:a64a2053bd93c75a0a77261ff8402f817"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>A reference to an async operation. </p>
+</div><h2 class="groupheader">Member Data Documentation</h2>
+<a class="anchor" id="a64a2053bd93c75a0a77261ff8402f817"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classtriplegit_1_1async__io_1_1shared__future.html">shared_future</a>&lt;std::shared_ptr&lt;<a class="el" href="classtriplegit_1_1async__io_1_1detail_1_1async__io__handle.html">detail::async_io_handle</a>&gt; &gt; triplegit::async_io::async_io_op::h</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>A future handle to the item being operated upon. </p>
+
+</div>
+</div>
+<a class="anchor" id="af303d1a104de71b2c6c6b2ce47d514c6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">size_t triplegit::async_io::async_io_op::id</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>A unique id for this operation. </p>
+
+</div>
+</div>
+<a class="anchor" id="aa7f06f1a66943a0557c8a52c58b39bd6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">std::shared_ptr&lt;<a class="el" href="classtriplegit_1_1async__io_1_1async__file__io__dispatcher__base.html">async_file_io_dispatcher_base</a>&gt; triplegit::async_io::async_io_op::parent</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>The parent dispatcher. </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>triplegit/include/<a class="el" href="async__file__io_8hpp_source.html">async_file_io.hpp</a></li>
+</ul>
+</div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/structtriplegit_1_1async__io_1_1async__path__op__req-members.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/structtriplegit_1_1async__io_1_1async__path__op__req-members.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,105 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li class="current">Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Class List</li>
+ <li>Class Index</li>
+ <li>Class Hierarchy</li>
+ <li>Class Members</li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><b>triplegit</b></li><li class="navelem"><a class="el" href="namespacetriplegit_1_1async__io.html">async_io</a></li><li class="navelem"><a class="el" href="structtriplegit_1_1async__io_1_1async__path__op__req.html">async_path_op_req</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">triplegit::async_io::async_path_op_req Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="structtriplegit_1_1async__io_1_1async__path__op__req.html">triplegit::async_io::async_path_op_req</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="structtriplegit_1_1async__io_1_1async__path__op__req.html#a140edf74812e339fea7051df405fc56c">async_path_op_req</a>(std::filesystem::path _path, file_flags _flags=file_flags::None)</td><td class="entry"><a class="el" href="structtriplegit_1_1async__io_1_1async__path__op__req.html">triplegit::async_io::async_path_op_req</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr><td class="entry"><a class="el" href="structtriplegit_1_1async__io_1_1async__path__op__req.html#a5c35e56a49e31f12603b2cbbb1ffdae3">async_path_op_req</a>(async_io_op _precondition, std::filesystem::path _path, file_flags _flags=file_flags::None)</td><td class="entry"><a class="el" href="structtriplegit_1_1async__io_1_1async__path__op__req.html">triplegit::async_io::async_path_op_req</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="structtriplegit_1_1async__io_1_1async__path__op__req.html#a2698273a17aede1d349179906511fc2f">async_path_op_req</a>(std::string _path, file_flags _flags=file_flags::None)</td><td class="entry"><a class="el" href="structtriplegit_1_1async__io_1_1async__path__op__req.html">triplegit::async_io::async_path_op_req</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr><td class="entry"><a class="el" href="structtriplegit_1_1async__io_1_1async__path__op__req.html#a1a92f25371984a7476f3d13530b6f1cd">async_path_op_req</a>(async_io_op _precondition, std::string _path, file_flags _flags=file_flags::None)</td><td class="entry"><a class="el" href="structtriplegit_1_1async__io_1_1async__path__op__req.html">triplegit::async_io::async_path_op_req</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="structtriplegit_1_1async__io_1_1async__path__op__req.html#a69fbf4bfcba29f732802abe554727484">async_path_op_req</a>(const char *_path, file_flags _flags=file_flags::None)</td><td class="entry"><a class="el" href="structtriplegit_1_1async__io_1_1async__path__op__req.html">triplegit::async_io::async_path_op_req</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+ <tr><td class="entry"><a class="el" href="structtriplegit_1_1async__io_1_1async__path__op__req.html#a8da200394b59be098d23e4db27b7f80f">async_path_op_req</a>(async_io_op _precondition, const char *_path, file_flags _flags=file_flags::None)</td><td class="entry"><a class="el" href="structtriplegit_1_1async__io_1_1async__path__op__req.html">triplegit::async_io::async_path_op_req</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+</table></div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/structtriplegit_1_1async__io_1_1async__path__op__req.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/structtriplegit_1_1async__io_1_1async__path__op__req.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,366 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: triplegit::async_io::async_path_op_req Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li class="current">Classes</li>
+ <li>Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>Class List</li>
+ <li>Class Index</li>
+ <li>Class Hierarchy</li>
+ <li>Class Members</li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><b>triplegit</b></li><li class="navelem"><a class="el" href="namespacetriplegit_1_1async__io.html">async_io</a></li><li class="navelem"><a class="el" href="structtriplegit_1_1async__io_1_1async__path__op__req.html">async_path_op_req</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+Public Member Functions &#124;
+List of all members </div>
+ <div class="headertitle">
+<div class="title">triplegit::async_io::async_path_op_req Struct Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>A convenience bundle of path and flags, with optional precondition.
+ More...</p>
+
+<p><code>#include &lt;<a class="el" href="async__file__io_8hpp_source.html">async_file_io.hpp</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a140edf74812e339fea7051df405fc56c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structtriplegit_1_1async__io_1_1async__path__op__req.html#a140edf74812e339fea7051df405fc56c">async_path_op_req</a> (std::filesystem::path _path, file_flags _flags=file_flags::None)</td></tr>
+<tr class="memdesc:a140edf74812e339fea7051df405fc56c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Fails is path is not absolute. <br/></td></tr>
+<tr class="separator:a140edf74812e339fea7051df405fc56c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5c35e56a49e31f12603b2cbbb1ffdae3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structtriplegit_1_1async__io_1_1async__path__op__req.html#a5c35e56a49e31f12603b2cbbb1ffdae3">async_path_op_req</a> (<a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> _precondition, std::filesystem::path _path, file_flags _flags=file_flags::None)</td></tr>
+<tr class="memdesc:a5c35e56a49e31f12603b2cbbb1ffdae3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Fails is path is not absolute. <br/></td></tr>
+<tr class="separator:a5c35e56a49e31f12603b2cbbb1ffdae3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2698273a17aede1d349179906511fc2f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structtriplegit_1_1async__io_1_1async__path__op__req.html#a2698273a17aede1d349179906511fc2f">async_path_op_req</a> (std::string _path, file_flags _flags=file_flags::None)</td></tr>
+<tr class="memdesc:a2698273a17aede1d349179906511fc2f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructs on the basis of a string. make_preferred() and absolute() are called in this case. <br/></td></tr>
+<tr class="separator:a2698273a17aede1d349179906511fc2f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1a92f25371984a7476f3d13530b6f1cd"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structtriplegit_1_1async__io_1_1async__path__op__req.html#a1a92f25371984a7476f3d13530b6f1cd">async_path_op_req</a> (<a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> _precondition, std::string _path, file_flags _flags=file_flags::None)</td></tr>
+<tr class="memdesc:a1a92f25371984a7476f3d13530b6f1cd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructs on the basis of a string. make_preferred() and absolute() are called in this case. <br/></td></tr>
+<tr class="separator:a1a92f25371984a7476f3d13530b6f1cd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a69fbf4bfcba29f732802abe554727484"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structtriplegit_1_1async__io_1_1async__path__op__req.html#a69fbf4bfcba29f732802abe554727484">async_path_op_req</a> (const char *_path, file_flags _flags=file_flags::None)</td></tr>
+<tr class="memdesc:a69fbf4bfcba29f732802abe554727484"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructs on the basis of a string. make_preferred() and absolute() are called in this case. <br/></td></tr>
+<tr class="separator:a69fbf4bfcba29f732802abe554727484"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8da200394b59be098d23e4db27b7f80f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structtriplegit_1_1async__io_1_1async__path__op__req.html#a8da200394b59be098d23e4db27b7f80f">async_path_op_req</a> (<a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a> _precondition, const char *_path, file_flags _flags=file_flags::None)</td></tr>
+<tr class="memdesc:a8da200394b59be098d23e4db27b7f80f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructs on the basis of a string. make_preferred() and absolute() are called in this case. <br/></td></tr>
+<tr class="separator:a8da200394b59be098d23e4db27b7f80f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>A convenience bundle of path and flags, with optional precondition. </p>
+</div><h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" id="a140edf74812e339fea7051df405fc56c"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">triplegit::async_io::async_path_op_req::async_path_op_req </td>
+ <td>(</td>
+ <td class="paramtype">std::filesystem::path&#160;</td>
+ <td class="paramname"><em>_path</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">file_flags&#160;</td>
+ <td class="paramname"><em>_flags</em> = <code>file_flags::None</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Fails is path is not absolute. </p>
+
+</div>
+</div>
+<a class="anchor" id="a5c35e56a49e31f12603b2cbbb1ffdae3"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">triplegit::async_io::async_path_op_req::async_path_op_req </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a>&#160;</td>
+ <td class="paramname"><em>_precondition</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">std::filesystem::path&#160;</td>
+ <td class="paramname"><em>_path</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">file_flags&#160;</td>
+ <td class="paramname"><em>_flags</em> = <code>file_flags::None</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Fails is path is not absolute. </p>
+
+</div>
+</div>
+<a class="anchor" id="a2698273a17aede1d349179906511fc2f"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">triplegit::async_io::async_path_op_req::async_path_op_req </td>
+ <td>(</td>
+ <td class="paramtype">std::string&#160;</td>
+ <td class="paramname"><em>_path</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">file_flags&#160;</td>
+ <td class="paramname"><em>_flags</em> = <code>file_flags::None</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Constructs on the basis of a string. make_preferred() and absolute() are called in this case. </p>
+
+</div>
+</div>
+<a class="anchor" id="a1a92f25371984a7476f3d13530b6f1cd"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">triplegit::async_io::async_path_op_req::async_path_op_req </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a>&#160;</td>
+ <td class="paramname"><em>_precondition</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">std::string&#160;</td>
+ <td class="paramname"><em>_path</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">file_flags&#160;</td>
+ <td class="paramname"><em>_flags</em> = <code>file_flags::None</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Constructs on the basis of a string. make_preferred() and absolute() are called in this case. </p>
+
+</div>
+</div>
+<a class="anchor" id="a69fbf4bfcba29f732802abe554727484"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">triplegit::async_io::async_path_op_req::async_path_op_req </td>
+ <td>(</td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>_path</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">file_flags&#160;</td>
+ <td class="paramname"><em>_flags</em> = <code>file_flags::None</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Constructs on the basis of a string. make_preferred() and absolute() are called in this case. </p>
+
+</div>
+</div>
+<a class="anchor" id="a8da200394b59be098d23e4db27b7f80f"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">triplegit::async_io::async_path_op_req::async_path_op_req </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="structtriplegit_1_1async__io_1_1async__io__op.html">async_io_op</a>&#160;</td>
+ <td class="paramname"><em>_precondition</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>_path</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">file_flags&#160;</td>
+ <td class="paramname"><em>_flags</em> = <code>file_flags::None</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Constructs on the basis of a string. make_preferred() and absolute() are called in this case. </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>triplegit/include/<a class="el" href="async__file__io_8hpp_source.html">async_file_io.hpp</a></li>
+</ul>
+</div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012 Niall Douglas</address>
+</body>
+</html>

Added: sandbox/triplegit/trunk/html/sync_off.png
==============================================================================
Binary file. No diff available.

Added: sandbox/triplegit/trunk/html/sync_on.png
==============================================================================
Binary file. No diff available.

Added: sandbox/triplegit/trunk/html/tab_a.png
==============================================================================
Binary file. No diff available.

Added: sandbox/triplegit/trunk/html/tab_b.png
==============================================================================
Binary file. No diff available.

Added: sandbox/triplegit/trunk/html/tab_h.png
==============================================================================
Binary file. No diff available.

Added: sandbox/triplegit/trunk/html/tab_s.png
==============================================================================
Binary file. No diff available.

Added: sandbox/triplegit/trunk/html/tabs.css
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/tabs.css 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,60 @@
+.tabs, .tabs2, .tabs3 {
+ background-image: url('tab_b.png');
+ width: 100%;
+ z-index: 101;
+ font-size: 13px;
+ font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;
+}
+
+.tabs2 {
+ font-size: 10px;
+}
+.tabs3 {
+ font-size: 9px;
+}
+
+.tablist {
+ margin: 0;
+ padding: 0;
+ display: table;
+}
+
+.tablist li {
+ float: left;
+ display: table-cell;
+ background-image: url('tab_b.png');
+ line-height: 36px;
+ list-style: none;
+}
+
+.tablist a {
+ display: block;
+ padding: 0 20px;
+ font-weight: bold;
+ background-image:url('tab_s.png');
+ background-repeat:no-repeat;
+ background-position:right;
+ color: #283A5D;
+ text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+ text-decoration: none;
+ outline: none;
+}
+
+.tabs3 .tablist a {
+ padding: 0 10px;
+}
+
+.tablist a:hover {
+ background-image: url('tab_h.png');
+ background-repeat:repeat-x;
+ color: #fff;
+ text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+ text-decoration: none;
+}
+
+.tablist li.current a {
+ background-image: url('tab_a.png');
+ background-repeat:repeat-x;
+ color: #fff;
+ text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+}

Added: sandbox/triplegit/trunk/html/triplegit_8hpp_source.html
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/html/triplegit_8hpp_source.html 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,251 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>TripleGit: triplegit/include/triplegit.hpp Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">TripleGit
+ &#160;<span id="projectnumber">v0.01</span>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.2 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li>Main Page</li>
+ <li>Namespaces</li>
+ <li>Classes</li>
+ <li class="current">Files</li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li>File List</li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_5702f8a2329a6e3cef9103a99d8690ff.html">triplegit</a></li><li class="navelem"><a class="el" href="dir_603090840fc3140f581dcce46ee211a4.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle">
+<div class="title">triplegit.hpp</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">/* TripleGit</span></div>
+<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment">(C) 2013 Niall Douglas http://www.nedprod.com/></div>
+<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment">File Created: Mar 2013</span></div>
+<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;</div>
+<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="preprocessor">#ifndef TRIPLEGIT_H</span></div>
+<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="preprocessor"></span><span class="preprocessor">#define TRIPLEGIT_H</span></div>
+<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="preprocessor"></span></div>
+<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="preprocessor">#include &quot;../../NiallsCPP11Utilities/Int128_256.hpp&quot;</span></div>
+<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="preprocessor">#include &quot;boost/graph/adjacency_list.hpp&quot;</span></div>
+<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="preprocessor">#include &quot;boost/graph/adjacency_list_io.hpp&quot;</span></div>
+<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="async__file__io_8hpp.html" title="Provides a batch asynchronous file i/o implementation based on Boost.ASIO.">async_file_io.hpp</a>&quot;</span></div>
+<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="preprocessor">#include &lt;unordered_set&gt;</span></div>
+<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;</div>
+<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="preprocessor">#ifdef TRIPLEGIT_DLL_EXPORTS</span></div>
+<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="preprocessor"></span><span class="preprocessor">#define TRIPLEGIT_API DLLEXPORTMARKUP</span></div>
+<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="preprocessor"></span><span class="preprocessor">#else</span></div>
+<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;<span class="preprocessor"></span><span class="preprocessor">#define TRIPLEGIT_API DLLIMPORTMARKUP</span></div>
+<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;<span class="preprocessor"></span><span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="preprocessor"></span></div>
+<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="keyword">namespace </span>boost { <span class="keyword">namespace </span>property_tree { <span class="keyword">template</span>&lt;<span class="keyword">typename</span> Key, <span class="keyword">typename</span> Data, <span class="keyword">typename</span> KeyCompare = std::less&lt;Key&gt;&gt; <span class="keyword">class </span>basic_ptree; <span class="keyword">typedef</span> basic_ptree&lt; std::string, std::string &gt; ptree; } }</div>
+<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;</div>
+<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="keyword">namespace </span>triplegit</div>
+<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;{</div>
+<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;</div>
+<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;<span class="keyword">namespace </span>detail { <span class="keywordtype">void</span> TRIPLEGIT_API prefetched_unique_id_source(<span class="keywordtype">void</span> *ptr, <span class="keywordtype">size_t</span> size); }</div>
+<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;</div>
+<div class="line"><a name="l00035"></a><span class="lineno"><a class="code" href="classtriplegit_1_1unique__id.html"> 35</a></span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">class</span> T, <span class="keyword">class</span> hasher&gt; <span class="keyword">class </span><a class="code" href="classtriplegit_1_1unique__id.html" title="A unique id.">unique_id</a> : <span class="keyword">public</span> T</div>
+<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;{</div>
+<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160; <span class="keyword">static</span> T int_init()</div>
+<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160; {</div>
+<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160; T ret;</div>
+<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160; detail::prefetched_unique_id_source(&amp;ret, <span class="keyword">sizeof</span>(T));</div>
+<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160; <span class="keywordflow">return</span> ret;</div>
+<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160; }</div>
+<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160; <a class="code" href="classtriplegit_1_1unique__id.html" title="A unique id.">unique_id</a>() : T(int_init()) { }</div>
+<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160;};</div>
+<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160;</div>
+<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160;<span class="keyword">class </span><a class="code" href="classtriplegit_1_1fs__store.html" title="A graph stored in the filing system.">fs_store</a>;</div>
+<div class="line"><a name="l00051"></a><span class="lineno"><a class="code" href="classtriplegit_1_1collection__id.html"> 51</a></span>&#160;<span class="keyword">class </span><a class="code" href="classtriplegit_1_1collection__id.html" title="A collection in a fs_store.">collection_id</a> : <span class="keyword">public</span> <a class="code" href="classtriplegit_1_1unique__id.html" title="A unique id.">unique_id</a>&lt;NiallsCPP11Utilities::Int128, NiallsCPP11Utilities::Hash128&gt;</div>
+<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160;{</div>
+<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; <a class="code" href="classtriplegit_1_1collection__id.html#abf5fe0ca6383437bdc684e6219078c38" title="Creates a new, unique, anonymous collection id.">collection_id</a>(<a class="code" href="classtriplegit_1_1fs__store.html" title="A graph stored in the filing system.">fs_store</a> &amp;store);</div>
+<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; <a class="code" href="classtriplegit_1_1collection__id.html#abf5fe0ca6383437bdc684e6219078c38" title="Creates a new, unique, anonymous collection id.">collection_id</a>(<a class="code" href="classtriplegit_1_1fs__store.html" title="A graph stored in the filing system.">fs_store</a> &amp;store, <span class="keyword">const</span> std::string &amp;name, <span class="keywordtype">bool</span> mustBeUnique=<span class="keyword">false</span>);</div>
+<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160;};</div>
+<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160;</div>
+<div class="line"><a name="l00063"></a><span class="lineno"><a class="code" href="classtriplegit_1_1base__store.html"> 63</a></span>&#160;<span class="keyword">class </span>TRIPLEGIT_API <a class="code" href="classtriplegit_1_1base__store.html" title="Base class for a stored graph.">base_store</a></div>
+<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160;{</div>
+<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; <span class="keyword">const</span> boost::property_tree::ptree &amp;config() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; <span class="keywordtype">bool</span> isReadOnly() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; <span class="keywordtype">bool</span> isFSReadOnly() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160;</div>
+<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; <span class="keywordtype">bool</span> checkCollectionId(<span class="keyword">const</span> <a class="code" href="classtriplegit_1_1collection__id.html" title="A collection in a fs_store.">collection_id</a> &amp;<span class="keywordtype">id</span>) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l00076"></a><span class="lineno"><a class="code" href="classtriplegit_1_1base__store.html#aae2fc9e86358fb51548d35b4b1691aef"> 76</a></span>&#160; <span class="keyword">typedef</span> std::unordered_set&lt;collection_id&gt; <a class="code" href="classtriplegit_1_1base__store.html#aae2fc9e86358fb51548d35b4b1691aef" title="A set of collections.">collections_t</a>;</div>
+<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160;};</div>
+<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160;</div>
+<div class="line"><a name="l00084"></a><span class="lineno"><a class="code" href="classtriplegit_1_1fs__store.html"> 84</a></span>&#160;<span class="keyword">class </span>TRIPLEGIT_API <a class="code" href="classtriplegit_1_1fs__store.html" title="A graph stored in the filing system.">fs_store</a> : <span class="keyword">public</span> <a class="code" href="classtriplegit_1_1base__store.html" title="Base class for a stored graph.">base_store</a></div>
+<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160;{</div>
+<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160;<span class="keyword">public</span>: </div>
+<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; <a class="code" href="classtriplegit_1_1fs__store.html" title="A graph stored in the filing system.">fs_store</a>(<span class="keyword">const</span> std::filesystem::path &amp;path, <span class="keywordtype">bool</span> readOnly=<span class="keyword">false</span>);</div>
+<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; <a class="code" href="classtriplegit_1_1fs__store.html" title="A graph stored in the filing system.">fs_store</a>(std::filesystem::path &amp;&amp;path, <span class="keywordtype">bool</span> readOnly=<span class="keyword">false</span>);</div>
+<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160;};</div>
+<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160;</div>
+<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160;<span class="keyword">namespace </span>detail {</div>
+<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; <span class="keyword">class </span>TRIPLEGIT_API <a class="code" href="classtriplegit_1_1storable__vertices.html" title="The base class for a storable collection of vertices.">storable_vertices</a></div>
+<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; {</div>
+<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; <span class="keywordtype">bool</span> amLoaded, amDirty;</div>
+<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; <span class="keywordtype">void</span> *begin_batch_attachdetach();</div>
+<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; <span class="keywordtype">void</span> do_batch_attach(<span class="keywordtype">void</span> *p, <a class="code" href="classtriplegit_1_1base__store.html" title="Base class for a stored graph.">base_store</a> &amp;store, <a class="code" href="classtriplegit_1_1collection__id.html" title="A collection in a fs_store.">collection_id</a> <span class="keywordtype">id</span>);</div>
+<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; <span class="keywordtype">void</span> do_batch_detach(<span class="keywordtype">void</span> *p, <a class="code" href="classtriplegit_1_1base__store.html" title="Base class for a stored graph.">base_store</a> &amp;store, <a class="code" href="classtriplegit_1_1collection__id.html" title="A collection in a fs_store.">collection_id</a> <span class="keywordtype">id</span>);</div>
+<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; <span class="keywordtype">void</span> end_batch_attachdetach(<span class="keywordtype">void</span> *p);</div>
+<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; <span class="keyword">public</span>:</div>
+<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; <a class="code" href="classtriplegit_1_1storable__vertices.html" title="The base class for a storable collection of vertices.">storable_vertices</a>() : amLoaded(true), amDirty(true) { }</div>
+<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160;</div>
+<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; <span class="keywordtype">bool</span> isLoaded()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> amLoaded; }</div>
+<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; <span class="keywordtype">bool</span> isDirty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> amDirty; }</div>
+<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160;</div>
+<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; async_io::future&lt;void&gt; begincommit();</div>
+<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; <span class="keywordtype">void</span> attach(base_store &amp;store, collection_id <span class="keywordtype">id</span>)</div>
+<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; {</div>
+<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; <span class="keywordtype">void</span> *p=begin_batch_attachdetach();</div>
+<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; <span class="keyword">auto</span> unbatch=NiallsCPP11Utilities::Undoer([p, <span class="keyword">this</span>]{end_batch_attachdetach(p);});</div>
+<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; do_batch_attach(p, store, <span class="keywordtype">id</span>);</div>
+<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; }</div>
+<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">typename</span> Iterator&gt; <span class="keywordtype">void</span> attach(Iterator begin, Iterator end)</div>
+<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; {</div>
+<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; <span class="keywordtype">void</span> *p=begin_batch_attachdetach();</div>
+<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; <span class="keyword">auto</span> unbatch=NiallsCPP11Utilities::Undoer([p, <span class="keyword">this</span>]{end_batch_attachdetach(p);});</div>
+<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; <span class="keywordflow">for</span>(; begin!=end; ++begin)</div>
+<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; do_batch_attach(p, begin-&gt;first, begin-&gt;second);</div>
+<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; }</div>
+<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; <span class="keywordtype">void</span> detach(base_store &amp;store, collection_id <span class="keywordtype">id</span>)</div>
+<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; {</div>
+<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; <span class="keywordtype">void</span> *p=begin_batch_attachdetach();</div>
+<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; <span class="keyword">auto</span> unbatch=NiallsCPP11Utilities::Undoer([p, <span class="keyword">this</span>]{end_batch_attachdetach(p);});</div>
+<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; do_batch_detach(p, store, <span class="keywordtype">id</span>);</div>
+<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; }</div>
+<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">typename</span> Iterator&gt; <span class="keywordtype">void</span> detach(Iterator begin, Iterator end)</div>
+<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; {</div>
+<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; <span class="keywordtype">void</span> *p=begin_batch_attachdetach();</div>
+<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; <span class="keyword">auto</span> unbatch=NiallsCPP11Utilities::Undoer([p, <span class="keyword">this</span>]{end_batch_attachdetach(p);});</div>
+<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; <span class="keywordflow">for</span>(; begin!=end; ++begin)</div>
+<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; do_batch_detach(p, begin-&gt;first, begin-&gt;second);</div>
+<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; }</div>
+<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; };</div>
+<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160;}</div>
+<div class="line"><a name="l00145"></a><span class="lineno"><a class="code" href="classtriplegit_1_1storable__vertices.html"> 145</a></span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">class</span> derived&gt; <span class="keyword">class </span><a class="code" href="classtriplegit_1_1storable__vertices.html" title="The base class for a storable collection of vertices.">storable_vertices</a> : <span class="keyword">public</span> detail::storable_vertices</div>
+<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160;{</div>
+<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160;};</div>
+<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160;</div>
+<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160;<span class="keyword">namespace </span>boost</div>
+<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160;{</div>
+<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; <span class="keyword">using namespace </span>::boost;</div>
+<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class </span>OutEdgeListS = boost::vecS, <span class="comment">// a Sequence or an AssociativeContainer</span></div>
+<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; <span class="keyword">class </span>VertexListS = boost::vecS, <span class="comment">// a Sequence or a RandomAccessContainer</span></div>
+<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; <span class="keyword">class </span>DirectedS = boost::directedS,</div>
+<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; <span class="keyword">class </span>VertexProperty = boost::no_property,</div>
+<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; <span class="keyword">class </span>EdgeProperty = boost::no_property,</div>
+<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; <span class="keyword">class </span>GraphProperty = boost::no_property,</div>
+<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160; <span class="keyword">class </span>EdgeListS = boost::listS&gt;</div>
+<div class="line"><a name="l00163"></a><span class="lineno"><a class="code" href="classtriplegit_1_1boost_1_1adjacency__list.html"> 163</a></span>&#160; <span class="keyword">class </span><a class="code" href="classtriplegit_1_1boost_1_1adjacency__list.html" title="A stored Boost.Graph adjacency_list.">adjacency_list</a> : <span class="keyword">public</span> <a class="code" href="classtriplegit_1_1boost_1_1adjacency__list.html" title="A stored Boost.Graph adjacency_list.">::boost::adjacency_list</a>&lt;OutEdgeListS, VertexListS, DirectedS, VertexProperty, EdgeProperty, GraphProperty, EdgeListS&gt;, <span class="keyword">public</span> <a class="code" href="classtriplegit_1_1storable__vertices.html" title="The base class for a storable collection of vertices.">storable_vertices</a>&lt;adjacency_list&lt;OutEdgeListS, VertexListS, DirectedS, VertexProperty, EdgeProperty, GraphProperty, EdgeListS&gt;&gt;</div>
+<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160; {</div>
+<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160; typedef ::boost::adjacency_list&lt;OutEdgeListS, VertexListS, DirectedS, VertexProperty, EdgeProperty, GraphProperty, EdgeListS&gt; <a class="code" href="classtriplegit_1_1boost_1_1adjacency__list.html" title="A stored Boost.Graph adjacency_list.">Base</a>;</div>
+<div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160; <span class="keyword">public</span>:</div>
+<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; <a class="code" href="classtriplegit_1_1boost_1_1adjacency__list.html" title="A stored Boost.Graph adjacency_list.">adjacency_list</a>(<a class="code" href="classtriplegit_1_1base__store.html" title="Base class for a stored graph.">base_store</a> &amp;store, <a class="code" href="classtriplegit_1_1collection__id.html" title="A collection in a fs_store.">collection_id</a> <span class="keywordtype">id</span>, <span class="keyword">const</span> GraphProperty&amp; p = GraphProperty()) : <a class="code" href="classtriplegit_1_1boost_1_1adjacency__list.html" title="A stored Boost.Graph adjacency_list.">Base</a>(p) { Base::attach(store, <span class="keywordtype">id</span>); }</div>
+<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160; <a class="code" href="classtriplegit_1_1boost_1_1adjacency__list.html" title="A stored Boost.Graph adjacency_list.">adjacency_list</a>(<span class="keyword">const</span> GraphProperty&amp; p = GraphProperty()) : <a class="code" href="classtriplegit_1_1boost_1_1adjacency__list.html" title="A stored Boost.Graph adjacency_list.">Base</a>(p) { }</div>
+<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160; <a class="code" href="classtriplegit_1_1boost_1_1adjacency__list.html" title="A stored Boost.Graph adjacency_list.">adjacency_list</a>(<span class="keyword">const</span> <a class="code" href="classtriplegit_1_1boost_1_1adjacency__list.html" title="A stored Boost.Graph adjacency_list.">adjacency_list</a>&amp; x) : <a class="code" href="classtriplegit_1_1boost_1_1adjacency__list.html" title="A stored Boost.Graph adjacency_list.">Base</a>(x) { }</div>
+<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160; <a class="code" href="classtriplegit_1_1boost_1_1adjacency__list.html" title="A stored Boost.Graph adjacency_list.">adjacency_list</a>&amp; operator=(<span class="keyword">const</span> <a class="code" href="classtriplegit_1_1boost_1_1adjacency__list.html" title="A stored Boost.Graph adjacency_list.">adjacency_list</a>&amp; x) {</div>
+<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160; <span class="keyword">static_cast&lt;</span><a class="code" href="classtriplegit_1_1boost_1_1adjacency__list.html" title="A stored Boost.Graph adjacency_list.">Base</a> &amp;<span class="keyword">&gt;</span>(*this)=x;</div>
+<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160; <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
+<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; }</div>
+<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160;<span class="preprocessor">#if 0 // BGL doesn&#39;t support move construction yet</span></div>
+<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160;<span class="preprocessor"></span> <a class="code" href="classtriplegit_1_1boost_1_1adjacency__list.html" title="A stored Boost.Graph adjacency_list.">adjacency_list</a>(<a class="code" href="classtriplegit_1_1boost_1_1adjacency__list.html" title="A stored Boost.Graph adjacency_list.">adjacency_list</a>&amp;&amp; x) : <a class="code" href="classtriplegit_1_1boost_1_1adjacency__list.html" title="A stored Boost.Graph adjacency_list.">Base</a>(std::move(x)) { }</div>
+<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160; <a class="code" href="classtriplegit_1_1boost_1_1adjacency__list.html" title="A stored Boost.Graph adjacency_list.">adjacency_list</a>&amp; operator=(<a class="code" href="classtriplegit_1_1boost_1_1adjacency__list.html" title="A stored Boost.Graph adjacency_list.">adjacency_list</a>&amp;&amp; x) {</div>
+<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; <span class="keyword">static_cast&lt;</span><a class="code" href="classtriplegit_1_1boost_1_1adjacency__list.html" title="A stored Boost.Graph adjacency_list.">Base</a> &amp;<span class="keyword">&gt;</span>(*this)=std::move(x);</div>
+<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
+<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; }</div>
+<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160;<span class="preprocessor"></span> <a class="code" href="classtriplegit_1_1boost_1_1adjacency__list.html" title="A stored Boost.Graph adjacency_list.">adjacency_list</a>(<span class="keyword">typename</span> Base::vertices_size_type num_vertices, <span class="keyword">const</span> GraphProperty&amp; p = GraphProperty()) : <a class="code" href="classtriplegit_1_1boost_1_1adjacency__list.html" title="A stored Boost.Graph adjacency_list.">Base</a>(num_vertices, p) { }</div>
+<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">class</span> EdgeIterator&gt; <a class="code" href="classtriplegit_1_1boost_1_1adjacency__list.html" title="A stored Boost.Graph adjacency_list.">adjacency_list</a>(EdgeIterator first, EdgeIterator last,</div>
+<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; <span class="keyword">typename</span> Base::vertices_size_type n,</div>
+<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; <span class="keyword">typename</span> Base::edges_size_type = 0,</div>
+<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; <span class="keyword">const</span> GraphProperty&amp; p = GraphProperty()) : <a class="code" href="classtriplegit_1_1boost_1_1adjacency__list.html" title="A stored Boost.Graph adjacency_list.">Base</a>(first, last, n, 0, p) { }</div>
+<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">class</span> EdgeIterator, <span class="keyword">class</span> EdgePropertyIterator&gt; <a class="code" href="classtriplegit_1_1boost_1_1adjacency__list.html" title="A stored Boost.Graph adjacency_list.">adjacency_list</a>(EdgeIterator first, EdgeIterator last,</div>
+<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; EdgePropertyIterator ep_iter,</div>
+<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; <span class="keyword">typename</span> Base::vertices_size_type n,</div>
+<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; <span class="keyword">typename</span> Base::edges_size_type = 0,</div>
+<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; <span class="keyword">const</span> GraphProperty&amp; p = GraphProperty()) : <a class="code" href="classtriplegit_1_1boost_1_1adjacency__list.html" title="A stored Boost.Graph adjacency_list.">Base</a>(first, last, ep_iter, n, 0, p) { }</div>
+<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160; };</div>
+<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160;</div>
+<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160;} <span class="comment">// namespace boost</span></div>
+<div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160;</div>
+<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160;} <span class="comment">// namespace</span></div>
+<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160;</div>
+<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160;<span class="preprocessor">#endif</span></div>
+</div><!-- fragment --></div><!-- contents -->
+<hr class="footer"/><address class="footer">(C) 2012
Niall Douglas</address>
+</body>
+</html>

Deleted: sandbox/triplegit/trunk/testAutoSVNAttribs.c
==============================================================================

Deleted: sandbox/triplegit/trunk/testfile
==============================================================================
--- sandbox/triplegit/trunk/testfile 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
+++ (empty file)
@@ -1 +0,0 @@
-I am a teapot.

Added: sandbox/triplegit/trunk/triplegit/SConscript
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/triplegit/SConscript 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,98 @@
+import os, sys, platform
+
+Import("importedenv", "ARMcrosscompiler")
+env=importedenv.Clone()
+architecture=env['VARIANT'][:env['VARIANT'].find('/')]
+debugbuild="Debug" in env['VARIANT']
+if env['CC']=='cl':
+ if architecture=="x86":
+ if env.GetOption('sse')==1: env['CCFLAGS']+=[ "/arch:SSE" ]
+ elif env.GetOption('sse')>=2: env['CCFLAGS']+=[ "/arch:SSE2" ]
+ if env.GetOption('sse')>=3: env['CPPDEFINES']+=[("__SSE3__", 1)]
+ if env.GetOption('sse')>=4: env['CPPDEFINES']+=[("__SSE4__", 1)]
+ if architecture=="x86" or architecture=="x64":
+ if env.GetOption('avx')==1: env['CCFLAGS']+=[ "/arch:AVX" ]
+else:
+ if architecture=="x86":
+ env['CCFLAGS']+=["-m32"]
+ env['LINKFLAGS']+=["-m32"]
+ if env.GetOption('sse'):
+ env['CCFLAGS']+=["-mfpmath=sse"]
+ if env.GetOption('sse')>1: env['CCFLAGS']+=["-msse%s" % str(env.GetOption('sse'))]
+ else: env['CCFLAGS']+=["-msse"]
+ if architecture=="x86" or architecture=="x64":
+ if env.GetOption('avx'):
+ env['CCFLAGS']+=["-mfpmath=avx"]
+ if env.GetOption('avx')>1: env['CCFLAGS']+=["-mavx%s" % str(env.GetOption('avx'))]
+ else: env['CCFLAGS']+=["-mavx"]
+ if architecture=='ARMv7':
+ if ARMcrosscompiler:
+ env['CC']='arm-linux-gnueabi-gcc'
+ env['CXX']='arm-linux-gnueabi-g++'
+ env['CCFLAGS']+=['-mfpu=%s' % env.GetOption('fpu')]
+ if env.GetOption('thumb'):
+ env['CCFLAGS']+=['-mthumb']
+
+# Am I building a debug or release build?
+if debugbuild:
+ env['CPPDEFINES']+=["DEBUG", "_DEBUG"]
+else:
+ env['CPPDEFINES']+=["NDEBUG"]
+
+# Am I building for Windows or POSIX?
+if env['CC']=='cl':
+ env['CPPDEFINES']+=["WIN32", "_WINDOWS", "UNICODE", "_UNICODE"]
+ env['CXXFLAGS']+=["/EHsc"]
+ env['CCFLAGS']+=["/GF"] # Eliminate duplicate strings
+ env['CCFLAGS']+=["/Gy"] # Seperate COMDATs
+ env['CCFLAGS']+=["/Zi"] # Program database debug info
+ if debugbuild:
+ env['CCFLAGS']+=["/Od", "/MTd"]
+ else:
+ env['CCFLAGS']+=["/O2", "/MT"]
+ env['LIBS']+=[]
+ env['LINKFLAGS']+=["/DEBUG"] # Output debug symbols
+ env['LINKFLAGS']+=["/LARGEADDRESSAWARE"] # Works past 2Gb
+ env['LINKFLAGS']+=["/DYNAMICBASE"] # Doesn't mind being randomly placed
+ env['LINKFLAGS']+=["/NXCOMPAT"] # Likes no execute
+ env['LINKFLAGS']+=["/OPT:REF"] # Seems to puke on load on WinXP without
+ env['LINKFLAGS']+=["/MANIFEST"] # Be UAC compatible
+ env['LINKFLAGSEXE']=env['LINKFLAGS'][:]
+
+ env['LINKFLAGS']+=["/VERSION:1.00.0"] # Version
+
+ if not debugbuild:
+ env['LINKFLAGS']+=["/OPT:ICF"] # Eliminate redundants
+else:
+ env['CPPDEFINES']+=[]
+ env['CCFLAGS']+=["-fstrict-aliasing", "-fargument-noalias", "-Wstrict-aliasing"]
+ env['CCFLAGS']+=["-Wall", "-Wno-unused"]
+ if debugbuild:
+ env['CCFLAGS']+=["-O0", "-g"]
+ else:
+ env['CCFLAGS']+=["-O2", "-g"]
+ env['CXXFLAGS']+=["-std=c++0x"]
+ env['LIBS']+=["boost_filesystem", "boost_system", "boost_thread", "pthread"]
+ env['LINKFLAGS']+=[]
+ env['LINKFLAGSEXE']=env['LINKFLAGS'][:]
+
+outputs={}
+
+# Build the triplegit DLL
+sources = env.SConscript(os.path.join("src", "SConscript"), 'importedenv')
+libobjects = env.SharedObject(sources, CPPDEFINES=env['CPPDEFINES']+["TRIPLEGIT_DLL_EXPORTS"])
+outputs['NiallsCPP11Utilitieslib']=env.SConscript(os.path.join("..", "NiallsCPP11Utilities", "SConscript"), 'importedenv')['mylib']
+libobjects+=outputs['NiallsCPP11Utilitieslib']
+env['RPATH']+=["."]
+if env.GetOption("static"):
+ mylib = env.StaticLibrary("triplegit", source = libobjects)
+ myliblib = mylib
+else:
+ mylib = env.SharedLibrary("triplegit", source = libobjects)
+ if env['CC']=='cl': env.AddPostAction(mylib, 'mt.exe -nologo -manifest ${TARGET}.manifest -outputresource:$TARGET;2')
+ myliblib = mylib
+ if sys.platform=='win32':
+ myliblib=mylib[1]
+outputs['triplegitlib']=(myliblib, mylib, sources)
+
+Return("outputs")

Added: sandbox/triplegit/trunk/triplegit/SConstruct
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/triplegit/SConstruct 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,258 @@
+import os, sys, platform, subprocess
+
+architectures = ["generic"]
+
+env = Environment()
+#print env['TOOLS']
+
+architecture="generic"
+ARMcrosscompiler=False
+if env['CC']=='cl':
+ # We're on windows
+ if os.environ.has_key('LIBPATH'):
+ if not env.GetOption('force32') and -1!=os.environ['LIBPATH'].find("\\amd64"):
+ architecture="x64"
+ elif -1!=os.environ['LIBPATH'].find("\\arm"):
+ architecture="ARMv7"
+ else:
+ architecture="x86"
+ architectures.append(architecture)
+else:
+ # We're on POSIX, so ask the compiler what it thinks it's building
+ output=''
+ try:
+ output=subprocess.check_output([env['CXX'], "--target-help"])
+ except:
+ try:
+ output=subprocess.check_output([env['CXX'], "--version"])
+ except:
+ output=platform.machine()
+ if 'armelf' in output:
+ architectures+=["ARMv7"]
+ architecture="ARMv7"
+ # Choose Intel in preference as otherwise it's probably a cross-compiler
+ if 'x64' in output or 'x86_64' in output:
+ architectures+=["x86", "x64"]
+ architecture="x64"
+ else:
+ for a in ['i386', 'i486', 'i586', 'i686']:
+ if a in output:
+ architectures+=["x86"]
+ architecture="x86"
+ break
+ # If not ARMv7 support, see if there is a cross-compiler
+ if "ARMv7" not in architectures:
+ output=''
+ try:
+ output=subprocess.check_output(['arm-linux-gnueabi-g++', "--target-help"])
+ except:
+ try:
+ output=subprocess.check_output(['arm-linux-gnueabi-g++', "--version"])
+ except:
+ output=platform.machine()
+ if 'armelf' in output:
+ architectures+=["ARMv7"]
+ ARMcrosscompiler=True
+print "*** Architectures detected as being available:", architectures
+print "*** Minimum architecture is:", architecture
+
+if sys.platform=="win32" and 'INCLUDE' not in os.environ:
+ env = Environment(tools=['mingw', 'msvs'])
+#print env['TOOLS']
+AddOption('--postfix', dest='postfix', nargs=1, default='_test', help='appends a string to the DLL name')
+AddOption('--debugbuild', dest='debug', nargs='?', const=True, help='enable debug build')
+AddOption('--static', dest='static', nargs='?', const=True, help='build a static library rather than shared library')
+AddOption('--useclang', dest='useclang', nargs=1, type='str', default='clang++', help='use clang if it is available')
+AddOption('--usegcc', dest='usegcc', nargs=1, type='str', default='g++', help='use gcc if it is available')
+AddOption('--force32', dest='force32', help='force 32 bit build on 64 bit machine')
+AddOption('--archs', dest='archs', nargs=1, type='str', default='min', help='which architectures to build, comma separated. all means all. Defaults to min.')
+if 'x86' in architectures:
+ AddOption('--sse', dest='sse', nargs=1, type='int', default=2, help='set SSE used (0-4) on 32 bit x86. Defaults to 2 (SSE2).')
+ AddOption('--avx', dest='avx', nargs=1, type='int', default=0, help='set AVX used (0-2) on x86/x64. Defaults to 0 (No AVX).')
+if 'ARMv7' in architectures:
+ AddOption('--fpu', dest='fpu', nargs=1, type='str', default='neon', help='sets FPU used on ARMv7. Defaults to neon.')
+ AddOption('--thumb', dest='thumb', nargs='?', const=True, help='generate ARMv7 Thumb instructions instead of normal.')
+if env.GetOption('archs')!='min' and env.GetOption('archs')!='all':
+ archs=env.GetOption('archs').split(',')
+ for arch in archs:
+ assert arch in architectures
+ architectures=archs
+if architecture=='x64' and env.GetOption('force32'): architecture='x86'
+
+# Force scons to always use absolute paths in everything (helps debuggers to find source files)
+env['CCCOM'] = env['CCCOM'].replace('$CHANGED_SOURCES','$SOURCES.abspath')
+env['SHCCCOM'] = env['SHCCCOM'].replace('$CHANGED_SOURCES','$SOURCES.abspath')
+env['CXXCOM'] = env['CXXCOM'].replace('$CHANGED_SOURCES','$SOURCES.abspath')
+env['SHCXXCOM']= env['SHCXXCOM'].replace('$CHANGED_SOURCES','$SOURCES.abspath')
+env['CPPPATH']=[]
+env['CPPDEFINES']=[]
+env['CCFLAGS']=[]
+env['CXXFLAGS']=[]
+env['LIBS']=[]
+env['LIBPATH']=[]
+env['RPATH']=[]
+env['LINKFLAGS']=[]
+
+# Am I in a 32 or 64 bit environment? Note that not specifying --sse doesn't set any x86 or x64 specific options
+# so it's good to go for ANY platform
+if sys.platform=="win32" and 'INCLUDE' in os.environ:
+ # Even the very latest scons still screws this up :(
+ env['ENV']['INCLUDE']=os.environ['INCLUDE']
+ env['ENV']['LIB']=os.environ['LIB']
+ env['ENV']['PATH']=os.environ['PATH']
+else:
+ if sys.platform=="win32":
+ env['ENV']['PATH']=os.environ['PATH']
+ env['CPPDEFINES']+=["WIN32"]
+ # Test the build environment
+ def CheckHaveClang(cc):
+ cc.Message("Checking if clang is available ...")
+ try:
+ temp=env['CC']
+ except:
+ temp=[]
+ cc.env['CC']="clang"
+ result=cc.TryLink('int main(void) { return 0; }\n', '.c')
+ cc.env['CC']=temp
+ cc.Result(result)
+ return result
+ def CheckHaveGCC(cc):
+ cc.Message("Checking if gcc is available ...")
+ try:
+ temp=env['CC']
+ except:
+ temp=[]
+ cc.env['CC']="gcc"
+ result=cc.TryLink('int main(void) { return 0; }\n', '.c')
+ cc.env['CC']=temp
+ cc.Result(result)
+ return result
+ def CheckHaveVisibility(cc):
+ cc.Message("Checking for symbol visibility support ...")
+ try:
+ temp=cc.env['CPPFLAGS']
+ except:
+ temp=[]
+ cc.env['CPPFLAGS']=temp+["-fvisibility=hidden"]
+ result=cc.TryCompile('struct __attribute__ ((visibility("default"))) Foo { int foo; };\nint main(void) { Foo foo; return 0; }\n', '.cpp')
+ cc.env['CPPFLAGS']=temp
+ cc.Result(result)
+ return result
+ def CheckHaveOpenMP(cc):
+ cc.Message("Checking for OpenMP support ...")
+ try:
+ temp=cc.env['CPPFLAGS']
+ except:
+ temp=[]
+ cc.env['CPPFLAGS']=temp+["-fopenmp"]
+ result=cc.TryCompile('#include <omp.h>\nint main(void) { return 0; }\n', '.cpp')
+ cc.env['CPPFLAGS']=temp
+ cc.Result(result)
+ return result
+ def CheckHaveCPP11Features(cc):
+ cc.Message("Checking if can enable C++11 features ...")
+ try:
+ temp=cc.env['CPPFLAGS']
+ except:
+ temp=[]
+ cc.env['CPPFLAGS']=temp+["-std=c++11"]
+ result=cc.TryCompile('struct Foo { static const int gee=5; Foo(const char *) { } Foo(Foo &&a) { } };\nint main(void) { Foo foo(__func__); static_assert(Foo::gee==5, "Death!"); return 0; }\n', '.cpp')
+ cc.env['CPPFLAGS']=temp
+ cc.Result(result)
+ return result
+ def CheckHaveBoost(cc):
+ cc.Message("Checking for Boost C++ libraries ...")
+ try:
+ temp=cc.env['CPPFLAGS']
+ except:
+ temp=[]
+ result=cc.TryCompile('#include "boost/mpl/vector.hpp"\n', '.cpp')
+ cc.Result(result)
+ return result
+ conf=Configure(env, { "CheckHaveClang" : CheckHaveClang, "CheckHaveGCC" : CheckHaveGCC, "CheckHaveVisibility" : CheckHaveVisibility, "CheckHaveOpenMP" : CheckHaveOpenMP, "CheckHaveCPP11Features" : CheckHaveCPP11Features, "CheckHaveBoost" : CheckHaveBoost } )
+ if env.GetOption('useclang') and conf.CheckHaveClang():
+ env['CC']="clang"
+ env['CXX']=env.GetOption('useclang')
+ if env.GetOption('usegcc') and conf.CheckHaveGCC():
+ env['CC']="gcc"
+ env['CXX']=env.GetOption('usegcc')
+ if not conf.CheckLib("rt", "clock_gettime") and not conf.CheckLib("c", "clock_gettime"):
+ print "WARNING: Can't find clock_gettime() in librt or libc, code may not fully compile if your system headers say that this function is available"
+ if conf.CheckHaveVisibility():
+ env['CPPFLAGS']+=["-fvisibility=hidden"] # All symbols are hidden unless marked otherwise
+ env['CXXFLAGS']+=["-fvisibility-inlines-hidden" # All inlines are always hidden
+ ]
+ else:
+ print "Disabling -fvisibility support"
+ if conf.CheckHaveOpenMP():
+ env['CPPFLAGS']+=["-fopenmp"]
+ env['LINKFLAGS']+=["-fopenmp"]
+ else:
+ print "Disabling OpenMP support"
+
+ #if conf.CheckHaveCPP11Features():
+ # env['CXXFLAGS']+=["-std=c++11"]
+ #else:
+ # print "Disabling C++11 support"
+
+ boostpath=os.path.abspath(os.path.join(os.getcwd(), "boost"))
+ while not os.path.exists(boostpath):
+ #print(boostpath)
+ boostpath=os.path.dirname(os.path.dirname(boostpath))
+ if len(boostpath)<4: break
+ boostpath=os.path.join(boostpath, "boost")
+ if len(boostpath)>4 and os.path.exists(boostpath):
+ env['CPPPATH']+=[boostpath]
+ env['LIBPATH']+=[os.path.join(boostpath, 'stage', 'lib')]
+ env['RPATH']+=[os.path.join(boostpath, 'stage', 'lib')]
+ if not conf.CheckHaveBoost():
+ print("ERROR: I need the Boost libraries, either in the system or in a boost directory just above mine")
+ sys.exit(1)
+
+ env=conf.Finish()
+
+# Build
+mylibrary=None
+buildvariants={}
+for arch in architectures:
+ for buildtype in ["Debug", "Release"]:
+ env['VARIANT']=arch+"/"+buildtype
+ importedenv=env
+ mylibraryvariant=env.SConscript("SConscript", exports=["importedenv", "ARMcrosscompiler"], variant_dir=env['VARIANT'], duplicate=False)
+ buildvariants[(buildtype, arch)]=mylibraryvariant
+
+if env.GetOption('archs')=='min':
+ print "*** Build variant preferred by environment is", "Debug" if env.GetOption("debug") else "Release", architecture, "using compiler", env['CC']
+ mylibrary=buildvariants[("Debug" if env.GetOption("debug") else "Release", architecture)]
+ #print(mylibrary)
+ Default([x[0] for x in mylibrary.values()])
+else:
+ #print(buildvariants)
+ mylibrary=[x.values()[0][0] for x in buildvariants.values()]
+ #print(mylibrary)
+ Default(mylibrary)
+
+# Set up the MSVC project files
+if 'win32'==sys.platform:
+ includes = [ "include/triplegit.hpp" ]
+ variants = []
+ projs = {}
+ for buildvariant, output in buildvariants.items():
+ variant = buildvariant[0]+'|'+("Win32" if buildvariant[1]=="x86" else buildvariant[1])
+ variants+=[variant]
+ for program, builditems in output.items():
+ if not program in projs: projs[program]={}
+ projs[program][variant]=builditems
+ variants.sort()
+ msvsprojs = []
+ for program, items in projs.items():
+ buildtargets = items.items()
+ buildtargets.sort()
+ #print buildtargets
+ #print [str(x[1][0][0]) for x in buildtargets]
+ msvsprojs+=env.MSVSProject(program+env['MSVSPROJECTSUFFIX'], srcs=items.values()[0][1], incs=includes, misc="Readme.txt", buildtarget=[x[1][0][0] for x in buildtargets], runfile=[str(x[1][0][0]) for x in buildtargets], variant=[x[0] for x in buildtargets], auto_build_solution=0)
+ msvssolution = env.MSVSSolution("triplegit.sln", projects=msvsprojs, variant=variants)
+ Depends(msvssolution, msvsprojs)
+ Alias("msvcproj", msvssolution)
+
+Return("mylibrary")

Added: sandbox/triplegit/trunk/triplegit/TripleGit.vcxproj
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/triplegit/TripleGit.vcxproj 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,211 @@
+<?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|ARM">
+ <Configuration>Debug</Configuration>
+ <Platform>ARM</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|ARM">
+ <Configuration>Release</Configuration>
+ <Platform>ARM</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="include\async_file_io.hpp" />
+ <ClInclude Include="include\triplegit.hpp" />
+ <ClInclude Include="src\std_filesystem.hpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="src\async_file_io.cpp" />
+ <ClCompile Include="src\triplegitmain.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\NiallsCPP11Utilities\NiallsCPP11Utilities.vcxproj">
+ <Project>{cf7497ef-702b-4237-bb7c-ad72c297b88e}</Project>
+ </ProjectReference>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{D733647B-03E2-449A-9B5C-D33840F1520F}</ProjectGuid>
+ <Keyword>Win32Proj</Keyword>
+ <RootNamespace>TripleGit</RootNamespace>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>v110</PlatformToolset>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>v110</PlatformToolset>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>v120_CTP_Nov2012</PlatformToolset>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <PlatformToolset>v110</PlatformToolset>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <PlatformToolset>v110</PlatformToolset>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <PlatformToolset>v120_CTP_Nov2012</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 Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <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>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <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|x64'">
+ <LibraryPath>..\boost\stage\lib;$(LibraryPath)</LibraryPath>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <LibraryPath>..\boost\stage\lib;$(LibraryPath)</LibraryPath>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <SDLCheck>true</SDLCheck>
+ </ClCompile>
+ <Link>
+ <SubSystem>Windows</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
+ <ClCompile>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <SDLCheck>true</SDLCheck>
+ </ClCompile>
+ <Link>
+ <SubSystem>Windows</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;TRIPLEGIT_DLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <SDLCheck>false</SDLCheck>
+ <AdditionalIncludeDirectories>../boost</AdditionalIncludeDirectories>
+ <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ <MinimalRebuild>false</MinimalRebuild>
+ </ClCompile>
+ <Link>
+ <SubSystem>Windows</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <SDLCheck>true</SDLCheck>
+ </ClCompile>
+ <Link>
+ <SubSystem>Windows</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <SDLCheck>true</SDLCheck>
+ </ClCompile>
+ <Link>
+ <SubSystem>Windows</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;TRIPLEGIT_DLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <SDLCheck>true</SDLCheck>
+ <AdditionalIncludeDirectories>../boost</AdditionalIncludeDirectories>
+ </ClCompile>
+ <Link>
+ <SubSystem>Windows</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ </Link>
+ </ItemDefinitionGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project>
\ No newline at end of file

Added: sandbox/triplegit/trunk/triplegit/include/async_file_io.hpp
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/triplegit/include/async_file_io.hpp 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,1265 @@
+/* async_file_io
+Provides a threadpool and asynchronous file i/o infrastructure based on Boost.ASIO, Boost.Iostreams and filesystem
+(C) 2013 Niall Douglas http://www.nedprod.com/
+File Created: Mar 2013
+*/
+
+#ifndef TRIPLEGIT_ASYNC_FILE_IO_H
+#define TRIPLEGIT_ASYNC_FILE_IO_H
+
+#include "../../NiallsCPP11Utilities/NiallsCPP11Utilities.hpp"
+#include "../../NiallsCPP11Utilities/std_filesystem.hpp"
+#include <type_traits>
+#include <initializer_list>
+#include <thread>
+#include <atomic>
+#include <exception>
+#if !defined(_WIN32_WINNT) && defined(WIN32)
+#define _WIN32_WINNT 0x0501
+#endif
+//#define BOOST_THREAD_VERSION 4
+//#define BOOST_THREAD_PROVIDES_VARIADIC_THREAD
+//#define BOOST_THREAD_DONT_PROVIDE_FUTURE
+//#define BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK
+#include "boost/asio.hpp"
+#include "boost/thread/thread.hpp"
+#include "boost/thread/future.hpp"
+
+#ifdef TRIPLEGIT_DLL_EXPORTS
+#define TRIPLEGIT_ASYNC_FILE_IO_API DLLEXPORTMARKUP
+#else
+#define TRIPLEGIT_ASYNC_FILE_IO_API DLLIMPORTMARKUP
+#endif
+
+#ifdef _MSC_VER
+#pragma warning(push)
+#pragma warning(disable: 4251) // type needs to have dll-interface to be used by clients of class
+#endif
+
+/*! \file async_file_io.hpp
+\brief Provides a batch asynchronous file i/o implementation based on Boost.ASIO
+
+My Seagate 7200rpm drive:
+
+-----------------------------------------------------------------------
+CrystalDiskMark 3.0.2 x64 (C) 2007-2013 hiyohiyo
+ Crystal Dew World : http://crystalmark.info/
+-----------------------------------------------------------------------
+* MB/s = 1,000,000 byte/s [SATA/300 = 300,000,000 byte/s]
+
+ Sequential Read : 46.012 MB/s
+ Sequential Write : 44.849 MB/s
+ Random Read 512KB : 26.367 MB/s
+ Random Write 512KB : 23.521 MB/s
+ Random Read 4KB (QD=1) : 0.487 MB/s [ 118.8 IOPS]
+ Random Write 4KB (QD=1) : 0.771 MB/s [ 188.3 IOPS]
+ Random Read 4KB (QD=32) : 0.819 MB/s [ 199.8 IOPS]
+ Random Write 4KB (QD=32) : 0.789 MB/s [ 192.6 IOPS]
+
+ Test : 1000 MB [G: 99.0% (178.2/180.1 GB)] (x5)
+ Date : 2013/04/13 23:02:23
+ OS : Windows 8 [6.2 Build 9200] (x64)
+
+
+Windows IOCP backend, 3.5Ghz Ivy Bridge Windows 8 x64 on
+my Seagate 7200rpm drive:
+
+1000 file opens, writes 1 byte, closes, and deletes:
+It took 0.26311 secs to do all operations
+ It took 0.0079942 secs to dispatch all operations
+ It took 0.255116 secs to finish all operations
+
+It took 0.0899875 secs to do 11112.7 file opens per sec
+It took 0.0100023 secs to do 99977 file writes per sec
+It took 0.0210025 secs to do 47613.4 file closes per sec
+It took 0.142118 secs to do 7036.43 file deletions per sec
+
+
+1000 file opens, writes 64Kb, closes, and deletes:
+It took 1.01195 secs to do all operations
+ It took 0.0079939 secs to dispatch all operations
+ It took 1.00396 secs to finish all operations
+
+It took 0.10599 secs to do 9434.83 file opens per sec
+It took 0.0410053 secs to do 24387.1 file writes per sec
+It took 0.769099 secs to do 1300.22 file closes per sec
+It took 0.0958558 secs to do 10432.3 file deletions per sec
+
+
+1000 file opens, writes 1 byte, closes, and deletes with synchronous i/o:
+It took 9.28653 secs to do all operations
+ It took 0.142254 secs to dispatch all operations
+ It took 9.14427 secs to finish all operations
+
+It took 8.92534 secs to do 112.041 file opens per sec
+It took 0.112127 secs to do 8918.5 file writes per sec
+It took 0.177022 secs to do 5649.03 file closes per sec
+It took 0.0720397 secs to do 13881.2 file deletions per sec
+
+
+1000 file opens, writes 64Kb, closes, and deletes with synchronous i/o:
+It took 3.03522 secs to do all operations
+ It took 0.0212259 secs to dispatch all operations
+ It took 3.01399 secs to finish all operations
+
+It took 1.92052 secs to do 520.694 file opens per sec
+It took 0.0720104 secs to do 13886.9 file writes per sec
+It took 0.806102 secs to do 1240.54 file closes per sec
+It took 0.236588 secs to do 4226.75 file deletions per sec
+
+
+1000 file opens, writes 1 byte, closes, and deletes with autoflush i/o:
+It took 11.9628 secs to do all operations
+ It took 0.0080006 secs to dispatch all operations
+ It took 11.9548 secs to finish all operations
+
+It took 0.0940122 secs to do 10636.9 file opens per sec
+It took 0.46754 secs to do 2138.85 file writes per sec
+It took 11.2472 secs to do 88.9107 file closes per sec
+It took 0.154042 secs to do 6491.76 file deletions per sec
+
+
+1000 file opens, writes 64Kb, closes, and deletes with autoflush i/o:
+It took 14.5824 secs to do all operations
+ It took 0.0080019 secs to dispatch all operations
+ It took 14.5744 secs to finish all operations
+
+It took 0.0980132 secs to do 10202.7 file opens per sec
+It took 0.465669 secs to do 2147.45 file writes per sec
+It took 13.8906 secs to do 71.9913 file closes per sec
+It took 0.128166 secs to do 7802.36 file deletions per sec
+
+
+
+POSIX compat backend, 3.5Ghz Ivy Bridge Linux 3.2 x64 on
+my Seagate 7200rpm drive:
+
+1000 file opens, writes 1 byte, closes, and deletes:
+It took 0.03907 secs to do all operations
+ It took 0.00425 secs to dispatch all operations
+ It took 0.03482 secs to finish all operations
+
+It took 0.015097 secs to do 66238.3 file opens per sec
+It took 0.009744 secs to do 102627 file writes per sec
+It took 0.008307 secs to do 120380 file closes per sec
+It took 0.005922 secs to do 168862 file deletions per sec
+
+
+1000 file opens, writes 64Kb, closes, and deletes:
+It took 0.039257 secs to do all operations
+ It took 0.004198 secs to dispatch all operations
+ It took 0.035059 secs to finish all operations
+
+It took 0.017462 secs to do 57267.2 file opens per sec
+It took 0.010241 secs to do 97646.7 file writes per sec
+It took 0.007234 secs to do 138236 file closes per sec
+It took 0.00432 secs to do 231481 file deletions per sec
+
+
+1000 file opens, writes 1 byte, closes, and deletes with synchronous i/o:
+It took 7.53982 secs to do all operations
+ It took 0.003997 secs to dispatch all operations
+ It took 7.53582 secs to finish all operations
+
+It took 6.35027 secs to do 157.473 file opens per sec
+It took 1.18224 secs to do 845.848 file writes per sec
+It took 0.005773 secs to do 173220 file closes per sec
+It took 0.001528 secs to do 654450 file deletions per sec
+
+
+1000 file opens, writes 64Kb, closes, and deletes with synchronous i/o:
+It took 7.97113 secs to do all operations
+ It took 0.004116 secs to dispatch all operations
+ It took 7.96701 secs to finish all operations
+
+It took 6.32829 secs to do 158.021 file opens per sec
+It took 1.63634 secs to do 611.12 file writes per sec
+It took 0.004897 secs to do 204207 file closes per sec
+It took 0.001605 secs to do 623053 file deletions per sec
+
+
+1000 file opens, writes 1 byte, closes, and deletes with autoflush i/o:
+It took 7.46535 secs to do all operations
+ It took 0.00405 secs to dispatch all operations
+ It took 7.4613 secs to finish all operations
+
+It took 6.30895 secs to do 158.505 file opens per sec
+It took 1.12623 secs to do 887.922 file writes per sec
+It took 0.02834 secs to do 35285.8 file closes per sec
+It took 0.001838 secs to do 544070 file deletions per sec
+
+
+1000 file opens, writes 64Kb, closes, and deletes with autoflush i/o:
+It took 8.0235 secs to do all operations
+ It took 0.00419 secs to dispatch all operations
+ It took 8.01931 secs to finish all operations
+
+It took 6.29931 secs to do 158.748 file opens per sec
+It took 1.68728 secs to do 592.67 file writes per sec
+It took 0.035096 secs to do 28493.3 file closes per sec
+It took 0.001815 secs to do 550964 file deletions per sec
+
+
+
+
+My Samsung 256Gb 830 SSD:
+-----------------------------------------------------------------------
+CrystalDiskMark 3.0.2 x64 (C) 2007-2013 hiyohiyo
+ Crystal Dew World : http://crystalmark.info/
+-----------------------------------------------------------------------
+* MB/s = 1,000,000 byte/s [SATA/300 = 300,000,000 byte/s]
+
+ Sequential Read : 478.802 MB/s
+ Sequential Write : 406.425 MB/s
+ Random Read 512KB : 337.185 MB/s
+ Random Write 512KB : 390.353 MB/s
+ Random Read 4KB (QD=1) : 21.235 MB/s [ 5184.4 IOPS]
+ Random Write 4KB (QD=1) : 58.373 MB/s [ 14251.1 IOPS]
+ Random Read 4KB (QD=32) : 301.170 MB/s [ 73527.7 IOPS]
+ Random Write 4KB (QD=32) : 148.339 MB/s [ 36215.5 IOPS]
+
+ Test : 1000 MB [C: 72.2% (57.3/79.4 GB)] (x5)
+ Date : 2013/04/13 23:10:09
+ OS : Windows 8 [6.2 Build 9200] (x64)
+
+
+Windows IOCP backend, 3.5Ghz Ivy Bridge Windows 8 x64 on
+my Samsung 256Gb 830 SSD drive:
+
+1000 file opens, writes 1 byte, closes, and deletes:
+It took 0.187081 secs to do all operations
+ It took 0.0079831 secs to dispatch all operations
+ It took 0.179098 secs to finish all operations
+
+It took 0.0789921 secs to do 12659.5 file opens per sec
+It took 0.0110014 secs to do 90897.5 file writes per sec
+It took 0.0250035 secs to do 39994.4 file closes per sec
+It took 0.0720843 secs to do 13872.6 file deletions per sec
+
+
+1000 file opens, writes 64Kb, closes, and deletes:
+It took 0.924099 secs to do all operations
+ It took 0.007996 secs to dispatch all operations
+ It took 0.916103 secs to finish all operations
+
+It took 0.0859878 secs to do 11629.6 file opens per sec
+It took 0.0230033 secs to do 43472 file writes per sec
+It took 0.7571 secs to do 1320.83 file closes per sec
+It took 0.0580077 secs to do 17239.1 file deletions per sec
+
+
+1000 file opens, writes 1 byte, closes, and deletes with synchronous i/o:
+It took 2.98316 secs to do all operations
+ It took 0.0446 secs to dispatch all operations
+ It took 2.93856 secs to finish all operations
+
+It took 2.71914 secs to do 367.763 file opens per sec
+It took 0.0359893 secs to do 27786 file writes per sec
+It took 0.151021 secs to do 6621.6 file closes per sec
+It took 0.0770071 secs to do 12985.8 file deletions per sec
+
+
+1000 file opens, writes 64Kb, closes, and deletes with synchronous i/o:
+It took 1.65352 secs to do all operations
+ It took 0.0149789 secs to dispatch all operations
+ It took 1.63854 secs to finish all operations
+
+It took 0.714499 secs to do 1399.58 file opens per sec
+It took 0.0420066 secs to do 23805.8 file writes per sec
+It took 0.835109 secs to do 1197.45 file closes per sec
+It took 0.0619072 secs to do 16153.2 file deletions per sec
+
+
+1000 file opens, writes 1 byte, closes, and deletes with autoflush i/o:
+It took 2.70265 secs to do all operations
+ It took 0.0089945 secs to dispatch all operations
+ It took 2.69366 secs to finish all operations
+
+It took 0.0759873 secs to do 13160.1 file opens per sec
+It took 0.0334323 secs to do 29911.2 file writes per sec
+It took 2.46722 secs to do 405.315 file closes per sec
+It took 0.126015 secs to do 7935.54 file deletions per sec
+
+
+1000 file opens, writes 64Kb, closes, and deletes with autoflush i/o:
+It took 2.79222 secs to do all operations
+ It took 0.0079943 secs to dispatch all operations
+ It took 2.78422 secs to finish all operations
+
+It took 0.0829872 secs to do 12050.1 file opens per sec
+It took 0.0381194 secs to do 26233.4 file writes per sec
+It took 2.6111 secs to do 382.98 file closes per sec
+It took 0.0600064 secs to do 16664.9 file deletions per sec
+
+
+1000 file opens, writes 1 byte, closes, and deletes with direct i/o:
+It took 0.178027 secs to do all operations
+ It took 0.0070116 secs to dispatch all operations
+ It took 0.171015 secs to finish all operations
+
+It took 0.0629898 secs to do 15875.6 file opens per sec
+It took 0.0110008 secs to do 90902.5 file writes per sec
+It took 0.0190018 secs to do 52626.6 file closes per sec
+It took 0.0850346 secs to do 11759.9 file deletions per sec
+
+
+1000 file opens, writes 64Kb, closes, and deletes with direct i/o:
+It took 1.67592 secs to do all operations
+ It took 0.0169852 secs to dispatch all operations
+ It took 1.65893 secs to finish all operations
+
+It took 0.711476 secs to do 1405.53 file opens per sec
+It took 0.0163148 secs to do 61294 file writes per sec
+It took 0.890117 secs to do 1123.45 file closes per sec
+It took 0.058008 secs to do 17239 file deletions per sec
+
+
+1000 file opens, writes 1 byte, closes, and deletes with direct synchronous i/o:
+
+It took 0.309121 secs to do all operations
+ It took 0.00698 secs to dispatch all operations
+ It took 0.302141 secs to finish all operations
+
+It took 0.138198 secs to do 7235.99 file opens per sec
+It took 0.0142443 secs to do 70203.5 file writes per sec
+It took 0.0796398 secs to do 12556.5 file closes per sec
+It took 0.0770388 secs to do 12980.5 file deletions per sec
+
+
+1000 file opens, writes 64Kb, closes, and deletes with direct synchronous i/o:
+It took 1.95023 secs to do all operations
+ It took 0.020987 secs to dispatch all operations
+ It took 1.92924 secs to finish all operations
+
+It took 0.967097 secs to do 1034.02 file opens per sec
+It took 0.0290068 secs to do 34474.7 file writes per sec
+It took 0.901115 secs to do 1109.74 file closes per sec
+It took 0.0530077 secs to do 18865.2 file deletions per sec
+
+
+
+
+
+iozone -e -I -a -s 1000M -r 4k -r 512k -i 0 -i 1 -i 2
+ random random bkwd record stride
+ KB reclen write rewrite read reread read write read rewrite read fwrite frewrite fread freread
+ 1024000 4 2528 3044 12000 11693 11337 931
+ 1024000 512 17393 17039 68703 68524 67958 3881
+
+iozone -e -I -s 31M -r 4k -t 32 -T -i 0 -i 2
+
+ Children see throughput for 2 initial writers = 1502.15 KB/sec
+ Parent sees throughput for 2 initial writers = 1502.13 KB/sec
+ Min throughput per thread = 751.07 KB/sec
+ Max throughput per thread = 751.08 KB/sec
+ Avg throughput per thread = 751.07 KB/sec
+ Min xfer = 511992.00 KB
+
+ Children see throughput for 2 rewriters = 1537.12 KB/sec
+ Parent sees throughput for 2 rewriters = 1537.11 KB/sec
+ Min throughput per thread = 768.34 KB/sec
+ Max throughput per thread = 768.77 KB/sec
+ Avg throughput per thread = 768.56 KB/sec
+ Min xfer = 511716.00 KB
+
+ Children see throughput for 2 random readers = 9044.48 KB/sec
+ Parent sees throughput for 2 random readers = 9044.42 KB/sec
+ Min throughput per thread = 4521.79 KB/sec
+ Max throughput per thread = 4522.69 KB/sec
+ Avg throughput per thread = 4522.24 KB/sec
+ Min xfer = 511900.00 KB
+
+ Children see throughput for 2 random writers = 825.19 KB/sec
+ Parent sees throughput for 2 random writers = 825.14 KB/sec
+ Min throughput per thread = 412.52 KB/sec
+ Max throughput per thread = 412.67 KB/sec
+ Avg throughput per thread = 412.60 KB/sec
+ Min xfer = 511812.00 KB
+
+
+From these I infer:
+
+ Sequential Read : 67.09 MB/s
+ Sequential Write : 16.98 MB/s
+ Random Read 512KB : 66.36 MB/s
+ Random Write 512KB : 3.79 MB/s
+ Random Read 4KB (QD=1) : 11.42 MB/s [ 2834.3 IOPS]
+ Random Write 4KB (QD=1) : 0.91 MB/s [ 232.8 IOPS]
+ Random Read 4KB (QD=32) : ? MB/s [ ? IOPS]
+ Random Write 4KB (QD=32) : ? MB/s [ ? IOPS]
+
+
+POSIX compat backend, 1.7Ghz ARM Cortex-A15 Linux 3.4 on
+Samsung Chromebook eMMC internal drive:
+
+1000 file opens, writes 1 byte, closes, and deletes:
+It took 0.386876 secs to do all operations
+ It took 0.110156 secs to dispatch all operations
+ It took 0.27672 secs to finish all operations
+
+It took 0.181143 secs to do 5520.5 file opens per sec
+It took 0.094321 secs to do 10602.1 file writes per sec
+It took 0.070552 secs to do 14173.9 file closes per sec
+It took 0.04086 secs to do 24473.8 file deletions per sec
+
+
+1000 file opens, writes 64Kb, closes, and deletes:
+It took 0.425939 secs to do all operations
+ It took 0.147966 secs to dispatch all operations
+ It took 0.277973 secs to finish all operations
+
+It took 0.17901 secs to do 5586.28 file opens per sec
+It took 0.152722 secs to do 6547.85 file writes per sec
+It took 0.054538 secs to do 18335.8 file closes per sec
+It took 0.039669 secs to do 25208.6 file deletions per sec
+
+
+1000 file opens, writes 1 byte, closes, and deletes with synchronous i/o:
+It took 19.4941 secs to do all operations
+ It took 0.07904 secs to dispatch all operations
+ It took 19.4151 secs to finish all operations
+
+It took 13.323 secs to do 75.058 file opens per sec
+It took 6.06393 secs to do 164.909 file writes per sec
+It took 0.071753 secs to do 13936.7 file closes per sec
+It took 0.035389 secs to do 28257.4 file deletions per sec
+
+
+1000 file opens, writes 64Kb, closes, and deletes with synchronous i/o:
+It took 22.8757 secs to do all operations
+ It took 0.102336 secs to dispatch all operations
+ It took 22.7734 secs to finish all operations
+
+It took 5.35023 secs to do 186.908 file opens per sec
+It took 17.498 secs to do 57.1495 file writes per sec
+It took 0.014796 secs to do 67585.8 file closes per sec
+It took 0.012747 secs to do 78449.8 file deletions per sec
+
+
+1000 file opens, writes 1 byte, closes, and deletes with autoflush i/o:
+It took 13.2068 secs to do all operations
+ It took 0.085519 secs to dispatch all operations
+ It took 13.1213 secs to finish all operations
+
+It took 9.65411 secs to do 103.583 file opens per sec
+It took 3.40673 secs to do 293.537 file writes per sec
+It took 0.119205 secs to do 8388.91 file closes per sec
+It took 0.02677 secs to do 37355.2 file deletions per sec
+
+
+1000 file opens, writes 64Kb, closes, and deletes with autoflush i/o:
+It took 24.0624 secs to do all operations
+ It took 0.092833 secs to dispatch all operations
+ It took 23.9695 secs to finish all operations
+
+It took 12.9862 secs to do 77.0047 file opens per sec
+It took 10.8002 secs to do 92.5906 file writes per sec
+It took 0.219705 secs to do 4551.56 file closes per sec
+It took 0.05619 secs to do 17796.8 file deletions per sec
+
+
+1000 file opens, writes 1 byte, closes, and deletes with direct i/o:
+[Started testing]
+
+[Running: async_io/works/1/direct]
+unittests/main.cpp:266: !(((size_t) &towrite.front()) & 4095) failed with unexpected exception with message: 'Invalid argument (22) in 'triplegit/src/async_file_io.cpp':dowrite:884'
+[Finished: 'async_io/works/1/direct' 1 test case failed (1 of 2 assertions failed)]
+
+
+1000 file opens, writes 64Kb, closes, and deletes with direct i/o:
+It took 6.84248 secs to do all operations
+ It took 0.125639 secs to dispatch all operations
+ It took 6.71684 secs to finish all operations
+
+It took 0.204354 secs to do 4893.47 file opens per sec
+It took 6.58176 secs to do 151.935 file writes per sec
+It took 0.025033 secs to do 39947.3 file closes per sec
+It took 0.031331 secs to do 31917.3 file deletions per sec
+
+
+1000 file opens, writes 1 byte, closes, and deletes with direct synchronous i/o:
+It took 7.00683 secs to do all operations
+ It took 0.054578 secs to dispatch all operations
+ It took 6.95225 secs to finish all operations
+
+It took 6.88883 secs to do 145.163 file opens per sec
+It took 0.057979 secs to do 17247.6 file writes per sec
+It took 0.030898 secs to do 32364.6 file closes per sec
+It took 0.029125 secs to do 34334.8 file deletions per sec
+
+
+1000 file opens, writes 64Kb, closes, and deletes with direct synchronous i/o:
+It took 24.9112 secs to do all operations
+ It took 0.058847 secs to dispatch all operations
+ It took 24.8524 secs to finish all operations
+
+It took 11.8282 secs to do 84.5438 file opens per sec
+It took 13.0079 secs to do 76.8762 file writes per sec
+It took 0.057255 secs to do 17465.7 file closes per sec
+It took 0.017878 secs to do 55934.7 file deletions per sec
+
+*/
+
+namespace triplegit {
+//! \brief The namespace containing the Boost.ASIO asynchronous file i/o implementation.
+namespace async_io {
+
+#ifdef __GNUC__
+typedef boost::thread thread;
+#else
+typedef std::thread thread;
+#endif
+
+// This isn't consistent on MSVC so hard code it
+typedef unsigned long long off_t;
+
+#define ASYNC_FILE_IO_FORWARD_STL_IMPL(M, B) \
+template<class T> class M : public B<T> \
+{ \
+public: \
+ M() { } \
+ M(const B<T> &o) : B<T>(o) { } \
+ M(B<T> &&o) : B<T>(std::move(o)) { } \
+ M(const M &o) : B<T>(o) { } \
+ M(M &&o) : B<T>(std::move(o)) { } \
+ M &operator=(const B<T> &o) { static_cast<B<T> &&>(*this)=o; return *this; } \
+ M &operator=(B<T> &&o) { static_cast<B<T> &&>(*this)=std::move(o); return *this; } \
+ M &operator=(const M &o) { static_cast<B<T> &&>(*this)=o; return *this; } \
+ M &operator=(M &&o) { static_cast<B<T> &&>(*this)=std::move(o); return *this; } \
+};
+#define ASYNC_FILE_IO_FORWARD_STL_IMPL_NC(M, B) \
+template<class T> class M : public B<T> \
+{ \
+public: \
+ M() { } \
+ M(B<T> &&o) : B<T>(std::move(o)) { } \
+ M(M &&o) : B<T>(std::move(o)) { } \
+ M &operator=(B<T> &&o) { static_cast<B<T> &&>(*this)=std::move(o); return *this; } \
+ M &operator=(M &&o) { static_cast<B<T> &&>(*this)=std::move(o); return *this; } \
+};
+/*! \class future
+\brief For now, this is boost's future. Will be replaced when C++'s future catches up with boost's
+
+when_all() and when_any() definitions borrowed from http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3428.pdf
+*/
+#if BOOST_THREAD_VERSION >=4
+ASYNC_FILE_IO_FORWARD_STL_IMPL_NC(future, boost::future)
+#else
+ASYNC_FILE_IO_FORWARD_STL_IMPL_NC(future, boost::unique_future)
+#endif
+/*! \class shared_future
+\brief For now, this is boost's shared_future. Will be replaced when C++'s shared_future catches up with boost's
+
+when_all() and when_any() definitions borrowed from http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3428.pdf
+*/
+ASYNC_FILE_IO_FORWARD_STL_IMPL(shared_future, boost::shared_future)
+/*! \class promise
+\brief For now, this is boost's promise. Will be replaced when C++'s promise catches up with boost's
+*/
+ASYNC_FILE_IO_FORWARD_STL_IMPL(promise, boost::promise)
+/*! \brief For now, this is boost's exception_ptr. Will be replaced when C++'s exception_ptr catches up with boost's
+*/
+typedef boost::exception_ptr exception_ptr;
+template<class T> inline exception_ptr make_exception_ptr(const T &e) { return boost::copy_exception(e); }
+using std::current_exception;
+/*! \brief For now, this is an emulation of std::packaged_task based on boost's packaged_task.
+We have to drop the Args... support because it segfaults MSVC Nov 2012 CTP.
+*/
+template<class> class packaged_task;
+template<class R> class packaged_task<R()>
+#if BOOST_THREAD_VERSION >=4
+: public boost::packaged_task<R()>
+{
+ typedef boost::packaged_task<R()> Base;
+#else
+: public boost::packaged_task<R>
+ {
+ typedef boost::packaged_task<R> Base;
+#endif
+public:
+ packaged_task() { }
+ packaged_task(Base &&o) : Base(std::move(o)) { }
+ packaged_task(packaged_task &&o) : Base(static_cast<Base &&>(o)) { }
+ template<class T> packaged_task(T &&o) : Base(std::forward<T>(o)) { }
+ packaged_task &operator=(Base &&o) { static_cast<Base &&>(*this)=std::move(o); return *this; }
+ packaged_task &operator=(packaged_task &&o) { static_cast<Base &&>(*this)=std::move(o); return *this; }
+};
+
+/*! \class thread_pool
+\brief A very simple thread pool based on Boost.ASIO and std::thread
+*/
+class thread_pool {
+ class worker
+ {
+ thread_pool *pool;
+ public:
+ explicit worker(thread_pool *p) : pool(p) { }
+ void operator()()
+ {
+ pool->service.run();
+ }
+ };
+ friend class worker;
+
+ std::vector< std::unique_ptr<thread> > workers;
+ boost::asio::io_service service;
+ boost::asio::io_service::work working;
+public:
+ //! Constructs a thread pool of \em no workers
+ explicit thread_pool(size_t no) : working(service)
+ {
+ workers.reserve(no);
+ for(size_t n=0; n<no; n++)
+ workers.push_back(std::unique_ptr<thread>(new thread(worker(this))));
+ }
+ ~thread_pool()
+ {
+ service.stop();
+ for(auto &i : workers)
+ i->join();
+ }
+ //! Returns the underlying io_service
+ boost::asio::io_service &io_service() { return service; }
+ //! Sends some callable entity to the thread pool for execution
+ template<class F> future<typename std::result_of<F()>::type> enqueue(F f)
+ {
+ typedef typename std::result_of<F()>::type R;
+ // Somewhat annoyingly, io_service.post() needs its parameter to be copy constructible,
+ // and packaged_task is only move constructible, so ...
+ auto task=std::make_shared<packaged_task<R()>>(std::move(f));
+ service.post(std::bind([](std::shared_ptr<packaged_task<R()>> t) { (*t)(); }, task));
+ return task->get_future();
+ }
+};
+//! Returns the process threadpool
+extern TRIPLEGIT_ASYNC_FILE_IO_API thread_pool &process_threadpool();
+
+namespace detail {
+ template<class returns_t, class future_type> inline returns_t when_all_do(std::shared_ptr<std::vector<future_type>> futures)
+ {
+ boost::wait_for_all(futures->begin(), futures->end());
+ returns_t ret;
+ ret.reserve(futures->size());
+ std::for_each(futures->begin(), futures->end(), [&ret](future_type &f) { ret.push_back(std::move(f.get())); });
+ return ret;
+ }
+ template<class returns_t, class future_type> inline returns_t when_any_do(std::shared_ptr<std::vector<future_type>> futures)
+ {
+ typename std::vector<future_type>::iterator it=boost::wait_for_any(futures->begin(), futures->end());
+ return std::make_pair(std::distance(futures->begin(), it), std::move(it->get()));
+ }
+}
+//! Returns a future vector of results from all the supplied futures
+template <class InputIterator> inline future<std::vector<typename std::decay<decltype(((typename InputIterator::value_type *) 0)->get())>::type>> when_all(InputIterator first, InputIterator last)
+{
+ typedef typename InputIterator::value_type future_type;
+ typedef typename std::decay<decltype(((typename InputIterator::value_type *) 0)->get())>::type value_type;
+ typedef std::vector<value_type> returns_t;
+ // Take a copy of the futures supplied to us (which may invalidate them)
+ auto futures=std::make_shared<std::vector<future_type>>(std::make_move_iterator(first), std::make_move_iterator(last));
+ // Bind to my delegate and invoke
+ std::function<returns_t ()> waitforall(std::move(std::bind(&detail::when_all_do<returns_t, future_type>, futures)));
+ return process_threadpool().enqueue(std::move(waitforall));
+}
+//! Returns a future tuple of results from all the supplied futures
+//template <typename... T> inline future<std::tuple<typename std::decay<T...>::type>> when_all(T&&... futures);
+//! Returns a future result from the first of the supplied futures
+template <class InputIterator> inline future<std::pair<size_t, typename std::decay<decltype(((typename InputIterator::value_type *) 0)->get())>::type>> when_any(InputIterator first, InputIterator last)
+{
+ typedef typename InputIterator::value_type future_type;
+ typedef typename std::decay<decltype(((typename InputIterator::value_type *) 0)->get())>::type value_type;
+ typedef std::pair<size_t, typename std::decay<decltype(((typename InputIterator::value_type *) 0)->get())>::type> returns_t;
+ // Take a copy of the futures supplied to us (which may invalidate them)
+ auto futures=std::make_shared<std::vector<future_type>>(std::make_move_iterator(first), std::make_move_iterator(last));
+ // Bind to my delegate and invoke
+ std::function<returns_t ()> waitforall(std::move(std::bind(&detail::when_any_do<returns_t, future_type>, futures)));
+ return process_threadpool().enqueue(std::move(waitforall));
+}
+//! Returns a future result from the first of the supplied futures
+/*template <typename... T> inline future<std::pair<size_t, typename std::decay<T>::type>> when_any(T&&... futures)
+{
+ std::array<T..., sizeof...(T)> f={ futures...};
+ return when_any(f.begin(), f.end());
+}*/
+
+class async_file_io_dispatcher_base;
+struct async_io_op;
+struct async_path_op_req;
+template<class T> struct async_data_op_req;
+
+namespace detail {
+
+ struct async_io_handle_posix;
+ struct async_io_handle_windows;
+ struct async_file_io_dispatcher_base_p;
+ class async_file_io_dispatcher_compat;
+ class async_file_io_dispatcher_windows;
+ class async_file_io_dispatcher_linux;
+ class async_file_io_dispatcher_qnx;
+ //! \brief May occasionally be useful to access to discover information about an open handle
+ class async_io_handle : public std::enable_shared_from_this<async_io_handle>
+ {
+ friend class async_file_io_dispatcher_base;
+ friend struct async_io_handle_posix;
+ friend struct async_io_handle_windows;
+ friend class async_file_io_dispatcher_compat;
+ friend class async_file_io_dispatcher_windows;
+ friend class async_file_io_dispatcher_linux;
+ friend class async_file_io_dispatcher_qnx;
+
+ async_file_io_dispatcher_base *_parent;
+ std::chrono::system_clock::time_point _opened;
+ std::filesystem::path _path; // guaranteed canonical
+ protected:
+ std::atomic<off_t> bytesread, byteswritten, byteswrittenatlastfsync;
+ async_io_handle(async_file_io_dispatcher_base *parent, const std::filesystem::path &path) : _parent(parent), _opened(std::chrono::system_clock::now()), _path(path), bytesread(0), byteswritten(0), byteswrittenatlastfsync(0) { }
+ public:
+ virtual ~async_io_handle() { }
+ //! Returns the parent of this io handle
+ async_file_io_dispatcher_base *parent() const { return _parent; }
+ //! Returns the native handle of this io handle
+ virtual void *native_handle() const=0;
+ //! Returns when this handle was opened
+ const std::chrono::system_clock::time_point &opened() const { return _opened; }
+ //! Returns the path of this io handle
+ const std::filesystem::path &path() const { return _path; }
+ //! Returns how many bytes have been read since this handle was opened.
+ off_t read_count() const { return bytesread; }
+ //! Returns how many bytes have been written since this handle was opened.
+ off_t write_count() const { return byteswritten; }
+ //! Returns how many bytes have been written since this handle was last fsynced.
+ off_t write_count_since_fsync() const { return byteswritten-byteswrittenatlastfsync; }
+ };
+ struct immediate_async_ops;
+}
+
+
+#define ASYNC_FILEIO_DECLARE_CLASS_ENUM_AS_BITFIELD(type) \
+inline type operator&(type a, type b) \
+{ \
+ return static_cast<type>(static_cast<size_t>(a) & static_cast<size_t>(b)); \
+} \
+inline type operator|(type a, type b) \
+{ \
+ return static_cast<type>(static_cast<size_t>(a) | static_cast<size_t>(b)); \
+} \
+inline type operator~(type a) \
+{ \
+ return static_cast<type>(~static_cast<size_t>(a)); \
+} \
+inline bool operator!(type a) \
+{ \
+ return 0==static_cast<size_t>(a); \
+}
+/*! \enum open_flags
+\brief Bitwise file and directory open flags
+*/
+enum class file_flags : size_t
+{
+ None=0, //!< No flags set
+ Read=1, //!< Read access
+ Write=2, //!< Write access
+ Append=4, //!< Append only
+ Truncate=8, //!< Truncate existing file to zero
+ Create=16, //!< Open and create if doesn't exist
+ CreateOnlyIfNotExist=32, //!< Create and open only if doesn't exist
+ AutoFlush=64, //!< Automatically initiate an asynchronous flush just before file close, and fuse both operations so both must complete for close to complete.
+ WillBeSequentiallyAccessed=128, //!< Will be exclusively either read or written sequentially. If you're exclusively writing sequentially, \em strongly consider turning on OSDirect too.
+
+ OSDirect=(1<<16), //!< Bypass the OS file buffers (only really useful for writing large files. Note you must 4Kb align everything if this is on)
+ OSSync=(1<<17) //!< Ask the OS to not complete until the data is on the physical storage. Best used only with Direct, otherwise use AutoFlush.
+
+};
+ASYNC_FILEIO_DECLARE_CLASS_ENUM_AS_BITFIELD(file_flags)
+enum class async_op_flags : size_t
+{
+ None=0, //!< No flags set
+ DetachedFuture=1, //!< The specified completion routine may choose to not complete immediately
+ ImmediateCompletion=2 //!< Call chained completion immediately instead of scheduling for later. Make SURE your completion can not block!
+};
+ASYNC_FILEIO_DECLARE_CLASS_ENUM_AS_BITFIELD(async_op_flags)
+
+
+/*! \class async_file_io_dispatcher_base
+\brief Abstract base class for dispatching file i/o asynchronously
+*/
+class TRIPLEGIT_ASYNC_FILE_IO_API async_file_io_dispatcher_base : public std::enable_shared_from_this<async_file_io_dispatcher_base>
+{
+ //friend TRIPLEGIT_ASYNC_FILE_IO_API std::shared_ptr<async_file_io_dispatcher_base> async_file_io_dispatcher(thread_pool &threadpool=process_threadpool(), file_flags flagsforce=file_flags::None, file_flags flagsmask=file_flags::None);
+ friend struct detail::async_io_handle_posix;
+ friend struct detail::async_io_handle_windows;
+ friend class detail::async_file_io_dispatcher_compat;
+ friend class detail::async_file_io_dispatcher_windows;
+ friend class detail::async_file_io_dispatcher_linux;
+ friend class detail::async_file_io_dispatcher_qnx;
+
+ detail::async_file_io_dispatcher_base_p *p;
+ void int_add_io_handle(void *key, std::shared_ptr<detail::async_io_handle> h);
+ void int_del_io_handle(void *key);
+protected:
+ async_file_io_dispatcher_base(thread_pool &threadpool, file_flags flagsforce, file_flags flagsmask);
+public:
+ virtual ~async_file_io_dispatcher_base();
+
+ //! Returns the thread pool used by this dispatcher
+ thread_pool &threadpool() const;
+ //! Returns file flags as would be used after forcing and masking
+ file_flags fileflags(file_flags flags) const;
+ //! Returns the current wait queue depth of this dispatcher
+ size_t wait_queue_depth() const;
+ //! Returns the number of open items in this dispatcher
+ size_t count() const;
+
+ typedef std::pair<bool, std::shared_ptr<detail::async_io_handle>> completion_returntype;
+ typedef completion_returntype completion_t(size_t, std::shared_ptr<detail::async_io_handle>);
+ //! Invoke the specified function when each of the supplied operations complete
+ std::vector<async_io_op> completion(const std::vector<async_io_op> &ops, const std::vector<std::pair<async_op_flags, std::function<completion_t>>> &callbacks);
+ //! Invoke the specified function when the supplied operation completes
+ inline async_io_op completion(const async_io_op &req, const std::pair<async_op_flags, std::function<completion_t>> &callback);
+
+ //! Invoke the specified callable when the supplied operation completes
+ template<class R> inline std::pair<std::vector<future<R>>, std::vector<async_io_op>> call(const std::vector<async_io_op> &ops, const std::vector<std::function<R()>> &callables);
+ //! Invoke the specified callable when the supplied operation completes
+ template<class C, class... Args> inline std::pair<future<typename std::result_of<C(Args...)>::type>, async_io_op> call(const async_io_op &req, C callback, Args... args);
+
+ //! Asynchronously creates directories
+ virtual std::vector<async_io_op> dir(const std::vector<async_path_op_req> &reqs)=0;
+ //! Asynchronously creates a directory
+ inline async_io_op dir(const async_path_op_req &req);
+ //! Asynchronously deletes directories
+ virtual std::vector<async_io_op> rmdir(const std::vector<async_path_op_req> &reqs)=0;
+ //! Asynchronously deletes a directory
+ inline async_io_op rmdir(const async_path_op_req &req);
+ //! Asynchronously opens or creates files
+ virtual std::vector<async_io_op> file(const std::vector<async_path_op_req> &reqs)=0;
+ //! Asynchronously opens or creates a file
+ inline async_io_op file(const async_path_op_req &req);
+ //! Asynchronously deletes files
+ virtual std::vector<async_io_op> rmfile(const std::vector<async_path_op_req> &reqs)=0;
+ //! Asynchronously deletes files
+ inline async_io_op rmfile(const async_path_op_req &req);
+ //! Asynchronously synchronises items with physical storage once they complete
+ virtual std::vector<async_io_op> sync(const std::vector<async_io_op> &ops)=0;
+ //! Asynchronously synchronises an item with physical storage once it completes
+ inline async_io_op sync(const async_io_op &req);
+ //! Asynchronously closes connections to items once they complete
+ virtual std::vector<async_io_op> close(const std::vector<async_io_op> &ops)=0;
+ //! Asynchronously closes the connection to an item once it completes
+ inline async_io_op close(const async_io_op &req);
+
+ //! Asynchronously reads data from items
+ virtual std::vector<async_io_op> read(const std::vector<async_data_op_req<void>> &ops)=0;
+ //! Asynchronously reads data from an item
+ inline async_io_op read(const async_data_op_req<void> &req);
+ //! Asynchronously reads data from items
+ template<class T> inline std::vector<async_io_op> read(const std::vector<async_data_op_req<T>> &ops);
+ //! Asynchronously writes data to items
+ virtual std::vector<async_io_op> write(const std::vector<async_data_op_req<const void>> &ops)=0;
+ //! Asynchronously writes data to an item
+ inline async_io_op write(const async_data_op_req<const void> &req);
+ //! Asynchronously writes data to items
+ template<class T> inline std::vector<async_io_op> write(const std::vector<async_data_op_req<T>> &ops);
+
+ //! Convenience function for truncating the lengths of items via std::filesystem::resize_file()
+ inline std::vector<async_io_op> truncate(const std::vector<async_io_op> &ops, const std::vector<off_t> &sizes);
+ //! Convenience function for truncating the length of an item via std::filesystem::resize_file()
+ inline async_io_op truncate(const async_io_op &op, off_t newsize);
+protected:
+ void complete_async_op(size_t id, std::shared_ptr<detail::async_io_handle> h, exception_ptr e=exception_ptr());
+ completion_returntype invoke_user_completion(size_t id, std::shared_ptr<detail::async_io_handle> h, std::function<completion_t> callback);
+ template<class F, class... Args> std::shared_ptr<detail::async_io_handle> invoke_async_op_completions(size_t id, std::shared_ptr<detail::async_io_handle> h, completion_returntype (F::*f)(size_t, std::shared_ptr<detail::async_io_handle>, Args...), Args... args);
+ template<class F, class... Args> async_io_op chain_async_op(detail::immediate_async_ops &immediates, int optype, const async_io_op &precondition, async_op_flags flags, completion_returntype (F::*f)(size_t, std::shared_ptr<detail::async_io_handle>, Args...), Args... args);
+ template<class F, class T> std::vector<async_io_op> chain_async_ops(int optype, const std::vector<T> &container, async_op_flags flags, completion_returntype (F::*f)(size_t, std::shared_ptr<detail::async_io_handle>, T));
+ template<class F> std::vector<async_io_op> chain_async_ops(int optype, const std::vector<async_path_op_req> &container, async_op_flags flags, completion_returntype (F::*f)(size_t, std::shared_ptr<detail::async_io_handle>, async_path_op_req));
+ template<class F, class T> std::vector<async_io_op> chain_async_ops(int optype, const std::vector<async_data_op_req<T>> &container, async_op_flags flags, completion_returntype (F::*f)(size_t, std::shared_ptr<detail::async_io_handle>, async_data_op_req<T>));
+};
+/*! \brief Instatiates the best available async_file_io_dispatcher implementation for this system.
+
+\em flagsforce is ORed with any opened file flags. The NOT of \em flags mask is ANDed with any opened flags.
+
+Note that the number of threads in the threadpool supplied is the maximum non-async op queue depth (e.g. file opens, closes etc.).
+For fast SSDs, there isn't much gain after eight-sixteen threads, so the process threadpool is set to eight by default.
+For slow hard drives, or worse, SANs, a queue depth of 64 or higher might deliver significant benefits.
+*/
+extern TRIPLEGIT_ASYNC_FILE_IO_API std::shared_ptr<async_file_io_dispatcher_base> async_file_io_dispatcher(thread_pool &threadpool=process_threadpool(), file_flags flagsforce=file_flags::None, file_flags flagsmask=file_flags::None);
+
+/*! \struct async_io_op
+\brief A reference to an async operation
+*/
+struct async_io_op
+{
+ std::shared_ptr<async_file_io_dispatcher_base> parent; //!< The parent dispatcher
+ size_t id; //!< A unique id for this operation
+ shared_future<std::shared_ptr<detail::async_io_handle>> h; //!< A future handle to the item being operated upon
+
+ async_io_op() : id(0) { }
+ async_io_op(const async_io_op &o) : parent(o.parent), id(o.id), h(o.h) { }
+ async_io_op(async_io_op &&o) : parent(std::move(o.parent)), id(std::move(o.id)), h(std::move(o.h)) { }
+ async_io_op(std::shared_ptr<async_file_io_dispatcher_base> _parent, size_t _id, shared_future<std::shared_ptr<detail::async_io_handle>> _handle) : parent(_parent), id(_id), h(std::move(_handle)) { }
+ async_io_op(std::shared_ptr<async_file_io_dispatcher_base> _parent, size_t _id) : parent(_parent), id(_id) { }
+ async_io_op &operator=(const async_io_op &o) { parent=o.parent; id=o.id; h=o.h; return *this; }
+ async_io_op &operator=(async_io_op &&o) { parent=std::move(o.parent); id=std::move(o.id); h=std::move(o.h); return *this; }
+};
+
+namespace detail
+{
+ struct when_all_count_completed_state
+ {
+ std::atomic<size_t> togo;
+ std::vector<std::shared_ptr<detail::async_io_handle>> out;
+ promise<std::vector<std::shared_ptr<detail::async_io_handle>>> done;
+ when_all_count_completed_state(size_t outsize) : togo(outsize), out(outsize) { }
+ };
+ inline async_file_io_dispatcher_base::completion_returntype when_all_count_completed_nothrow(size_t, std::shared_ptr<detail::async_io_handle> h, std::shared_ptr<detail::when_all_count_completed_state> state, size_t idx)
+ {
+ state->out[idx]=h; // This might look thread unsafe, but each idx is unique
+ if(!--state->togo)
+ state->done.set_value(state->out);
+ return std::make_pair(true, h);
+ }
+ inline async_file_io_dispatcher_base::completion_returntype when_all_count_completed(size_t, std::shared_ptr<detail::async_io_handle> h, std::shared_ptr<detail::when_all_count_completed_state> state, size_t idx)
+ {
+ state->out[idx]=h; // This might look thread unsafe, but each idx is unique
+ if(!--state->togo)
+ {
+ bool done=false;
+ try
+ {
+ for(auto &i : state->out)
+ i.get();
+ }
+#ifdef _MSC_VER
+ catch(const std::exception &)
+#else
+ catch(...)
+#endif
+ {
+ exception_ptr e(async_io::make_exception_ptr(current_exception()));
+ state->done.set_exception(e);
+ done=true;
+ }
+ if(!done)
+ state->done.set_value(state->out);
+ }
+ return std::make_pair(true, h);
+ }
+}
+
+//! \brief Convenience overload for a vector of async_io_op. Does not retrieve exceptions.
+inline future<std::vector<std::shared_ptr<detail::async_io_handle>>> when_all(std::nothrow_t, std::vector<async_io_op>::iterator first, std::vector<async_io_op>::iterator last)
+{
+ if(first==last)
+ return future<std::vector<std::shared_ptr<detail::async_io_handle>>>();
+ std::vector<async_io_op> inputs(first, last);
+ std::shared_ptr<detail::when_all_count_completed_state> state(new detail::when_all_count_completed_state(inputs.size()));
+ std::vector<std::pair<async_op_flags, std::function<async_file_io_dispatcher_base::completion_t>>> callbacks;
+ callbacks.reserve(inputs.size());
+ size_t idx=0;
+ for(auto &i : inputs)
+ callbacks.push_back(std::make_pair(async_op_flags::ImmediateCompletion, std::bind(&detail::when_all_count_completed_nothrow, std::placeholders::_1, std::placeholders::_2, state, idx++)));
+ inputs.front().parent->completion(inputs, callbacks);
+ return state->done.get_future();
+}
+//! \brief Convenience overload for a vector of async_io_op. Retrieves exceptions.
+inline future<std::vector<std::shared_ptr<detail::async_io_handle>>> when_all(std::vector<async_io_op>::iterator first, std::vector<async_io_op>::iterator last)
+{
+ if(first==last)
+ return future<std::vector<std::shared_ptr<detail::async_io_handle>>>();
+ std::vector<async_io_op> inputs(first, last);
+ std::shared_ptr<detail::when_all_count_completed_state> state(new detail::when_all_count_completed_state(inputs.size()));
+ std::vector<std::pair<async_op_flags, std::function<async_file_io_dispatcher_base::completion_t>>> callbacks;
+ callbacks.reserve(inputs.size());
+ size_t idx=0;
+ for(auto &i : inputs)
+ callbacks.push_back(std::make_pair(async_op_flags::ImmediateCompletion, std::bind(&detail::when_all_count_completed, std::placeholders::_1, std::placeholders::_2, state, idx++)));
+ inputs.front().parent->completion(inputs, callbacks);
+ return state->done.get_future();
+}
+//! \brief Convenience overload for a list of async_io_op. Does not retrieve exceptions.
+inline future<std::vector<std::shared_ptr<detail::async_io_handle>>> when_all(std::nothrow_t _, std::initializer_list<async_io_op> _ops)
+{
+ std::vector<async_io_op> ops;
+ ops.reserve(_ops.size());
+ for(auto &&i : _ops)
+ ops.push_back(std::move(i));
+ return when_all(_, ops.begin(), ops.end());
+}
+//! \brief Convenience overload for a list of async_io_op. Retrieves exceptions.
+inline future<std::vector<std::shared_ptr<detail::async_io_handle>>> when_all(std::initializer_list<async_io_op> _ops)
+{
+ std::vector<async_io_op> ops;
+ ops.reserve(_ops.size());
+ for(auto &&i : _ops)
+ ops.push_back(std::move(i));
+ return when_all(ops.begin(), ops.end());
+}
+
+/*! \struct async_path_op_req
+\brief A convenience bundle of path and flags, with optional precondition
+*/
+struct async_path_op_req
+{
+ std::filesystem::path path;
+ file_flags flags;
+ async_io_op precondition;
+ async_path_op_req() { }
+ //! Fails is path is not absolute
+ async_path_op_req(std::filesystem::path _path, file_flags _flags=file_flags::None) : path(_path), flags(_flags) { if(!path.is_absolute()) throw std::runtime_error("Non-absolute path"); }
+ //! Fails is path is not absolute
+ async_path_op_req(async_io_op _precondition, std::filesystem::path _path, file_flags _flags=file_flags::None) : path(_path), flags(_flags), precondition(std::move(_precondition)) { if(!path.is_absolute()) throw std::runtime_error("Non-absolute path"); }
+ //! Constructs on the basis of a string. make_preferred() and absolute() are called in this case.
+ async_path_op_req(std::string _path, file_flags _flags=file_flags::None) : path(std::filesystem::absolute(std::filesystem::path(_path).make_preferred())), flags(_flags) { }
+ //! Constructs on the basis of a string. make_preferred() and absolute() are called in this case.
+ async_path_op_req(async_io_op _precondition, std::string _path, file_flags _flags=file_flags::None) : path(std::filesystem::absolute(std::filesystem::path(_path).make_preferred())), flags(_flags), precondition(std::move(_precondition)) { }
+ //! Constructs on the basis of a string. make_preferred() and absolute() are called in this case.
+ async_path_op_req(const char *_path, file_flags _flags=file_flags::None) : path(std::filesystem::absolute(std::filesystem::path(_path).make_preferred())), flags(_flags) { }
+ //! Constructs on the basis of a string. make_preferred() and absolute() are called in this case.
+ async_path_op_req(async_io_op _precondition, const char *_path, file_flags _flags=file_flags::None) : path(std::filesystem::absolute(std::filesystem::path(_path).make_preferred())), flags(_flags), precondition(std::move(_precondition)) { }
+};
+
+/*! \struct async_data_op_req
+\brief A convenience bundle of precondition, data and where. Data \b MUST stay around until the operation completes.
+*/
+template<> struct async_data_op_req<void> // For reading
+{
+ async_io_op precondition;
+ std::vector<boost::asio::mutable_buffer> buffers;
+ off_t where;
+ async_data_op_req() { }
+ async_data_op_req(const async_data_op_req &o) : precondition(o.precondition), buffers(o.buffers), where(o.where) { }
+ async_data_op_req(async_data_op_req &&o) : precondition(std::move(o.precondition)), buffers(std::move(o.buffers)), where(std::move(o.where)) { }
+ async_data_op_req(async_io_op _precondition, void *_buffer, size_t _length, off_t _where) : precondition(std::move(_precondition)), where(_where) { buffers.reserve(1); buffers.push_back(boost::asio::mutable_buffer(_buffer, _length)); }
+ async_data_op_req(async_io_op _precondition, std::vector<boost::asio::mutable_buffer> _buffers, off_t _where) : precondition(std::move(_precondition)), buffers(_buffers), where(_where) { }
+};
+template<> struct async_data_op_req<const void> // For writing
+{
+ async_io_op precondition;
+ std::vector<boost::asio::const_buffer> buffers;
+ off_t where;
+ async_data_op_req() { }
+ async_data_op_req(const async_data_op_req &o) : precondition(o.precondition), buffers(o.buffers), where(o.where) { }
+ async_data_op_req(async_data_op_req &&o) : precondition(std::move(o.precondition)), buffers(std::move(o.buffers)), where(std::move(o.where)) { }
+ async_data_op_req(const async_data_op_req<void> &o) : precondition(o.precondition), where(o.where) { buffers.reserve(o.buffers.capacity()); for(auto &i: o.buffers) buffers.push_back(i); }
+ async_data_op_req(async_data_op_req<void> &&o) : precondition(std::move(o.precondition)), where(o.where) { buffers.reserve(o.buffers.capacity()); for(auto &&i: o.buffers) buffers.push_back(std::move(i)); }
+ async_data_op_req(async_io_op _precondition, const void *_buffer, size_t _length, off_t _where) : precondition(std::move(_precondition)), where(_where) { buffers.reserve(1); buffers.push_back(boost::asio::const_buffer(_buffer, _length)); }
+ async_data_op_req(async_io_op _precondition, std::vector<boost::asio::const_buffer> _buffers, off_t _where) : precondition(std::move(_precondition)), buffers(_buffers), where(_where) { }
+};
+//! \brief A specialisation for any pointer to type T
+template<class T> struct async_data_op_req : public async_data_op_req<void>
+{
+ async_data_op_req() { }
+ async_data_op_req(const async_data_op_req &o) : async_data_op_req<void>(o) { }
+ async_data_op_req(async_data_op_req &&o) : async_data_op_req<void>(std::move(o)) { }
+ async_data_op_req(async_io_op _precondition, T *_buffer, size_t _length, off_t _where) : async_data_op_req<void>(std::move(_precondition), static_cast<void *>(_buffer), _length, _where) { }
+};
+template<class T> struct async_data_op_req<const T> : public async_data_op_req<const void>
+{
+ async_data_op_req() { }
+ async_data_op_req(const async_data_op_req &o) : async_data_op_req<const void>(o) { }
+ async_data_op_req(async_data_op_req &&o) : async_data_op_req<const void>(std::move(o)) { }
+ async_data_op_req(const async_data_op_req<T> &o) : async_data_op_req<const void>(o) { }
+ async_data_op_req(async_data_op_req<T> &&o) : async_data_op_req<const void>(std::move(o)) { }
+ async_data_op_req(async_io_op _precondition, const T *_buffer, size_t _length, off_t _where) : async_data_op_req<const void>(std::move(_precondition), static_cast<const void *>(_buffer), _length, _where) { }
+};
+//! \brief A specialisation for any std::vector<T, A>
+template<class T, class A> struct async_data_op_req<std::vector<T, A>> : public async_data_op_req<void>
+{
+ async_data_op_req() { }
+ async_data_op_req(const async_data_op_req &o) : async_data_op_req<void>(o) { }
+ async_data_op_req(async_data_op_req &&o) : async_data_op_req<void>(std::move(o)) { }
+ async_data_op_req(async_io_op _precondition, std::vector<T, A> &v, off_t _where) : async_data_op_req<void>(std::move(_precondition), static_cast<void *>(&v.front()), v.size()*sizeof(T), _where) { }
+};
+template<class T, class A> struct async_data_op_req<const std::vector<T, A>> : public async_data_op_req<const void>
+{
+ async_data_op_req() { }
+ async_data_op_req(const async_data_op_req &o) : async_data_op_req<const void>(o) { }
+ async_data_op_req(async_data_op_req &&o) : async_data_op_req<const void>(std::move(o)) { }
+ async_data_op_req(const async_data_op_req<std::vector<T, A>> &o) : async_data_op_req<const void>(o) { }
+ async_data_op_req(async_data_op_req<std::vector<T, A>> &&o) : async_data_op_req<const void>(std::move(o)) { }
+ async_data_op_req(async_io_op _precondition, const std::vector<T, A> &v, off_t _where) : async_data_op_req<const void>(std::move(_precondition), static_cast<const void *>(&v.front()), v.size()*sizeof(T), _where) { }
+};
+//! \brief A specialisation for any std::array<T, N>
+template<class T, size_t N> struct async_data_op_req<std::array<T, N>> : public async_data_op_req<void>
+{
+ async_data_op_req() { }
+ async_data_op_req(const async_data_op_req &o) : async_data_op_req<void>(o) { }
+ async_data_op_req(async_data_op_req &&o) : async_data_op_req<void>(std::move(o)) { }
+ async_data_op_req(async_io_op _precondition, std::array<T, N> &v, off_t _where) : async_data_op_req<void>(std::move(_precondition), static_cast<void *>(&v.front()), v.size()*sizeof(T), _where) { }
+};
+template<class T, size_t N> struct async_data_op_req<const std::array<T, N>> : public async_data_op_req<const void>
+{
+ async_data_op_req() { }
+ async_data_op_req(const async_data_op_req &o) : async_data_op_req<const void>(o) { }
+ async_data_op_req(async_data_op_req &&o) : async_data_op_req<const void>(std::move(o)) { }
+ async_data_op_req(const async_data_op_req<std::array<T, N>> &o) : async_data_op_req<const void>(o) { }
+ async_data_op_req(async_data_op_req<std::array<T, N>> &&o) : async_data_op_req<const void>(std::move(o)) { }
+ async_data_op_req(async_io_op _precondition, const std::array<T, N> &v, off_t _where) : async_data_op_req<const void>(std::move(_precondition), static_cast<const void *>(&v.front()), v.size()*sizeof(T), _where) { }
+};
+//! \brief A specialisation for any std::basic_string<C, T, A>
+template<class C, class T, class A> struct async_data_op_req<std::basic_string<C, T, A>> : public async_data_op_req<void>
+{
+ async_data_op_req() { }
+ async_data_op_req(const async_data_op_req &o) : async_data_op_req<void>(o) { }
+ async_data_op_req(async_data_op_req &&o) : async_data_op_req<void>(std::move(o)) { }
+ async_data_op_req(async_io_op _precondition, std::basic_string<C, T, A> &v, off_t _where) : async_data_op_req<void>(std::move(_precondition), static_cast<void *>(&v.front()), v.size()*sizeof(A), _where) { }
+};
+template<class C, class T, class A> struct async_data_op_req<const std::basic_string<C, T, A>> : public async_data_op_req<const void>
+{
+ async_data_op_req() { }
+ async_data_op_req(const async_data_op_req &o) : async_data_op_req<const void>(o) { }
+ async_data_op_req(async_data_op_req &&o) : async_data_op_req<const void>(std::move(o)) { }
+ async_data_op_req(const async_data_op_req<std::basic_string<C, T, A>> &o) : async_data_op_req<const void>(o) { }
+ async_data_op_req(async_data_op_req<std::basic_string<C, T, A>> &&o) : async_data_op_req<const void>(std::move(o)) { }
+ async_data_op_req(async_io_op _precondition, const std::basic_string<C, T, A> &v, off_t _where) : async_data_op_req<const void>(std::move(_precondition), static_cast<const void *>(&v.front()), v.size()*sizeof(A), _where) { }
+};
+
+namespace detail {
+ template<bool isconst> struct void_type_selector { typedef void type; };
+ template<> struct void_type_selector<true> { typedef const void type; };
+ template<class T> struct async_file_io_dispatcher_rwconverter
+ {
+ typedef async_data_op_req<typename void_type_selector<std::is_const<T>::value>::type> return_type;
+ const std::vector<return_type> &operator()(const std::vector<async_data_op_req<T>> &ops)
+ {
+ typedef async_data_op_req<T> reqT;
+ static_assert(std::is_convertible<reqT, return_type>::value, "async_data_op_req<T> is not convertible to async_data_op_req<[const] void>");
+ static_assert(sizeof(return_type)==sizeof(reqT), "async_data_op_req<T> does not have the same size as async_data_op_req<[const] void>");
+ return reinterpret_cast<const std::vector<return_type> &>(ops);
+ }
+ };
+}
+
+inline async_io_op async_file_io_dispatcher_base::completion(const async_io_op &req, const std::pair<async_op_flags, std::function<async_file_io_dispatcher_base::completion_t>> &callback)
+{
+ std::vector<async_io_op> r;
+ std::vector<std::pair<async_op_flags, std::function<async_file_io_dispatcher_base::completion_t>>> i;
+ r.reserve(1); i.reserve(1);
+ r.push_back(req);
+ i.push_back(callback);
+ return std::move(completion(r, i).front());
+}
+template<class R> inline std::pair<std::vector<future<R>>, std::vector<async_io_op>> async_file_io_dispatcher_base::call(const std::vector<async_io_op> &ops, const std::vector<std::function<R()>> &callables)
+{
+ typedef packaged_task<R()> tasktype;
+ std::vector<future<R>> retfutures;
+ std::vector<std::pair<async_op_flags, std::function<completion_t>>> callbacks;
+ retfutures.reserve(callables.size());
+ callbacks.reserve(callables.size());
+ auto f=[](size_t, std::shared_ptr<detail::async_io_handle> _, std::shared_ptr<tasktype> c) {
+ (*c)();
+ return std::make_pair(true, _);
+ };
+ for(auto &t : callables)
+ {
+ std::shared_ptr<tasktype> c(std::make_shared<tasktype>(t));
+ retfutures.push_back(c->get_future());
+ callbacks.push_back(std::make_pair(async_op_flags::None, std::bind(f, std::placeholders::_1, std::placeholders::_2, std::move(c))));
+ }
+ return std::make_pair(std::move(retfutures), completion(ops, callbacks));
+}
+template<class C, class... Args> inline std::pair<future<typename std::result_of<C(Args...)>::type>, async_io_op> async_file_io_dispatcher_base::call(const async_io_op &req, C callback, Args... args)
+{
+ typedef typename std::result_of<C(Args...)>::type rettype;
+ std::vector<async_io_op> i;
+ std::vector<std::function<rettype()>> c;
+ i.reserve(1); c.reserve(1);
+ i.push_back(req);
+ c.push_back(std::move(std::bind<rettype()>(callback, args...)));
+ std::pair<std::vector<future<rettype>>, std::vector<async_io_op>> ret(call(i, c));
+ return std::make_pair(std::move(ret.first.front()), ret.second.front());
+}
+inline async_io_op async_file_io_dispatcher_base::dir(const async_path_op_req &req)
+{
+ std::vector<async_path_op_req> i;
+ i.reserve(1);
+ i.push_back(req);
+ return std::move(dir(i).front());
+}
+inline async_io_op async_file_io_dispatcher_base::rmdir(const async_path_op_req &req)
+{
+ std::vector<async_path_op_req> i;
+ i.reserve(1);
+ i.push_back(req);
+ return std::move(rmdir(i).front());
+}
+inline async_io_op async_file_io_dispatcher_base::file(const async_path_op_req &req)
+{
+ std::vector<async_path_op_req> i;
+ i.reserve(1);
+ i.push_back(req);
+ return std::move(file(i).front());
+}
+inline async_io_op async_file_io_dispatcher_base::rmfile(const async_path_op_req &req)
+{
+ std::vector<async_path_op_req> i;
+ i.reserve(1);
+ i.push_back(req);
+ return std::move(rmfile(i).front());
+}
+inline async_io_op async_file_io_dispatcher_base::sync(const async_io_op &req)
+{
+ std::vector<async_io_op> i;
+ i.reserve(1);
+ i.push_back(req);
+ return std::move(sync(i).front());
+}
+inline async_io_op async_file_io_dispatcher_base::close(const async_io_op &req)
+{
+ std::vector<async_io_op> i;
+ i.reserve(1);
+ i.push_back(req);
+ return std::move(close(i).front());
+}
+inline async_io_op async_file_io_dispatcher_base::read(const async_data_op_req<void> &req)
+{
+ std::vector<async_data_op_req<void>> i;
+ i.reserve(1);
+ i.push_back(req);
+ return std::move(read(i).front());
+}
+inline async_io_op async_file_io_dispatcher_base::write(const async_data_op_req<const void> &req)
+{
+ std::vector<async_data_op_req<const void>> i;
+ i.reserve(1);
+ i.push_back(req);
+ return std::move(write(i).front());
+}
+template<class T> inline std::vector<async_io_op> async_file_io_dispatcher_base::read(const std::vector<async_data_op_req<T>> &ops)
+{
+ return read(detail::async_file_io_dispatcher_rwconverter<T>()(ops));
+}
+template<class T> inline std::vector<async_io_op> async_file_io_dispatcher_base::write(const std::vector<async_data_op_req<T>> &ops)
+{
+ return write(detail::async_file_io_dispatcher_rwconverter<T>()(ops));
+}
+inline std::vector<async_io_op> async_file_io_dispatcher_base::truncate(const std::vector<async_io_op> &ops, const std::vector<off_t> &sizes)
+{
+ auto dotruncate=[](size_t, std::shared_ptr<detail::async_io_handle> h, off_t newsize) {
+ std::filesystem::resize_file(h->path(), newsize);
+ return std::make_pair(true, h);
+ };
+ std::vector<std::pair<async_op_flags, std::function<completion_t>>> callbacks;
+ callbacks.reserve(ops.size());
+ for(auto &i : sizes)
+ callbacks.push_back(std::make_pair(async_op_flags::None, std::bind(dotruncate, std::placeholders::_1, std::placeholders::_2, i)));
+ return completion(ops, callbacks);
+}
+inline async_io_op async_file_io_dispatcher_base::truncate(const async_io_op &op, off_t newsize)
+{
+ std::vector<async_io_op> o;
+ std::vector<off_t> i;
+ o.reserve(1);
+ o.push_back(op);
+ i.reserve(1);
+ i.push_back(newsize);
+ return std::move(truncate(o, i).front());
+}
+
+
+} } // namespace
+
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+
+#endif

Added: sandbox/triplegit/trunk/triplegit/include/triplegit.hpp
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/triplegit/include/triplegit.hpp 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,197 @@
+/* TripleGit
+(C) 2013 Niall Douglas http://www.nedprod.com/
+File Created: Mar 2013
+*/
+
+#ifndef TRIPLEGIT_H
+#define TRIPLEGIT_H
+
+#include "../../NiallsCPP11Utilities/Int128_256.hpp"
+#include "boost/graph/adjacency_list.hpp"
+#include "boost/graph/adjacency_list_io.hpp"
+#include "async_file_io.hpp"
+#include <unordered_set>
+
+/*! \file triplgit.hpp
+\brief Declares TripleGit's main functionality
+*/
+
+#ifdef TRIPLEGIT_DLL_EXPORTS
+#define TRIPLEGIT_API DLLEXPORTMARKUP
+#else
+#define TRIPLEGIT_API DLLIMPORTMARKUP
+#endif
+
+namespace boost { namespace property_tree { template<typename Key, typename Data, typename KeyCompare = std::less<Key>> class basic_ptree; typedef basic_ptree< std::string, std::string > ptree; } }
+
+namespace triplegit
+{
+
+namespace detail { void TRIPLEGIT_API prefetched_unique_id_source(void *ptr, size_t size); }
+
+/*! \class unique_id
+\brief A unique id
+*/
+template<class T, class hasher> class unique_id : public T
+{
+ static T int_init()
+ {
+ T ret;
+ detail::prefetched_unique_id_source(&ret, sizeof(T));
+ return ret;
+ }
+public:
+ unique_id() : T(int_init()) { }
+};
+
+class fs_store;
+/*! \class collection_id
+\brief A collection in a fs_store
+*/
+class collection_id : public unique_id<NiallsCPP11Utilities::Int128, NiallsCPP11Utilities::Hash128>
+{
+public:
+ //! Creates a new, unique, anonymous collection id
+ collection_id(fs_store &store);
+ //! Creates a named collection id
+ collection_id(fs_store &store, const std::string &name, bool mustBeUnique=false);
+};
+
+/*! \class base_store
+\brief Base class for a stored graph
+*/
+class TRIPLEGIT_API base_store
+{
+public:
+ //! Returns the configuration of this graph store
+ const boost::property_tree::ptree &config() const;
+ //! Returns if this instance is read-only
+ bool isReadOnly() const;
+ //! Returns if this instance is read-only due to the filing system
+ bool isFSReadOnly() const;
+
+ //! Returns if a collection id is unique
+ bool checkCollectionId(const collection_id &id) const;
+ //! A set of collections
+ typedef std::unordered_set<collection_id> collections_t;
+};
+
+/*! \class fs_store
+\brief A graph stored in the filing system
+
+If the filing system is read-only the store is automatically marked as read-only.
+*/
+class TRIPLEGIT_API fs_store : public base_store
+{
+public:
+ //! Constructs an instance using \em path
+ fs_store(const std::filesystem::path &path, bool readOnly=false);
+ fs_store(std::filesystem::path &&path, bool readOnly=false);
+};
+
+namespace detail {
+ class TRIPLEGIT_API storable_vertices
+ {
+ bool amLoaded, amDirty;
+ void *begin_batch_attachdetach();
+ void do_batch_attach(void *p, base_store &store, collection_id id);
+ void do_batch_detach(void *p, base_store &store, collection_id id);
+ void end_batch_attachdetach(void *p);
+ public:
+ storable_vertices() : amLoaded(true), amDirty(true) { }
+
+ //! Returns if loaded
+ bool isLoaded() const { return amLoaded; }
+ //! Returns if dirty
+ bool isDirty() const { return amDirty; }
+
+ //! Begins a commit to attached storage
+ async_io::future<void> begincommit();
+ //! Attachs this collection of vertices to the given store
+ void attach(base_store &store, collection_id id)
+ {
+ void *p=begin_batch_attachdetach();
+ auto unbatch=NiallsCPP11Utilities::Undoer([p, this]{end_batch_attachdetach(p);});
+ do_batch_attach(p, store, id);
+ }
+ //! Attachs this collection of vertices to the given stores of std::pair<base_store &, collection_id>
+ template<typename Iterator> void attach(Iterator begin, Iterator end)
+ {
+ void *p=begin_batch_attachdetach();
+ auto unbatch=NiallsCPP11Utilities::Undoer([p, this]{end_batch_attachdetach(p);});
+ for(; begin!=end; ++begin)
+ do_batch_attach(p, begin->first, begin->second);
+ }
+ //! Detachs this collection of vertices from the given store
+ void detach(base_store &store, collection_id id)
+ {
+ void *p=begin_batch_attachdetach();
+ auto unbatch=NiallsCPP11Utilities::Undoer([p, this]{end_batch_attachdetach(p);});
+ do_batch_detach(p, store, id);
+ }
+ //! Detachs this collection of vertices to the given stores of std::pair<base_store &, collection_id>
+ template<typename Iterator> void detach(Iterator begin, Iterator end)
+ {
+ void *p=begin_batch_attachdetach();
+ auto unbatch=NiallsCPP11Utilities::Undoer([p, this]{end_batch_attachdetach(p);});
+ for(; begin!=end; ++begin)
+ do_batch_detach(p, begin->first, begin->second);
+ }
+ };
+}
+/*! \class storable_vertices
+\brief The base class for a storable collection of vertices
+*/
+template<class derived> class storable_vertices : public detail::storable_vertices
+{
+public:
+};
+
+namespace boost
+{
+ using namespace ::boost;
+ /*! \class adjacency_list
+ \brief A stored Boost.Graph adjacency_list
+ */
+ template<class OutEdgeListS = boost::vecS, // a Sequence or an AssociativeContainer
+ class VertexListS = boost::vecS, // a Sequence or a RandomAccessContainer
+ class DirectedS = boost::directedS,
+ class VertexProperty = boost::no_property,
+ class EdgeProperty = boost::no_property,
+ class GraphProperty = boost::no_property,
+ class EdgeListS = boost::listS>
+ class adjacency_list : public ::boost::adjacency_list<OutEdgeListS, VertexListS, DirectedS, VertexProperty, EdgeProperty, GraphProperty, EdgeListS>, public storable_vertices<adjacency_list<OutEdgeListS, VertexListS, DirectedS, VertexProperty, EdgeProperty, GraphProperty, EdgeListS>>
+ {
+ typedef ::boost::adjacency_list<OutEdgeListS, VertexListS, DirectedS, VertexProperty, EdgeProperty, GraphProperty, EdgeListS> Base;
+ public:
+ adjacency_list(base_store &store, collection_id id, const GraphProperty& p = GraphProperty()) : Base(p) { Base::attach(store, id); }
+ adjacency_list(const GraphProperty& p = GraphProperty()) : Base(p) { }
+ adjacency_list(const adjacency_list& x) : Base(x) { }
+ adjacency_list& operator=(const adjacency_list& x) {
+ static_cast<Base &>(*this)=x;
+ return *this;
+ }
+#if 0 // BGL doesn't support move construction yet
+ adjacency_list(adjacency_list&& x) : Base(std::move(x)) { }
+ adjacency_list& operator=(adjacency_list&& x) {
+ static_cast<Base &>(*this)=std::move(x);
+ return *this;
+ }
+#endif
+ adjacency_list(typename Base::vertices_size_type num_vertices, const GraphProperty& p = GraphProperty()) : Base(num_vertices, p) { }
+ template <class EdgeIterator> adjacency_list(EdgeIterator first, EdgeIterator last,
+ typename Base::vertices_size_type n,
+ typename Base::edges_size_type = 0,
+ const GraphProperty& p = GraphProperty()) : Base(first, last, n, 0, p) { }
+ template <class EdgeIterator, class EdgePropertyIterator> adjacency_list(EdgeIterator first, EdgeIterator last,
+ EdgePropertyIterator ep_iter,
+ typename Base::vertices_size_type n,
+ typename Base::edges_size_type = 0,
+ const GraphProperty& p = GraphProperty()) : Base(first, last, ep_iter, n, 0, p) { }
+ };
+
+} // namespace boost
+
+} // namespace
+
+#endif

Added: sandbox/triplegit/trunk/triplegit/src/SConscript
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/triplegit/src/SConscript 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,4 @@
+Import("importedenv")
+env=importedenv
+srcs=Glob("*.cpp")
+Return("srcs")
\ No newline at end of file

Added: sandbox/triplegit/trunk/triplegit/src/async_file_io.cpp
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/triplegit/src/async_file_io.cpp 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,942 @@
+/* async_file_io
+Provides a threadpool and asynchronous file i/o infrastructure based on Boost.ASIO, Boost.Iostreams and filesystem
+(C) 2013 Niall Douglas http://www.nedprod.com/
+File Created: Mar 2013
+*/
+
+#define MAX_NON_ASYNC_QUEUE_DEPTH 8
+//#define USE_POSIX_ON_WIN32 // Useful for testing
+
+#define _CRT_SECURE_NO_WARNINGS
+#define _CRT_NONSTDC_DEPRECATE(a)
+
+#include "../include/async_file_io.hpp"
+#include "boost/smart_ptr/detail/spinlock.hpp"
+#include "../../NiallsCPP11Utilities/ErrorHandling.hpp"
+#include <mutex>
+
+#include <fcntl.h>
+#include <sys/stat.h>
+#ifdef WIN32
+#include <Windows.h>
+// We also compile the posix compat layer for catching silly compile errors for POSIX
+#include <io.h>
+#include <direct.h>
+#define posix_mkdir(path, mode) _wmkdir(path)
+#define posix_rmdir _wrmdir
+#define posix_stat _wstat64
+#define stat _stat64
+#define S_ISREG(m) ((m) & _S_IFREG)
+#define S_ISDIR(m) ((m) & _S_IFDIR)
+#define posix_open _wopen
+#define posix_close _close
+#define posix_unlink _wunlink
+#define posix_fsync _commit
+#else
+#include <sys/uio.h>
+#define posix_mkdir mkdir
+#define posix_rmdir ::rmdir
+#define posix_stat stat
+#define posix_open open
+#define posix_close ::close
+#define posix_unlink unlink
+#define posix_fsync fsync
+#endif
+
+// libstdc++ doesn't come with std::lock_guard
+#define lock_guard boost::lock_guard
+
+#if defined(_DEBUG) && 0
+#ifdef WIN32
+#define DEBUG_PRINT(...) \
+ { \
+ char buffer[256]; \
+ sprintf(buffer, __VA_ARGS__); \
+ OutputDebugStringA(buffer); \
+ }
+#else
+#define DEBUG_PRINT(...) \
+ { \
+ fprintf(stderr, __VA_ARGS__); \
+ }
+#endif
+#else
+#define DEBUG_PRINT(...)
+#endif
+
+
+#ifdef WIN32
+struct iovec {
+ void *iov_base; /* Starting address */
+ size_t iov_len; /* Number of bytes to transfer */
+};
+typedef ptrdiff_t ssize_t;
+static boost::detail::spinlock preadwritelock;
+ssize_t preadv(int fd, const struct iovec *iov, int iovcnt, triplegit::async_io::off_t offset)
+{
+ triplegit::async_io::off_t at=offset;
+ ssize_t transferred;
+ lock_guard<boost::detail::spinlock> lockh(preadwritelock);
+ if(-1==_lseeki64(fd, offset, SEEK_SET)) return -1;
+ for(; iovcnt; iov++, iovcnt--, at+=(triplegit::async_io::off_t) transferred)
+ if(-1==(transferred=_read(fd, iov->iov_base, (unsigned) iov->iov_len))) return -1;
+ return at-offset;
+}
+ssize_t pwritev(int fd, const struct iovec *iov, int iovcnt, triplegit::async_io::off_t offset)
+{
+ triplegit::async_io::off_t at=offset;
+ ssize_t transferred;
+ lock_guard<boost::detail::spinlock> lockh(preadwritelock);
+ if(-1==_lseeki64(fd, offset, SEEK_SET)) return -1;
+ for(; iovcnt; iov++, iovcnt--, at+=(triplegit::async_io::off_t) transferred)
+ if(-1==(transferred=_write(fd, iov->iov_base, (unsigned) iov->iov_len))) return -1;
+ return at-offset;
+}
+#endif
+
+
+namespace triplegit { namespace async_io {
+
+thread_pool &process_threadpool()
+{
+ // This is basically how many file i/o operations can occur at once
+ // Obviously the kernel also has a limit
+ static thread_pool ret(MAX_NON_ASYNC_QUEUE_DEPTH);
+ return ret;
+}
+
+namespace detail {
+#if defined(WIN32)
+ struct async_io_handle_windows : public async_io_handle
+ {
+ std::shared_ptr<async_file_io_dispatcher_base> parent;
+ std::unique_ptr<boost::asio::windows::random_access_handle> h;
+ void *myid;
+ bool has_been_added, autoflush;
+
+ async_io_handle_windows(std::shared_ptr<async_file_io_dispatcher_base> _parent, const std::filesystem::path &path) : async_io_handle(_parent.get(), path), parent(_parent), myid(nullptr), has_been_added(false), autoflush(false) { }
+ async_io_handle_windows(std::shared_ptr<async_file_io_dispatcher_base> _parent, const std::filesystem::path &path, bool _autoflush, HANDLE _h) : async_io_handle(_parent.get(), path), parent(_parent), h(new boost::asio::windows::random_access_handle(process_threadpool().io_service(), _h)), myid(_h), has_been_added(false), autoflush(_autoflush) { }
+ virtual void *native_handle() const { return myid; }
+
+ // You can't use shared_from_this() in a constructor so ...
+ void do_add_io_handle_to_parent()
+ {
+ if(h)
+ {
+ parent->int_add_io_handle(myid, shared_from_this());
+ has_been_added=true;
+ }
+ }
+ ~async_io_handle_windows()
+ {
+ if(has_been_added)
+ parent->int_del_io_handle(myid);
+ if(h)
+ {
+ if(autoflush && write_count_since_fsync())
+ ERRHWINFN(FlushFileBuffers(h->native_handle()), path());
+ h->close();
+ }
+ }
+ };
+#endif
+ struct async_io_handle_posix : public async_io_handle
+ {
+ std::shared_ptr<async_file_io_dispatcher_base> parent;
+ std::shared_ptr<detail::async_io_handle> dirh;
+ int fd;
+ bool has_been_added, autoflush, has_ever_been_fsynced;
+
+ async_io_handle_posix(std::shared_ptr<async_file_io_dispatcher_base> _parent, std::shared_ptr<detail::async_io_handle> _dirh, const std::filesystem::path &path, bool _autoflush, int _fd) : async_io_handle(_parent.get(), path), parent(_parent), dirh(_dirh), fd(_fd), has_been_added(false), autoflush(_autoflush),has_ever_been_fsynced(false)
+ {
+ if(fd!=-999)
+ ERRHOSFN(fd, path);
+ }
+ virtual void *native_handle() const { return (void *)(size_t) fd; }
+
+ // You can't use shared_from_this() in a constructor so ...
+ void do_add_io_handle_to_parent()
+ {
+ parent->int_add_io_handle((void *)(size_t)fd, shared_from_this());
+ has_been_added=true;
+ }
+ ~async_io_handle_posix()
+ {
+ if(has_been_added)
+ parent->int_del_io_handle((void *)(size_t)fd);
+ if(fd>=0)
+ {
+ // Flush synchronously here? I guess ...
+ if(autoflush && write_count_since_fsync())
+ ERRHOSFN(posix_fsync(fd), path());
+ ERRHOSFN(posix_close(fd), path());
+ fd=-1;
+ }
+ }
+ };
+
+ enum class OpType
+ {
+ Unknown,
+ UserCompletion,
+ dir,
+ rmdir,
+ file,
+ rmfile,
+ sync,
+ close,
+ read,
+ write
+ };
+ struct async_file_io_dispatcher_op
+ {
+ OpType optype;
+ async_op_flags flags;
+ shared_future<std::shared_ptr<detail::async_io_handle>> h;
+ std::unique_ptr<promise<std::shared_ptr<detail::async_io_handle>>> detached_promise;
+ typedef std::pair<size_t, std::function<std::shared_ptr<detail::async_io_handle> (std::shared_ptr<detail::async_io_handle>)>> completion_t;
+ std::vector<completion_t> completions;
+ async_file_io_dispatcher_op(OpType _optype, async_op_flags _flags, shared_future<std::shared_ptr<detail::async_io_handle>> _h)
+ : optype(_optype), flags(_flags), h(_h) { }
+ async_file_io_dispatcher_op(async_file_io_dispatcher_op &&o) : optype(o.optype), flags(std::move(o.flags)), h(std::move(o.h)),
+ detached_promise(std::move(o.detached_promise)), completions(std::move(o.completions)) { }
+ private:
+ async_file_io_dispatcher_op(const async_file_io_dispatcher_op &o);
+ };
+ struct async_file_io_dispatcher_base_p
+ {
+ thread_pool &pool;
+ file_flags flagsforce, flagsmask;
+
+ typedef boost::detail::spinlock fdslock_t;
+ typedef std::recursive_mutex opslock_t;
+ fdslock_t fdslock; std::unordered_map<void *, std::weak_ptr<async_io_handle>> fds;
+ opslock_t opslock; size_t monotoniccount; std::unordered_map<size_t, async_file_io_dispatcher_op> ops;
+
+ async_file_io_dispatcher_base_p(thread_pool &_pool, file_flags _flagsforce, file_flags _flagsmask) : pool(_pool),
+ flagsforce(_flagsforce), flagsmask(_flagsmask), monotoniccount(0)
+ {
+ // Boost's spinlock is so lightweight it has no constructor ...
+ fdslock.unlock();
+ ops.reserve(10000);
+ }
+ };
+ class async_file_io_dispatcher_compat;
+ class async_file_io_dispatcher_windows;
+ class async_file_io_dispatcher_linux;
+ class async_file_io_dispatcher_qnx;
+ struct immediate_async_ops
+ {
+ typedef std::shared_ptr<detail::async_io_handle> rettype;
+ typedef rettype retfuncttype();
+ std::vector<packaged_task<retfuncttype>> toexecute;
+
+ immediate_async_ops() { }
+ // Returns a promise which is fulfilled when this is destructed
+ future<rettype> enqueue(std::function<retfuncttype> f)
+ {
+ packaged_task<retfuncttype> t(std::move(f));
+ toexecute.push_back(std::move(t));
+ return toexecute.back().get_future();
+ }
+ ~immediate_async_ops()
+ {
+ for(auto &i : toexecute)
+ i();
+ }
+ private:
+ immediate_async_ops(const immediate_async_ops &);
+ immediate_async_ops &operator=(const immediate_async_ops &);
+ immediate_async_ops(immediate_async_ops &&);
+ immediate_async_ops &operator=(immediate_async_ops &&);
+ };
+}
+
+async_file_io_dispatcher_base::async_file_io_dispatcher_base(thread_pool &threadpool, file_flags flagsforce, file_flags flagsmask) : p(new detail::async_file_io_dispatcher_base_p(threadpool, flagsforce, flagsmask))
+{
+}
+
+async_file_io_dispatcher_base::~async_file_io_dispatcher_base()
+{
+ delete p;
+}
+
+void async_file_io_dispatcher_base::int_add_io_handle(void *key, std::shared_ptr<detail::async_io_handle> h)
+{
+ lock_guard<detail::async_file_io_dispatcher_base_p::fdslock_t> lockh(p->fdslock);
+ p->fds.insert(make_pair(key, std::weak_ptr<detail::async_io_handle>(h)));
+}
+
+void async_file_io_dispatcher_base::int_del_io_handle(void *key)
+{
+ lock_guard<detail::async_file_io_dispatcher_base_p::fdslock_t> lockh(p->fdslock);
+ p->fds.erase(key);
+}
+
+thread_pool &async_file_io_dispatcher_base::threadpool() const
+{
+ return p->pool;
+}
+
+file_flags async_file_io_dispatcher_base::fileflags(file_flags flags) const
+{
+ return (flags&~p->flagsmask)|p->flagsforce;
+}
+
+size_t async_file_io_dispatcher_base::wait_queue_depth() const
+{
+ lock_guard<detail::async_file_io_dispatcher_base_p::opslock_t> opslockh(p->opslock);
+ return p->ops.size();
+}
+
+size_t async_file_io_dispatcher_base::count() const
+{
+ lock_guard<detail::async_file_io_dispatcher_base_p::fdslock_t> lockh(p->fdslock);
+ return p->fds.size();
+}
+
+// Called in unknown thread
+async_file_io_dispatcher_base::completion_returntype async_file_io_dispatcher_base::invoke_user_completion(size_t id, std::shared_ptr<detail::async_io_handle> h, std::function<async_file_io_dispatcher_base::completion_t> callback)
+{
+ return callback(id, h);
+}
+
+std::vector<async_io_op> async_file_io_dispatcher_base::completion(const std::vector<async_io_op> &ops, const std::vector<std::pair<async_op_flags, std::function<async_file_io_dispatcher_base::completion_t>>> &callbacks)
+{
+ std::vector<async_io_op> ret;
+ ret.reserve(ops.size());
+ std::vector<async_io_op>::const_iterator i;
+ std::vector<std::pair<async_op_flags, std::function<async_file_io_dispatcher_base::completion_t>>>::const_iterator c;
+ lock_guard<detail::async_file_io_dispatcher_base_p::opslock_t> opslockh(p->opslock);
+ detail::immediate_async_ops immediates;
+ for(i=ops.begin(), c=callbacks.begin(); i!=ops.end() && c!=callbacks.end(); ++i, ++c)
+ ret.push_back(chain_async_op(immediates, (int) detail::OpType::UserCompletion, *i, c->first, &async_file_io_dispatcher_base::invoke_user_completion, c->second));
+ return ret;
+}
+
+// Called in unknown thread
+void async_file_io_dispatcher_base::complete_async_op(size_t id, std::shared_ptr<detail::async_io_handle> h, exception_ptr e)
+{
+ lock_guard<detail::async_file_io_dispatcher_base_p::opslock_t> opslockh(p->opslock);
+ detail::immediate_async_ops immediates;
+ // Find me in ops, remove my completions and delete me from extant ops
+ std::unordered_map<size_t, detail::async_file_io_dispatcher_op>::iterator it(p->ops.find(id));
+ if(p->ops.end()==it)
+ {
+#ifndef NDEBUG
+ std::vector<size_t> opsids;
+ for(auto &i : p->ops)
+ opsids.push_back(i.first);
+ std::sort(opsids.begin(), opsids.end());
+#endif
+ throw std::runtime_error("Failed to find this operation in list of currently executing operations");
+ }
+ if(!it->second.completions.empty())
+ {
+ // Remove completions as we're about to modify p->ops which will invalidate it
+ std::vector<detail::async_file_io_dispatcher_op::completion_t> completions(std::move(it->second.completions));
+ for(auto &c : completions)
+ {
+ // Enqueue each completion
+ it=p->ops.find(c.first);
+ if(p->ops.end()==it)
+ throw std::runtime_error("Failed to find this completion operation in list of currently executing operations");
+ if(!!(it->second.flags & async_op_flags::ImmediateCompletion))
+ {
+ // If he was set up with a detached future, use that instead
+ if(it->second.detached_promise)
+ {
+ it->second.h=it->second.detached_promise->get_future();
+ immediates.enqueue(std::bind(c.second, h));
+ }
+ else
+ it->second.h=immediates.enqueue(std::bind(c.second, h));
+ }
+ else
+ {
+ // If he was set up with a detached future, use that instead
+ if(it->second.detached_promise)
+ {
+ it->second.h=it->second.detached_promise->get_future();
+ threadpool().enqueue(std::bind(c.second, h));
+ }
+ else
+ it->second.h=threadpool().enqueue(std::bind(c.second, h));
+ }
+ DEBUG_PRINT("C %u\n", (unsigned) c.first);
+ }
+ // Restore it to my id
+ it=p->ops.find(id);
+ if(p->ops.end()==it)
+ {
+ #ifndef NDEBUG
+ std::vector<size_t> opsids;
+ for(auto &i : p->ops)
+ opsids.push_back(i.first);
+ std::sort(opsids.begin(), opsids.end());
+ #endif
+ throw std::runtime_error("Failed to find this operation in list of currently executing operations");
+ }
+ }
+ if(it->second.detached_promise)
+ {
+ if(e)
+ it->second.detached_promise->set_exception(e);
+ else
+ it->second.detached_promise->set_value(h);
+ }
+ p->ops.erase(it);
+ DEBUG_PRINT("R %u\n", (unsigned) id);
+}
+
+// Called in unknown thread
+template<class F, class... Args> std::shared_ptr<detail::async_io_handle> async_file_io_dispatcher_base::invoke_async_op_completions(size_t id, std::shared_ptr<detail::async_io_handle> h, completion_returntype (F::*f)(size_t, std::shared_ptr<detail::async_io_handle>, Args...), Args... args)
+{
+ try
+ {
+ completion_returntype ret((static_cast<F *>(this)->*f)(id, h, args...));
+ // If boolean is false, reschedule completion notification setting it to ret.second, otherwise complete now
+ if(ret.first)
+ {
+ complete_async_op(id, ret.second);
+ }
+ else
+ {
+ // Make sure this was set up for deferred completion
+ #ifndef NDEBUG
+ lock_guard<detail::async_file_io_dispatcher_base_p::opslock_t> opslockh(p->opslock);
+ std::unordered_map<size_t, detail::async_file_io_dispatcher_op>::iterator it(p->ops.find(id));
+ if(p->ops.end()==it)
+ {
+ #ifndef NDEBUG
+ std::vector<size_t> opsids;
+ for(auto &i : p->ops)
+ opsids.push_back(i.first);
+ std::sort(opsids.begin(), opsids.end());
+ #endif
+ throw std::runtime_error("Failed to find this operation in list of currently executing operations");
+ }
+ if(!it->second.detached_promise)
+ {
+ // If this trips, it means a completion handler tried to defer signalling
+ // completion but it hadn't been set up with a detached future
+ assert(0);
+ std::terminate();
+ }
+ #endif
+ }
+ return ret.second;
+ }
+#ifdef _MSC_VER
+ catch(const std::exception &)
+#else
+ catch(...)
+#endif
+ {
+ exception_ptr e(async_io::make_exception_ptr(std::current_exception()));
+ complete_async_op(id, h, e);
+ throw;
+ }
+}
+
+// You MUST hold opslock before entry!
+template<class F, class... Args> async_io_op async_file_io_dispatcher_base::chain_async_op(detail::immediate_async_ops &immediates, int optype, const async_io_op &precondition, async_op_flags flags, completion_returntype (F::*f)(size_t, std::shared_ptr<detail::async_io_handle>, Args...), Args... args)
+{
+ size_t thisid=0;
+ while(!(thisid=++p->monotoniccount));
+#if 0 //ndef NDEBUG
+ if(!p->ops.empty())
+ {
+ std::vector<size_t> opsids;
+ for(auto &i : p->ops)
+ opsids.push_back(i.first);
+ std::sort(opsids.begin(), opsids.end());
+ assert(thisid==opsids.back()+1);
+ }
+#endif
+ // Wrap supplied implementation routine with a completion dispatcher
+ auto wrapperf=&async_file_io_dispatcher_base::invoke_async_op_completions<F, Args...>;
+ // Bind supplied implementation routine to this, unique id and any args they passed
+ typename detail::async_file_io_dispatcher_op::completion_t boundf(std::make_pair(thisid, std::bind(wrapperf, this, thisid, std::placeholders::_1, f, args...)));
+ // Make a new async_io_op ready for returning
+ async_io_op ret(shared_from_this(), thisid);
+ bool done=false;
+ if(precondition.id)
+ {
+ // If still in flight, chain boundf to be executed when precondition completes
+ auto dep(p->ops.find(precondition.id));
+ if(p->ops.end()!=dep)
+ {
+ dep->second.completions.push_back(boundf);
+ done=true;
+ }
+ }
+ auto undep=NiallsCPP11Utilities::Undoer([done, this, precondition](){
+ if(done)
+ {
+ auto dep(p->ops.find(precondition.id));
+ dep->second.completions.pop_back();
+ }
+ });
+ if(!done)
+ {
+ // Bind input handle now and queue immediately to next available thread worker
+ std::shared_ptr<detail::async_io_handle> h;
+ // Boost's shared_future has get() as non-const which is weird, because it doesn't
+ // delete the data after retrieval.
+ if(precondition.h.valid())
+ h=const_cast<shared_future<std::shared_ptr<detail::async_io_handle>> &>(precondition.h).get();
+ if(!!(flags & async_op_flags::ImmediateCompletion))
+ ret.h=immediates.enqueue(std::bind(boundf.second, h)).share();
+ else
+ ret.h=threadpool().enqueue(std::bind(boundf.second, h)).share();
+ }
+ auto opsit=p->ops.insert(std::make_pair(thisid, detail::async_file_io_dispatcher_op((detail::OpType) optype, flags, ret.h)));
+ assert(opsit.second);
+ DEBUG_PRINT("I %u\n", (unsigned) thisid);
+ auto unopsit=NiallsCPP11Utilities::Undoer([this, opsit, thisid](){
+ p->ops.erase(opsit.first);
+ DEBUG_PRINT("E R %u\n", (unsigned) thisid);
+ });
+ if(!!(flags & async_op_flags::DetachedFuture))
+ {
+ opsit.first->second.detached_promise.reset(new promise<std::shared_ptr<detail::async_io_handle>>);
+ if(!done)
+ opsit.first->second.h=opsit.first->second.detached_promise->get_future();
+ }
+ unopsit.dismiss();
+ undep.dismiss();
+ return ret;
+}
+template<class F, class T> std::vector<async_io_op> async_file_io_dispatcher_base::chain_async_ops(int optype, const std::vector<T> &container, async_op_flags flags, completion_returntype (F::*f)(size_t, std::shared_ptr<detail::async_io_handle>, T))
+{
+ std::vector<async_io_op> ret;
+ ret.reserve(container.size());
+ lock_guard<detail::async_file_io_dispatcher_base_p::opslock_t> opslockh(p->opslock);
+ detail::immediate_async_ops immediates;
+ for(auto &i : container)
+ ret.push_back(chain_async_op(immediates, optype, i, flags, f, i));
+ return ret;
+}
+template<class F> std::vector<async_io_op> async_file_io_dispatcher_base::chain_async_ops(int optype, const std::vector<async_path_op_req> &container, async_op_flags flags, completion_returntype (F::*f)(size_t, std::shared_ptr<detail::async_io_handle>, async_path_op_req))
+{
+ std::vector<async_io_op> ret;
+ ret.reserve(container.size());
+ lock_guard<detail::async_file_io_dispatcher_base_p::opslock_t> opslockh(p->opslock);
+ detail::immediate_async_ops immediates;
+ for(auto &i : container)
+ ret.push_back(chain_async_op(immediates, optype, i.precondition, flags, f, i));
+ return ret;
+}
+template<class F, class T> std::vector<async_io_op> async_file_io_dispatcher_base::chain_async_ops(int optype, const std::vector<async_data_op_req<T>> &container, async_op_flags flags, completion_returntype (F::*f)(size_t, std::shared_ptr<detail::async_io_handle>, async_data_op_req<T>))
+{
+ std::vector<async_io_op> ret;
+ ret.reserve(container.size());
+ lock_guard<detail::async_file_io_dispatcher_base_p::opslock_t> opslockh(p->opslock);
+ detail::immediate_async_ops immediates;
+ for(auto &i : container)
+ ret.push_back(chain_async_op(immediates, optype, i.precondition, flags, f, i));
+ return ret;
+}
+
+
+namespace detail {
+#if defined(WIN32)
+ class async_file_io_dispatcher_windows : public async_file_io_dispatcher_base
+ {
+ // Called in unknown thread
+ completion_returntype dodir(size_t id, std::shared_ptr<detail::async_io_handle> _, async_path_op_req req)
+ {
+ BOOL ret=0;
+ req.flags=fileflags(req.flags);
+ if(!!(req.flags & (file_flags::Create|file_flags::CreateOnlyIfNotExist)))
+ {
+ ret=CreateDirectory(req.path.c_str(), NULL);
+ if(!ret && ERROR_ALREADY_EXISTS==GetLastError())
+ {
+ // Ignore already exists unless we were asked otherwise
+ if(!(req.flags & file_flags::CreateOnlyIfNotExist))
+ ret=1;
+ }
+ req.flags=req.flags&~(file_flags::Create|file_flags::CreateOnlyIfNotExist);
+ }
+ DWORD attr=GetFileAttributes(req.path.c_str());
+ if(INVALID_FILE_ATTRIBUTES!=attr && !(attr & FILE_ATTRIBUTE_DIRECTORY))
+ throw std::runtime_error("Not a directory");
+ if(!!(req.flags & file_flags::Read))
+ return dofile(id, _, req);
+ else
+ {
+ // Create empty handle so
+ auto ret=std::shared_ptr<detail::async_io_handle>(new async_io_handle_windows(shared_from_this(), req.path));
+ return std::make_pair(true, ret);
+ }
+ }
+ // Called in unknown thread
+ completion_returntype dormdir(size_t id, std::shared_ptr<detail::async_io_handle> _, async_path_op_req req)
+ {
+ req.flags=fileflags(req.flags);
+ ERRHWINFN(RemoveDirectory(req.path.c_str()), req.path);
+ auto ret=std::shared_ptr<detail::async_io_handle>(new async_io_handle_windows(shared_from_this(), req.path));
+ return std::make_pair(true, ret);
+ }
+ // Called in unknown thread
+ completion_returntype dofile(size_t id, std::shared_ptr<detail::async_io_handle>, async_path_op_req req)
+ {
+ DWORD access=0, creation=0, flags=FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED;
+ req.flags=fileflags(req.flags);
+ if(!!(req.flags & file_flags::Append)) access|=FILE_APPEND_DATA|SYNCHRONIZE;
+ else
+ {
+ if(!!(req.flags & file_flags::Read)) access|=GENERIC_READ;
+ if(!!(req.flags & file_flags::Write)) access|=GENERIC_WRITE;
+ }
+ if(!!(req.flags & file_flags::CreateOnlyIfNotExist)) creation|=CREATE_NEW;
+ else if(!!(req.flags & file_flags::Create)) creation|=CREATE_ALWAYS;
+ else if(!!(req.flags & file_flags::Truncate)) creation|=TRUNCATE_EXISTING;
+ else creation|=OPEN_EXISTING;
+ if(!!(req.flags & file_flags::WillBeSequentiallyAccessed))
+ flags|=FILE_FLAG_SEQUENTIAL_SCAN;
+ if(!!(req.flags & file_flags::OSDirect)) flags|=FILE_FLAG_NO_BUFFERING;
+ if(!!(req.flags & file_flags::OSSync)) flags|=FILE_FLAG_WRITE_THROUGH;
+ // If writing and autoflush and NOT synchronous, turn on autoflush
+ auto ret=std::shared_ptr<detail::async_io_handle>(new async_io_handle_windows(shared_from_this(), req.path, (file_flags::AutoFlush|file_flags::Write)==(req.flags & (file_flags::AutoFlush|file_flags::Write|file_flags::OSSync)),
+ CreateFile(req.path.c_str(), access, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
+ NULL, creation, flags, NULL)));
+ static_cast<async_io_handle_windows *>(ret.get())->do_add_io_handle_to_parent();
+ return std::make_pair(true, ret);
+ }
+ // Called in unknown thread
+ completion_returntype dormfile(size_t id, std::shared_ptr<detail::async_io_handle> _, async_path_op_req req)
+ {
+ req.flags=fileflags(req.flags);
+ ERRHWINFN(DeleteFile(req.path.c_str()), req.path);
+ auto ret=std::shared_ptr<detail::async_io_handle>(new async_io_handle_windows(shared_from_this(), req.path));
+ return std::make_pair(true, ret);
+ }
+ // Called in unknown thread
+ completion_returntype dosync(size_t id, std::shared_ptr<detail::async_io_handle> h, async_io_op)
+ {
+ async_io_handle_windows *p=static_cast<async_io_handle_windows *>(h.get());
+ size_t bytestobesynced=p->write_count_since_fsync();
+ if(bytestobesynced)
+ ERRHWINFN(FlushFileBuffers(p->h->native_handle()), p->path());
+ p->byteswrittenatlastfsync+=(long) bytestobesynced;
+ return std::make_pair(true, h);
+ }
+ // Called in unknown thread
+ completion_returntype doclose(size_t id, std::shared_ptr<detail::async_io_handle> h, async_io_op)
+ {
+ async_io_handle_windows *p=static_cast<async_io_handle_windows *>(h.get());
+ // Windows doesn't provide an async fsync so do it synchronously
+ if(p->autoflush && p->write_count_since_fsync())
+ ERRHWINFN(FlushFileBuffers(p->h->native_handle()), p->path());
+ p->h->close();
+ p->h.reset();
+ return std::make_pair(true, h);
+ }
+ // Called in unknown thread
+ void boost_asio_completion_handler(bool is_write, size_t id, std::shared_ptr<detail::async_io_handle> h, const boost::system::error_code &ec, size_t bytes_transferred)
+ {
+ exception_ptr e;
+ if(ec)
+ e=async_io::make_exception_ptr(boost::system::system_error(ec));
+ else
+ {
+ async_io_handle_windows *p=static_cast<async_io_handle_windows *>(h.get());
+ if(is_write)
+ p->byteswritten+=bytes_transferred;
+ else
+ p->bytesread+=bytes_transferred;
+ }
+ DEBUG_PRINT("H %u e=%u\n", (unsigned) id, (unsigned) ec.value());
+ complete_async_op(id, h, e);
+ }
+ // Called in unknown thread
+ completion_returntype doread(size_t id, std::shared_ptr<detail::async_io_handle> h, async_data_op_req<void> req)
+ {
+ async_io_handle_windows *p=static_cast<async_io_handle_windows *>(h.get());
+ boost::asio::async_read_at(*p->h, req.where, req.buffers, boost::bind(&async_file_io_dispatcher_windows::boost_asio_completion_handler, this, false, id, h, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
+ // Indicate we're not finished yet
+ return std::make_pair(false, h);
+ }
+ // Called in unknown thread
+ completion_returntype dowrite(size_t id, std::shared_ptr<detail::async_io_handle> h, async_data_op_req<const void> req)
+ {
+ async_io_handle_windows *p=static_cast<async_io_handle_windows *>(h.get());
+ DEBUG_PRINT("W %u\n", (unsigned) id);
+ boost::asio::async_write_at(*p->h, req.where, req.buffers, boost::bind(&async_file_io_dispatcher_windows::boost_asio_completion_handler, this, true, id, h, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
+ // Indicate we're not finished yet
+ return std::make_pair(false, h);
+ }
+
+ public:
+ async_file_io_dispatcher_windows(thread_pool &threadpool, file_flags flagsforce, file_flags flagsmask) : async_file_io_dispatcher_base(threadpool, flagsforce, flagsmask)
+ {
+ }
+
+ virtual std::vector<async_io_op> dir(const std::vector<async_path_op_req> &reqs)
+ {
+ return chain_async_ops((int) detail::OpType::dir, reqs, async_op_flags::None, &async_file_io_dispatcher_windows::dodir);
+ }
+ virtual std::vector<async_io_op> rmdir(const std::vector<async_path_op_req> &reqs)
+ {
+ return chain_async_ops((int) detail::OpType::rmdir, reqs, async_op_flags::None, &async_file_io_dispatcher_windows::dormdir);
+ }
+ virtual std::vector<async_io_op> file(const std::vector<async_path_op_req> &reqs)
+ {
+ return chain_async_ops((int) detail::OpType::file, reqs, async_op_flags::None, &async_file_io_dispatcher_windows::dofile);
+ }
+ virtual std::vector<async_io_op> rmfile(const std::vector<async_path_op_req> &reqs)
+ {
+ return chain_async_ops((int) detail::OpType::rmfile, reqs, async_op_flags::None, &async_file_io_dispatcher_windows::dormfile);
+ }
+ virtual std::vector<async_io_op> sync(const std::vector<async_io_op> &ops)
+ {
+ return chain_async_ops((int) detail::OpType::sync, ops, async_op_flags::None, &async_file_io_dispatcher_windows::dosync);
+ }
+ virtual std::vector<async_io_op> close(const std::vector<async_io_op> &ops)
+ {
+ return chain_async_ops((int) detail::OpType::close, ops, async_op_flags::None, &async_file_io_dispatcher_windows::doclose);
+ }
+ virtual std::vector<async_io_op> read(const std::vector<async_data_op_req<void>> &reqs)
+ {
+ return chain_async_ops((int) detail::OpType::read, reqs, async_op_flags::DetachedFuture|async_op_flags::ImmediateCompletion, &async_file_io_dispatcher_windows::doread);
+ }
+ virtual std::vector<async_io_op> write(const std::vector<async_data_op_req<const void>> &reqs)
+ {
+ return chain_async_ops((int) detail::OpType::write, reqs, async_op_flags::DetachedFuture|async_op_flags::ImmediateCompletion, &async_file_io_dispatcher_windows::dowrite);
+ }
+ };
+#endif
+ class async_file_io_dispatcher_compat : public async_file_io_dispatcher_base
+ {
+#ifdef __linux__
+ // Need to fsync the containing directory on Linux, otherwise the file isn't guaranteed to appear where we just created it
+ typedef boost::detail::spinlock linuxdirsynclock_t;
+ linuxdirsynclock_t linuxdirsynclock; std::unordered_map<std::filesystem::path, std::weak_ptr<async_io_handle>> linuxdirsync;
+ std::shared_ptr<detail::async_io_handle> get_handle_to_containing_dir(const std::filesystem::path &path)
+ {
+ std::filesystem::path containingdir(path.parent_path());
+ std::shared_ptr<detail::async_io_handle> dirh;
+ lock_guard<linuxdirsynclock_t> linuxdirsynclockh(linuxdirsynclock);
+ do
+ {
+ std::unordered_map<std::filesystem::path, std::weak_ptr<async_io_handle>>::iterator it=linuxdirsync.find(containingdir);
+ if(linuxdirsync.end()==it || it->second.expired())
+ {
+ if(linuxdirsync.end()!=it) linuxdirsync.erase(it);
+ dirh=std::shared_ptr<detail::async_io_handle>(new async_io_handle_posix(std::shared_ptr<async_file_io_dispatcher_base>(), std::shared_ptr<detail::async_io_handle>(),
+ containingdir, false, posix_open(containingdir.c_str(), O_RDONLY, 0x1b0/*660*/)));
+ auto _it=linuxdirsync.insert(std::make_pair(containingdir, std::weak_ptr<async_io_handle>(dirh)));
+ return dirh;
+ }
+ else
+ dirh=std::shared_ptr<async_io_handle>(it->second);
+ } while(!dirh);
+ return dirh;
+ }
+#endif
+ // Called in unknown thread
+ completion_returntype dodir(size_t id, std::shared_ptr<detail::async_io_handle> _, async_path_op_req req)
+ {
+ int ret=0;
+ req.flags=fileflags(req.flags);
+ if(!!(req.flags & (file_flags::Create|file_flags::CreateOnlyIfNotExist)))
+ {
+ ret=posix_mkdir(req.path.c_str(), 0x1f8/*770*/);
+ if(-1==ret && EEXIST==errno)
+ {
+ // Ignore already exists unless we were asked otherwise
+ if(!(req.flags & file_flags::CreateOnlyIfNotExist))
+ ret=0;
+ }
+ req.flags=req.flags&~(file_flags::Create|file_flags::CreateOnlyIfNotExist);
+ }
+
+ struct stat s={0};
+ ret=posix_stat(req.path.c_str(), &s);
+ if(0==ret && !S_ISDIR(s.st_mode))
+ throw std::runtime_error("Not a directory");
+ if(file_flags::Read==(req.flags & file_flags::Read))
+ {
+ return dofile(id, _, req);
+ }
+ else
+ {
+ // Create dummy handle so
+ std::shared_ptr<detail::async_io_handle> dirh;
+#ifdef __linux__
+ // Need to fsync the containing directory, otherwise the file isn't guaranteed to appear where we just created it
+ if(!!(req.flags & (file_flags::Create|file_flags::CreateOnlyIfNotExist)) && !!(req.flags & (file_flags::AutoFlush|file_flags::OSSync)))
+ dirh=get_handle_to_containing_dir(req.path);
+#endif
+ auto ret=std::shared_ptr<detail::async_io_handle>(new async_io_handle_posix(shared_from_this(), dirh, req.path, false, -999));
+#ifdef __linux__
+ if(!!(req.flags & (file_flags::Create|file_flags::CreateOnlyIfNotExist)) && !!(req.flags & (file_flags::AutoFlush|file_flags::OSSync)))
+ posix_fsync(static_cast<async_io_handle_posix *>(dirh.get())->fd);
+#endif
+ return std::make_pair(true, ret);
+ }
+ }
+ // Called in unknown thread
+ completion_returntype dormdir(size_t id, std::shared_ptr<detail::async_io_handle> _, async_path_op_req req)
+ {
+ req.flags=fileflags(req.flags);
+ ERRHOSFN(posix_rmdir(req.path.c_str()), req.path);
+ auto ret=std::shared_ptr<detail::async_io_handle>(new async_io_handle_posix(shared_from_this(), std::shared_ptr<detail::async_io_handle>(), req.path, false, -999));
+ return std::make_pair(true, ret);
+ }
+ // Called in unknown thread
+ completion_returntype dofile(size_t id, std::shared_ptr<detail::async_io_handle>, async_path_op_req req)
+ {
+ int flags=0;
+ std::shared_ptr<detail::async_io_handle> dirh;
+ req.flags=fileflags(req.flags);
+ if(!!(req.flags & file_flags::Read) && !!(req.flags & file_flags::Write)) flags|=O_RDWR;
+ else if(!!(req.flags & file_flags::Read)) flags|=O_RDONLY;
+ else if(!!(req.flags & file_flags::Write)) flags|=O_WRONLY;
+ if(!!(req.flags & file_flags::Append)) flags|=O_APPEND;
+ if(!!(req.flags & file_flags::Truncate)) flags|=O_TRUNC;
+ if(!!(req.flags & file_flags::CreateOnlyIfNotExist)) flags|=O_EXCL|O_CREAT;
+ else if(!!(req.flags & file_flags::Create)) flags|=O_CREAT;
+#ifdef O_DIRECT
+ if(!!(req.flags & file_flags::OSDirect)) flags|=O_DIRECT;
+#endif
+#ifdef O_SYNC
+ if(!!(req.flags & file_flags::OSSync)) flags|=O_SYNC;
+#endif
+#ifdef __linux__
+ // Need to fsync the containing directory, otherwise the file isn't guaranteed to appear where we just created it
+ if((flags & O_CREAT) && !!(req.flags & (file_flags::AutoFlush|file_flags::OSSync)))
+ {
+ dirh=get_handle_to_containing_dir(req.path);
+ }
+#endif
+ // If writing and autoflush and NOT synchronous, turn on autoflush
+ auto ret=std::shared_ptr<detail::async_io_handle>(new async_io_handle_posix(shared_from_this(), dirh, req.path, (file_flags::AutoFlush|file_flags::Write)==(req.flags & (file_flags::AutoFlush|file_flags::Write|file_flags::OSSync)),
+ posix_open(req.path.c_str(), flags, 0x1b0/*660*/)));
+#ifdef __linux__
+ if(!!(req.flags & (file_flags::Create|file_flags::CreateOnlyIfNotExist)) && !!(req.flags & (file_flags::AutoFlush|file_flags::OSSync)))
+ posix_fsync(static_cast<async_io_handle_posix *>(dirh.get())->fd);
+#endif
+ static_cast<async_io_handle_posix *>(ret.get())->do_add_io_handle_to_parent();
+ return std::make_pair(true, ret);
+ }
+ // Called in unknown thread
+ completion_returntype dormfile(size_t id, std::shared_ptr<detail::async_io_handle> _, async_path_op_req req)
+ {
+ req.flags=fileflags(req.flags);
+ ERRHOSFN(posix_unlink(req.path.c_str()), req.path);
+ auto ret=std::shared_ptr<detail::async_io_handle>(new async_io_handle_posix(shared_from_this(), std::shared_ptr<detail::async_io_handle>(), req.path, false, -999));
+ return std::make_pair(true, ret);
+ }
+ // Called in unknown thread
+ completion_returntype dosync(size_t id, std::shared_ptr<detail::async_io_handle> h, async_io_op)
+ {
+ async_io_handle_posix *p=static_cast<async_io_handle_posix *>(h.get());
+ size_t bytestobesynced=p->write_count_since_fsync();
+ if(bytestobesynced)
+ ERRHOSFN(posix_fsync(p->fd), p->path());
+ p->has_ever_been_fsynced=true;
+ p->byteswrittenatlastfsync+=(long) bytestobesynced;
+ return std::make_pair(true, h);
+ }
+ // Called in unknown thread
+ completion_returntype doclose(size_t id, std::shared_ptr<detail::async_io_handle> h, async_io_op)
+ {
+ async_io_handle_posix *p=static_cast<async_io_handle_posix *>(h.get());
+ if(p->autoflush && p->write_count_since_fsync())
+ ERRHOSFN(posix_fsync(p->fd), p->path());
+ ERRHOSFN(posix_close(p->fd), p->path());
+ p->fd=-1;
+ return std::make_pair(true, h);
+ }
+ // Called in unknown thread
+ completion_returntype doread(size_t id, std::shared_ptr<detail::async_io_handle> h, async_data_op_req<void> req)
+ {
+ async_io_handle_posix *p=static_cast<async_io_handle_posix *>(h.get());
+ ssize_t bytesread=0;
+ iovec v;
+ std::vector<iovec> vecs;
+ vecs.reserve(req.buffers.size());
+ for(auto &b : req.buffers)
+ {
+ v.iov_base=boost::asio::buffer_cast<void *>(b);
+ v.iov_len=boost::asio::buffer_size(b);
+ vecs.push_back(v);
+ }
+ ERRHOSFN((int) (bytesread=preadv(p->fd, &vecs.front(), (int) vecs.size(), req.where)), p->path());
+ p->bytesread+=bytesread;
+ return std::make_pair(true, h);
+ }
+ // Called in unknown thread
+ completion_returntype dowrite(size_t id, std::shared_ptr<detail::async_io_handle> h, async_data_op_req<const void> req)
+ {
+ async_io_handle_posix *p=static_cast<async_io_handle_posix *>(h.get());
+ ssize_t byteswritten=0;
+ iovec v;
+ std::vector<iovec> vecs;
+ vecs.reserve(req.buffers.size());
+ for(auto &b : req.buffers)
+ {
+ v.iov_base=(void *) boost::asio::buffer_cast<const void *>(b);
+ v.iov_len=boost::asio::buffer_size(b);
+ vecs.push_back(v);
+ }
+ ERRHOSFN((int) (byteswritten=pwritev(p->fd, &vecs.front(), (int) vecs.size(), req.where)), p->path());
+ p->byteswritten+=byteswritten;
+ return std::make_pair(true, h);
+ }
+
+ public:
+ async_file_io_dispatcher_compat(thread_pool &threadpool, file_flags flagsforce, file_flags flagsmask) : async_file_io_dispatcher_base(threadpool, flagsforce, flagsmask)
+ {
+ }
+
+
+ virtual std::vector<async_io_op> dir(const std::vector<async_path_op_req> &reqs)
+ {
+ return chain_async_ops((int) detail::OpType::dir, reqs, async_op_flags::None, &async_file_io_dispatcher_compat::dodir);
+ }
+ virtual std::vector<async_io_op> rmdir(const std::vector<async_path_op_req> &reqs)
+ {
+ return chain_async_ops((int) detail::OpType::rmdir, reqs, async_op_flags::None, &async_file_io_dispatcher_compat::dormdir);
+ }
+ virtual std::vector<async_io_op> file(const std::vector<async_path_op_req> &reqs)
+ {
+ return chain_async_ops((int) detail::OpType::file, reqs, async_op_flags::None, &async_file_io_dispatcher_compat::dofile);
+ }
+ virtual std::vector<async_io_op> rmfile(const std::vector<async_path_op_req> &reqs)
+ {
+ return chain_async_ops((int) detail::OpType::rmfile, reqs, async_op_flags::None, &async_file_io_dispatcher_compat::dormfile);
+ }
+ virtual std::vector<async_io_op> sync(const std::vector<async_io_op> &ops)
+ {
+ return chain_async_ops((int) detail::OpType::sync, ops, async_op_flags::None, &async_file_io_dispatcher_compat::dosync);
+ }
+ virtual std::vector<async_io_op> close(const std::vector<async_io_op> &ops)
+ {
+ return chain_async_ops((int) detail::OpType::close, ops, async_op_flags::None, &async_file_io_dispatcher_compat::doclose);
+ }
+ virtual std::vector<async_io_op> read(const std::vector<async_data_op_req<void>> &reqs)
+ {
+ return chain_async_ops((int) detail::OpType::read, reqs, async_op_flags::None, &async_file_io_dispatcher_compat::doread);
+ }
+ virtual std::vector<async_io_op> write(const std::vector<async_data_op_req<const void>> &reqs)
+ {
+ return chain_async_ops((int) detail::OpType::write, reqs, async_op_flags::None, &async_file_io_dispatcher_compat::dowrite);
+ }
+ };
+}
+
+std::shared_ptr<async_file_io_dispatcher_base> async_file_io_dispatcher(thread_pool &threadpool, file_flags flagsforce, file_flags flagsmask)
+{
+#if defined(WIN32) && !defined(USE_POSIX_ON_WIN32)
+ return std::make_shared<detail::async_file_io_dispatcher_windows>(threadpool, flagsforce, flagsmask);
+#else
+ return std::make_shared<detail::async_file_io_dispatcher_compat>(threadpool, flagsforce, flagsmask);
+#endif
+}
+
+} } // namespace

Added: sandbox/triplegit/trunk/triplegit/src/triplegitmain.cpp
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/triplegit/src/triplegitmain.cpp 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,66 @@
+/* TripleGit
+(C) 2013 Niall Douglas http://www.nedprod.com/
+File Created: Mar 2013
+*/
+
+#include "../include/triplegit.hpp"
+#include "../include/async_file_io.hpp"
+#ifdef _MSC_VER
+#pragma warning(push)
+#pragma warning(disable: 4996) // Function call with parameters that may be unsafe
+#endif
+#include "boost/lockfree/spsc_queue.hpp"
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+#include <atomic>
+
+using namespace std;
+using namespace NiallsCPP11Utilities;
+
+namespace triplegit
+{
+namespace detail
+{
+ // Entropy is somewhat expensive to construct and tear down
+ // per 16 or 32 byte request, so batch gather into a lockfree
+ // ringbuffer
+ static boost::lockfree::spsc_queue<unsigned long long, boost::lockfree::capacity<1024>> randomness_cache; // 8Kb
+ static atomic<size_t> randomness_cache_left;
+ static void fill_randomness_cache()
+ {
+ const size_t amount=4096/sizeof(Int256);
+ Int256 buffer[amount];
+ Int256::FillQualityRandom(buffer, amount);
+ unsigned long long *_buffer=(unsigned long long *) buffer;
+ randomness_cache.push(_buffer, amount*4);
+ randomness_cache_left+=amount*sizeof(Int256);
+ }
+ void prefetched_unique_id_source(void *ptr, size_t size)
+ {
+ if(!randomness_cache_left)
+ fill_randomness_cache();
+ else if(randomness_cache_left<4096)
+ async_io::process_threadpool().enqueue(fill_randomness_cache);
+ size/=8;
+ for(size_t n=0; n<size; n+=randomness_cache.pop(((unsigned long long *) ptr)+n, size-n));
+ }
+
+ void *storable_vertices::begin_batch_attachdetach()
+ {
+ return nullptr;
+ }
+ void storable_vertices::do_batch_attach(void *p, base_store &store, collection_id id)
+ {
+ }
+ void storable_vertices::do_batch_detach(void *p, base_store &store, collection_id id)
+ {
+ }
+ void storable_vertices::end_batch_attachdetach(void *p)
+ {
+ }
+
+} // namespace
+
+
+} // namespace

Added: sandbox/triplegit/trunk/unittests/!GenCatch.bat
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/unittests/!GenCatch.bat 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1 @@
+CATCH\glueHeaders.py > catch.hpp

Added: sandbox/triplegit/trunk/unittests/SConscript
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/unittests/SConscript 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,4 @@
+Import("importedenv")
+env=importedenv
+srcs=Glob("*.cpp")
+Return("srcs")
\ No newline at end of file

Added: sandbox/triplegit/trunk/unittests/catch.hpp
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/unittests/catch.hpp 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,6446 @@
+/*
+ * Generated: 2013-02-26 12:22:50.141945
+ * ----------------------------------------------------------
+ * This file has been merged from multiple headers. Please don't edit it directly
+ * Copyright (c) 2012 Two Blue Cubes Ltd. All rights reserved.
+ *
+ * Distributed under the Boost Software License, Version 1.0. (See accompanying
+ * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+#ifndef TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED
+#define TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED
+
+#define TWOBLUECUBES_CATCH_HPP_INCLUDED
+
+#ifdef __clang__
+#pragma clang diagnostic ignored "-Wglobal-constructors"
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wpadded"
+#endif
+
+// #included from: internal/catch_notimplemented_exception.h
+#define TWOBLUECUBES_CATCH_NOTIMPLEMENTED_EXCEPTION_H_INCLUDED
+
+// #included from: catch_common.h
+#define TWOBLUECUBES_CATCH_COMMON_H_INCLUDED
+
+#define INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) name##line
+#define INTERNAL_CATCH_UNIQUE_NAME_LINE( name, line ) INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line )
+#define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __LINE__ )
+
+#define INTERNAL_CATCH_STRINGIFY2( expr ) #expr
+#define INTERNAL_CATCH_STRINGIFY( expr ) INTERNAL_CATCH_STRINGIFY2( expr )
+
+#ifdef __GNUC__
+#define CATCH_ATTRIBUTE_NORETURN __attribute__ ((noreturn))
+#else
+#define CATCH_ATTRIBUTE_NORETURN
+#endif
+
+#include <sstream>
+#include <stdexcept>
+#include <algorithm>
+
+namespace Catch {
+
+ class NonCopyable {
+ NonCopyable( const NonCopyable& );
+ void operator = ( const NonCopyable& );
+ protected:
+ NonCopyable() {}
+ virtual ~NonCopyable();
+ };
+
+ class SafeBool {
+ public:
+ typedef void (SafeBool::*type)() const;
+
+ static type makeSafe( bool value ) {
+ return value ? &SafeBool::trueValue : 0;
+ }
+ private:
+ void trueValue() const {}
+ };
+
+ template<typename ContainerT>
+ inline void deleteAll( ContainerT& container ) {
+ typename ContainerT::const_iterator it = container.begin();
+ typename ContainerT::const_iterator itEnd = container.end();
+ for(; it != itEnd; ++it )
+ {
+ delete *it;
+ }
+ }
+ template<typename AssociativeContainerT>
+ inline void deleteAllValues( AssociativeContainerT& container ) {
+ typename AssociativeContainerT::const_iterator it = container.begin();
+ typename AssociativeContainerT::const_iterator itEnd = container.end();
+ for(; it != itEnd; ++it )
+ {
+ delete it->second;
+ }
+ }
+
+ template<typename ContainerT, typename Function>
+ inline void forEach( ContainerT& container, Function function ) {
+ std::for_each( container.begin(), container.end(), function );
+ }
+
+ template<typename ContainerT, typename Function>
+ inline void forEach( const ContainerT& container, Function function ) {
+ std::for_each( container.begin(), container.end(), function );
+ }
+
+ inline bool startsWith( const std::string& s, const std::string& prefix ) {
+ return s.size() >= prefix.size() && s.substr( 0, prefix.size() ) == prefix;
+ }
+ inline bool endsWith( const std::string& s, const std::string& suffix ) {
+ return s.size() >= suffix.size() && s.substr( s.size()-suffix.size(), suffix.size() ) == suffix;
+ }
+ inline bool contains( const std::string& s, const std::string& infix ) {
+ return s.find( infix ) != std::string::npos;
+ }
+
+ struct pluralise {
+ pluralise( std::size_t count, const std::string& label )
+ : m_count( count ),
+ m_label( label )
+ {}
+
+ friend std::ostream& operator << ( std::ostream& os, const pluralise& pluraliser ) {
+ os << pluraliser.m_count << " " << pluraliser.m_label;
+ if( pluraliser.m_count != 1 )
+ os << "s";
+ return os;
+ }
+
+ std::size_t m_count;
+ std::string m_label;
+ };
+
+ struct SourceLineInfo {
+
+ SourceLineInfo() : line( 0 ){}
+ SourceLineInfo( const std::string& _file, std::size_t _line )
+ : file( _file ),
+ line( _line )
+ {}
+ SourceLineInfo( const SourceLineInfo& other )
+ : file( other.file ),
+ line( other.line )
+ {}
+ bool empty() const {
+ return file.empty();
+ }
+
+ std::string file;
+ std::size_t line;
+ };
+
+ inline std::ostream& operator << ( std::ostream& os, const SourceLineInfo& info ) {
+#ifndef __GNUG__
+ os << info.file << "(" << info.line << "): ";
+#else
+ os << info.file << ":" << info.line << ": ";
+#endif
+ return os;
+ }
+
+ CATCH_ATTRIBUTE_NORETURN
+ inline void throwLogicError( const std::string& message, const SourceLineInfo& locationInfo ) {
+ std::ostringstream oss;
+ oss << "Internal Catch error: '" << message << "' at: " << locationInfo;
+ throw std::logic_error( oss.str() );
+ }
+}
+
+#define CATCH_INTERNAL_LINEINFO ::Catch::SourceLineInfo( __FILE__, static_cast<std::size_t>( __LINE__ ) )
+#define CATCH_INTERNAL_ERROR( msg ) ::Catch::throwLogicError( msg, CATCH_INTERNAL_LINEINFO );
+
+#include <ostream>
+
+namespace Catch {
+
+ class NotImplementedException : public std::exception
+ {
+ public:
+ NotImplementedException( const SourceLineInfo& lineInfo );
+
+ virtual ~NotImplementedException() throw() {}
+
+ virtual const char* what() const throw();
+
+ private:
+ std::string m_what;
+ SourceLineInfo m_lineInfo;
+ };
+
+} // end namespace Catch
+
+///////////////////////////////////////////////////////////////////////////////
+#define CATCH_NOT_IMPLEMENTED throw Catch::NotImplementedException( CATCH_INTERNAL_LINEINFO )
+
+// #included from: internal/catch_context.h
+#define TWOBLUECUBES_CATCH_CONTEXT_H_INCLUDED
+
+// #included from: catch_interfaces_generators.h
+#define TWOBLUECUBES_CATCH_INTERFACES_GENERATORS_H_INCLUDED
+
+#include <string>
+
+namespace Catch {
+
+ struct IGeneratorInfo {
+ virtual ~IGeneratorInfo();
+ virtual bool moveNext() = 0;
+ virtual std::size_t getCurrentIndex() const = 0;
+ };
+
+ struct IGeneratorsForTest {
+ virtual ~IGeneratorsForTest();
+
+ virtual IGeneratorInfo& getGeneratorInfo( const std::string& fileInfo, std::size_t size ) = 0;
+ virtual bool moveNext() = 0;
+ };
+
+ IGeneratorsForTest* createGeneratorsForTest();
+
+} // end namespace Catch
+
+#include <memory>
+#include <vector>
+#include <stdlib.h>
+
+namespace Catch {
+
+ class TestCaseInfo;
+ class Stream;
+ struct IResultCapture;
+ struct IRunner;
+ struct IGeneratorsForTest;
+ struct IConfig;
+
+ struct IContext
+ {
+ virtual ~IContext();
+
+ virtual IResultCapture& getResultCapture() = 0;
+ virtual IRunner& getRunner() = 0;
+ virtual size_t getGeneratorIndex( const std::string& fileInfo, size_t totalSize ) = 0;
+ virtual bool advanceGeneratorsForCurrentTest() = 0;
+ virtual const IConfig* getConfig() const = 0;
+ };
+
+ struct IMutableContext : IContext
+ {
+ virtual ~IMutableContext();
+ virtual void setResultCapture( IResultCapture* resultCapture ) = 0;
+ virtual void setRunner( IRunner* runner ) = 0;
+ virtual void setConfig( const IConfig* config ) = 0;
+ };
+
+ IContext& getCurrentContext();
+ IMutableContext& getCurrentMutableContext();
+ void cleanUpContext();
+ Stream createStream( const std::string& streamName );
+
+}
+
+// #included from: internal/catch_test_registry.hpp
+#define TWOBLUECUBES_CATCH_TEST_REGISTRY_HPP_INCLUDED
+
+// #included from: catch_interfaces_testcase.h
+#define TWOBLUECUBES_CATCH_INTERFACES_TESTCASE_H_INCLUDED
+
+// #included from: catch_ptr.hpp
+#define TWOBLUECUBES_CATCH_PTR_HPP_INCLUDED
+
+namespace Catch {
+
+ // An intrusive reference counting smart pointer.
+ // T must implement addRef() and release() methods
+ // typically implementing the IShared interface
+ template<typename T>
+ class Ptr {
+ public:
+ Ptr() : m_p( NULL ){}
+ Ptr( T* p ) : m_p( p ){
+ if( m_p )
+ m_p->addRef();
+ }
+ Ptr( const Ptr& other ) : m_p( other.m_p ){
+ if( m_p )
+ m_p->addRef();
+ }
+ ~Ptr(){
+ if( m_p )
+ m_p->release();
+ }
+ Ptr& operator = ( T* p ){
+ Ptr temp( p );
+ swap( temp );
+ return *this;
+ }
+ Ptr& operator = ( const Ptr& other ){
+ Ptr temp( other );
+ swap( temp );
+ return *this;
+ }
+ void swap( Ptr& other ){
+ std::swap( m_p, other.m_p );
+ }
+
+ T* get(){
+ return m_p;
+ }
+ const T* get() const{
+ return m_p;
+ }
+
+ T& operator*() const {
+ return *m_p;
+ }
+
+ T* operator->() const {
+ return m_p;
+ }
+
+ bool operator !() const {
+ return m_p == NULL;
+ }
+
+ private:
+ T* m_p;
+ };
+
+ struct IShared : NonCopyable {
+ virtual ~IShared();
+ virtual void addRef() = 0;
+ virtual void release() = 0;
+ };
+
+ template<typename T>
+ struct SharedImpl : T {
+
+ SharedImpl() : m_rc( 0 ){}
+
+ virtual void addRef(){
+ ++m_rc;
+ }
+ virtual void release(){
+ if( --m_rc == 0 )
+ delete this;
+ }
+
+ int m_rc;
+ };
+
+} // end namespace Catch
+
+#include <vector>
+
+namespace Catch {
+
+ class TestCaseFilters;
+
+ struct ITestCase : IShared {
+ virtual void invoke () const = 0;
+ protected:
+ virtual ~ITestCase();
+ };
+
+ class TestCaseInfo;
+
+ struct ITestCaseRegistry {
+ virtual ~ITestCaseRegistry();
+ virtual const std::vector<TestCaseInfo>& getAllTests() const = 0;
+ virtual std::vector<TestCaseInfo> getMatchingTestCases( const std::string& rawTestSpec ) const = 0;
+ };
+}
+
+namespace Catch {
+
+template<typename C>
+class MethodTestCase : public SharedImpl<ITestCase> {
+
+public:
+ MethodTestCase( void (C::*method)() ) : m_method( method ) {}
+
+ virtual void invoke() const {
+ C obj;
+ (obj.*m_method)();
+ }
+
+private:
+ virtual ~MethodTestCase() {}
+
+ void (C::*m_method)();
+};
+
+typedef void(*TestFunction)();
+
+struct AutoReg {
+
+ AutoReg( TestFunction function,
+ const char* name,
+ const char* description,
+ const SourceLineInfo& lineInfo );
+
+ template<typename C>
+ AutoReg( void (C::*method)(),
+ const char* className,
+ const char* name,
+ const char* description,
+ const SourceLineInfo& lineInfo ) {
+ registerTestCase( new MethodTestCase<C>( method ), className, name, description, lineInfo );
+ }
+
+ void registerTestCase( ITestCase* testCase,
+ const char* className,
+ const char* name,
+ const char* description,
+ const SourceLineInfo& lineInfo );
+
+ ~AutoReg();
+
+private:
+ AutoReg( const AutoReg& );
+ void operator= ( const AutoReg& );
+};
+
+} // end namespace Catch
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CATCH_TESTCASE( Name, Desc ) \
+ static void INTERNAL_CATCH_UNIQUE_NAME( TestCaseFunction_catch_internal_ )(); \
+ namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( TestCaseFunction_catch_internal_ ), Name, Desc, CATCH_INTERNAL_LINEINFO ); }\
+ static void INTERNAL_CATCH_UNIQUE_NAME( TestCaseFunction_catch_internal_ )()
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CATCH_TESTCASE_NORETURN( Name, Desc ) \
+ static void INTERNAL_CATCH_UNIQUE_NAME( TestCaseFunction_catch_internal_ )() CATCH_ATTRIBUTE_NORETURN; \
+ namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( TestCaseFunction_catch_internal_ ), Name, Desc, CATCH_INTERNAL_LINEINFO ); }\
+ static void INTERNAL_CATCH_UNIQUE_NAME( TestCaseFunction_catch_internal_ )()
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, Name, Desc ) \
+ namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Name, Desc, CATCH_INTERNAL_LINEINFO ); }
+
+///////////////////////////////////////////////////////////////////////////////
+#define TEST_CASE_METHOD( ClassName, TestName, Desc )\
+ namespace{ \
+ struct INTERNAL_CATCH_UNIQUE_NAME( TestCaseMethod_catch_internal_ ) : ClassName{ \
+ void test(); \
+ }; \
+ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &INTERNAL_CATCH_UNIQUE_NAME( TestCaseMethod_catch_internal_ )::test, #ClassName, TestName, Desc, CATCH_INTERNAL_LINEINFO ); \
+ } \
+ void INTERNAL_CATCH_UNIQUE_NAME( TestCaseMethod_catch_internal_ )::test()
+
+// #included from: internal/catch_capture.hpp
+#define TWOBLUECUBES_CATCH_CAPTURE_HPP_INCLUDED
+
+// #included from: catch_expression_decomposer.hpp
+#define TWOBLUECUBES_CATCH_EXPRESSION_DECOMPOSER_HPP_INCLUDED
+
+// #included from: catch_expression_lhs.hpp
+#define TWOBLUECUBES_CATCH_EXPRESSION_LHS_HPP_INCLUDED
+
+// #included from: catch_expressionresult_builder.h
+#define TWOBLUECUBES_CATCH_ASSERTIONRESULT_BUILDER_H_INCLUDED
+
+// #included from: catch_tostring.hpp
+#define TWOBLUECUBES_CATCH_TOSTRING_HPP_INCLUDED
+
+#include <sstream>
+
+#ifdef __OBJC__
+// #included from: catch_objc_arc.hpp
+#define TWOBLUECUBES_CATCH_OBJC_ARC_HPP_INCLUDED
+
+#import <Foundation/Foundation.h>
+
+#ifdef __has_feature
+#define CATCH_ARC_ENABLED __has_feature(objc_arc)
+#else
+#define CATCH_ARC_ENABLED 0
+#endif
+
+void arcSafeRelease( NSObject* obj );
+id performOptionalSelector( id obj, SEL sel );
+
+#if !CATCH_ARC_ENABLED
+inline void arcSafeRelease( NSObject* obj ) {
+ [obj release];
+}
+inline id performOptionalSelector( id obj, SEL sel ) {
+ if( [obj respondsToSelector: sel] )
+ return [obj performSelector: sel];
+ return nil;
+}
+#define CATCH_UNSAFE_UNRETAINED
+#define CATCH_ARC_STRONG
+#else
+inline void arcSafeRelease( NSObject* ){}
+inline id performOptionalSelector( id obj, SEL sel ) {
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
+#endif
+ if( [obj respondsToSelector: sel] )
+ return [obj performSelector: sel];
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+ return nil;
+}
+#define CATCH_UNSAFE_UNRETAINED __unsafe_unretained
+#define CATCH_ARC_STRONG __strong
+#endif
+
+#endif
+
+namespace Catch {
+namespace Detail {
+
+ struct NonStreamable {
+ template<typename T> NonStreamable( const T& ){}
+ };
+
+ // If the type does not have its own << overload for ostream then
+ // this one will be used instead
+ inline std::ostream& operator << ( std::ostream& ss, NonStreamable ){
+ return ss << "{?}";
+ }
+
+ template<typename T>
+ inline std::string makeString( const T& value ) {
+ std::ostringstream oss;
+ oss << value;
+ return oss.str();
+ }
+
+ template<typename T>
+ inline std::string makeString( T* p ) {
+ if( !p )
+ return INTERNAL_CATCH_STRINGIFY( NULL );
+ std::ostringstream oss;
+ oss << p;
+ return oss.str();
+ }
+
+ template<typename T>
+ inline std::string makeString( const T* p ) {
+ if( !p )
+ return INTERNAL_CATCH_STRINGIFY( NULL );
+ std::ostringstream oss;
+ oss << p;
+ return oss.str();
+ }
+
+} // end namespace Detail
+
+/// \brief converts any type to a string
+///
+/// The default template forwards on to ostringstream - except when an
+/// ostringstream overload does not exist - in which case it attempts to detect
+/// that and writes {?}.
+/// Overload (not specialise) this template for custom typs that you don't want
+/// to provide an ostream overload for.
+template<typename T>
+std::string toString( const T& value ) {
+ return Detail::makeString( value );
+}
+
+// Built in overloads
+
+inline std::string toString( const std::string& value ) {
+ return "\"" + value + "\"";
+}
+
+inline std::string toString( const std::wstring& value ) {
+ std::ostringstream oss;
+ oss << "\"";
+ for(size_t i = 0; i < value.size(); ++i )
+ oss << static_cast<char>( value[i] <= 0xff ? value[i] : '?');
+ oss << "\"";
+ return oss.str();
+}
+
+inline std::string toString( const char* const value ) {
+ return value ? Catch::toString( std::string( value ) ) : std::string( "{null string}" );
+}
+
+inline std::string toString( char* const value ) {
+ return Catch::toString( static_cast<const char*>( value ) );
+}
+
+inline std::string toString( int value ) {
+ std::ostringstream oss;
+ oss << value;
+ return oss.str();
+}
+
+inline std::string toString( unsigned long value ) {
+ std::ostringstream oss;
+ if( value > 8192 )
+ oss << "0x" << std::hex << value;
+ else
+ oss << value;
+ return oss.str();
+}
+
+inline std::string toString( unsigned int value ) {
+ return toString( static_cast<unsigned long>( value ) );
+}
+
+inline std::string toString( const double value ) {
+ std::ostringstream oss;
+ oss << value;
+ return oss.str();
+}
+
+inline std::string toString( bool value ) {
+ return value ? "true" : "false";
+}
+
+inline std::string toString( char value ) {
+ return value < ' '
+ ? toString( (unsigned int)value )
+ : Detail::makeString( value );
+}
+
+inline std::string toString( signed char value ) {
+ return toString( static_cast<char>( value ) );
+}
+
+#ifdef CATCH_CONFIG_CPP11_NULLPTR
+inline std::string toString( std::nullptr_t ) {
+ return "nullptr";
+}
+#endif
+
+#ifdef __OBJC__
+ inline std::string toString( NSString const * const& nsstring ) {
+ return std::string( "@\"" ) + [nsstring UTF8String] + "\"";
+ }
+ inline std::string toString( NSString * CATCH_ARC_STRONG const& nsstring ) {
+ return std::string( "@\"" ) + [nsstring UTF8String] + "\"";
+ }
+ inline std::string toString( NSObject* const& nsObject ) {
+ return toString( [nsObject description] );
+ }
+#endif
+
+} // end namespace Catch
+
+// #included from: catch_assertionresult.h
+#define TWOBLUECUBES_CATCH_ASSERTIONRESULT_H_INCLUDED
+
+#include <string>
+// #included from: catch_result_type.h
+#define TWOBLUECUBES_CATCH_RESULT_TYPE_H_INCLUDED
+
+namespace Catch {
+
+ // ResultWas::OfType enum
+ struct ResultWas { enum OfType {
+ Unknown = -1,
+ Ok = 0,
+ Info = 1,
+ Warning = 2,
+
+ FailureBit = 0x10,
+
+ ExpressionFailed = FailureBit | 1,
+ ExplicitFailure = FailureBit | 2,
+
+ Exception = 0x100 | FailureBit,
+
+ ThrewException = Exception | 1,
+ DidntThrowException = Exception | 2
+
+ }; };
+
+ inline bool isOk( ResultWas::OfType resultType ) {
+ return ( resultType & ResultWas::FailureBit ) == 0;
+ }
+
+ // ResultAction::Value enum
+ struct ResultAction { enum Value {
+ None,
+ Failed = 1, // Failure - but no debug break if Debug bit not set
+ Debug = 2, // If this bit is set, invoke the debugger
+ Abort = 4 // Test run should abort
+ }; };
+
+ // ResultDisposition::Flags enum
+ struct ResultDisposition { enum Flags {
+ Normal = 0x00,
+
+ ContinueOnFailure = 0x01, // Failures fail test, but execution continues
+ NegateResult = 0x02, // Prefix expressiom with !
+ SuppressFail = 0x04 // Failures are reported but do not fail the test
+ }; };
+
+ inline ResultDisposition::Flags operator | ( ResultDisposition::Flags lhs, ResultDisposition::Flags rhs ) {
+ return static_cast<ResultDisposition::Flags>( static_cast<int>( lhs ) | static_cast<int>( rhs ) );
+ }
+
+ inline bool shouldContinueOnFailure( int flags ) { return flags & ResultDisposition::ContinueOnFailure; }
+ inline bool shouldNegate( int flags ) { return flags & ResultDisposition::NegateResult; }
+ inline bool shouldSuppressFailure( int flags ) { return flags & ResultDisposition::SuppressFail; }
+
+} // end namespace Catch
+
+
+namespace Catch {
+
+ struct AssertionInfo
+ {
+ AssertionInfo() {}
+ AssertionInfo( const std::string& _macroName,
+ const SourceLineInfo& _lineInfo,
+ const std::string& _capturedExpression,
+ ResultDisposition::Flags _resultDisposition );
+
+ std::string macroName;
+ SourceLineInfo lineInfo;
+ std::string capturedExpression;
+ ResultDisposition::Flags resultDisposition;
+ };
+
+ struct AssertionResultData
+ {
+ AssertionResultData() : resultType( ResultWas::Unknown ) {}
+
+ std::string reconstructedExpression;
+ std::string message;
+ ResultWas::OfType resultType;
+ };
+
+ class AssertionResult {
+ public:
+ AssertionResult();
+ AssertionResult( const AssertionInfo& info, const AssertionResultData& data );
+ ~AssertionResult();
+
+ bool isOk() const;
+ bool succeeded() const;
+ ResultWas::OfType getResultType() const;
+ bool hasExpression() const;
+ bool hasMessage() const;
+ std::string getExpression() const;
+ bool hasExpandedExpression() const;
+ std::string getExpandedExpression() const;
+ std::string getMessage() const;
+ SourceLineInfo getSourceInfo() const;
+ std::string getTestMacroName() const;
+
+ protected:
+ AssertionInfo m_info;
+ AssertionResultData m_resultData;
+ };
+
+} // end namespace Catch
+
+// #included from: catch_evaluate.hpp
+#define TWOBLUECUBES_CATCH_EVALUATE_HPP_INCLUDED
+
+namespace Catch {
+namespace Internal {
+
+ enum Operator {
+ IsEqualTo,
+ IsNotEqualTo,
+ IsLessThan,
+ IsGreaterThan,
+ IsLessThanOrEqualTo,
+ IsGreaterThanOrEqualTo
+ };
+
+ template<Operator Op> struct OperatorTraits { static const char* getName(){ return "*error*"; } };
+ template<> struct OperatorTraits<IsEqualTo> { static const char* getName(){ return "=="; } };
+ template<> struct OperatorTraits<IsNotEqualTo> { static const char* getName(){ return "!="; } };
+ template<> struct OperatorTraits<IsLessThan> { static const char* getName(){ return "<"; } };
+ template<> struct OperatorTraits<IsGreaterThan> { static const char* getName(){ return ">"; } };
+ template<> struct OperatorTraits<IsLessThanOrEqualTo> { static const char* getName(){ return "<="; } };
+ template<> struct OperatorTraits<IsGreaterThanOrEqualTo>{ static const char* getName(){ return ">="; } };
+
+ // So the compare overloads can be operator agnostic we convey the operator as a template
+ // enum, which is used to specialise an Evaluator for doing the comparison.
+ template<typename T1, typename T2, Operator Op>
+ class Evaluator{};
+
+ template<typename T1, typename T2>
+ struct Evaluator<T1, T2, IsEqualTo> {
+ static bool evaluate( const T1& lhs, const T2& rhs) {
+ return const_cast<T1&>( lhs ) == const_cast<T2&>( rhs );
+ }
+ };
+ template<typename T1, typename T2>
+ struct Evaluator<T1, T2, IsNotEqualTo> {
+ static bool evaluate( const T1& lhs, const T2& rhs ) {
+ return const_cast<T1&>( lhs ) != const_cast<T2&>( rhs );
+ }
+ };
+ template<typename T1, typename T2>
+ struct Evaluator<T1, T2, IsLessThan> {
+ static bool evaluate( const T1& lhs, const T2& rhs ) {
+ return const_cast<T1&>( lhs ) < const_cast<T2&>( rhs );
+ }
+ };
+ template<typename T1, typename T2>
+ struct Evaluator<T1, T2, IsGreaterThan> {
+ static bool evaluate( const T1& lhs, const T2& rhs ) {
+ return const_cast<T1&>( lhs ) > const_cast<T2&>( rhs );
+ }
+ };
+ template<typename T1, typename T2>
+ struct Evaluator<T1, T2, IsGreaterThanOrEqualTo> {
+ static bool evaluate( const T1& lhs, const T2& rhs ) {
+ return const_cast<T1&>( lhs ) >= const_cast<T2&>( rhs );
+ }
+ };
+ template<typename T1, typename T2>
+ struct Evaluator<T1, T2, IsLessThanOrEqualTo> {
+ static bool evaluate( const T1& lhs, const T2& rhs ) {
+ return const_cast<T1&>( lhs ) <= const_cast<T2&>( rhs );
+ }
+ };
+
+ template<Operator Op, typename T1, typename T2>
+ bool applyEvaluator( const T1& lhs, const T2& rhs ) {
+ return Evaluator<T1, T2, Op>::evaluate( lhs, rhs );
+ }
+
+ // This level of indirection allows us to specialise for integer types
+ // to avoid signed/ unsigned warnings
+
+ // "base" overload
+ template<Operator Op, typename T1, typename T2>
+ bool compare( const T1& lhs, const T2& rhs ) {
+ return Evaluator<T1, T2, Op>::evaluate( lhs, rhs );
+ }
+
+ // unsigned X to int
+ template<Operator Op> bool compare( unsigned int lhs, int rhs ) {
+ return applyEvaluator<Op>( lhs, static_cast<unsigned int>( rhs ) );
+ }
+ template<Operator Op> bool compare( unsigned long lhs, int rhs ) {
+ return applyEvaluator<Op>( lhs, static_cast<unsigned int>( rhs ) );
+ }
+ template<Operator Op> bool compare( unsigned char lhs, int rhs ) {
+ return applyEvaluator<Op>( lhs, static_cast<unsigned int>( rhs ) );
+ }
+
+ // unsigned X to long
+ template<Operator Op> bool compare( unsigned int lhs, long rhs ) {
+ return applyEvaluator<Op>( lhs, static_cast<unsigned long>( rhs ) );
+ }
+ template<Operator Op> bool compare( unsigned long lhs, long rhs ) {
+ return applyEvaluator<Op>( lhs, static_cast<unsigned long>( rhs ) );
+ }
+ template<Operator Op> bool compare( unsigned char lhs, long rhs ) {
+ return applyEvaluator<Op>( lhs, static_cast<unsigned long>( rhs ) );
+ }
+
+ // int to unsigned X
+ template<Operator Op> bool compare( int lhs, unsigned int rhs ) {
+ return applyEvaluator<Op>( static_cast<unsigned int>( lhs ), rhs );
+ }
+ template<Operator Op> bool compare( int lhs, unsigned long rhs ) {
+ return applyEvaluator<Op>( static_cast<unsigned int>( lhs ), rhs );
+ }
+ template<Operator Op> bool compare( int lhs, unsigned char rhs ) {
+ return applyEvaluator<Op>( static_cast<unsigned int>( lhs ), rhs );
+ }
+
+ // long to unsigned X
+ template<Operator Op> bool compare( long lhs, unsigned int rhs ) {
+ return applyEvaluator<Op>( static_cast<unsigned long>( lhs ), rhs );
+ }
+ template<Operator Op> bool compare( long lhs, unsigned long rhs ) {
+ return applyEvaluator<Op>( static_cast<unsigned long>( lhs ), rhs );
+ }
+ template<Operator Op> bool compare( long lhs, unsigned char rhs ) {
+ return applyEvaluator<Op>( static_cast<unsigned long>( lhs ), rhs );
+ }
+
+ // pointer to long (when comparing against NULL)
+ template<Operator Op, typename T> bool compare( long lhs, T* rhs ) {
+ return Evaluator<T*, T*, Op>::evaluate( reinterpret_cast<T*>( lhs ), rhs );
+ }
+ template<Operator Op, typename T> bool compare( T* lhs, long rhs ) {
+ return Evaluator<T*, T*, Op>::evaluate( lhs, reinterpret_cast<T*>( rhs ) );
+ }
+
+ // pointer to int (when comparing against NULL)
+ template<Operator Op, typename T> bool compare( int lhs, T* rhs ) {
+ return Evaluator<T*, T*, Op>::evaluate( reinterpret_cast<T*>( lhs ), rhs );
+ }
+ template<Operator Op, typename T> bool compare( T* lhs, int rhs ) {
+ return Evaluator<T*, T*, Op>::evaluate( lhs, reinterpret_cast<T*>( rhs ) );
+ }
+
+} // end of namespace Internal
+} // end of namespace Catch
+
+namespace Catch {
+
+// Wraps the (stringised versions of) the lhs, operator and rhs of an expression - as well as
+// the result of evaluating it. This is used to build an AssertionResult object
+class ExpressionResultBuilder {
+public:
+
+ ExpressionResultBuilder( ResultWas::OfType resultType = ResultWas::Unknown );
+ ExpressionResultBuilder( const ExpressionResultBuilder& other );
+ ExpressionResultBuilder& operator=(const ExpressionResultBuilder& other );
+
+ ExpressionResultBuilder& setResultType( ResultWas::OfType result );
+ ExpressionResultBuilder& setResultType( bool result );
+ ExpressionResultBuilder& setLhs( const std::string& lhs );
+ ExpressionResultBuilder& setRhs( const std::string& rhs );
+ ExpressionResultBuilder& setOp( const std::string& op );
+
+ ExpressionResultBuilder& endExpression( ResultDisposition::Flags resultDisposition );
+
+ template<typename T>
+ ExpressionResultBuilder& operator << ( const T& value ) {
+ m_stream << value;
+ return *this;
+ }
+
+ std::string reconstructExpression( const AssertionInfo& info ) const;
+
+ AssertionResult buildResult( const AssertionInfo& info ) const;
+
+private:
+ AssertionResultData m_data;
+ struct ExprComponents {
+ ExprComponents() : shouldNegate( false ) {}
+ bool shouldNegate;
+ std::string lhs, rhs, op;
+ } m_exprComponents;
+ std::ostringstream m_stream;
+};
+
+} // end namespace Catch
+
+namespace Catch {
+
+struct STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison;
+
+// Wraps the LHS of an expression and captures the operator and RHS (if any) - wrapping them all
+// in an ExpressionResultBuilder object
+template<typename T>
+class ExpressionLhs {
+ void operator = ( const ExpressionLhs& );
+
+public:
+ ExpressionLhs( T lhs ) : m_lhs( lhs ) {}
+
+ template<typename RhsT>
+ ExpressionResultBuilder& operator == ( const RhsT& rhs ) {
+ return captureExpression<Internal::IsEqualTo>( rhs );
+ }
+
+ template<typename RhsT>
+ ExpressionResultBuilder& operator != ( const RhsT& rhs ) {
+ return captureExpression<Internal::IsNotEqualTo>( rhs );
+ }
+
+ template<typename RhsT>
+ ExpressionResultBuilder& operator < ( const RhsT& rhs ) {
+ return captureExpression<Internal::IsLessThan>( rhs );
+ }
+
+ template<typename RhsT>
+ ExpressionResultBuilder& operator > ( const RhsT& rhs ) {
+ return captureExpression<Internal::IsGreaterThan>( rhs );
+ }
+
+ template<typename RhsT>
+ ExpressionResultBuilder& operator <= ( const RhsT& rhs ) {
+ return captureExpression<Internal::IsLessThanOrEqualTo>( rhs );
+ }
+
+ template<typename RhsT>
+ ExpressionResultBuilder& operator >= ( const RhsT& rhs ) {
+ return captureExpression<Internal::IsGreaterThanOrEqualTo>( rhs );
+ }
+
+ ExpressionResultBuilder& operator == ( bool rhs ) {
+ return captureExpression<Internal::IsEqualTo>( rhs );
+ }
+
+ ExpressionResultBuilder& operator != ( bool rhs ) {
+ return captureExpression<Internal::IsNotEqualTo>( rhs );
+ }
+
+ ExpressionResultBuilder& endExpression( ResultDisposition::Flags resultDisposition ) {
+ bool value = m_lhs ? true : false;
+ return m_result
+ .setLhs( Catch::toString( value ) )
+ .setResultType( value )
+ .endExpression( resultDisposition );
+ }
+
+ // Only simple binary expressions are allowed on the LHS.
+ // If more complex compositions are required then place the sub expression in parentheses
+ template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator + ( const RhsT& );
+ template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator - ( const RhsT& );
+ template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator / ( const RhsT& );
+ template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator * ( const RhsT& );
+
+private:
+ template<Internal::Operator Op, typename RhsT>
+ ExpressionResultBuilder& captureExpression( const RhsT& rhs ) {
+ return m_result
+ .setResultType( Internal::compare<Op>( m_lhs, rhs ) )
+ .setLhs( Catch::toString( m_lhs ) )
+ .setRhs( Catch::toString( rhs ) )
+ .setOp( Internal::OperatorTraits<Op>::getName() );
+ }
+
+private:
+ ExpressionResultBuilder m_result;
+ T m_lhs;
+};
+
+} // end namespace Catch
+
+namespace Catch {
+
+// Captures the LHS of the expression and wraps it in an Expression Lhs object
+class ExpressionDecomposer {
+public:
+
+ template<typename T>
+ ExpressionLhs<const T&> operator->* ( const T & operand ) {
+ return ExpressionLhs<const T&>( operand );
+ }
+
+ ExpressionLhs<bool> operator->* ( bool value ) {
+ return ExpressionLhs<bool>( value );
+ }
+};
+
+} // end namespace Catch
+
+// #included from: catch_interfaces_capture.h
+#define TWOBLUECUBES_CATCH_INTERFACES_CAPTURE_H_INCLUDED
+
+#include <string>
+// #included from: catch_totals.hpp
+#define TWOBLUECUBES_CATCH_TOTALS_HPP_INCLUDED
+
+#include <cstddef>
+
+namespace Catch {
+
+ struct Counts {
+ Counts() : passed( 0 ), failed( 0 ) {}
+
+ Counts operator - ( const Counts& other ) const {
+ Counts diff;
+ diff.passed = passed - other.passed;
+ diff.failed = failed - other.failed;
+ return diff;
+ }
+ Counts& operator += ( const Counts& other ) {
+ passed += other.passed;
+ failed += other.failed;
+ return *this;
+ }
+
+ std::size_t total() const {
+ return passed + failed;
+ }
+
+ std::size_t passed;
+ std::size_t failed;
+ };
+
+ struct Totals {
+
+ Totals operator - ( const Totals& other ) const {
+ Totals diff;
+ diff.assertions = assertions - other.assertions;
+ diff.testCases = testCases - other.testCases;
+ return diff;
+ }
+
+ Totals delta( const Totals& prevTotals ) const {
+ Totals diff = *this - prevTotals;
+ if( diff.assertions.failed > 0 )
+ ++diff.testCases.failed;
+ else
+ ++diff.testCases.passed;
+ return diff;
+ }
+
+ Totals& operator += ( const Totals& other ) {
+ assertions += other.assertions;
+ testCases += other.testCases;
+ return *this;
+ }
+
+ Counts assertions;
+ Counts testCases;
+ };
+}
+
+
+namespace Catch {
+
+ class TestCaseInfo;
+ class ScopedInfo;
+ class ExpressionResultBuilder;
+ class AssertionResult;
+ struct AssertionInfo;
+
+ struct IResultCapture {
+
+ virtual ~IResultCapture();
+
+ virtual void testEnded( const AssertionResult& result ) = 0;
+ virtual bool sectionStarted( const std::string& name,
+ const std::string& description,
+ const SourceLineInfo& lineInfo,
+ Counts& assertions ) = 0;
+ virtual void sectionEnded( const std::string& name, const Counts& assertions ) = 0;
+ virtual void pushScopedInfo( ScopedInfo* scopedInfo ) = 0;
+ virtual void popScopedInfo( ScopedInfo* scopedInfo ) = 0;
+ virtual bool shouldDebugBreak() const = 0;
+
+ virtual ResultAction::Value acceptExpression( const ExpressionResultBuilder& assertionResult, const AssertionInfo& assertionInfo ) = 0;
+
+ virtual std::string getCurrentTestName() const = 0;
+ virtual const AssertionResult* getLastResult() const = 0;
+ };
+}
+
+// #included from: catch_debugger.hpp
+#define TWOBLUECUBES_CATCH_DEBUGGER_HPP_INCLUDED
+
+#include <iostream>
+
+#if defined(__MAC_OS_X_VERSION_MIN_REQUIRED)
+#define CATCH_PLATFORM_MAC
+#elif defined(__IPHONE_OS_VERSION_MIN_REQUIRED)
+#define CATCH_PLATFORM_IPHONE
+#elif defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER)
+#define CATCH_PLATFORM_WINDOWS
+#endif
+
+#ifdef CATCH_PLATFORM_MAC
+
+ #include <assert.h>
+ #include <stdbool.h>
+ #include <sys/types.h>
+ #include <unistd.h>
+ #include <sys/sysctl.h>
+
+ namespace Catch{
+
+ // The following function is taken directly from the following technical note:
+ // http://developer.apple.com/library/mac/#qa/qa2004/qa1361.html
+
+ // Returns true if the current process is being debugged (either
+ // running under the debugger or has a debugger attached post facto).
+ inline bool isDebuggerActive(){
+
+ int junk;
+ int mib[4];
+ struct kinfo_proc info;
+ size_t size;
+
+ // Initialize the flags so that, if sysctl fails for some bizarre
+ // reason, we get a predictable result.
+
+ info.kp_proc.p_flag = 0;
+
+ // Initialize mib, which tells sysctl the info we want, in this case
+ // we're looking for information about a specific process ID.
+
+ mib[0] = CTL_KERN;
+ mib[1] = KERN_PROC;
+ mib[2] = KERN_PROC_PID;
+ mib[3] = getpid();
+
+ // Call sysctl.
+
+ size = sizeof(info);
+ junk = sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, NULL, 0);
+ assert(junk == 0);
+
+ // We're being debugged if the P_TRACED flag is set.
+
+ return ( (info.kp_proc.p_flag & P_TRACED) != 0 );
+ }
+ }
+
+ // The following code snippet taken from:
+ // http://cocoawithlove.com/2008/03/break-into-debugger.html
+ #ifdef DEBUG
+ #if defined(__ppc64__) || defined(__ppc__)
+ #define BreakIntoDebugger() \
+ if( Catch::isDebuggerActive() ) { \
+ __asm__("li r0, 20\nsc\nnop\nli r0, 37\nli r4, 2\nsc\nnop\n" \
+ : : : "memory","r0","r3","r4" ); \
+ }
+ #else
+ #define BreakIntoDebugger() if( Catch::isDebuggerActive() ) {__asm__("int $3\n" : : );}
+ #endif
+ #else
+ inline void BreakIntoDebugger(){}
+ #endif
+
+#elif defined(_MSC_VER)
+ extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent();
+ #define BreakIntoDebugger() if (IsDebuggerPresent() ) { __debugbreak(); }
+ inline bool isDebuggerActive() {
+ return IsDebuggerPresent() != 0;
+ }
+#elif defined(__MINGW32__)
+ extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent();
+ extern "C" __declspec(dllimport) void __stdcall DebugBreak();
+ #define BreakIntoDebugger() if (IsDebuggerPresent() ) { DebugBreak(); }
+ inline bool isDebuggerActive() {
+ return IsDebuggerPresent() != 0;
+ }
+#else
+ inline void BreakIntoDebugger(){}
+ inline bool isDebuggerActive() { return false; }
+#endif
+
+#ifdef CATCH_PLATFORM_WINDOWS
+extern "C" __declspec(dllimport) void __stdcall OutputDebugStringA( const char* );
+inline void writeToDebugConsole( const std::string& text ) {
+ ::OutputDebugStringA( text.c_str() );
+}
+#else
+inline void writeToDebugConsole( const std::string& text ) {
+ // !TBD: Need a version for Mac/ XCode and other IDEs
+ std::cout << text;
+}
+#endif // CATCH_PLATFORM_WINDOWS
+
+// #included from: catch_interfaces_registry_hub.h
+#define TWOBLUECUBES_CATCH_INTERFACES_REGISTRY_HUB_H_INCLUDED
+
+// #included from: catch_interfaces_reporter.h
+#define TWOBLUECUBES_CATCH_INTERFACES_REPORTER_H_INCLUDED
+
+// #included from: catch_config.hpp
+#define TWOBLUECUBES_CATCH_CONFIG_HPP_INCLUDED
+
+// #included from: catch_test_spec.h
+#define TWOBLUECUBES_CATCH_TEST_SPEC_H_INCLUDED
+
+// #included from: catch_test_case_info.h
+#define TWOBLUECUBES_CATCH_TEST_CASE_INFO_H_INCLUDED
+
+#include <string>
+#include <set>
+
+namespace Catch {
+
+ struct ITestCase;
+
+ class TestCaseInfo {
+ public:
+ TestCaseInfo();
+
+ TestCaseInfo( ITestCase* testCase,
+ const std::string& className,
+ const std::string& name,
+ const std::string& description,
+ const SourceLineInfo& lineInfo );
+
+ TestCaseInfo( const TestCaseInfo& other, const std::string& name );
+ TestCaseInfo( const TestCaseInfo& other );
+
+ void invoke() const;
+
+ const std::string& getClassName() const;
+ const std::string& getName() const;
+ const std::string& getDescription() const;
+ const SourceLineInfo& getLineInfo() const;
+ bool isHidden() const;
+ bool hasTag( const std::string& tag ) const;
+ bool matchesTags( const std::string& tagPattern ) const;
+ const std::set<std::string>& getTags() const;
+
+ void swap( TestCaseInfo& other );
+ bool operator == ( const TestCaseInfo& other ) const;
+ bool operator < ( const TestCaseInfo& other ) const;
+ TestCaseInfo& operator = ( const TestCaseInfo& other );
+
+ private:
+ Ptr<ITestCase> m_test;
+ std::string m_className;
+ std::string m_name;
+ std::string m_description;
+ std::set<std::string> m_tags;
+ SourceLineInfo m_lineInfo;
+ bool m_isHidden;
+ };
+}
+
+// #included from: catch_tags.hpp
+#define TWOBLUECUBES_CATCH_TAGS_HPP_INCLUDED
+
+#include <string>
+#include <set>
+#include <map>
+#include <vector>
+
+#ifdef __clang__
+#pragma clang diagnostic ignored "-Wpadded"
+#endif
+
+namespace Catch {
+ class TagParser {
+ public:
+ virtual ~TagParser();
+
+ void parse( const std::string& str ) {
+ std::size_t pos = 0;
+ while( pos < str.size() ) {
+ char c = str[pos];
+ if( c == '[' ) {
+ std::size_t end = str.find_first_of( ']', pos );
+ if( end != std::string::npos ) {
+ acceptTag( str.substr( pos+1, end-pos-1 ) );
+ pos = end+1;
+ }
+ else {
+ acceptChar( c );
+ pos++;
+ }
+ }
+ else {
+ acceptChar( c );
+ pos++;
+ }
+ }
+ endParse();
+ }
+
+ protected:
+ virtual void acceptTag( const std::string& tag ) = 0;
+ virtual void acceptChar( char c ) = 0;
+ virtual void endParse() {}
+
+ private:
+ };
+
+ class TagExtracter : public TagParser {
+ public:
+
+ TagExtracter( std::set<std::string>& tags )
+ : m_tags( tags )
+ {}
+ virtual ~TagExtracter();
+
+ void parse( std::string& description ) {
+ TagParser::parse( description );
+ description = m_remainder;
+ }
+
+ private:
+ virtual void acceptTag( const std::string& tag ) {
+ m_tags.insert( tag );
+ }
+ virtual void acceptChar( char c ) {
+ m_remainder += c;
+ }
+
+ TagExtracter& operator=(const TagExtracter&);
+
+ std::set<std::string>& m_tags;
+ std::string m_remainder;
+ };
+
+ class Tag {
+ public:
+ Tag()
+ : m_isNegated( false )
+ {}
+
+ Tag( const std::string& name, bool isNegated )
+ : m_name( name ),
+ m_isNegated( isNegated )
+ {}
+
+ std::string getName() const {
+ return m_name;
+ }
+ bool isNegated() const {
+ return m_isNegated;
+ }
+
+ bool operator ! () const {
+ return m_name.empty();
+ }
+
+ private:
+ std::string m_name;
+ bool m_isNegated;
+ };
+
+ class TagSet {
+ typedef std::map<std::string, Tag> TagMap;
+ public:
+ void add( const Tag& tag ) {
+ m_tags.insert( std::make_pair( tag.getName(), tag ) );
+ }
+
+ bool empty() const {
+ return m_tags.empty();
+ }
+
+ bool matches( const std::set<std::string>& tags ) const {
+ TagMap::const_iterator it = m_tags.begin();
+ TagMap::const_iterator itEnd = m_tags.end();
+ for(; it != itEnd; ++it ) {
+ bool found = tags.find( it->first ) != tags.end();
+ if( found == it->second.isNegated() )
+ return false;
+ }
+ return true;
+ }
+
+ private:
+ TagMap m_tags;
+ };
+
+ class TagExpression {
+ public:
+ bool matches( const std::set<std::string>& tags ) const {
+ std::vector<TagSet>::const_iterator it = m_tagSets.begin();
+ std::vector<TagSet>::const_iterator itEnd = m_tagSets.end();
+ for(; it != itEnd; ++it )
+ if( it->matches( tags ) )
+ return true;
+ return false;
+ }
+
+ private:
+ friend class TagExpressionParser;
+
+ std::vector<TagSet> m_tagSets;
+ };
+
+ class TagExpressionParser : public TagParser {
+ public:
+ TagExpressionParser( TagExpression& exp )
+ : m_isNegated( false ),
+ m_exp( exp )
+ {}
+
+ ~TagExpressionParser();
+
+ private:
+ virtual void acceptTag( const std::string& tag ) {
+ m_currentTagSet.add( Tag( tag, m_isNegated ) );
+ m_isNegated = false;
+ }
+ virtual void acceptChar( char c ) {
+ switch( c ) {
+ case '~':
+ m_isNegated = true;
+ break;
+ case ',':
+ m_exp.m_tagSets.push_back( m_currentTagSet );
+ break;
+ }
+ }
+ virtual void endParse() {
+ if( !m_currentTagSet.empty() )
+ m_exp.m_tagSets.push_back( m_currentTagSet );
+ }
+
+ TagExpressionParser& operator=(const TagExpressionParser&);
+
+ bool m_isNegated;
+ TagSet m_currentTagSet;
+ TagExpression& m_exp;
+ };
+
+} // end namespace Catch
+
+#include <string>
+#include <vector>
+
+namespace Catch {
+
+ struct IfFilterMatches{ enum DoWhat {
+ AutoDetectBehaviour,
+ IncludeTests,
+ ExcludeTests
+ }; };
+
+ class TestCaseFilter {
+ enum WildcardPosition {
+ NoWildcard = 0,
+ WildcardAtStart = 1,
+ WildcardAtEnd = 2,
+ WildcardAtBothEnds = WildcardAtStart | WildcardAtEnd
+ };
+
+ public:
+ TestCaseFilter( const std::string& testSpec, IfFilterMatches::DoWhat matchBehaviour = IfFilterMatches::AutoDetectBehaviour )
+ : m_stringToMatch( testSpec ),
+ m_filterType( matchBehaviour ),
+ m_wildcardPosition( NoWildcard )
+ {
+ if( m_filterType == IfFilterMatches::AutoDetectBehaviour ) {
+ if( startsWith( m_stringToMatch, "exclude:" ) ) {
+ m_stringToMatch = m_stringToMatch.substr( 8 );
+ m_filterType = IfFilterMatches::ExcludeTests;
+ }
+ else if( startsWith( m_stringToMatch, "~" ) ) {
+ m_stringToMatch = m_stringToMatch.substr( 1 );
+ m_filterType = IfFilterMatches::ExcludeTests;
+ }
+ else {
+ m_filterType = IfFilterMatches::IncludeTests;
+ }
+ }
+
+ if( m_stringToMatch[0] == '*' ) {
+ m_stringToMatch = m_stringToMatch.substr( 1 );
+ m_wildcardPosition = (WildcardPosition)( m_wildcardPosition | WildcardAtStart );
+ }
+ if( m_stringToMatch[m_stringToMatch.size()-1] == '*' ) {
+ m_stringToMatch = m_stringToMatch.substr( 0, m_stringToMatch.size()-1 );
+ m_wildcardPosition = (WildcardPosition)( m_wildcardPosition | WildcardAtEnd );
+ }
+ }
+
+ IfFilterMatches::DoWhat getFilterType() const {
+ return m_filterType;
+ }
+
+ bool shouldInclude( const TestCaseInfo& testCase ) const {
+ return isMatch( testCase ) == (m_filterType == IfFilterMatches::IncludeTests);
+ }
+ private:
+
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wunreachable-code"
+#endif
+
+ bool isMatch( const TestCaseInfo& testCase ) const {
+ const std::string& name = testCase.getName();
+
+ switch( m_wildcardPosition ) {
+ case NoWildcard:
+ return m_stringToMatch == name;
+ case WildcardAtStart:
+ return endsWith( name, m_stringToMatch );
+ case WildcardAtEnd:
+ return startsWith( name, m_stringToMatch );
+ case WildcardAtBothEnds:
+ return contains( name, m_stringToMatch );
+ }
+ throw std::logic_error( "Unhandled wildcard type" );
+ }
+
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+
+ std::string m_stringToMatch;
+ IfFilterMatches::DoWhat m_filterType;
+ WildcardPosition m_wildcardPosition;
+ };
+
+ class TestCaseFilters {
+ public:
+ TestCaseFilters( const std::string& name ) : m_name( name ) {}
+
+ std::string getName() const {
+ return m_name;
+ }
+
+ void addFilter( const TestCaseFilter& filter ) {
+ if( filter.getFilterType() == IfFilterMatches::ExcludeTests )
+ m_exclusionFilters.push_back( filter );
+ else
+ m_inclusionFilters.push_back( filter );
+ }
+
+ void addTags( const std::string& tagPattern ) {
+ TagExpression exp;
+ TagExpressionParser( exp ).parse( tagPattern );
+
+ m_tagExpressions.push_back( exp );
+ }
+
+ bool shouldInclude( const TestCaseInfo& testCase ) const {
+ if( !m_tagExpressions.empty() ) {
+ std::vector<TagExpression>::const_iterator it = m_tagExpressions.begin();
+ std::vector<TagExpression>::const_iterator itEnd = m_tagExpressions.end();
+ for(; it != itEnd; ++it )
+ if( it->matches( testCase.getTags() ) )
+ break;
+ if( it == itEnd )
+ return false;
+ }
+
+ if( !m_inclusionFilters.empty() ) {
+ std::vector<TestCaseFilter>::const_iterator it = m_inclusionFilters.begin();
+ std::vector<TestCaseFilter>::const_iterator itEnd = m_inclusionFilters.end();
+ for(; it != itEnd; ++it )
+ if( it->shouldInclude( testCase ) )
+ break;
+ if( it == itEnd )
+ return false;
+ }
+ else if( m_exclusionFilters.empty() && m_tagExpressions.empty() ) {
+ return !testCase.isHidden();
+ }
+
+ std::vector<TestCaseFilter>::const_iterator it = m_exclusionFilters.begin();
+ std::vector<TestCaseFilter>::const_iterator itEnd = m_exclusionFilters.end();
+ for(; it != itEnd; ++it )
+ if( !it->shouldInclude( testCase ) )
+ return false;
+ return true;
+ }
+ private:
+ std::vector<TagExpression> m_tagExpressions;
+ std::vector<TestCaseFilter> m_inclusionFilters;
+ std::vector<TestCaseFilter> m_exclusionFilters;
+ std::string m_name;
+ };
+
+}
+
+// #included from: catch_interfaces_config.h
+#define TWOBLUECUBES_CATCH_INTERFACES_CONFIG_H_INCLUDED
+
+namespace Catch {
+
+ struct IConfig {
+
+ virtual ~IConfig();
+
+ virtual bool allowThrows() const = 0;
+ };
+}
+
+// #included from: catch_stream.hpp
+#define TWOBLUECUBES_CATCH_STREAM_HPP_INCLUDED
+
+// #included from: catch_streambuf.h
+#define TWOBLUECUBES_CATCH_STREAMBUF_H_INCLUDED
+
+#include <streambuf>
+
+namespace Catch {
+
+ class StreamBufBase : public std::streambuf {
+ public:
+ virtual ~StreamBufBase();
+ };
+}
+
+#include <stdexcept>
+#include <cstdio>
+
+namespace Catch {
+
+ template<typename WriterF, size_t bufferSize=256>
+ class StreamBufImpl : public StreamBufBase {
+ char data[bufferSize];
+ WriterF m_writer;
+
+ public:
+ StreamBufImpl() {
+ setp( data, data + sizeof(data) );
+ }
+
+ ~StreamBufImpl() {
+ sync();
+ }
+
+ private:
+ int overflow( int c ) {
+ sync();
+
+ if( c != EOF ) {
+ if( pbase() == epptr() )
+ m_writer( std::string( 1, static_cast<char>( c ) ) );
+ else
+ sputc( static_cast<char>( c ) );
+ }
+ return 0;
+ }
+
+ int sync() {
+ if( pbase() != pptr() ) {
+ m_writer( std::string( pbase(), static_cast<std::string::size_type>( pptr() - pbase() ) ) );
+ setp( pbase(), epptr() );
+ }
+ return 0;
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+
+ struct OutputDebugWriter {
+
+ void operator()( const std::string &str ) {
+ writeToDebugConsole( str );
+ }
+ };
+
+ class Stream {
+ public:
+ Stream()
+ : streamBuf( NULL ), isOwned( false )
+ {}
+
+ Stream( std::streambuf* _streamBuf, bool _isOwned )
+ : streamBuf( _streamBuf ), isOwned( _isOwned )
+ {}
+
+ void release() {
+ if( isOwned ) {
+ delete streamBuf;
+ streamBuf = NULL;
+ isOwned = false;
+ }
+ }
+
+ std::streambuf* streamBuf;
+
+ private:
+ bool isOwned;
+ };
+}
+
+#include <memory>
+#include <vector>
+#include <string>
+#include <iostream>
+
+namespace Catch {
+
+ struct Include { enum WhichResults {
+ FailedOnly,
+ SuccessfulResults
+ }; };
+
+ struct List{ enum What {
+ None = 0,
+
+ Reports = 1,
+ Tests = 2,
+ All = 3,
+
+ TestNames = 6,
+
+ WhatMask = 0xf,
+
+ AsText = 0x10,
+ AsXml = 0x20,
+
+ AsMask = 0xf0
+ }; };
+
+ struct ConfigData {
+
+ struct WarnAbout { enum What {
+ Nothing = 0x00,
+ NoAssertions = 0x01
+ }; };
+
+ ConfigData()
+ : listSpec( List::None ),
+ shouldDebugBreak( false ),
+ includeWhichResults( Include::FailedOnly ),
+ cutoff( -1 ),
+ allowThrows( true ),
+ warnings( WarnAbout::Nothing )
+ {}
+
+ std::string reporter;
+ std::string outputFilename;
+ List::What listSpec;
+ std::vector<TestCaseFilters> filters;
+ bool shouldDebugBreak;
+ std::string stream;
+ Include::WhichResults includeWhichResults;
+ std::string name;
+ int cutoff;
+ bool allowThrows;
+ WarnAbout::What warnings;
+ };
+
+ class Config : public IConfig {
+ private:
+ Config( const Config& other );
+ Config& operator = ( const Config& other );
+ virtual void dummy();
+ public:
+
+ Config()
+ : m_os( std::cout.rdbuf() )
+ {}
+
+ Config( const ConfigData& data )
+ : m_data( data ),
+ m_os( std::cout.rdbuf() )
+ {}
+
+ virtual ~Config() {
+ m_os.rdbuf( std::cout.rdbuf() );
+ m_stream.release();
+ }
+
+ void setFilename( const std::string& filename ) {
+ m_data.outputFilename = filename;
+ }
+
+ List::What getListSpec( void ) const {
+ return m_data.listSpec;
+ }
+
+ const std::string& getFilename() const {
+ return m_data.outputFilename ;
+ }
+
+ List::What listWhat() const {
+ return static_cast<List::What>( m_data.listSpec & List::WhatMask );
+ }
+
+ List::What listAs() const {
+ return static_cast<List::What>( m_data.listSpec & List::AsMask );
+ }
+
+ std::string getName() const {
+ return m_data.name;
+ }
+
+ bool shouldDebugBreak() const {
+ return m_data.shouldDebugBreak;
+ }
+
+ virtual std::ostream& stream() const {
+ return m_os;
+ }
+
+ void setStreamBuf( std::streambuf* buf ) {
+ m_os.rdbuf( buf ? buf : std::cout.rdbuf() );
+ }
+
+ void useStream( const std::string& streamName ) {
+ Stream stream = createStream( streamName );
+ setStreamBuf( stream.streamBuf );
+ m_stream.release();
+ m_stream = stream;
+ }
+
+ void addTestSpec( const std::string& testSpec ) {
+ TestCaseFilters filters( testSpec );
+ filters.addFilter( TestCaseFilter( testSpec ) );
+ m_data.filters.push_back( filters );
+ }
+
+ virtual bool includeSuccessfulResults() const {
+ return m_data.includeWhichResults == Include::SuccessfulResults;
+ }
+
+ int getCutoff() const {
+ return m_data.cutoff;
+ }
+
+ virtual bool allowThrows() const {
+ return m_data.allowThrows;
+ }
+
+ const ConfigData& data() const {
+ return m_data;
+ }
+ ConfigData& data() {
+ return m_data;
+ }
+
+ private:
+ ConfigData m_data;
+
+ // !TBD Move these out of here
+ Stream m_stream;
+ mutable std::ostream m_os;
+ };
+
+} // end namespace Catch
+
+#include <string>
+#include <ostream>
+#include <map>
+
+namespace Catch
+{
+ struct ReporterConfig
+ {
+ ReporterConfig( const std::string& _name,
+ std::ostream& _stream,
+ bool _includeSuccessfulResults,
+ const ConfigData& _fullConfig )
+ : name( _name ),
+ stream( _stream ),
+ includeSuccessfulResults( _includeSuccessfulResults ),
+ fullConfig( _fullConfig )
+ {}
+
+ ReporterConfig( const ReporterConfig& other )
+ : name( other.name ),
+ stream( other.stream ),
+ includeSuccessfulResults( other.includeSuccessfulResults ),
+ fullConfig( other.fullConfig )
+ {}
+
+ std::string name;
+ std::ostream& stream;
+ bool includeSuccessfulResults;
+ ConfigData fullConfig;
+
+ private:
+ void operator=(const ReporterConfig&);
+ };
+
+ class TestCaseInfo;
+ class AssertionResult;
+
+ struct IReporter : IShared {
+ virtual ~IReporter();
+
+ virtual bool shouldRedirectStdout() const = 0;
+
+ virtual void StartTesting() = 0;
+ virtual void EndTesting( const Totals& totals ) = 0;
+
+ virtual void StartGroup( const std::string& groupName ) = 0;
+ virtual void EndGroup( const std::string& groupName, const Totals& totals ) = 0;
+
+ virtual void StartTestCase( const TestCaseInfo& testInfo ) = 0;
+ // TestCaseResult
+ virtual void EndTestCase( const TestCaseInfo& testInfo, const Totals& totals, const std::string& stdOut, const std::string& stdErr ) = 0;
+
+ // SectionInfo
+ virtual void StartSection( const std::string& sectionName, const std::string& description ) = 0;
+ // Section Result
+ virtual void EndSection( const std::string& sectionName, const Counts& assertions ) = 0;
+
+ // - merge into SectionResult ?
+ virtual void NoAssertionsInSection( const std::string& sectionName ) = 0;
+ virtual void NoAssertionsInTestCase( const std::string& testName ) = 0;
+
+ // - merge into SectionResult, TestCaseResult, GroupResult & TestRunResult
+ virtual void Aborted() = 0;
+
+ // AssertionReslt
+ virtual void Result( const AssertionResult& result ) = 0;
+ };
+
+ struct IReporterFactory {
+ virtual ~IReporterFactory();
+ virtual IReporter* create( const ReporterConfig& config ) const = 0;
+ virtual std::string getDescription() const = 0;
+ };
+
+ struct IReporterRegistry {
+ typedef std::map<std::string, IReporterFactory*> FactoryMap;
+
+ virtual ~IReporterRegistry();
+ virtual IReporter* create( const std::string& name, const ReporterConfig& config ) const = 0;
+ virtual const FactoryMap& getFactories() const = 0;
+ };
+
+ inline std::string trim( const std::string& str ) {
+ std::string::size_type start = str.find_first_not_of( "\n\r\t " );
+ std::string::size_type end = str.find_last_not_of( "\n\r\t " );
+
+ return start != std::string::npos ? str.substr( start, 1+end-start ) : "";
+ }
+}
+
+#include <vector>
+
+namespace Catch {
+
+ class TestCaseInfo;
+ struct ITestCaseRegistry;
+ struct IExceptionTranslatorRegistry;
+ struct IExceptionTranslator;
+
+ struct IRegistryHub {
+ virtual ~IRegistryHub();
+
+ virtual const IReporterRegistry& getReporterRegistry() const = 0;
+ virtual const ITestCaseRegistry& getTestCaseRegistry() const = 0;
+ virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() = 0;
+ };
+
+ struct IMutableRegistryHub {
+ virtual ~IMutableRegistryHub();
+ virtual void registerReporter( const std::string& name, IReporterFactory* factory ) = 0;
+ virtual void registerTest( const TestCaseInfo& testInfo ) = 0;
+ virtual void registerTranslator( const IExceptionTranslator* translator ) = 0;
+ };
+
+ IRegistryHub& getRegistryHub();
+ IMutableRegistryHub& getMutableRegistryHub();
+ void cleanUp();
+ std::string translateActiveException();
+
+}
+
+#include <ostream>
+
+namespace Catch {
+
+ inline IResultCapture& getResultCapture() {
+ return getCurrentContext().getResultCapture();
+ }
+
+ template<typename MatcherT>
+ ExpressionResultBuilder expressionResultBuilderFromMatcher( const MatcherT& matcher,
+ const std::string& matcherCallAsString ) {
+ std::string matcherAsString = matcher.toString();
+ if( matcherAsString == "{?}" )
+ matcherAsString = matcherCallAsString;
+ return ExpressionResultBuilder()
+ .setRhs( matcherAsString )
+ .setOp( "matches" );
+ }
+
+ template<typename MatcherT, typename ArgT>
+ ExpressionResultBuilder expressionResultBuilderFromMatcher( const MatcherT& matcher,
+ const ArgT& arg,
+ const std::string& matcherCallAsString ) {
+ return expressionResultBuilderFromMatcher( matcher, matcherCallAsString )
+ .setLhs( Catch::toString( arg ) )
+ .setResultType( matcher.match( arg ) );
+ }
+
+ template<typename MatcherT, typename ArgT>
+ ExpressionResultBuilder expressionResultBuilderFromMatcher( const MatcherT& matcher,
+ ArgT* arg,
+ const std::string& matcherCallAsString ) {
+ return expressionResultBuilderFromMatcher( matcher, matcherCallAsString )
+ .setLhs( Catch::toString( arg ) )
+ .setResultType( matcher.match( arg ) );
+ }
+
+struct TestFailureException{};
+
+class ScopedInfo {
+public:
+ ScopedInfo() : m_resultBuilder( ResultWas::Info ) {
+ getResultCapture().pushScopedInfo( this );
+ }
+ ~ScopedInfo() {
+ getResultCapture().popScopedInfo( this );
+ }
+ template<typename T>
+ ScopedInfo& operator << ( const T& value ) {
+ m_resultBuilder << value;
+ return *this;
+ }
+ AssertionResult buildResult( const AssertionInfo& assertionInfo ) const {
+ return m_resultBuilder.buildResult( assertionInfo );
+ }
+
+private:
+ ExpressionResultBuilder m_resultBuilder;
+};
+
+// This is just here to avoid compiler warnings with macro constants and boolean literals
+inline bool isTrue( bool value ){ return value; }
+
+} // end namespace Catch
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CATCH_ASSERTIONINFO_NAME INTERNAL_CATCH_UNIQUE_NAME( __assertionInfo )
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CATCH_ACCEPT_EXPR( evaluatedExpr, resultDisposition, originalExpr ) \
+ if( Catch::ResultAction::Value internal_catch_action = Catch::getResultCapture().acceptExpression( evaluatedExpr, INTERNAL_CATCH_ASSERTIONINFO_NAME ) ) { \
+ if( internal_catch_action & Catch::ResultAction::Debug ) BreakIntoDebugger(); \
+ if( internal_catch_action & Catch::ResultAction::Abort ) throw Catch::TestFailureException(); \
+ if( !Catch::shouldContinueOnFailure( resultDisposition ) ) throw Catch::TestFailureException(); \
+ if( Catch::isTrue( false ) ){ bool this_is_here_to_invoke_warnings = ( originalExpr ); Catch::isTrue( this_is_here_to_invoke_warnings ); } \
+ }
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CATCH_ACCEPT_INFO( expr, macroName, resultDisposition ) \
+ Catch::AssertionInfo INTERNAL_CATCH_ASSERTIONINFO_NAME( macroName, CATCH_INTERNAL_LINEINFO, expr, resultDisposition );
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ) \
+ do { \
+ INTERNAL_CATCH_ACCEPT_INFO( #expr, macroName, resultDisposition ); \
+ try { \
+ INTERNAL_CATCH_ACCEPT_EXPR( ( Catch::ExpressionDecomposer()->*expr ).endExpression( resultDisposition ), resultDisposition, expr ); \
+ } catch( Catch::TestFailureException& ) { \
+ throw; \
+ } catch( ... ) { \
+ INTERNAL_CATCH_ACCEPT_EXPR( Catch::ExpressionResultBuilder( Catch::ResultWas::ThrewException ) << Catch::translateActiveException(), \
+ resultDisposition | Catch::ResultDisposition::ContinueOnFailure, expr ); \
+ throw; \
+ } \
+ } while( Catch::isTrue( false ) )
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CATCH_IF( expr, resultDisposition, macroName ) \
+ INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ); \
+ if( Catch::getResultCapture().getLastResult()->succeeded() )
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CATCH_ELSE( expr, resultDisposition, macroName ) \
+ INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ); \
+ if( !Catch::getResultCapture().getLastResult()->succeeded() )
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CATCH_NO_THROW( expr, resultDisposition, macroName ) \
+ do { \
+ INTERNAL_CATCH_ACCEPT_INFO( #expr, macroName, resultDisposition ); \
+ try { \
+ expr; \
+ INTERNAL_CATCH_ACCEPT_EXPR( Catch::ExpressionResultBuilder( Catch::ResultWas::Ok ), resultDisposition, false ); \
+ } \
+ catch( ... ) { \
+ INTERNAL_CATCH_ACCEPT_EXPR( Catch::ExpressionResultBuilder( Catch::ResultWas::ThrewException ) << Catch::translateActiveException(), resultDisposition, false ); \
+ } \
+} while( Catch::isTrue( false ) )
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CATCH_THROWS_IMPL( expr, exceptionType, resultDisposition ) \
+ try { \
+ if( Catch::getCurrentContext().getConfig()->allowThrows() ) { \
+ expr; \
+ INTERNAL_CATCH_ACCEPT_EXPR( Catch::ExpressionResultBuilder( Catch::ResultWas::DidntThrowException ), resultDisposition, false ); \
+ } \
+ } \
+ catch( Catch::TestFailureException& ) { \
+ throw; \
+ } \
+ catch( exceptionType ) { \
+ INTERNAL_CATCH_ACCEPT_EXPR( Catch::ExpressionResultBuilder( Catch::ResultWas::Ok ), resultDisposition, false ); \
+ }
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CATCH_THROWS( expr, exceptionType, resultDisposition, macroName ) \
+ do { \
+ INTERNAL_CATCH_ACCEPT_INFO( #expr, macroName, resultDisposition ); \
+ INTERNAL_CATCH_THROWS_IMPL( expr, exceptionType, resultDisposition ) \
+ } while( Catch::isTrue( false ) )
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CATCH_THROWS_AS( expr, exceptionType, resultDisposition, macroName ) \
+ do { \
+ INTERNAL_CATCH_ACCEPT_INFO( #expr, macroName, resultDisposition ); \
+ INTERNAL_CATCH_THROWS_IMPL( expr, exceptionType, resultDisposition ) \
+ catch( ... ) { \
+ INTERNAL_CATCH_ACCEPT_EXPR( ( Catch::ExpressionResultBuilder( Catch::ResultWas::ThrewException ) << Catch::translateActiveException() ), \
+ resultDisposition | Catch::ResultDisposition::ContinueOnFailure, false ); \
+ } \
+ } while( Catch::isTrue( false ) )
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CATCH_MSG( reason, resultType, resultDisposition, macroName ) \
+ do { \
+ INTERNAL_CATCH_ACCEPT_INFO( "", macroName, resultDisposition ); \
+ INTERNAL_CATCH_ACCEPT_EXPR( Catch::ExpressionResultBuilder( resultType ) << reason, resultDisposition, true ) \
+ } while( Catch::isTrue( false ) )
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CATCH_SCOPED_INFO( log, macroName ) \
+ INTERNAL_CATCH_ACCEPT_INFO( "", macroName, Catch::ResultDisposition::Normal ); \
+ Catch::ScopedInfo INTERNAL_CATCH_UNIQUE_NAME( info ); \
+ INTERNAL_CATCH_UNIQUE_NAME( info ) << log
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CHECK_THAT( arg, matcher, resultDisposition, macroName ) \
+ do { \
+ INTERNAL_CATCH_ACCEPT_INFO( #arg " " #matcher, macroName, resultDisposition ); \
+ try { \
+ INTERNAL_CATCH_ACCEPT_EXPR( ( Catch::expressionResultBuilderFromMatcher( ::Catch::Matchers::matcher, arg, #matcher ) ), resultDisposition, false ); \
+ } catch( Catch::TestFailureException& ) { \
+ throw; \
+ } catch( ... ) { \
+ INTERNAL_CATCH_ACCEPT_EXPR( ( Catch::ExpressionResultBuilder( Catch::ResultWas::ThrewException ) << Catch::translateActiveException() ), \
+ resultDisposition | Catch::ResultDisposition::ContinueOnFailure, false ); \
+ throw; \
+ } \
+ } while( Catch::isTrue( false ) )
+
+// #included from: internal/catch_section.hpp
+#define TWOBLUECUBES_CATCH_SECTION_HPP_INCLUDED
+
+#include <string>
+
+namespace Catch {
+
+ class Section {
+ public:
+ Section( const std::string& name,
+ const std::string& description,
+ const SourceLineInfo& lineInfo )
+ : m_name( name ),
+ m_sectionIncluded( getCurrentContext().getResultCapture().sectionStarted( name, description, lineInfo, m_assertions ) )
+ {}
+
+ ~Section() {
+ if( m_sectionIncluded )
+ getCurrentContext().getResultCapture().sectionEnded( m_name, m_assertions );
+ }
+
+ // This indicates whether the section should be executed or not
+ operator bool() {
+ return m_sectionIncluded;
+ }
+
+ private:
+
+ std::string m_name;
+ Counts m_assertions;
+ bool m_sectionIncluded;
+ };
+
+} // end namespace Catch
+
+#define INTERNAL_CATCH_SECTION( name, desc ) \
+ if( Catch::Section INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::Section( name, desc, CATCH_INTERNAL_LINEINFO ) )
+
+// #included from: internal/catch_generators.hpp
+#define TWOBLUECUBES_CATCH_GENERATORS_HPP_INCLUDED
+
+#include <iterator>
+#include <vector>
+#include <string>
+#include <stdlib.h>
+
+namespace Catch {
+
+template<typename T>
+struct IGenerator {
+ virtual ~IGenerator() {}
+ virtual T getValue( std::size_t index ) const = 0;
+ virtual std::size_t size () const = 0;
+};
+
+template<typename T>
+class BetweenGenerator : public IGenerator<T> {
+public:
+ BetweenGenerator( T from, T to ) : m_from( from ), m_to( to ){}
+
+ virtual T getValue( std::size_t index ) const {
+ return m_from+static_cast<T>( index );
+ }
+
+ virtual std::size_t size() const {
+ return static_cast<std::size_t>( 1+m_to-m_from );
+ }
+
+private:
+
+ T m_from;
+ T m_to;
+};
+
+template<typename T>
+class ValuesGenerator : public IGenerator<T> {
+public:
+ ValuesGenerator(){}
+
+ void add( T value ) {
+ m_values.push_back( value );
+ }
+
+ virtual T getValue( std::size_t index ) const {
+ return m_values[index];
+ }
+
+ virtual std::size_t size() const {
+ return m_values.size();
+ }
+
+private:
+ std::vector<T> m_values;
+};
+
+template<typename T>
+class CompositeGenerator {
+public:
+ CompositeGenerator() : m_totalSize( 0 ) {}
+
+ // *** Move semantics, similar to auto_ptr ***
+ CompositeGenerator( CompositeGenerator& other )
+ : m_fileInfo( other.m_fileInfo ),
+ m_totalSize( 0 )
+ {
+ move( other );
+ }
+
+ CompositeGenerator& setFileInfo( const char* fileInfo ) {
+ m_fileInfo = fileInfo;
+ return *this;
+ }
+
+ ~CompositeGenerator() {
+ deleteAll( m_composed );
+ }
+
+ operator T () const {
+ size_t overallIndex = getCurrentContext().getGeneratorIndex( m_fileInfo, m_totalSize );
+
+ typename std::vector<const IGenerator<T>*>::const_iterator it = m_composed.begin();
+ typename std::vector<const IGenerator<T>*>::const_iterator itEnd = m_composed.end();
+ for( size_t index = 0; it != itEnd; ++it )
+ {
+ const IGenerator<T>* generator = *it;
+ if( overallIndex >= index && overallIndex < index + generator->size() )
+ {
+ return generator->getValue( overallIndex-index );
+ }
+ index += generator->size();
+ }
+ CATCH_INTERNAL_ERROR( "Indexed past end of generated range" );
+ return T(); // Suppress spurious "not all control paths return a value" warning in Visual Studio - if you know how to fix this please do so
+ }
+
+ void add( const IGenerator<T>* generator ) {
+ m_totalSize += generator->size();
+ m_composed.push_back( generator );
+ }
+
+ CompositeGenerator& then( CompositeGenerator& other ) {
+ move( other );
+ return *this;
+ }
+
+ CompositeGenerator& then( T value ) {
+ ValuesGenerator<T>* valuesGen = new ValuesGenerator<T>();
+ valuesGen->add( value );
+ add( valuesGen );
+ return *this;
+ }
+
+private:
+
+ void move( CompositeGenerator& other ) {
+ std::copy( other.m_composed.begin(), other.m_composed.end(), std::back_inserter( m_composed ) );
+ m_totalSize += other.m_totalSize;
+ other.m_composed.clear();
+ }
+
+ std::vector<const IGenerator<T>*> m_composed;
+ std::string m_fileInfo;
+ size_t m_totalSize;
+};
+
+namespace Generators
+{
+ template<typename T>
+ CompositeGenerator<T> between( T from, T to ) {
+ CompositeGenerator<T> generators;
+ generators.add( new BetweenGenerator<T>( from, to ) );
+ return generators;
+ }
+
+ template<typename T>
+ CompositeGenerator<T> values( T val1, T val2 ) {
+ CompositeGenerator<T> generators;
+ ValuesGenerator<T>* valuesGen = new ValuesGenerator<T>();
+ valuesGen->add( val1 );
+ valuesGen->add( val2 );
+ generators.add( valuesGen );
+ return generators;
+ }
+
+ template<typename T>
+ CompositeGenerator<T> values( T val1, T val2, T val3 ){
+ CompositeGenerator<T> generators;
+ ValuesGenerator<T>* valuesGen = new ValuesGenerator<T>();
+ valuesGen->add( val1 );
+ valuesGen->add( val2 );
+ valuesGen->add( val3 );
+ generators.add( valuesGen );
+ return generators;
+ }
+
+ template<typename T>
+ CompositeGenerator<T> values( T val1, T val2, T val3, T val4 ) {
+ CompositeGenerator<T> generators;
+ ValuesGenerator<T>* valuesGen = new ValuesGenerator<T>();
+ valuesGen->add( val1 );
+ valuesGen->add( val2 );
+ valuesGen->add( val3 );
+ valuesGen->add( val4 );
+ generators.add( valuesGen );
+ return generators;
+ }
+
+} // end namespace Generators
+
+using namespace Generators;
+
+} // end namespace Catch
+
+#define INTERNAL_CATCH_LINESTR2( line ) #line
+#define INTERNAL_CATCH_LINESTR( line ) INTERNAL_CATCH_LINESTR2( line )
+
+#define INTERNAL_CATCH_GENERATE( expr ) expr.setFileInfo( __FILE__ "(" INTERNAL_CATCH_LINESTR( __LINE__ ) ")" )
+
+// #included from: internal/catch_interfaces_exception.h
+#define TWOBLUECUBES_CATCH_INTERFACES_EXCEPTION_H_INCLUDED
+
+#include <string>
+
+namespace Catch {
+
+ typedef std::string(*exceptionTranslateFunction)();
+
+ struct IExceptionTranslator {
+ virtual ~IExceptionTranslator();
+ virtual std::string translate() const = 0;
+ };
+
+ struct IExceptionTranslatorRegistry {
+ virtual ~IExceptionTranslatorRegistry();
+
+ virtual std::string translateActiveException() const = 0;
+ };
+
+ class ExceptionTranslatorRegistrar {
+ template<typename T>
+ class ExceptionTranslator : public IExceptionTranslator {
+ public:
+
+ ExceptionTranslator( std::string(*translateFunction)( T& ) )
+ : m_translateFunction( translateFunction )
+ {}
+
+ virtual std::string translate() const {
+ try {
+ throw;
+ }
+ catch( T& ex ) {
+ return m_translateFunction( ex );
+ }
+ }
+
+ protected:
+ std::string(*m_translateFunction)( T& );
+ };
+
+ public:
+ template<typename T>
+ ExceptionTranslatorRegistrar( std::string(*translateFunction)( T& ) ) {
+ getMutableRegistryHub().registerTranslator
+ ( new ExceptionTranslator<T>( translateFunction ) );
+ }
+ };
+}
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) \
+ static std::string INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator )( signature ); \
+ namespace{ Catch::ExceptionTranslatorRegistrar INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ) ); }\
+ static std::string INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator )( signature )
+
+// #included from: internal/catch_approx.hpp
+#define TWOBLUECUBES_CATCH_APPROX_HPP_INCLUDED
+
+#include <cmath>
+#include <limits>
+
+namespace Catch {
+namespace Detail {
+
+ class Approx {
+ public:
+ explicit Approx ( double value )
+ : m_epsilon( std::numeric_limits<float>::epsilon()*100 ),
+ m_scale( 1.0 ),
+ m_value( value )
+ {}
+
+ Approx( const Approx& other )
+ : m_epsilon( other.m_epsilon ),
+ m_scale( other.m_scale ),
+ m_value( other.m_value )
+ {}
+
+ static Approx custom() {
+ return Approx( 0 );
+ }
+
+ Approx operator()( double value ) {
+ Approx approx( value );
+ approx.epsilon( m_epsilon );
+ approx.scale( m_scale );
+ return approx;
+ }
+
+ friend bool operator == ( double lhs, const Approx& rhs ) {
+ // Thanks to Richard Harris for his help refining this formula
+ return fabs( lhs - rhs.m_value ) < rhs.m_epsilon * (rhs.m_scale + (std::max)( fabs(lhs), fabs(rhs.m_value) ) );
+ }
+
+ friend bool operator == ( const Approx& lhs, double rhs ) {
+ return operator==( rhs, lhs );
+ }
+
+ friend bool operator != ( double lhs, const Approx& rhs ) {
+ return !operator==( lhs, rhs );
+ }
+
+ friend bool operator != ( const Approx& lhs, double rhs ) {
+ return !operator==( rhs, lhs );
+ }
+
+ Approx& epsilon( double newEpsilon ) {
+ m_epsilon = newEpsilon;
+ return *this;
+ }
+
+ Approx& scale( double newScale ) {
+ m_scale = newScale;
+ return *this;
+ }
+
+ std::string toString() const {
+ std::ostringstream oss;
+ oss << "Approx( " << m_value << " )";
+ return oss.str();
+ }
+
+ private:
+ double m_epsilon;
+ double m_scale;
+ double m_value;
+ };
+}
+
+template<>
+inline std::string toString<Detail::Approx>( const Detail::Approx& value ) {
+ return value.toString();
+}
+
+} // end namespace Catch
+
+// #included from: internal/catch_matchers.hpp
+#define TWOBLUECUBES_CATCH_MATCHERS_HPP_INCLUDED
+
+namespace Catch {
+namespace Matchers {
+ namespace Impl {
+
+ template<typename ExpressionT>
+ struct Matcher : SharedImpl<IShared>
+ {
+ typedef ExpressionT ExpressionType;
+
+ virtual ~Matcher() {}
+ virtual Ptr<Matcher> clone() const = 0;
+ virtual bool match( const ExpressionT& expr ) const = 0;
+ virtual std::string toString() const = 0;
+ };
+
+ template<typename DerivedT, typename ExpressionT>
+ struct MatcherImpl : Matcher<ExpressionT> {
+
+ virtual Ptr<Matcher<ExpressionT> > clone() const {
+ return Ptr<Matcher<ExpressionT> >( new DerivedT( static_cast<const DerivedT&>( *this ) ) );
+ }
+ };
+
+ namespace Generic {
+
+ template<typename ExpressionT>
+ class AllOf : public MatcherImpl<AllOf<ExpressionT>, ExpressionT> {
+ public:
+
+ AllOf() {}
+ AllOf( const AllOf& other ) : m_matchers( other.m_matchers ) {}
+
+ AllOf& add( const Matcher<ExpressionT>& matcher ) {
+ m_matchers.push_back( matcher.clone() );
+ return *this;
+ }
+ virtual bool match( const ExpressionT& expr ) const
+ {
+ for( std::size_t i = 0; i < m_matchers.size(); ++i )
+ if( !m_matchers[i]->match( expr ) )
+ return false;
+ return true;
+ }
+ virtual std::string toString() const {
+ std::ostringstream oss;
+ oss << "( ";
+ for( std::size_t i = 0; i < m_matchers.size(); ++i ) {
+ if( i != 0 )
+ oss << " and ";
+ oss << m_matchers[i]->toString();
+ }
+ oss << " )";
+ return oss.str();
+ }
+
+ private:
+ std::vector<Ptr<Matcher<ExpressionT> > > m_matchers;
+ };
+
+ template<typename ExpressionT>
+ class AnyOf : public MatcherImpl<AnyOf<ExpressionT>, ExpressionT> {
+ public:
+
+ AnyOf() {}
+ AnyOf( const AnyOf& other ) : m_matchers( other.m_matchers ) {}
+
+ AnyOf& add( const Matcher<ExpressionT>& matcher ) {
+ m_matchers.push_back( matcher.clone() );
+ return *this;
+ }
+ virtual bool match( const ExpressionT& expr ) const
+ {
+ for( std::size_t i = 0; i < m_matchers.size(); ++i )
+ if( m_matchers[i]->match( expr ) )
+ return true;
+ return false;
+ }
+ virtual std::string toString() const {
+ std::ostringstream oss;
+ oss << "( ";
+ for( std::size_t i = 0; i < m_matchers.size(); ++i ) {
+ if( i != 0 )
+ oss << " or ";
+ oss << m_matchers[i]->toString();
+ }
+ oss << " )";
+ return oss.str();
+ }
+
+ private:
+ std::vector<Ptr<Matcher<ExpressionT> > > m_matchers;
+ };
+
+ }
+
+ namespace StdString {
+
+ struct Equals : MatcherImpl<Equals, std::string> {
+ Equals( const std::string& str ) : m_str( str ){}
+ Equals( const Equals& other ) : m_str( other.m_str ){}
+
+ virtual ~Equals();
+
+ virtual bool match( const std::string& expr ) const {
+ return m_str == expr;
+ }
+ virtual std::string toString() const {
+ return "equals: \"" + m_str + "\"";
+ }
+
+ std::string m_str;
+ };
+
+ struct Contains : MatcherImpl<Contains, std::string> {
+ Contains( const std::string& substr ) : m_substr( substr ){}
+ Contains( const Contains& other ) : m_substr( other.m_substr ){}
+
+ virtual ~Contains();
+
+ virtual bool match( const std::string& expr ) const {
+ return expr.find( m_substr ) != std::string::npos;
+ }
+ virtual std::string toString() const {
+ return "contains: \"" + m_substr + "\"";
+ }
+
+ std::string m_substr;
+ };
+
+ struct StartsWith : MatcherImpl<StartsWith, std::string> {
+ StartsWith( const std::string& substr ) : m_substr( substr ){}
+ StartsWith( const StartsWith& other ) : m_substr( other.m_substr ){}
+
+ virtual ~StartsWith();
+
+ virtual bool match( const std::string& expr ) const {
+ return expr.find( m_substr ) == 0;
+ }
+ virtual std::string toString() const {
+ return "starts with: \"" + m_substr + "\"";
+ }
+
+ std::string m_substr;
+ };
+
+ struct EndsWith : MatcherImpl<EndsWith, std::string> {
+ EndsWith( const std::string& substr ) : m_substr( substr ){}
+ EndsWith( const EndsWith& other ) : m_substr( other.m_substr ){}
+
+ virtual ~EndsWith();
+
+ virtual bool match( const std::string& expr ) const {
+ return expr.find( m_substr ) == expr.size() - m_substr.size();
+ }
+ virtual std::string toString() const {
+ return "ends with: \"" + m_substr + "\"";
+ }
+
+ std::string m_substr;
+ };
+ } // namespace StdString
+ } // namespace Impl
+
+ // The following functions create the actual matcher objects.
+ // This allows the types to be inferred
+ template<typename ExpressionT>
+ inline Impl::Generic::AllOf<ExpressionT> AllOf( const Impl::Matcher<ExpressionT>& m1,
+ const Impl::Matcher<ExpressionT>& m2 ) {
+ return Impl::Generic::AllOf<ExpressionT>().add( m1 ).add( m2 );
+ }
+ template<typename ExpressionT>
+ inline Impl::Generic::AllOf<ExpressionT> AllOf( const Impl::Matcher<ExpressionT>& m1,
+ const Impl::Matcher<ExpressionT>& m2,
+ const Impl::Matcher<ExpressionT>& m3 ) {
+ return Impl::Generic::AllOf<ExpressionT>().add( m1 ).add( m2 ).add( m3 );
+ }
+ template<typename ExpressionT>
+ inline Impl::Generic::AnyOf<ExpressionT> AnyOf( const Impl::Matcher<ExpressionT>& m1,
+ const Impl::Matcher<ExpressionT>& m2 ) {
+ return Impl::Generic::AnyOf<ExpressionT>().add( m1 ).add( m2 );
+ }
+ template<typename ExpressionT>
+ inline Impl::Generic::AnyOf<ExpressionT> AnyOf( const Impl::Matcher<ExpressionT>& m1,
+ const Impl::Matcher<ExpressionT>& m2,
+ const Impl::Matcher<ExpressionT>& m3 ) {
+ return Impl::Generic::AnyOf<ExpressionT>().add( m1 ).add( m2 ).add( m3 );
+ }
+
+ inline Impl::StdString::Equals Equals( const std::string& str ){ return Impl::StdString::Equals( str ); }
+ inline Impl::StdString::Contains Contains( const std::string& substr ){ return Impl::StdString::Contains( substr ); }
+ inline Impl::StdString::StartsWith StartsWith( const std::string& substr ){ return Impl::StdString::StartsWith( substr ); }
+ inline Impl::StdString::EndsWith EndsWith( const std::string& substr ){ return Impl::StdString::EndsWith( substr ); }
+
+} // namespace Matchers
+
+using namespace Matchers;
+
+} // namespace Catch
+
+// These files are included here so the single_include script doesn't put them
+// in the conditionally compiled sections
+// #included from: internal/catch_interfaces_runner.h
+#define TWOBLUECUBES_CATCH_INTERFACES_RUNNER_H_INCLUDED
+
+#include <string>
+
+namespace Catch {
+ class TestCaseInfo;
+
+ struct IRunner {
+ virtual ~IRunner();
+ };
+}
+
+
+#ifdef __OBJC__
+// #included from: internal/catch_objc.hpp
+#define TWOBLUECUBES_CATCH_OBJC_HPP_INCLUDED
+
+#import <objc/runtime.h>
+
+#include <string>
+
+// NB. Any general catch headers included here must be included
+// in catch.hpp first to make sure they are included by the single
+// header for non obj-usage
+
+///////////////////////////////////////////////////////////////////////////////
+// This protocol is really only here for (self) documenting purposes, since
+// all its methods are optional.
+@protocol OcFixture
+
+@optional
+
+-(void) setUp;
+-(void) tearDown;
+
+@end
+
+namespace Catch {
+
+ class OcMethod : public SharedImpl<ITestCase> {
+
+ public:
+ OcMethod( Class cls, SEL sel ) : m_cls( cls ), m_sel( sel ) {}
+
+ virtual void invoke() const {
+ id obj = [[m_cls alloc] init];
+
+ performOptionalSelector( obj, @selector(setUp) );
+ performOptionalSelector( obj, m_sel );
+ performOptionalSelector( obj, @selector(tearDown) );
+
+ arcSafeRelease( obj );
+ }
+ private:
+ virtual ~OcMethod() {}
+
+ Class m_cls;
+ SEL m_sel;
+ };
+
+ namespace Detail{
+
+ inline bool startsWith( const std::string& str, const std::string& sub ) {
+ return str.length() > sub.length() && str.substr( 0, sub.length() ) == sub;
+ }
+
+ inline std::string getAnnotation( Class cls,
+ const std::string& annotationName,
+ const std::string& testCaseName ) {
+ NSString* selStr = [[NSString alloc] initWithFormat:@"Catch_%s_%s", annotationName.c_str(), testCaseName.c_str()];
+ SEL sel = NSSelectorFromString( selStr );
+ arcSafeRelease( selStr );
+ id value = performOptionalSelector( cls, sel );
+ if( value )
+ return [(NSString*)value UTF8String];
+ return "";
+ }
+ }
+
+ inline size_t registerTestMethods() {
+ size_t noTestMethods = 0;
+ int noClasses = objc_getClassList( NULL, 0 );
+
+ Class* classes = (CATCH_UNSAFE_UNRETAINED Class *)malloc( sizeof(Class) * noClasses);
+ objc_getClassList( classes, noClasses );
+
+ for( int c = 0; c < noClasses; c++ ) {
+ Class cls = classes[c];
+ {
+ u_int count;
+ Method* methods = class_copyMethodList( cls, &count );
+ for( u_int m = 0; m < count ; m++ ) {
+ SEL selector = method_getName(methods[m]);
+ std::string methodName = sel_getName(selector);
+ if( Detail::startsWith( methodName, "Catch_TestCase_" ) ) {
+ std::string testCaseName = methodName.substr( 15 );
+ std::string name = Detail::getAnnotation( cls, "Name", testCaseName );
+ std::string desc = Detail::getAnnotation( cls, "Description", testCaseName );
+ const char* className = class_getName( cls );
+
+ getMutableRegistryHub().registerTest( TestCaseInfo( new OcMethod( cls, selector ), className, name.c_str(), desc.c_str(), SourceLineInfo() ) );
+ noTestMethods++;
+ }
+ }
+ free(methods);
+ }
+ }
+ return noTestMethods;
+ }
+
+ namespace Matchers {
+ namespace Impl {
+ namespace NSStringMatchers {
+
+ template<typename MatcherT>
+ struct StringHolder : MatcherImpl<MatcherT, NSString*>{
+ StringHolder( NSString* substr ) : m_substr( [substr copy] ){}
+ StringHolder( StringHolder const& other ) : m_substr( [other.m_substr copy] ){}
+ StringHolder() {
+ arcSafeRelease( m_substr );
+ }
+
+ NSString* m_substr;
+ };
+
+ struct Equals : StringHolder<Equals> {
+ Equals( NSString* substr ) : StringHolder( substr ){}
+
+ virtual bool match( ExpressionType const& str ) const {
+ return [str isEqualToString:m_substr];
+ }
+
+ virtual std::string toString() const {
+ return "equals string: \"" + Catch::toString( m_substr ) + "\"";
+ }
+ };
+
+ struct Contains : StringHolder<Contains> {
+ Contains( NSString* substr ) : StringHolder( substr ){}
+
+ virtual bool match( ExpressionType const& str ) const {
+ return [str rangeOfString:m_substr].location != NSNotFound;
+ }
+
+ virtual std::string toString() const {
+ return "contains string: \"" + Catch::toString( m_substr ) + "\"";
+ }
+ };
+
+ struct StartsWith : StringHolder<StartsWith> {
+ StartsWith( NSString* substr ) : StringHolder( substr ){}
+
+ virtual bool match( ExpressionType const& str ) const {
+ return [str rangeOfString:m_substr].location == 0;
+ }
+
+ virtual std::string toString() const {
+ return "starts with: \"" + Catch::toString( m_substr ) + "\"";
+ }
+ };
+ struct EndsWith : StringHolder<EndsWith> {
+ EndsWith( NSString* substr ) : StringHolder( substr ){}
+
+ virtual bool match( ExpressionType const& str ) const {
+ return [str rangeOfString:m_substr].location == [str length] - [m_substr length];
+ }
+
+ virtual std::string toString() const {
+ return "ends with: \"" + Catch::toString( m_substr ) + "\"";
+ }
+ };
+
+ } // namespace NSStringMatchers
+ } // namespace Impl
+
+ inline Impl::NSStringMatchers::Equals
+ Equals( NSString* substr ){ return Impl::NSStringMatchers::Equals( substr ); }
+
+ inline Impl::NSStringMatchers::Contains
+ Contains( NSString* substr ){ return Impl::NSStringMatchers::Contains( substr ); }
+
+ inline Impl::NSStringMatchers::StartsWith
+ StartsWith( NSString* substr ){ return Impl::NSStringMatchers::StartsWith( substr ); }
+
+ inline Impl::NSStringMatchers::EndsWith
+ EndsWith( NSString* substr ){ return Impl::NSStringMatchers::EndsWith( substr ); }
+
+ } // namespace Matchers
+
+ using namespace Matchers;
+
+} // namespace Catch
+
+///////////////////////////////////////////////////////////////////////////////
+#define OC_TEST_CASE( name, desc )\
++(NSString*) INTERNAL_CATCH_UNIQUE_NAME( Catch_Name_test ) \
+{\
+return @ name; \
+}\
++(NSString*) INTERNAL_CATCH_UNIQUE_NAME( Catch_Description_test ) \
+{ \
+return @ desc; \
+} \
+-(void) INTERNAL_CATCH_UNIQUE_NAME( Catch_TestCase_test )
+
+#endif
+
+#if defined( CATCH_CONFIG_MAIN ) || defined( CATCH_CONFIG_RUNNER )
+// #included from: internal/catch_impl.hpp
+#define TWOBLUECUBES_CATCH_IMPL_HPP_INCLUDED
+
+// Collect all the implementation files together here
+// These are the equivalent of what would usually be cpp files
+
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wweak-vtables"
+#endif
+
+// #included from: catch_runner.hpp
+#define TWOBLUECUBES_CATCH_RUNNER_HPP_INCLUDED
+
+// #included from: internal/catch_commandline.hpp
+#define TWOBLUECUBES_CATCH_COMMANDLINE_HPP_INCLUDED
+
+namespace Catch {
+
+ class Command {
+ public:
+ Command(){}
+
+ explicit Command( const std::string& name ) : m_name( name ) {
+ }
+
+ Command& operator += ( const std::string& arg ) {
+ m_args.push_back( arg );
+ return *this;
+ }
+ Command& operator += ( const Command& other ) {
+ std::copy( other.m_args.begin(), other.m_args.end(), std::back_inserter( m_args ) );
+ if( m_name.empty() )
+ m_name = other.m_name;
+ return *this;
+ }
+ Command operator + ( const Command& other ) {
+ Command newCommand( *this );
+ newCommand += other;
+ return newCommand;
+ }
+
+ operator SafeBool::type() const {
+ return SafeBool::makeSafe( !m_name.empty() || !m_args.empty() );
+ }
+
+ std::string name() const { return m_name; }
+ std::string operator[]( std::size_t i ) const { return m_args[i]; }
+ std::size_t argsCount() const { return m_args.size(); }
+
+ CATCH_ATTRIBUTE_NORETURN
+ void raiseError( const std::string& message ) const {
+ std::ostringstream oss;
+ if( m_name.empty() )
+ oss << "Error while parsing " << m_name << ". " << message << ".";
+ else
+ oss << "Error while parsing arguments. " << message << ".";
+
+ if( m_args.size() > 0 )
+ oss << " Arguments were:";
+ for( std::size_t i = 0; i < m_args.size(); ++i )
+ oss << " " << m_args[i];
+ throw std::domain_error( oss.str() );
+ }
+
+ private:
+
+ std::string m_name;
+ std::vector<std::string> m_args;
+ };
+
+ class CommandParser {
+ public:
+ CommandParser( int argc, char const * const * argv ) : m_argc( static_cast<std::size_t>( argc ) ), m_argv( argv ) {}
+
+ std::string exeName() const {
+ return m_argv[0];
+ }
+ Command find( const std::string& arg1, const std::string& arg2, const std::string& arg3 ) const {
+ return find( arg1 ) + find( arg2 ) + find( arg3 );
+ }
+
+ Command find( const std::string& shortArg, const std::string& longArg ) const {
+ return find( shortArg ) + find( longArg );
+ }
+ Command find( const std::string& arg ) const {
+ if( arg.empty() )
+ return getArgs( "", 1 );
+ else
+ for( std::size_t i = 1; i < m_argc; ++i )
+ if( m_argv[i] == arg )
+ return getArgs( m_argv[i], i+1 );
+ return Command();
+ }
+ Command getDefaultArgs() const {
+ return getArgs( "", 1 );
+ }
+
+ private:
+ Command getArgs( const std::string& cmdName, std::size_t from ) const {
+ Command command( cmdName );
+ for( std::size_t i = from; i < m_argc && m_argv[i][0] != '-'; ++i )
+ command += m_argv[i];
+ return command;
+ }
+
+ std::size_t m_argc;
+ char const * const * m_argv;
+ };
+
+ class OptionParser : public SharedImpl<IShared> {
+ public:
+ OptionParser( int minArgs = 0, int maxArgs = 0 )
+ : m_minArgs( minArgs ), m_maxArgs( maxArgs )
+ {}
+
+ virtual ~OptionParser() {}
+
+ Command find( const CommandParser& parser ) const {
+ Command cmd;
+ for( std::vector<std::string>::const_iterator it = m_optionNames.begin();
+ it != m_optionNames.end();
+ ++it )
+ cmd += parser.find( *it );
+ return cmd;
+ }
+
+ void validateArgs( const Command& args ) const {
+ if( tooFewArgs( args ) || tooManyArgs( args ) ) {
+ std::ostringstream oss;
+ if( m_maxArgs == -1 )
+ oss <<"Expected at least " << pluralise( static_cast<std::size_t>( m_minArgs ), "argument" );
+ else if( m_minArgs == m_maxArgs )
+ oss <<"Expected " << pluralise( static_cast<std::size_t>( m_minArgs ), "argument" );
+ else
+ oss <<"Expected between " << m_minArgs << " and " << m_maxArgs << " argument";
+ args.raiseError( oss.str() );
+ }
+ }
+
+ void parseIntoConfig( const CommandParser& parser, ConfigData& config ) {
+ if( Command cmd = find( parser ) ) {
+ validateArgs( cmd );
+ parseIntoConfig( cmd, config );
+ }
+ }
+
+ virtual void parseIntoConfig( const Command& cmd, ConfigData& config ) = 0;
+ virtual std::string argsSynopsis() const = 0;
+ virtual std::string optionSummary() const = 0;
+ virtual std::string optionDescription() const { return ""; }
+
+ std::string optionNames() const {
+ std::string names;
+ for( std::vector<std::string>::const_iterator it = m_optionNames.begin();
+ it != m_optionNames.end();
+ ++it ) {
+ if( !it->empty() ) {
+ if( !names.empty() )
+ names += ", ";
+ names += *it;
+ }
+ else {
+ names = "[" + names;
+ }
+ }
+ if( names[0] == '[' )
+ names += "]";
+ return names;
+ }
+
+ protected:
+
+ bool tooFewArgs( const Command& args ) const {
+ return args.argsCount() < static_cast<std::size_t>( m_minArgs );
+ }
+ bool tooManyArgs( const Command& args ) const {
+ return m_maxArgs >= 0 && args.argsCount() > static_cast<std::size_t>( m_maxArgs );
+ }
+ std::vector<std::string> m_optionNames;
+ int m_minArgs;
+ int m_maxArgs;
+ };
+
+ namespace Options {
+
+ class HelpOptionParser : public OptionParser {
+ public:
+ HelpOptionParser() {
+ m_optionNames.push_back( "-?" );
+ m_optionNames.push_back( "-h" );
+ m_optionNames.push_back( "--help" );
+ }
+ virtual std::string argsSynopsis() const {
+ return "[<option for help on> ...]";
+ }
+ virtual std::string optionSummary() const {
+ return "Shows this usage summary, or help on a specific option, or options, if supplied";
+ }
+ virtual std::string optionDescription() const {
+ return "";
+ }
+
+ virtual void parseIntoConfig( const Command&, ConfigData& ) {
+ // Does not affect config
+ }
+ };
+
+ class TestCaseOptionParser : public OptionParser {
+ public:
+ TestCaseOptionParser() : OptionParser( 1, -1 ) {
+ m_optionNames.push_back( "-t" );
+ m_optionNames.push_back( "--test" );
+ m_optionNames.push_back( "" ); // default option
+ }
+ virtual std::string argsSynopsis() const {
+ return "<testspec> [<testspec>...]";
+ }
+ virtual std::string optionSummary() const {
+ return "Specifies which test case or cases to run";
+ }
+
+ // Lines are split at the nearest prior space char to the 80 char column.
+ // Tab chars are removed from the output but their positions are used to align
+ // subsequently wrapped lines
+ virtual std::string optionDescription() const {
+ return
+ "This option allows one ore more test specs to be supplied. Each spec either fully "
+ "specifies a test case or is a pattern containing wildcards to match a set of test "
+ "cases. If this option is not provided then all test cases, except those prefixed "
+ "by './' are run\n"
+ "\n"
+ "Specs must be enclosed in \"quotes\" if they contain spaces. If they do not "
+ "contain spaces the quotes are optional.\n"
+ "\n"
+ "Wildcards consist of the * character at the beginning, end, or both and can substitute for "
+ "any number of any characters (including none)\n"
+ "\n"
+ "If spec is prefixed with exclude: or the ~ character then the pattern matches an exclusion. "
+ "This means that tests matching the pattern are excluded from the set - even if a prior "
+ "inclusion spec included them. Subsequent inclusion specs will take precedence, however. "
+ "Inclusions and exclusions are evaluated in left-to-right order.\n"
+ "\n"
+ "Examples:\n"
+ "\n"
+ " -t thisTestOnly \tMatches the test case called, 'thisTestOnly'\n"
+ " -t \"this test only\" \tMatches the test case called, 'this test only'\n"
+ " -t these/* \tMatches all cases starting with 'these/'\n"
+ " -t exclude:notThis \tMatches all tests except, 'notThis'\n"
+ " -t ~notThis \tMatches all tests except, 'notThis'\n"
+ " -t ~*private* \tMatches all tests except those that contain 'private'\n"
+ " -t a/* ~a/b/* a/b/c \tMatches all tests that start with 'a/', except those "
+ "that start with 'a/b/', except 'a/b/c', which is included";
+ }
+
+ virtual void parseIntoConfig( const Command& cmd, ConfigData& config ) {
+ std::string groupName;
+ for( std::size_t i = 0; i < cmd.argsCount(); ++i ) {
+ if( i != 0 )
+ groupName += " ";
+ groupName += cmd[i];
+ }
+ TestCaseFilters filters( groupName );
+ for( std::size_t i = 0; i < cmd.argsCount(); ++i )
+ filters.addFilter( TestCaseFilter( cmd[i] ) );
+ config.filters.push_back( filters );
+ }
+ };
+
+ class TagOptionParser : public OptionParser {
+ public:
+ TagOptionParser() : OptionParser( 1, -1 ) {
+ m_optionNames.push_back( "-g" );
+ m_optionNames.push_back( "--tag" );
+ }
+ virtual std::string argsSynopsis() const {
+ return "<tagspec> [,<tagspec>...]";
+ }
+ virtual std::string optionSummary() const {
+ return "Matches test cases against tags or tag patterns";
+ }
+
+ // Lines are split at the nearest prior space char to the 80 char column.
+ // Tab chars are removed from the output but their positions are used to align
+ // subsequently wrapped lines
+ virtual std::string optionDescription() const {
+ return
+ "This option allows one or more tags or tag patterns to be specified.\n"
+ "Each tag is enclosed in square brackets. A series of tags form an AND expression "
+ "wheras a comma seperated sequence forms an OR expression. e.g.:\n\n"
+ " -g [one][two],[three]\n\n"
+ "This matches all tests tagged [one] and [two], as well as all tests tagged [three].\n\n"
+ "Tags can be negated with the ~ character. This removes matching tests from the set. e.g.:\n\n"
+ " -g [one]~[two]\n\n"
+ "matches all tests tagged [one], except those also tagged [two]";
+ }
+
+ virtual void parseIntoConfig( const Command& cmd, ConfigData& config ) {
+ std::string groupName;
+ for( std::size_t i = 0; i < cmd.argsCount(); ++i ) {
+ if( i != 0 )
+ groupName += " ";
+ groupName += cmd[i];
+ }
+ TestCaseFilters filters( groupName );
+ for( std::size_t i = 0; i < cmd.argsCount(); ++i )
+ filters.addTags( cmd[i] );
+ config.filters.push_back( filters );
+ }
+ };
+
+ class ListOptionParser : public OptionParser {
+ public:
+ ListOptionParser() : OptionParser( 0, 2 ) {
+ m_optionNames.push_back( "-l" );
+ m_optionNames.push_back( "--list" );
+ }
+ virtual std::string argsSynopsis() const {
+ return "[all | tests | reporters [xml]]";
+ }
+ virtual std::string optionSummary() const {
+ return "Lists available tests or reporters";
+ }
+
+ virtual std::string optionDescription() const {
+ return
+ "With no arguments this option will list all registered tests - one per line.\n"
+ "Supplying the xml argument formats the list as an xml document (which may be useful for "
+ "consumption by other tools).\n"
+ "Supplying the tests or reporters lists tests or reporters respectively - with descriptions.\n"
+ "\n"
+ "Examples:\n"
+ "\n"
+ " -l\n"
+ " -l tests\n"
+ " -l reporters xml\n"
+ " -l xml";
+ }
+
+ virtual void parseIntoConfig( const Command& cmd, ConfigData& config ) {
+ config.listSpec = List::TestNames;
+ if( cmd.argsCount() >= 1 ) {
+ if( cmd[0] == "all" )
+ config.listSpec = List::All;
+ else if( cmd[0] == "tests" )
+ config.listSpec = List::Tests;
+ else if( cmd[0] == "reporters" )
+ config.listSpec = List::Reports;
+ else
+ cmd.raiseError( "Expected [tests] or [reporters]" );
+ }
+ if( cmd.argsCount() >= 2 ) {
+ if( cmd[1] == "xml" )
+ config.listSpec = static_cast<List::What>( config.listSpec | List::AsXml );
+ else if( cmd[1] == "text" )
+ config.listSpec = static_cast<List::What>( config.listSpec | List::AsText );
+ else
+ cmd.raiseError( "Expected [xml] or [text]" );
+ }
+ }
+ };
+
+ class ReporterOptionParser : public OptionParser {
+ public:
+ ReporterOptionParser() : OptionParser( 1, 1 ) {
+ m_optionNames.push_back( "-r" );
+ m_optionNames.push_back( "--reporter" );
+ }
+ virtual std::string argsSynopsis() const {
+ return "<reporter name>";
+ }
+ virtual std::string optionSummary() const {
+ return "Specifies type of reporter";
+ }
+
+ virtual std::string optionDescription() const {
+ return
+ "A reporter is an object that formats and structures the output of running "
+ "tests, and potentially summarises the results. By default a basic reporter "
+ "is used that writes IDE friendly results. CATCH comes bundled with some "
+ "alternative reporters, but more can be added in client code.\n"
+ "\n"
+ "The bundled reporters are:\n"
+ " -r basic\n"
+ " -r xml\n"
+ " -r junit\n"
+ "\n"
+ "The JUnit reporter is an xml format that follows the structure of the JUnit "
+ "XML Report ANT task, as consumed by a number of third-party tools, "
+ "including Continuous Integration servers such as Jenkins.\n"
+ "If not otherwise needed, the standard XML reporter is preferred as this is "
+ "a streaming reporter, whereas the Junit reporter needs to hold all its "
+ "results until the end so it can write the overall results into attributes "
+ "of the root node.";
+ }
+
+ virtual void parseIntoConfig( const Command& cmd, ConfigData& config ) {
+ config.reporter = cmd[0];
+ }
+ };
+
+ class OutputOptionParser : public OptionParser {
+ public:
+ OutputOptionParser() : OptionParser( 1, 1 ) {
+ m_optionNames.push_back( "-o" );
+ m_optionNames.push_back( "--out" );
+ }
+ virtual std::string argsSynopsis() const {
+ return "<file name>|<%stream name>";
+ }
+ virtual std::string optionSummary() const {
+ return "Sends output to a file or stream";
+ }
+ virtual std::string optionDescription() const {
+ return
+ "Use this option to send all output to a file or a stream. By default output is "
+ "sent to stdout (note that uses of stdout and stderr from within test cases are "
+ "redirected and included in the report - so even stderr will effectively end up "
+ "on stdout). If the name begins with % it is interpreted as a stream. "
+ "Otherwise it is treated as a filename.\n"
+ "\n"
+ "Examples are:\n"
+ "\n"
+ " -o filename.txt\n"
+ " -o \"long filename.txt\"\n"
+ " -o %stdout\n"
+ " -o %stderr\n"
+ " -o %debug \t(The IDE's debug output window - currently only Windows' "
+ "OutputDebugString is supported).";
+ }
+ virtual void parseIntoConfig( const Command& cmd, ConfigData& config ) {
+ if( cmd[0][0] == '%' )
+ config.stream = cmd[0].substr( 1 );
+ else
+ config.outputFilename = cmd[0];
+ }
+ };
+
+ class SuccessOptionParser : public OptionParser {
+ public:
+ SuccessOptionParser() {
+ m_optionNames.push_back( "-s" );
+ m_optionNames.push_back( "--success" );
+ }
+ virtual std::string argsSynopsis() const {
+ return "";
+ }
+ virtual std::string optionSummary() const {
+ return "Shows results for successful tests";
+ }
+ virtual std::string optionDescription() const {
+ return
+ "Usually you only want to see reporting for failed tests. Sometimes it's useful "
+ "to see all the output (especially when you don't trust that that test you just "
+ "added worked first time!). To see successful, as well as failing, test results "
+ "just pass this option.";
+ }
+ virtual void parseIntoConfig( const Command&, ConfigData& config ) {
+ config.includeWhichResults = Include::SuccessfulResults;
+ }
+ };
+
+ class DebugBreakOptionParser : public OptionParser {
+ public:
+ DebugBreakOptionParser() {
+ m_optionNames.push_back( "-b" );
+ m_optionNames.push_back( "--break" );
+ }
+ virtual std::string argsSynopsis() const {
+ return "";
+ }
+ virtual std::string optionSummary() const {
+ return "Breaks into the debugger on failure";
+ }
+ virtual std::string optionDescription() const {
+ return
+ "In some IDEs (currently XCode and Visual Studio) it is possible for CATCH to "
+ "break into the debugger on a test failure. This can be very helpful during "
+ "debug sessions - especially when there is more than one path through a "
+ "particular test. In addition to the command line option, ensure you have "
+ "built your code with the DEBUG preprocessor symbol";
+ }
+
+ virtual void parseIntoConfig( const Command&, ConfigData& config ) {
+ config.shouldDebugBreak = true;
+ }
+ };
+
+ class NameOptionParser : public OptionParser {
+ public:
+ NameOptionParser() : OptionParser( 1, 1 ) {
+ m_optionNames.push_back( "-n" );
+ m_optionNames.push_back( "--name" );
+ }
+ virtual std::string argsSynopsis() const {
+ return "<name>";
+ }
+ virtual std::string optionSummary() const {
+ return "Names a test run";
+ }
+ virtual std::string optionDescription() const {
+ return
+ "If a name is supplied it will be used by the reporter to provide an overall "
+ "name for the test run. This can be useful if you are sending to a file, for "
+ "example, and need to distinguish different test runs - either from different "
+ "Catch executables or runs of the same executable with different options.\n"
+ "\n"
+ "Examples:\n"
+ "\n"
+ " -n testRun\n"
+ " -n \"tests of the widget component\"";
+ }
+
+ virtual void parseIntoConfig( const Command& cmd, ConfigData& config ) {
+ config.name = cmd[0];
+ }
+ };
+
+ class AbortOptionParser : public OptionParser {
+ public:
+ AbortOptionParser() : OptionParser( 0, 1 ) {
+ m_optionNames.push_back( "-a" );
+ m_optionNames.push_back( "--abort" );
+ }
+ virtual std::string argsSynopsis() const {
+ return "[#]";
+ }
+ virtual std::string optionSummary() const {
+ return "Aborts after a certain number of failures";
+ }
+ virtual std::string optionDescription() const {
+ return
+ "If a REQUIRE assertion fails the test case aborts, but subsequent test cases "
+ "are still run. If a CHECK assertion fails even the current test case is not "
+ "aborted.\n"
+ "\n"
+ "Sometimes this results in a flood of failure messages and you'd rather just "
+ "see the first few. Specifying -a or --abort on its own will abort the whole "
+ "test run on the first failed assertion of any kind. Following it with a "
+ "number causes it to abort after that number of assertion failures.";
+ }
+
+ virtual void parseIntoConfig( const Command& cmd, ConfigData& config ) {
+ int threshold = 1;
+ if( cmd.argsCount() == 1 ) {
+ std::stringstream ss;
+ ss << cmd[0];
+ ss >> threshold;
+ if( ss.fail() || threshold <= 0 )
+ cmd.raiseError( "threshold must be a number greater than zero" );
+ }
+ config.cutoff = threshold;
+ }
+ };
+
+ class NoThrowOptionParser : public OptionParser {
+ public:
+ NoThrowOptionParser() {
+ m_optionNames.push_back( "-nt" );
+ m_optionNames.push_back( "--nothrow" );
+ }
+ virtual std::string argsSynopsis() const {
+ return "";
+ }
+ virtual std::string optionSummary() const {
+ return "Elides assertions expected to throw";
+ }
+ virtual std::string optionDescription() const {
+ return
+ "Skips all assertions that test that an exception is thrown, "
+ "e.g. REQUIRE_THROWS.\n"
+ "\n"
+ "These can be a nuisance in certain debugging environments that may break when "
+ "exceptions are thrown (while this is usually optional for handled exceptions, "
+ "it can be useful to have enabled if you are trying to track down something "
+ "unexpected).\n"
+ "\n"
+ "When running with this option the throw checking assertions are skipped so "
+ "as not to contribute additional noise.";
+ }
+
+ virtual void parseIntoConfig( const Command&, ConfigData& config ) {
+ config.allowThrows = false;
+ }
+ };
+
+ class WarningsOptionParser : public OptionParser {
+ public:
+ WarningsOptionParser() : OptionParser( 1, -1 ) {
+ m_optionNames.push_back( "-w" );
+ m_optionNames.push_back( "--warnings" );
+ }
+ virtual std::string argsSynopsis() const {
+ return "<warning>";
+ }
+ virtual std::string optionSummary() const {
+ return "Enable warnings";
+ }
+ virtual std::string optionDescription() const {
+ return
+ "Enables the named warnings. If the warnings are violated the test case is "
+ "failed.\n"
+ "\n"
+ "At present only one warning has been provided: NoAssertions. If this warning "
+ "is enabled then any test case that completes without an assertions (CHECK, "
+ "REQUIRE etc) being encountered violates the warning.\n"
+ "\n"
+ "e.g.:\n"
+ "\n"
+ " -w NoAssertions";
+ }
+
+ virtual void parseIntoConfig( const Command& cmd, ConfigData& config ) {
+ for( std::size_t i = 0; i < cmd.argsCount(); ++i ) {
+ if( cmd[i] == "NoAssertions" )
+ config.warnings = (ConfigData::WarnAbout::What)( config.warnings | ConfigData::WarnAbout::NoAssertions );
+ else
+ cmd.raiseError( "Unrecognised warning: " + cmd[i] );
+ }
+ }
+ };
+ }
+
+ class AllOptions
+ {
+ public:
+ typedef std::vector<Ptr<OptionParser> > Parsers;
+ typedef Parsers::const_iterator const_iterator;
+ typedef Parsers::const_iterator iterator;
+
+ AllOptions() {
+ add<Options::TestCaseOptionParser>(); // Keep this one first
+
+ add<Options::TagOptionParser>();
+ add<Options::ListOptionParser>();
+ add<Options::ReporterOptionParser>();
+ add<Options::OutputOptionParser>();
+ add<Options::SuccessOptionParser>();
+ add<Options::DebugBreakOptionParser>();
+ add<Options::NameOptionParser>();
+ add<Options::AbortOptionParser>();
+ add<Options::NoThrowOptionParser>();
+ add<Options::WarningsOptionParser>();
+
+ add<Options::HelpOptionParser>(); // Keep this one last
+ }
+
+ void parseIntoConfig( const CommandParser& parser, ConfigData& config ) {
+ for( const_iterator it = m_parsers.begin(); it != m_parsers.end(); ++it )
+ (*it)->parseIntoConfig( parser, config );
+ }
+
+ const_iterator begin() const {
+ return m_parsers.begin();
+ }
+ const_iterator end() const {
+ return m_parsers.end();
+ }
+ private:
+
+ template<typename T>
+ void add() {
+ m_parsers.push_back( new T() );
+ }
+ Parsers m_parsers;
+
+ };
+
+} // end namespace Catch
+
+// #included from: internal/catch_list.hpp
+#define TWOBLUECUBES_CATCH_LIST_HPP_INCLUDED
+
+#include <limits>
+
+namespace Catch {
+ inline bool matchesFilters( const std::vector<TestCaseFilters>& filters, const TestCaseInfo& testCase ) {
+ std::vector<TestCaseFilters>::const_iterator it = filters.begin();
+ std::vector<TestCaseFilters>::const_iterator itEnd = filters.end();
+ for(; it != itEnd; ++it )
+ if( !it->shouldInclude( testCase ) )
+ return false;
+ return true;
+ }
+ inline void List( const ConfigData& config ) {
+
+ if( config.listSpec & List::Reports ) {
+ std::cout << "Available reports:\n";
+ IReporterRegistry::FactoryMap::const_iterator it = getRegistryHub().getReporterRegistry().getFactories().begin();
+ IReporterRegistry::FactoryMap::const_iterator itEnd = getRegistryHub().getReporterRegistry().getFactories().end();
+ for(; it != itEnd; ++it ) {
+ // !TBD: consider listAs()
+ std::cout << "\t" << it->first << "\n\t\t'" << it->second->getDescription() << "'\n";
+ }
+ std::cout << std::endl;
+ }
+
+ if( config.listSpec & List::Tests ) {
+ if( config.filters.empty() )
+ std::cout << "All available test cases:\n";
+ else
+ std::cout << "Matching test cases:\n";
+ std::vector<TestCaseInfo>::const_iterator it = getRegistryHub().getTestCaseRegistry().getAllTests().begin();
+ std::vector<TestCaseInfo>::const_iterator itEnd = getRegistryHub().getTestCaseRegistry().getAllTests().end();
+ std::size_t matchedTests = 0;
+ for(; it != itEnd; ++it ) {
+ if( matchesFilters( config.filters, *it ) ) {
+ matchedTests++;
+ // !TBD: consider listAs()
+ std::cout << "\t" << it->getName() << "\n";
+ if( ( config.listSpec & List::TestNames ) != List::TestNames )
+ std::cout << "\t\t '" << it->getDescription() << "'\n";
+ }
+ }
+ if( config.filters.empty() )
+ std::cout << pluralise( matchedTests, "test case" ) << std::endl;
+ else
+ std::cout << pluralise( matchedTests, "matching test case" ) << std::endl;
+ }
+
+ if( ( config.listSpec & List::All ) == 0 ) {
+ std::ostringstream oss;
+ oss << "Unknown list type";
+ throw std::domain_error( oss.str() );
+ }
+ }
+
+} // end namespace Catch
+
+// #included from: internal/catch_runner_impl.hpp
+#define TWOBLUECUBES_CATCH_RUNNER_IMPL_HPP_INCLUDED
+
+// #included from: catch_running_test.hpp
+#define TWOBLUECUBES_CATCH_RUNNING_TEST_HPP_INCLUDED
+
+// #included from: catch_section_info.hpp
+#define TWOBLUECUBES_CATCH_SECTION_INFO_HPP_INCLUDED
+
+#include <map>
+#include <string>
+
+namespace Catch {
+
+ class SectionInfo {
+ public:
+
+ enum Status {
+ Root,
+ Unknown,
+ Branch,
+ TestedBranch,
+ TestedLeaf
+ };
+
+ SectionInfo( SectionInfo* parent )
+ : m_status( Unknown ),
+ m_parent( parent )
+ {}
+
+ SectionInfo()
+ : m_status( Root ),
+ m_parent( NULL )
+ {}
+
+ ~SectionInfo() {
+ deleteAllValues( m_subSections );
+ }
+
+ bool shouldRun() const {
+ return m_status < TestedBranch;
+ }
+
+ bool ran() {
+ if( m_status < Branch ) {
+ m_status = TestedLeaf;
+ return true;
+ }
+ return false;
+ }
+
+ bool isBranch() const {
+ return m_status == Branch;
+ }
+
+ void ranToCompletion() {
+ if( m_status == Branch && !hasUntestedSections() )
+ m_status = TestedBranch;
+ }
+
+ SectionInfo* findSubSection( const std::string& name ) {
+ std::map<std::string, SectionInfo*>::const_iterator it = m_subSections.find( name );
+ return it != m_subSections.end()
+ ? it->second
+ : NULL;
+ }
+
+ SectionInfo* addSubSection( const std::string& name ) {
+ SectionInfo* subSection = new SectionInfo( this );
+ m_subSections.insert( std::make_pair( name, subSection ) );
+ m_status = Branch;
+ return subSection;
+ }
+
+ SectionInfo* getParent() {
+ return m_parent;
+ }
+
+ bool hasUntestedSections() const {
+ if( m_status == Unknown )
+ return true;
+
+ std::map<std::string, SectionInfo*>::const_iterator it = m_subSections.begin();
+ std::map<std::string, SectionInfo*>::const_iterator itEnd = m_subSections.end();
+ for(; it != itEnd; ++it ) {
+ if( it->second->hasUntestedSections() )
+ return true;
+ }
+ return false;
+ }
+
+ private:
+ Status m_status;
+ std::map<std::string, SectionInfo*> m_subSections;
+ SectionInfo* m_parent;
+ };
+}
+
+namespace Catch {
+
+ class RunningTest {
+
+ enum RunStatus {
+ NothingRun,
+ EncounteredASection,
+ RanAtLeastOneSection,
+ RanToCompletionWithSections,
+ RanToCompletionWithNoSections
+ };
+
+ public:
+ explicit RunningTest( const TestCaseInfo* info = NULL )
+ : m_info( info ),
+ m_runStatus( RanAtLeastOneSection ),
+ m_currentSection( &m_rootSection ),
+ m_changed( false )
+ {}
+
+ bool wasSectionSeen() const {
+ return m_runStatus == RanAtLeastOneSection ||
+ m_runStatus == RanToCompletionWithSections;
+ }
+
+ bool isBranchSection() const {
+ return m_currentSection &&
+ m_currentSection->isBranch();
+ }
+
+ bool hasSections() const {
+ return m_runStatus == RanAtLeastOneSection ||
+ m_runStatus == RanToCompletionWithSections ||
+ m_runStatus == EncounteredASection;
+ }
+
+ void reset() {
+ m_runStatus = NothingRun;
+ m_changed = false;
+ m_lastSectionToRun = NULL;
+ }
+
+ void ranToCompletion() {
+ if( m_runStatus == RanAtLeastOneSection ||
+ m_runStatus == EncounteredASection ) {
+ m_runStatus = RanToCompletionWithSections;
+ if( m_lastSectionToRun ) {
+ m_lastSectionToRun->ranToCompletion();
+ m_changed = true;
+ }
+ }
+ else {
+ m_runStatus = RanToCompletionWithNoSections;
+ }
+ }
+
+ bool addSection( const std::string& name ) {
+ if( m_runStatus == NothingRun )
+ m_runStatus = EncounteredASection;
+
+ SectionInfo* thisSection = m_currentSection->findSubSection( name );
+ if( !thisSection ) {
+ thisSection = m_currentSection->addSubSection( name );
+ m_changed = true;
+ }
+
+ if( !wasSectionSeen() && thisSection->shouldRun() ) {
+ m_currentSection = thisSection;
+ m_lastSectionToRun = NULL;
+ return true;
+ }
+ return false;
+ }
+
+ void endSection( const std::string& ) {
+ if( m_currentSection->ran() ) {
+ m_runStatus = RanAtLeastOneSection;
+ m_changed = true;
+ }
+ else if( m_runStatus == EncounteredASection ) {
+ m_runStatus = RanAtLeastOneSection;
+ m_lastSectionToRun = m_currentSection;
+ }
+ m_currentSection = m_currentSection->getParent();
+ }
+
+ const TestCaseInfo& getTestCaseInfo() const {
+ return *m_info;
+ }
+
+ bool hasUntestedSections() const {
+ return m_runStatus == RanAtLeastOneSection ||
+ ( m_rootSection.hasUntestedSections() && m_changed );
+ }
+
+ private:
+ const TestCaseInfo* m_info;
+ RunStatus m_runStatus;
+ SectionInfo m_rootSection;
+ SectionInfo* m_currentSection;
+ SectionInfo* m_lastSectionToRun;
+ bool m_changed;
+ };
+}
+
+#include <set>
+#include <string>
+
+namespace Catch {
+
+ class StreamRedirect {
+
+ public:
+ StreamRedirect( std::ostream& stream, std::string& targetString )
+ : m_stream( stream ),
+ m_prevBuf( stream.rdbuf() ),
+ m_targetString( targetString )
+ {
+ stream.rdbuf( m_oss.rdbuf() );
+ }
+
+ ~StreamRedirect() {
+ m_targetString += m_oss.str();
+ m_stream.rdbuf( m_prevBuf );
+ }
+
+ private:
+ std::ostream& m_stream;
+ std::streambuf* m_prevBuf;
+ std::ostringstream m_oss;
+ std::string& m_targetString;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+
+ class Runner : public IResultCapture, public IRunner {
+
+ Runner( const Runner& );
+ void operator =( const Runner& );
+
+ public:
+
+ explicit Runner( const Config& config, const Ptr<IReporter>& reporter )
+ : m_context( getCurrentMutableContext() ),
+ m_runningTest( NULL ),
+ m_config( config ),
+ m_reporter( reporter ),
+ m_prevRunner( &m_context.getRunner() ),
+ m_prevResultCapture( &m_context.getResultCapture() ),
+ m_prevConfig( m_context.getConfig() )
+ {
+ m_context.setRunner( this );
+ m_context.setConfig( &m_config );
+ m_context.setResultCapture( this );
+ m_reporter->StartTesting();
+ }
+
+ virtual ~Runner() {
+ m_reporter->EndTesting( m_totals );
+ m_context.setRunner( m_prevRunner );
+ m_context.setConfig( NULL );
+ m_context.setResultCapture( m_prevResultCapture );
+ m_context.setConfig( m_prevConfig );
+ }
+
+ Totals runMatching( const std::string& testSpec ) {
+
+ std::vector<TestCaseInfo> matchingTests = getRegistryHub().getTestCaseRegistry().getMatchingTestCases( testSpec );
+
+ Totals totals;
+
+ m_reporter->StartGroup( testSpec );
+
+ std::vector<TestCaseInfo>::const_iterator it = matchingTests.begin();
+ std::vector<TestCaseInfo>::const_iterator itEnd = matchingTests.end();
+ for(; it != itEnd; ++it )
+ totals += runTest( *it );
+ // !TBD use std::accumulate?
+
+ m_reporter->EndGroup( testSpec, totals );
+ return totals;
+ }
+
+ Totals runTest( const TestCaseInfo& testInfo ) {
+ Totals prevTotals = m_totals;
+
+ std::string redirectedCout;
+ std::string redirectedCerr;
+
+ m_reporter->StartTestCase( testInfo );
+
+ m_runningTest = new RunningTest( &testInfo );
+
+ do {
+ do {
+ runCurrentTest( redirectedCout, redirectedCerr );
+ }
+ while( m_runningTest->hasUntestedSections() && !aborting() );
+ }
+ while( getCurrentContext().advanceGeneratorsForCurrentTest() && !aborting() );
+
+ delete m_runningTest;
+ m_runningTest = NULL;
+
+ Totals deltaTotals = m_totals.delta( prevTotals );
+ m_totals.testCases += deltaTotals.testCases;
+ m_reporter->EndTestCase( testInfo, deltaTotals, redirectedCout, redirectedCerr );
+ return deltaTotals;
+ }
+
+ const Config& config() const {
+ return m_config;
+ }
+
+ private: // IResultCapture
+
+ virtual ResultAction::Value acceptExpression( const ExpressionResultBuilder& assertionResult, const AssertionInfo& assertionInfo ) {
+ m_lastAssertionInfo = assertionInfo;
+ return actOnCurrentResult( assertionResult.buildResult( assertionInfo ) );
+ }
+
+ virtual void testEnded( const AssertionResult& result ) {
+ if( result.getResultType() == ResultWas::Ok ) {
+ m_totals.assertions.passed++;
+ }
+ else if( !result.isOk() ) {
+ m_totals.assertions.failed++;
+
+ {
+ std::vector<ScopedInfo*>::const_iterator it = m_scopedInfos.begin();
+ std::vector<ScopedInfo*>::const_iterator itEnd = m_scopedInfos.end();
+ for(; it != itEnd; ++it )
+ m_reporter->Result( (*it)->buildResult( m_lastAssertionInfo ) );
+ }
+ {
+ std::vector<AssertionResult>::const_iterator it = m_assertionResults.begin();
+ std::vector<AssertionResult>::const_iterator itEnd = m_assertionResults.end();
+ for(; it != itEnd; ++it )
+ m_reporter->Result( *it );
+ }
+ m_assertionResults.clear();
+ }
+
+ if( result.getResultType() == ResultWas::Info )
+ m_assertionResults.push_back( result );
+ else
+ m_reporter->Result( result );
+ }
+
+ virtual bool sectionStarted (
+ const std::string& name,
+ const std::string& description,
+ const SourceLineInfo& lineInfo,
+ Counts& assertions
+ )
+ {
+ std::ostringstream oss;
+ oss << name << "@" << lineInfo;
+
+ if( !m_runningTest->addSection( oss.str() ) )
+ return false;
+
+ m_lastAssertionInfo.lineInfo = lineInfo;
+
+ m_reporter->StartSection( name, description );
+ assertions = m_totals.assertions;
+
+ return true;
+ }
+
+ virtual void sectionEnded( const std::string& name, const Counts& prevAssertions ) {
+ Counts assertions = m_totals.assertions - prevAssertions;
+ if( assertions.total() == 0 &&
+ ( m_config.data().warnings & ConfigData::WarnAbout::NoAssertions ) &&
+ !m_runningTest->isBranchSection() ) {
+ m_reporter->NoAssertionsInSection( name );
+ m_totals.assertions.failed++;
+ assertions.failed++;
+ }
+ m_runningTest->endSection( name );
+ m_reporter->EndSection( name, assertions );
+ }
+
+ virtual void pushScopedInfo( ScopedInfo* scopedInfo ) {
+ m_scopedInfos.push_back( scopedInfo );
+ }
+
+ virtual void popScopedInfo( ScopedInfo* scopedInfo ) {
+ if( m_scopedInfos.back() == scopedInfo )
+ m_scopedInfos.pop_back();
+ }
+
+ virtual bool shouldDebugBreak() const {
+ return m_config.shouldDebugBreak();
+ }
+
+ virtual std::string getCurrentTestName() const {
+ return m_runningTest
+ ? m_runningTest->getTestCaseInfo().getName()
+ : "";
+ }
+
+ virtual const AssertionResult* getLastResult() const {
+ return &m_lastResult;
+ }
+
+ public:
+ // !TBD We need to do this another way!
+ bool aborting() const {
+ return m_totals.assertions.failed == static_cast<std::size_t>( m_config.getCutoff() );
+ }
+
+ private:
+
+ ResultAction::Value actOnCurrentResult( const AssertionResult& result ) {
+ m_lastResult = result;
+ testEnded( m_lastResult );
+
+ ResultAction::Value action = ResultAction::None;
+
+ if( !m_lastResult.isOk() ) {
+ action = ResultAction::Failed;
+ if( shouldDebugBreak() )
+ action = (ResultAction::Value)( action | ResultAction::Debug );
+ if( aborting() )
+ action = (ResultAction::Value)( action | ResultAction::Abort );
+ }
+ return action;
+ }
+
+ void runCurrentTest( std::string& redirectedCout, std::string& redirectedCerr ) {
+ try {
+ m_lastAssertionInfo = AssertionInfo( "TEST_CASE", m_runningTest->getTestCaseInfo().getLineInfo(), "", ResultDisposition::Normal );
+ m_runningTest->reset();
+ Counts prevAssertions = m_totals.assertions;
+ if( m_reporter->shouldRedirectStdout() ) {
+ StreamRedirect coutRedir( std::cout, redirectedCout );
+ StreamRedirect cerrRedir( std::cerr, redirectedCerr );
+ m_runningTest->getTestCaseInfo().invoke();
+ }
+ else {
+ m_runningTest->getTestCaseInfo().invoke();
+ }
+ Counts assertions = m_totals.assertions - prevAssertions;
+ if( assertions.total() == 0 &&
+ ( m_config.data().warnings & ConfigData::WarnAbout::NoAssertions ) &&
+ !m_runningTest->hasSections() ) {
+ m_totals.assertions.failed++;
+ m_reporter->NoAssertionsInTestCase( m_runningTest->getTestCaseInfo().getName() );
+ }
+ m_runningTest->ranToCompletion();
+ }
+ catch( TestFailureException& ) {
+ // This just means the test was aborted due to failure
+ }
+ catch(...) {
+ ExpressionResultBuilder exResult( ResultWas::ThrewException );
+ exResult << translateActiveException();
+ actOnCurrentResult( exResult.buildResult( m_lastAssertionInfo ) );
+ }
+ m_assertionResults.clear();
+ }
+
+ private:
+ IMutableContext& m_context;
+ RunningTest* m_runningTest;
+ AssertionResult m_lastResult;
+
+ const Config& m_config;
+ Totals m_totals;
+ Ptr<IReporter> m_reporter;
+ std::vector<ScopedInfo*> m_scopedInfos;
+ std::vector<AssertionResult> m_assertionResults;
+ IRunner* m_prevRunner;
+ IResultCapture* m_prevResultCapture;
+ const IConfig* m_prevConfig;
+ AssertionInfo m_lastAssertionInfo;
+ };
+
+} // end namespace Catch
+
+#include <fstream>
+#include <stdlib.h>
+#include <limits>
+
+namespace Catch {
+
+ class Runner2 { // This will become Runner when Runner becomes Context
+
+ public:
+ Runner2( Config& configWrapper )
+ : m_configWrapper( configWrapper ),
+ m_config( configWrapper.data() )
+ {
+ openStream();
+ makeReporter();
+ }
+
+ Totals runTests() {
+
+ std::vector<TestCaseFilters> filterGroups = m_config.filters;
+ if( filterGroups.empty() ) {
+ TestCaseFilters filterGroup( "" );
+ filterGroups.push_back( filterGroup );
+ }
+
+ Runner context( m_configWrapper, m_reporter ); // This Runner will be renamed Context
+ Totals totals;
+
+ std::vector<TestCaseFilters>::const_iterator it = filterGroups.begin();
+ std::vector<TestCaseFilters>::const_iterator itEnd = filterGroups.end();
+ for(; it != itEnd && !context.aborting(); ++it ) {
+ m_reporter->StartGroup( it->getName() );
+ totals += runTestsForGroup( context, *it );
+ if( context.aborting() )
+ m_reporter->Aborted();
+ m_reporter->EndGroup( it->getName(), totals );
+ }
+ return totals;
+ }
+
+ Totals runTestsForGroup( Runner& context, const TestCaseFilters& filterGroup ) {
+ Totals totals;
+ std::vector<TestCaseInfo>::const_iterator it = getRegistryHub().getTestCaseRegistry().getAllTests().begin();
+ std::vector<TestCaseInfo>::const_iterator itEnd = getRegistryHub().getTestCaseRegistry().getAllTests().end();
+ int testsRunForGroup = 0;
+ for(; it != itEnd; ++it ) {
+ if( filterGroup.shouldInclude( *it ) ) {
+ testsRunForGroup++;
+ if( m_testsAlreadyRun.find( *it ) == m_testsAlreadyRun.end() ) {
+
+ if( context.aborting() )
+ break;
+
+ totals += context.runTest( *it );
+ m_testsAlreadyRun.insert( *it );
+ }
+ }
+ }
+ if( testsRunForGroup == 0 )
+ std::cerr << "\n[No test cases matched with: " << filterGroup.getName() << "]" << std::endl;
+ return totals;
+
+ }
+
+ private:
+ void openStream() {
+ if( !m_config.stream.empty() )
+ m_configWrapper.useStream( m_config.stream );
+
+ // Open output file, if specified
+ if( !m_config.outputFilename.empty() ) {
+ m_ofs.open( m_config.outputFilename.c_str() );
+ if( m_ofs.fail() ) {
+ std::ostringstream oss;
+ oss << "Unable to open file: '" << m_config.outputFilename << "'";
+ throw std::domain_error( oss.str() );
+ }
+ m_configWrapper.setStreamBuf( m_ofs.rdbuf() );
+ }
+ }
+ void makeReporter() {
+ std::string reporterName = m_config.reporter.empty()
+ ? "basic"
+ : m_config.reporter;
+
+ ReporterConfig reporterConfig( m_config.name, m_configWrapper.stream(), m_config.includeWhichResults == Include::SuccessfulResults, m_config );
+
+ m_reporter = getRegistryHub().getReporterRegistry().create( reporterName, reporterConfig );
+ if( !m_reporter ) {
+ std::ostringstream oss;
+ oss << "No reporter registered with name: '" << reporterName << "'";
+ throw std::domain_error( oss.str() );
+ }
+ }
+
+ private:
+ Config& m_configWrapper;
+ const ConfigData& m_config;
+ std::ofstream m_ofs;
+ Ptr<IReporter> m_reporter;
+ std::set<TestCaseInfo> m_testsAlreadyRun;
+ };
+
+ inline int Main( Config& configWrapper ) {
+ int result = 0;
+ try
+ {
+ Runner2 runner( configWrapper );
+
+ const ConfigData& config = configWrapper.data();
+
+ // Handle list request
+ if( config.listSpec != List::None ) {
+ List( config );
+ Catch::cleanUp();
+ return 0;
+ }
+
+ result = static_cast<int>( runner.runTests().assertions.failed );
+
+ }
+ catch( std::exception& ex ) {
+ std::cerr << ex.what() << std::endl;
+ result = (std::numeric_limits<int>::max)();
+ }
+
+ Catch::cleanUp();
+ return result;
+ }
+
+ inline void showUsage( std::ostream& os ) {
+ AllOptions options;
+
+ for( AllOptions::const_iterator it = options.begin(); it != options.end(); ++it ) {
+ OptionParser& opt = **it;
+ os << " " << opt.optionNames() << " " << opt.argsSynopsis() << "\n";
+ }
+ os << "\nFor more detail usage please see: https://github.com/philsquared/Catch/wiki/Command-line\n" << std::endl;
+ }
+
+ inline void addIndent( std::ostream& os, std::size_t indent ) {
+ while( indent-- > 0 )
+ os << ' ';
+ }
+
+ inline void recursivelyWrapLine( std::ostream& os, std::string paragraph, std::size_t columns, std::size_t indent ) {
+ std::size_t width = columns-indent;
+ std::size_t tab = 0;
+ std::size_t wrapPoint = width;
+ for( std::size_t pos = 0; pos < paragraph.size(); ++pos ) {
+ if( pos == width ) {
+ addIndent( os, indent );
+ os << paragraph.substr( 0, wrapPoint ) << "\n";
+ return recursivelyWrapLine( os, paragraph.substr( wrapPoint+1 ), columns, indent+tab );
+ }
+ if( paragraph[pos] == '\t' ) {
+ tab = pos;
+ paragraph = paragraph.substr( 0, tab ) + paragraph.substr( tab+1 );
+ pos--;
+ }
+ else if( paragraph[pos] == ' ' ) {
+ wrapPoint = pos;
+ }
+ }
+ addIndent( os, indent );
+ os << paragraph << "\n";
+ }
+
+ inline std::string addLineBreaks( const std::string& str, std::size_t columns, std::size_t indent = 0 ) {
+ std::ostringstream oss;
+ std::string::size_type pos = 0;
+ std::string::size_type newline = str.find_first_of( '\n' );
+ while( newline != std::string::npos ) {
+ std::string paragraph = str.substr( pos, newline-pos );
+ recursivelyWrapLine( oss, paragraph, columns, indent );
+ pos = newline+1;
+ newline = str.find_first_of( '\n', pos );
+ }
+ if( pos != str.size() )
+ recursivelyWrapLine( oss, str.substr( pos, str.size()-pos ), columns, indent );
+
+ return oss.str();
+ }
+
+ inline void showHelp( const CommandParser& parser ) {
+ std::string exeName = parser.exeName();
+ std::string::size_type pos = exeName.find_last_of( "/\\" );
+ if( pos != std::string::npos ) {
+ exeName = exeName.substr( pos+1 );
+ }
+
+ AllOptions options;
+ Options::HelpOptionParser helpOpt;
+ bool displayedSpecificOption = false;
+ for( AllOptions::const_iterator it = options.begin(); it != options.end(); ++it ) {
+ OptionParser& opt = **it;
+ if( opt.find( parser ) && opt.optionNames() != helpOpt.optionNames() ) {
+ displayedSpecificOption = true;
+ std::cout << "\n" << opt.optionNames() << " " << opt.argsSynopsis() << "\n\n"
+ << opt.optionSummary() << "\n\n"
+
+ << addLineBreaks( opt.optionDescription(), 80, 2 ) << "\n" << std::endl;
+ }
+ }
+
+ if( !displayedSpecificOption ) {
+ std::cout << exeName << " is a CATCH host application. Options are as follows:\n\n";
+ showUsage( std::cout );
+ }
+ }
+
+ inline int Main( int argc, char* const argv[], Config& config ) {
+
+ try {
+ CommandParser parser( argc, argv );
+
+ if( Command cmd = Options::HelpOptionParser().find( parser ) ) {
+ if( cmd.argsCount() != 0 )
+ cmd.raiseError( "Does not accept arguments" );
+
+ showHelp( parser );
+ Catch::cleanUp();
+ return 0;
+ }
+
+ AllOptions options;
+
+ options.parseIntoConfig( parser, config.data() );
+ }
+ catch( std::exception& ex ) {
+ std::cerr << ex.what() << "\n\nUsage: ...\n\n";
+ showUsage( std::cerr );
+ Catch::cleanUp();
+ return (std::numeric_limits<int>::max)();
+ }
+
+ return Main( config );
+ }
+
+ inline int Main( int argc, char* const argv[] ) {
+ Config config;
+// !TBD: This doesn't always work, for some reason
+// if( isDebuggerActive() )
+// config.useStream( "debug" );
+ return Main( argc, argv, config );
+ }
+
+} // end namespace Catch
+
+// #included from: catch_registry_hub.hpp
+#define TWOBLUECUBES_CATCH_REGISTRY_HUB_HPP_INCLUDED
+
+// #included from: catch_test_case_registry_impl.hpp
+#define TWOBLUECUBES_CATCH_TEST_CASE_REGISTRY_IMPL_HPP_INCLUDED
+
+#include <vector>
+#include <set>
+#include <sstream>
+#include <iostream>
+
+namespace Catch {
+
+ class TestRegistry : public ITestCaseRegistry {
+ public:
+ TestRegistry() : m_unnamedCount( 0 ) {}
+ virtual ~TestRegistry();
+
+ virtual void registerTest( const TestCaseInfo& testInfo ) {
+ if( testInfo.getName() == "" ) {
+ std::ostringstream oss;
+ oss << testInfo.getName() << "unnamed/" << ++m_unnamedCount;
+ return registerTest( TestCaseInfo( testInfo, oss.str() ) );
+ }
+
+ if( m_functions.find( testInfo ) == m_functions.end() ) {
+ m_functions.insert( testInfo );
+ m_functionsInOrder.push_back( testInfo );
+ if( !testInfo.isHidden() )
+ m_nonHiddenFunctions.push_back( testInfo );
+ }
+ else {
+ const TestCaseInfo& prev = *m_functions.find( testInfo );
+ std::cerr << "error: TEST_CASE( \"" << testInfo.getName() << "\" ) already defined.\n"
+ << "\tFirst seen at " << SourceLineInfo( prev.getLineInfo() ) << "\n"
+ << "\tRedefined at " << SourceLineInfo( testInfo.getLineInfo() ) << std::endl;
+ exit(1);
+ }
+ }
+
+ virtual const std::vector<TestCaseInfo>& getAllTests() const {
+ return m_functionsInOrder;
+ }
+
+ virtual const std::vector<TestCaseInfo>& getAllNonHiddenTests() const {
+ return m_nonHiddenFunctions;
+ }
+
+ // !TBD deprecated
+ virtual std::vector<TestCaseInfo> getMatchingTestCases( const std::string& rawTestSpec ) const {
+ std::vector<TestCaseInfo> matchingTests;
+ getMatchingTestCases( rawTestSpec, matchingTests );
+ return matchingTests;
+ }
+
+ // !TBD deprecated
+ virtual void getMatchingTestCases( const std::string& rawTestSpec, std::vector<TestCaseInfo>& matchingTestsOut ) const {
+ TestCaseFilter filter( rawTestSpec );
+
+ std::vector<TestCaseInfo>::const_iterator it = m_functionsInOrder.begin();
+ std::vector<TestCaseInfo>::const_iterator itEnd = m_functionsInOrder.end();
+ for(; it != itEnd; ++it ) {
+ if( filter.shouldInclude( *it ) ) {
+ matchingTestsOut.push_back( *it );
+ }
+ }
+ }
+ virtual void getMatchingTestCases( const TestCaseFilters& filters, std::vector<TestCaseInfo>& matchingTestsOut ) const {
+ std::vector<TestCaseInfo>::const_iterator it = m_functionsInOrder.begin();
+ std::vector<TestCaseInfo>::const_iterator itEnd = m_functionsInOrder.end();
+ // !TBD: replace with algorithm
+ for(; it != itEnd; ++it )
+ if( filters.shouldInclude( *it ) )
+ matchingTestsOut.push_back( *it );
+ }
+
+ private:
+
+ std::set<TestCaseInfo> m_functions;
+ std::vector<TestCaseInfo> m_functionsInOrder;
+ std::vector<TestCaseInfo> m_nonHiddenFunctions;
+ size_t m_unnamedCount;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+
+ class FreeFunctionTestCase : public SharedImpl<ITestCase> {
+ public:
+
+ FreeFunctionTestCase( TestFunction fun ) : m_fun( fun ) {}
+
+ virtual void invoke() const {
+ m_fun();
+ }
+
+ private:
+ virtual ~FreeFunctionTestCase();
+
+ TestFunction m_fun;
+ };
+
+ inline std::string extractClassName( const std::string& classOrQualifiedMethodName ) {
+ std::string className = classOrQualifiedMethodName;
+ if( className[0] == '&' )
+ {
+ std::size_t lastColons = className.rfind( "::" );
+ std::size_t penultimateColons = className.rfind( "::", lastColons-1 );
+ if( penultimateColons == std::string::npos )
+ penultimateColons = 1;
+ className = className.substr( penultimateColons, lastColons-penultimateColons );
+ }
+ return className;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+
+ AutoReg::AutoReg( TestFunction function,
+ const char* name,
+ const char* description,
+ const SourceLineInfo& lineInfo ) {
+ registerTestCase( new FreeFunctionTestCase( function ), "global", name, description, lineInfo );
+ }
+
+ AutoReg::~AutoReg() {}
+
+ void AutoReg::registerTestCase( ITestCase* testCase,
+ const char* classOrQualifiedMethodName,
+ const char* name,
+ const char* description,
+ const SourceLineInfo& lineInfo ) {
+
+ getMutableRegistryHub().registerTest( TestCaseInfo( testCase, extractClassName( classOrQualifiedMethodName ), name, description, lineInfo ) );
+ }
+
+} // end namespace Catch
+
+// #included from: catch_reporter_registry.hpp
+#define TWOBLUECUBES_CATCH_REPORTER_REGISTRY_HPP_INCLUDED
+
+#include <map>
+
+namespace Catch {
+
+ class ReporterRegistry : public IReporterRegistry {
+
+ public:
+
+ virtual ~ReporterRegistry() {
+ deleteAllValues( m_factories );
+ }
+
+ virtual IReporter* create( const std::string& name, const ReporterConfig& config ) const {
+ FactoryMap::const_iterator it = m_factories.find( name );
+ if( it == m_factories.end() )
+ return NULL;
+ return it->second->create( config );
+ }
+
+ void registerReporter( const std::string& name, IReporterFactory* factory ) {
+ m_factories.insert( std::make_pair( name, factory ) );
+ }
+
+ const FactoryMap& getFactories() const {
+ return m_factories;
+ }
+
+ private:
+ FactoryMap m_factories;
+ };
+}
+
+// #included from: catch_exception_translator_registry.hpp
+#define TWOBLUECUBES_CATCH_EXCEPTION_TRANSLATOR_REGISTRY_HPP_INCLUDED
+
+#ifdef __OBJC__
+#import "Foundation/Foundation.h"
+#endif
+
+namespace Catch {
+
+ class ExceptionTranslatorRegistry : public IExceptionTranslatorRegistry {
+ public:
+ ~ExceptionTranslatorRegistry() {
+ deleteAll( m_translators );
+ }
+
+ virtual void registerTranslator( const IExceptionTranslator* translator ) {
+ m_translators.push_back( translator );
+ }
+
+ virtual std::string translateActiveException() const {
+ try {
+#ifdef __OBJC__
+ // In Objective-C try objective-c exceptions first
+ @try {
+ throw;
+ }
+ @catch (NSException *exception) {
+ return toString( [exception description] );
+ }
+#else
+ throw;
+#endif
+ }
+ catch( std::exception& ex ) {
+ return ex.what();
+ }
+ catch( std::string& msg ) {
+ return msg;
+ }
+ catch( const char* msg ) {
+ return msg;
+ }
+ catch(...) {
+ return tryTranslators( m_translators.begin() );
+ }
+ }
+
+ std::string tryTranslators( std::vector<const IExceptionTranslator*>::const_iterator it ) const {
+ if( it == m_translators.end() )
+ return "Unknown exception";
+
+ try {
+ return (*it)->translate();
+ }
+ catch(...) {
+ return tryTranslators( it+1 );
+ }
+ }
+
+ private:
+ std::vector<const IExceptionTranslator*> m_translators;
+ };
+}
+
+namespace Catch {
+
+ namespace {
+
+ class RegistryHub : public IRegistryHub, public IMutableRegistryHub {
+
+ RegistryHub( const RegistryHub& );
+ void operator=( const RegistryHub& );
+
+ public: // IRegistryHub
+ RegistryHub() {
+ }
+ virtual const IReporterRegistry& getReporterRegistry() const {
+ return m_reporterRegistry;
+ }
+ virtual const ITestCaseRegistry& getTestCaseRegistry() const {
+ return m_testCaseRegistry;
+ }
+ virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() {
+ return m_exceptionTranslatorRegistry;
+ }
+
+ public: // IMutableRegistryHub
+ virtual void registerReporter( const std::string& name, IReporterFactory* factory ) {
+ m_reporterRegistry.registerReporter( name, factory );
+ }
+ virtual void registerTest( const TestCaseInfo& testInfo ) {
+ m_testCaseRegistry.registerTest( testInfo );
+ }
+ virtual void registerTranslator( const IExceptionTranslator* translator ) {
+ m_exceptionTranslatorRegistry.registerTranslator( translator );
+ }
+
+ private:
+ TestRegistry m_testCaseRegistry;
+ ReporterRegistry m_reporterRegistry;
+ ExceptionTranslatorRegistry m_exceptionTranslatorRegistry;
+ };
+
+ // Single, global, instance
+ inline RegistryHub*& getTheRegistryHub() {
+ static RegistryHub* theRegistryHub = NULL;
+ if( !theRegistryHub )
+ theRegistryHub = new RegistryHub();
+ return theRegistryHub;
+ }
+ }
+
+ IRegistryHub& getRegistryHub() {
+ return *getTheRegistryHub();
+ }
+ IMutableRegistryHub& getMutableRegistryHub() {
+ return *getTheRegistryHub();
+ }
+ void cleanUp() {
+ delete getTheRegistryHub();
+ getTheRegistryHub() = NULL;
+ cleanUpContext();
+ }
+ std::string translateActiveException() {
+ return getRegistryHub().getExceptionTranslatorRegistry().translateActiveException();
+ }
+
+} // end namespace Catch
+
+// #included from: catch_notimplemented_exception.hpp
+#define TWOBLUECUBES_CATCH_NOTIMPLEMENTED_EXCEPTION_HPP_INCLUDED
+
+#include <ostream>
+
+namespace Catch {
+
+ NotImplementedException::NotImplementedException( const SourceLineInfo& lineInfo )
+ : m_lineInfo( lineInfo ) {
+ std::ostringstream oss;
+ oss << lineInfo << "function ";
+ oss << "not implemented";
+ m_what = oss.str();
+ }
+
+ const char* NotImplementedException::what() const throw() {
+ return m_what.c_str();
+ }
+
+} // end namespace Catch
+
+// #included from: catch_context_impl.hpp
+#define TWOBLUECUBES_CATCH_CONTEXT_IMPL_HPP_INCLUDED
+
+namespace Catch {
+
+ class Context : public IMutableContext {
+
+ Context() : m_config( NULL ) {}
+ Context( const Context& );
+ void operator=( const Context& );
+
+ public: // IContext
+ virtual IResultCapture& getResultCapture() {
+ return *m_resultCapture;
+ }
+ virtual IRunner& getRunner() {
+ return *m_runner;
+ }
+ virtual size_t getGeneratorIndex( const std::string& fileInfo, size_t totalSize ) {
+ return getGeneratorsForCurrentTest()
+ .getGeneratorInfo( fileInfo, totalSize )
+ .getCurrentIndex();
+ }
+ virtual bool advanceGeneratorsForCurrentTest() {
+ IGeneratorsForTest* generators = findGeneratorsForCurrentTest();
+ return generators && generators->moveNext();
+ }
+
+ virtual const IConfig* getConfig() const {
+ return m_config;
+ }
+
+ public: // IMutableContext
+ virtual void setResultCapture( IResultCapture* resultCapture ) {
+ m_resultCapture = resultCapture;
+ }
+ virtual void setRunner( IRunner* runner ) {
+ m_runner = runner;
+ }
+ virtual void setConfig( const IConfig* config ) {
+ m_config = config;
+ }
+
+ friend IMutableContext& getCurrentMutableContext();
+
+ private:
+ IGeneratorsForTest* findGeneratorsForCurrentTest() {
+ std::string testName = getResultCapture().getCurrentTestName();
+
+ std::map<std::string, IGeneratorsForTest*>::const_iterator it =
+ m_generatorsByTestName.find( testName );
+ return it != m_generatorsByTestName.end()
+ ? it->second
+ : NULL;
+ }
+
+ IGeneratorsForTest& getGeneratorsForCurrentTest() {
+ IGeneratorsForTest* generators = findGeneratorsForCurrentTest();
+ if( !generators ) {
+ std::string testName = getResultCapture().getCurrentTestName();
+ generators = createGeneratorsForTest();
+ m_generatorsByTestName.insert( std::make_pair( testName, generators ) );
+ }
+ return *generators;
+ }
+
+ private:
+ IRunner* m_runner;
+ IResultCapture* m_resultCapture;
+ const IConfig* m_config;
+ std::map<std::string, IGeneratorsForTest*> m_generatorsByTestName;
+ };
+
+ namespace {
+ Context* currentContext = NULL;
+ }
+ IMutableContext& getCurrentMutableContext() {
+ if( !currentContext )
+ currentContext = new Context();
+ return *currentContext;
+ }
+ IContext& getCurrentContext() {
+ return getCurrentMutableContext();
+ }
+
+ Stream createStream( const std::string& streamName ) {
+ if( streamName == "stdout" ) return Stream( std::cout.rdbuf(), false );
+ if( streamName == "stderr" ) return Stream( std::cerr.rdbuf(), false );
+ if( streamName == "debug" ) return Stream( new StreamBufImpl<OutputDebugWriter>, true );
+
+ throw std::domain_error( "Unknown stream: " + streamName );
+ }
+
+ void cleanUpContext() {
+ delete currentContext;
+ currentContext = NULL;
+ }
+}
+
+// #included from: catch_console_colour_impl.hpp
+#define TWOBLUECUBES_CATCH_CONSOLE_COLOUR_IMPL_HPP_INCLUDED
+
+// #included from: catch_console_colour.hpp
+#define TWOBLUECUBES_CATCH_CONSOLE_COLOUR_HPP_INCLUDED
+
+namespace Catch {
+
+ struct ConsoleColourImpl;
+
+ class TextColour : NonCopyable {
+ public:
+
+ enum Colours {
+ None,
+
+ FileName,
+ ResultError,
+ ResultSuccess,
+
+ Error,
+ Success,
+
+ OriginalExpression,
+ ReconstructedExpression
+ };
+
+ TextColour( Colours colour = None );
+ void set( Colours colour );
+ ~TextColour();
+
+ private:
+ ConsoleColourImpl* m_impl;
+ };
+
+} // end namespace Catch
+
+#if defined( CATCH_CONFIG_USE_ANSI_COLOUR_CODES )
+
+#include <unistd.h>
+
+namespace Catch {
+
+ // use POSIX/ ANSI console terminal codes
+ // Implementation contributed by Adam Strzelecki (http://github.com/nanoant)
+ // https://github.com/philsquared/Catch/pull/131
+
+ TextColour::TextColour( Colours colour ) {
+ if( colour )
+ set( colour );
+ }
+
+ TextColour::~TextColour() {
+ set( TextColour::None );
+ }
+
+ namespace { const char colourEscape = '\033'; }
+
+ void TextColour::set( Colours colour ) {
+ if( isatty( fileno(stdout) ) ) {
+ switch( colour ) {
+ case TextColour::FileName:
+ std::cout << colourEscape << "[0m"; // white/ normal
+ break;
+ case TextColour::ResultError:
+ std::cout << colourEscape << "[1;31m"; // bold red
+ break;
+ case TextColour::ResultSuccess:
+ std::cout << colourEscape << "[1;32m"; // bold green
+ break;
+ case TextColour::Error:
+ std::cout << colourEscape << "[0;31m"; // red
+ break;
+ case TextColour::Success:
+ std::cout << colourEscape << "[0;32m"; // green
+ break;
+ case TextColour::OriginalExpression:
+ std::cout << colourEscape << "[0;36m"; // cyan
+ break;
+ case TextColour::ReconstructedExpression:
+ std::cout << colourEscape << "[0;33m"; // yellow
+ break;
+ case TextColour::None:
+ std::cout << colourEscape << "[0m"; // reset
+ }
+ }
+ }
+
+} // namespace Catch
+
+#elif defined ( CATCH_PLATFORM_WINDOWS )
+
+#include <windows.h>
+
+namespace Catch {
+
+ namespace {
+
+ WORD mapConsoleColour( TextColour::Colours colour ) {
+ switch( colour ) {
+ case TextColour::FileName:
+ return FOREGROUND_INTENSITY; // greyed out
+ case TextColour::ResultError:
+ return FOREGROUND_RED | FOREGROUND_INTENSITY; // bright red
+ case TextColour::ResultSuccess:
+ return FOREGROUND_GREEN | FOREGROUND_INTENSITY; // bright green
+ case TextColour::Error:
+ return FOREGROUND_RED; // dark red
+ case TextColour::Success:
+ return FOREGROUND_GREEN; // dark green
+ case TextColour::OriginalExpression:
+ return FOREGROUND_BLUE | FOREGROUND_GREEN; // turquoise
+ case TextColour::ReconstructedExpression:
+ return FOREGROUND_RED | FOREGROUND_GREEN; // greeny-yellow
+ default: return 0;
+ }
+ }
+ }
+
+ struct ConsoleColourImpl {
+
+ ConsoleColourImpl()
+ : hStdout( GetStdHandle(STD_OUTPUT_HANDLE) ),
+ wOldColorAttrs( 0 )
+ {
+ GetConsoleScreenBufferInfo( hStdout, &csbiInfo );
+ wOldColorAttrs = csbiInfo.wAttributes;
+ }
+
+ ~ConsoleColourImpl() {
+ SetConsoleTextAttribute( hStdout, wOldColorAttrs );
+ }
+
+ void set( TextColour::Colours colour ) {
+ WORD consoleColour = mapConsoleColour( colour );
+ if( consoleColour > 0 )
+ SetConsoleTextAttribute( hStdout, consoleColour );
+ }
+
+ HANDLE hStdout;
+ CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
+ WORD wOldColorAttrs;
+ };
+
+ TextColour::TextColour( Colours colour )
+ : m_impl( new ConsoleColourImpl() )
+ {
+ if( colour )
+ m_impl->set( colour );
+ }
+
+ TextColour::~TextColour() {
+ delete m_impl;
+ }
+
+ void TextColour::set( Colours colour ) {
+ m_impl->set( colour );
+ }
+
+} // end namespace Catch
+
+#else
+
+namespace Catch {
+
+ TextColour::TextColour( Colours ){}
+ TextColour::~TextColour(){}
+ void TextColour::set( Colours ){}
+
+} // end namespace Catch
+
+#endif
+
+// #included from: catch_generators_impl.hpp
+#define TWOBLUECUBES_CATCH_GENERATORS_IMPL_HPP_INCLUDED
+
+#include <vector>
+#include <string>
+#include <map>
+
+namespace Catch {
+
+ struct GeneratorInfo : IGeneratorInfo {
+
+ GeneratorInfo( std::size_t size )
+ : m_size( size ),
+ m_currentIndex( 0 )
+ {}
+
+ bool moveNext() {
+ if( ++m_currentIndex == m_size ) {
+ m_currentIndex = 0;
+ return false;
+ }
+ return true;
+ }
+
+ std::size_t getCurrentIndex() const {
+ return m_currentIndex;
+ }
+
+ std::size_t m_size;
+ std::size_t m_currentIndex;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+
+ class GeneratorsForTest : public IGeneratorsForTest {
+
+ public:
+ ~GeneratorsForTest() {
+ deleteAll( m_generatorsInOrder );
+ }
+
+ IGeneratorInfo& getGeneratorInfo( const std::string& fileInfo, std::size_t size ) {
+ std::map<std::string, IGeneratorInfo*>::const_iterator it = m_generatorsByName.find( fileInfo );
+ if( it == m_generatorsByName.end() ) {
+ IGeneratorInfo* info = new GeneratorInfo( size );
+ m_generatorsByName.insert( std::make_pair( fileInfo, info ) );
+ m_generatorsInOrder.push_back( info );
+ return *info;
+ }
+ return *it->second;
+ }
+
+ bool moveNext() {
+ std::vector<IGeneratorInfo*>::const_iterator it = m_generatorsInOrder.begin();
+ std::vector<IGeneratorInfo*>::const_iterator itEnd = m_generatorsInOrder.end();
+ for(; it != itEnd; ++it ) {
+ if( (*it)->moveNext() )
+ return true;
+ }
+ return false;
+ }
+
+ private:
+ std::map<std::string, IGeneratorInfo*> m_generatorsByName;
+ std::vector<IGeneratorInfo*> m_generatorsInOrder;
+ };
+
+ IGeneratorsForTest* createGeneratorsForTest()
+ {
+ return new GeneratorsForTest();
+ }
+
+} // end namespace Catch
+
+// #included from: catch_assertionresult.hpp
+#define TWOBLUECUBES_CATCH_ASSERTIONRESULT_HPP_INCLUDED
+
+namespace Catch {
+
+ AssertionInfo::AssertionInfo( const std::string& _macroName,
+ const SourceLineInfo& _lineInfo,
+ const std::string& _capturedExpression,
+ ResultDisposition::Flags _resultDisposition )
+ : macroName( _macroName ),
+ lineInfo( _lineInfo ),
+ capturedExpression( _capturedExpression ),
+ resultDisposition( _resultDisposition )
+ {
+ if( shouldNegate( resultDisposition ) )
+ capturedExpression = "!" + _capturedExpression;
+ }
+
+ AssertionResult::AssertionResult() {}
+
+ AssertionResult::AssertionResult( const AssertionInfo& info, const AssertionResultData& data )
+ : m_info( info ),
+ m_resultData( data )
+ {}
+
+ AssertionResult::~AssertionResult() {}
+
+ // Result was a success
+ bool AssertionResult::succeeded() const {
+ return Catch::isOk( m_resultData.resultType );
+ }
+
+ // Result was a success, or failure is suppressed
+ bool AssertionResult::isOk() const {
+ return Catch::isOk( m_resultData.resultType ) || shouldSuppressFailure( m_info.resultDisposition );
+ }
+
+ ResultWas::OfType AssertionResult::getResultType() const {
+ return m_resultData.resultType;
+ }
+
+ bool AssertionResult::hasExpression() const {
+ return !m_info.capturedExpression.empty();
+ }
+
+ bool AssertionResult::hasMessage() const {
+ return !m_resultData.message.empty();
+ }
+
+ std::string AssertionResult::getExpression() const {
+ return m_info.capturedExpression;
+ }
+
+ bool AssertionResult::hasExpandedExpression() const {
+ return hasExpression() && getExpandedExpression() != getExpression();
+ }
+
+ std::string AssertionResult::getExpandedExpression() const {
+ return m_resultData.reconstructedExpression;
+ }
+
+ std::string AssertionResult::getMessage() const {
+ return m_resultData.message;
+ }
+ SourceLineInfo AssertionResult::getSourceInfo() const {
+ return m_info.lineInfo;
+ }
+
+ std::string AssertionResult::getTestMacroName() const {
+ return m_info.macroName;
+ }
+
+} // end namespace Catch
+
+// #included from: catch_expressionresult_builder.hpp
+#define TWOBLUECUBES_CATCH_EXPRESSIONRESULT_BUILDER_HPP_INCLUDED
+
+#include <assert.h>
+
+namespace Catch {
+
+ ExpressionResultBuilder::ExpressionResultBuilder( ResultWas::OfType resultType ) {
+ m_data.resultType = resultType;
+ }
+ ExpressionResultBuilder::ExpressionResultBuilder( const ExpressionResultBuilder& other )
+ : m_data( other.m_data ),
+ m_exprComponents( other.m_exprComponents )
+ {
+ m_stream << other.m_stream.str();
+ }
+ ExpressionResultBuilder& ExpressionResultBuilder::operator=(const ExpressionResultBuilder& other ) {
+ m_data = other.m_data;
+ m_exprComponents = other.m_exprComponents;
+ m_stream.str("");
+ m_stream << other.m_stream.str();
+ return *this;
+ }
+ ExpressionResultBuilder& ExpressionResultBuilder::setResultType( ResultWas::OfType result ) {
+ m_data.resultType = result;
+ return *this;
+ }
+ ExpressionResultBuilder& ExpressionResultBuilder::setResultType( bool result ) {
+ m_data.resultType = result ? ResultWas::Ok : ResultWas::ExpressionFailed;
+ return *this;
+ }
+ ExpressionResultBuilder& ExpressionResultBuilder::endExpression( ResultDisposition::Flags resultDisposition ) {
+ m_exprComponents.shouldNegate = shouldNegate( resultDisposition );
+ return *this;
+ }
+ ExpressionResultBuilder& ExpressionResultBuilder::setLhs( const std::string& lhs ) {
+ m_exprComponents.lhs = lhs;
+ return *this;
+ }
+ ExpressionResultBuilder& ExpressionResultBuilder::setRhs( const std::string& rhs ) {
+ m_exprComponents.rhs = rhs;
+ return *this;
+ }
+ ExpressionResultBuilder& ExpressionResultBuilder::setOp( const std::string& op ) {
+ m_exprComponents.op = op;
+ return *this;
+ }
+ AssertionResult ExpressionResultBuilder::buildResult( const AssertionInfo& info ) const
+ {
+ assert( m_data.resultType != ResultWas::Unknown );
+
+ AssertionResultData data = m_data;
+
+ // Flip bool results if shouldNegate is set
+ if( m_exprComponents.shouldNegate && data.resultType == ResultWas::Ok )
+ data.resultType = ResultWas::ExpressionFailed;
+ else if( m_exprComponents.shouldNegate && data.resultType == ResultWas::ExpressionFailed )
+ data.resultType = ResultWas::Ok;
+
+ data.message = m_stream.str();
+ data.reconstructedExpression = reconstructExpression( info );
+ if( m_exprComponents.shouldNegate ) {
+ if( m_exprComponents.op == "" )
+ data.reconstructedExpression = "!" + data.reconstructedExpression;
+ else
+ data.reconstructedExpression = "!(" + data.reconstructedExpression + ")";
+ }
+ return AssertionResult( info, data );
+ }
+ std::string ExpressionResultBuilder::reconstructExpression( const AssertionInfo& info ) const {
+ if( m_exprComponents.op == "" )
+ return m_exprComponents.lhs.empty() ? info.capturedExpression : m_exprComponents.op + m_exprComponents.lhs;
+ else if( m_exprComponents.op == "matches" )
+ return m_exprComponents.lhs + " " + m_exprComponents.rhs;
+ else if( m_exprComponents.op != "!" ) {
+ if( m_exprComponents.lhs.size() + m_exprComponents.rhs.size() < 30 )
+ return m_exprComponents.lhs + " " + m_exprComponents.op + " " + m_exprComponents.rhs;
+ else if( m_exprComponents.lhs.size() < 70 && m_exprComponents.rhs.size() < 70 )
+ return "\n\t" + m_exprComponents.lhs + "\n\t" + m_exprComponents.op + "\n\t" + m_exprComponents.rhs;
+ else
+ return "\n" + m_exprComponents.lhs + "\n" + m_exprComponents.op + "\n" + m_exprComponents.rhs + "\n\n";
+ }
+ else
+ return "{can't expand - use " + info.macroName + "_FALSE( " + info.capturedExpression.substr(1) + " ) instead of " + info.macroName + "( " + info.capturedExpression + " ) for better diagnostics}";
+ }
+
+} // end namespace Catch
+
+// #included from: catch_test_case_info.hpp
+#define TWOBLUECUBES_CATCH_TEST_CASE_INFO_HPP_INCLUDED
+
+namespace Catch {
+
+ TestCaseInfo::TestCaseInfo( ITestCase* testCase,
+ const std::string& className,
+ const std::string& name,
+ const std::string& description,
+ const SourceLineInfo& lineInfo )
+ : m_test( testCase ),
+ m_className( className ),
+ m_name( name ),
+ m_description( description ),
+ m_lineInfo( lineInfo ),
+ m_isHidden( startsWith( name, "./" ) )
+ {
+ TagExtracter( m_tags ).parse( m_description );
+ if( hasTag( "hide" ) )
+ m_isHidden = true;
+ }
+
+ TestCaseInfo::TestCaseInfo()
+ : m_test( NULL ),
+ m_className(),
+ m_name(),
+ m_description(),
+ m_isHidden( false )
+ {}
+
+ TestCaseInfo::TestCaseInfo( const TestCaseInfo& other, const std::string& name )
+ : m_test( other.m_test ),
+ m_className( other.m_className ),
+ m_name( name ),
+ m_description( other.m_description ),
+ m_tags( other.m_tags ),
+ m_lineInfo( other.m_lineInfo ),
+ m_isHidden( other.m_isHidden )
+ {}
+
+ TestCaseInfo::TestCaseInfo( const TestCaseInfo& other )
+ : m_test( other.m_test ),
+ m_className( other.m_className ),
+ m_name( other.m_name ),
+ m_description( other.m_description ),
+ m_tags( other.m_tags ),
+ m_lineInfo( other.m_lineInfo ),
+ m_isHidden( other.m_isHidden )
+ {}
+
+ void TestCaseInfo::invoke() const {
+ m_test->invoke();
+ }
+
+ const std::string& TestCaseInfo::getClassName() const {
+ return m_className;
+ }
+ const std::string& TestCaseInfo::getName() const {
+ return m_name;
+ }
+ const std::string& TestCaseInfo::getDescription() const {
+ return m_description;
+ }
+ const SourceLineInfo& TestCaseInfo::getLineInfo() const {
+ return m_lineInfo;
+ }
+
+ bool TestCaseInfo::isHidden() const {
+ return m_isHidden;
+ }
+
+ bool TestCaseInfo::hasTag( const std::string& tag ) const {
+ return m_tags.find( tag ) != m_tags.end();
+ }
+ bool TestCaseInfo::matchesTags( const std::string& tagPattern ) const {
+ TagExpression exp;
+ TagExpressionParser( exp ).parse( tagPattern );
+ return exp.matches( m_tags );
+ }
+ const std::set<std::string>& TestCaseInfo::getTags() const {
+ return m_tags;
+ }
+
+ void TestCaseInfo::swap( TestCaseInfo& other ) {
+ m_test.swap( other.m_test );
+ m_className.swap( other.m_className );
+ m_name.swap( other.m_name );
+ m_description.swap( other.m_description );
+ std::swap( m_lineInfo, other.m_lineInfo );
+ }
+
+ bool TestCaseInfo::operator == ( const TestCaseInfo& other ) const {
+ return m_test.get() == other.m_test.get() &&
+ m_name == other.m_name &&
+ m_className == other.m_className;
+ }
+
+ bool TestCaseInfo::operator < ( const TestCaseInfo& other ) const {
+ return m_name < other.m_name;
+ }
+ TestCaseInfo& TestCaseInfo::operator = ( const TestCaseInfo& other ) {
+ TestCaseInfo temp( other );
+ swap( temp );
+ return *this;
+ }
+
+} // end namespace Catch
+
+// #included from: ../reporters/catch_reporter_basic.hpp
+#define TWOBLUECUBES_CATCH_REPORTER_BASIC_HPP_INCLUDED
+
+// #included from: ../internal/catch_reporter_registrars.hpp
+#define TWOBLUECUBES_CATCH_REPORTER_REGISTRARS_HPP_INCLUDED
+
+namespace Catch {
+
+ template<typename T>
+ class ReporterRegistrar {
+
+ class ReporterFactory : public IReporterFactory {
+
+ virtual IReporter* create( const ReporterConfig& config ) const {
+ return new T( config );
+ }
+
+ virtual std::string getDescription() const {
+ return T::getDescription();
+ }
+ };
+
+ public:
+
+ ReporterRegistrar( const std::string& name ) {
+ getMutableRegistryHub().registerReporter( name, new ReporterFactory() );
+ }
+ };
+}
+
+#define INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) \
+ Catch::ReporterRegistrar<reporterType> catch_internal_RegistrarFor##reporterType( name );
+
+namespace Catch {
+
+ class BasicReporter : public SharedImpl<IReporter> {
+
+ struct SpanInfo {
+
+ SpanInfo()
+ : emitted( false )
+ {}
+
+ SpanInfo( const std::string& spanName )
+ : name( spanName ),
+ emitted( false )
+ {}
+
+ SpanInfo( const SpanInfo& other )
+ : name( other.name ),
+ emitted( other.emitted )
+ {}
+
+ std::string name;
+ bool emitted;
+ };
+
+ public:
+ BasicReporter( const ReporterConfig& config )
+ : m_config( config ),
+ m_firstSectionInTestCase( true ),
+ m_aborted( false )
+ {}
+
+ virtual ~BasicReporter();
+
+ static std::string getDescription() {
+ return "Reports test results as lines of text";
+ }
+
+ private:
+
+ void ReportCounts( const std::string& label, const Counts& counts, const std::string& allPrefix = "All " ) {
+ if( counts.passed )
+ m_config.stream << counts.failed << " of " << counts.total() << " " << label << "s failed";
+ else
+ m_config.stream << ( counts.failed > 1 ? allPrefix : "" ) << pluralise( counts.failed, label ) << " failed";
+ }
+
+ void ReportCounts( const Totals& totals, const std::string& allPrefix = "All " ) {
+ if( totals.assertions.total() == 0 ) {
+ m_config.stream << "No tests ran";
+ }
+ else if( totals.assertions.failed ) {
+ TextColour colour( TextColour::ResultError );
+ ReportCounts( "test case", totals.testCases, allPrefix );
+ if( totals.testCases.failed > 0 ) {
+ m_config.stream << " (";
+ ReportCounts( "assertion", totals.assertions, allPrefix );
+ m_config.stream << ")";
+ }
+ }
+ else {
+ TextColour colour( TextColour::ResultSuccess );
+ m_config.stream << allPrefix << "tests passed ("
+ << pluralise( totals.assertions.passed, "assertion" ) << " in "
+ << pluralise( totals.testCases.passed, "test case" ) << ")";
+ }
+ }
+
+ private: // IReporter
+
+ virtual bool shouldRedirectStdout() const {
+ return false;
+ }
+
+ virtual void StartTesting() {
+ m_testingSpan = SpanInfo();
+ }
+
+ virtual void Aborted() {
+ m_aborted = true;
+ }
+
+ virtual void EndTesting( const Totals& totals ) {
+ // Output the overall test results even if "Started Testing" was not emitted
+ if( m_aborted ) {
+ m_config.stream << "\n[Testing aborted. ";
+ ReportCounts( totals, "The first " );
+ }
+ else {
+ m_config.stream << "\n[Testing completed. ";
+ ReportCounts( totals );
+ }
+ m_config.stream << "]\n" << std::endl;
+ }
+
+ virtual void StartGroup( const std::string& groupName ) {
+ m_groupSpan = groupName;
+ }
+
+ virtual void EndGroup( const std::string& groupName, const Totals& totals ) {
+ if( m_groupSpan.emitted && !groupName.empty() ) {
+ m_config.stream << "[End of group: '" << groupName << "'. ";
+ ReportCounts( totals );
+ m_config.stream << "]\n" << std::endl;
+ m_groupSpan = SpanInfo();
+ }
+ }
+
+ virtual void StartTestCase( const TestCaseInfo& testInfo ) {
+ m_testSpan = testInfo.getName();
+ }
+
+ virtual void StartSection( const std::string& sectionName, const std::string& ) {
+ m_sectionSpans.push_back( SpanInfo( sectionName ) );
+ }
+
+ virtual void NoAssertionsInSection( const std::string& sectionName ) {
+ startSpansLazily();
+ TextColour colour( TextColour::ResultError );
+ m_config.stream << "\nNo assertions in section, '" << sectionName << "'\n" << std::endl;
+ }
+ virtual void NoAssertionsInTestCase( const std::string& testName ) {
+ startSpansLazily();
+ TextColour colour( TextColour::ResultError );
+ m_config.stream << "\nNo assertions in test case, '" << testName << "'\n" << std::endl;
+ }
+
+ virtual void EndSection( const std::string& sectionName, const Counts& assertions ) {
+
+ SpanInfo& sectionSpan = m_sectionSpans.back();
+ if( sectionSpan.emitted && !sectionSpan.name.empty() ) {
+ m_config.stream << "[End of section: '" << sectionName << "' ";
+
+ if( assertions.failed ) {
+ TextColour colour( TextColour::ResultError );
+ ReportCounts( "assertion", assertions);
+ }
+ else {
+ TextColour colour( TextColour::ResultSuccess );
+ m_config.stream << ( assertions.passed > 1 ? "All " : "" )
+ << pluralise( assertions.passed, "assertion" ) << " passed" ;
+ }
+ m_config.stream << "]\n" << std::endl;
+ }
+ m_sectionSpans.pop_back();
+ }
+
+ virtual void Result( const AssertionResult& assertionResult ) {
+ if( !m_config.includeSuccessfulResults && assertionResult.getResultType() == ResultWas::Ok )
+ return;
+
+ startSpansLazily();
+
+ if( !assertionResult.getSourceInfo().empty() ) {
+ TextColour colour( TextColour::FileName );
+ m_config.stream << assertionResult.getSourceInfo();
+ }
+
+ if( assertionResult.hasExpression() ) {
+ TextColour colour( TextColour::OriginalExpression );
+ m_config.stream << assertionResult.getExpression();
+ if( assertionResult.succeeded() ) {
+ TextColour successColour( TextColour::Success );
+ m_config.stream << " succeeded";
+ }
+ else {
+ TextColour errorColour( TextColour::Error );
+ m_config.stream << " failed";
+ if( assertionResult.isOk() ) {
+ TextColour okAnywayColour( TextColour::Success );
+ m_config.stream << " - but was ok";
+ }
+ }
+ }
+ switch( assertionResult.getResultType() ) {
+ case ResultWas::ThrewException:
+ {
+ TextColour colour( TextColour::Error );
+ if( assertionResult.hasExpression() )
+ m_config.stream << " with unexpected";
+ else
+ m_config.stream << "Unexpected";
+ m_config.stream << " exception with message: '" << assertionResult.getMessage() << "'";
+ }
+ break;
+ case ResultWas::DidntThrowException:
+ {
+ TextColour colour( TextColour::Error );
+ if( assertionResult.hasExpression() )
+ m_config.stream << " because no exception was thrown where one was expected";
+ else
+ m_config.stream << "No exception thrown where one was expected";
+ }
+ break;
+ case ResultWas::Info:
+ {
+ TextColour colour( TextColour::ReconstructedExpression );
+ streamVariableLengthText( "info", assertionResult.getMessage() );
+ }
+ break;
+ case ResultWas::Warning:
+ {
+ TextColour colour( TextColour::ReconstructedExpression );
+ streamVariableLengthText( "warning", assertionResult.getMessage() );
+ }
+ break;
+ case ResultWas::ExplicitFailure:
+ {
+ TextColour colour( TextColour::Error );
+ m_config.stream << "failed with message: '" << assertionResult.getMessage() << "'";
+ }
+ break;
+ case ResultWas::Unknown: // These cases are here to prevent compiler warnings
+ case ResultWas::Ok:
+ case ResultWas::FailureBit:
+ case ResultWas::ExpressionFailed:
+ case ResultWas::Exception:
+ if( !assertionResult.hasExpression() ) {
+ if( assertionResult.succeeded() ) {
+ TextColour colour( TextColour::Success );
+ m_config.stream << " succeeded";
+ }
+ else {
+ TextColour colour( TextColour::Error );
+ m_config.stream << " failed";
+ if( assertionResult.isOk() ) {
+ TextColour okAnywayColour( TextColour::Success );
+ m_config.stream << " - but was ok";
+ }
+ }
+ }
+ break;
+ }
+
+ if( assertionResult.hasExpandedExpression() ) {
+ m_config.stream << " for: ";
+ if( assertionResult.getExpandedExpression().size() > 40 ) {
+ m_config.stream << "\n";
+ if( assertionResult.getExpandedExpression().size() < 70 )
+ m_config.stream << "\t";
+ }
+ TextColour colour( TextColour::ReconstructedExpression );
+ m_config.stream << assertionResult.getExpandedExpression();
+ }
+ m_config.stream << std::endl;
+ }
+
+ virtual void EndTestCase( const TestCaseInfo& testInfo,
+ const Totals& totals,
+ const std::string& stdOut,
+ const std::string& stdErr ) {
+ if( !stdOut.empty() ) {
+ startSpansLazily();
+ streamVariableLengthText( "stdout", stdOut );
+ }
+
+ if( !stdErr.empty() ) {
+ startSpansLazily();
+ streamVariableLengthText( "stderr", stdErr );
+ }
+
+ if( m_testSpan.emitted ) {
+ m_config.stream << "[Finished: '" << testInfo.getName() << "' ";
+ ReportCounts( totals );
+ m_config.stream << "]" << std::endl;
+ }
+ }
+
+ private: // helpers
+
+ void startSpansLazily() {
+ if( !m_testingSpan.emitted ) {
+ if( m_config.name.empty() )
+ m_config.stream << "[Started testing]" << std::endl;
+ else
+ m_config.stream << "[Started testing: " << m_config.name << "]" << std::endl;
+ m_testingSpan.emitted = true;
+ }
+
+ if( !m_groupSpan.emitted && !m_groupSpan.name.empty() ) {
+ m_config.stream << "[Started group: '" << m_groupSpan.name << "']" << std::endl;
+ m_groupSpan.emitted = true;
+ }
+
+ if( !m_testSpan.emitted ) {
+ m_config.stream << std::endl << "[Running: " << m_testSpan.name << "]" << std::endl;
+ m_testSpan.emitted = true;
+ }
+
+ if( !m_sectionSpans.empty() ) {
+ SpanInfo& sectionSpan = m_sectionSpans.back();
+ if( !sectionSpan.emitted && !sectionSpan.name.empty() ) {
+ if( m_firstSectionInTestCase ) {
+ m_config.stream << "\n";
+ m_firstSectionInTestCase = false;
+ }
+ std::vector<SpanInfo>::iterator it = m_sectionSpans.begin();
+ std::vector<SpanInfo>::iterator itEnd = m_sectionSpans.end();
+ for(; it != itEnd; ++it ) {
+ SpanInfo& prevSpan = *it;
+ if( !prevSpan.emitted && !prevSpan.name.empty() ) {
+ m_config.stream << "[Started section: '" << prevSpan.name << "']" << std::endl;
+ prevSpan.emitted = true;
+ }
+ }
+ }
+ }
+ }
+
+ void streamVariableLengthText( const std::string& prefix, const std::string& text ) {
+ std::string trimmed = trim( text );
+ if( trimmed.find_first_of( "\r\n" ) == std::string::npos ) {
+ m_config.stream << "[" << prefix << ": " << trimmed << "]";
+ }
+ else {
+ m_config.stream << "\n[" << prefix << "] >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n" << trimmed
+ << "\n[end of " << prefix << "] <<<<<<<<<<<<<<<<<<<<<<<<\n";
+ }
+ }
+
+ private:
+ ReporterConfig m_config;
+ bool m_firstSectionInTestCase;
+
+ SpanInfo m_testingSpan;
+ SpanInfo m_groupSpan;
+ SpanInfo m_testSpan;
+ std::vector<SpanInfo> m_sectionSpans;
+ bool m_aborted;
+ };
+
+} // end namespace Catch
+
+// #included from: ../reporters/catch_reporter_xml.hpp
+#define TWOBLUECUBES_CATCH_REPORTER_XML_HPP_INCLUDED
+
+// #included from: ../internal/catch_xmlwriter.hpp
+#define TWOBLUECUBES_CATCH_XMLWRITER_HPP_INCLUDED
+
+#include <sstream>
+#include <iostream>
+#include <string>
+#include <vector>
+
+namespace Catch {
+
+ class XmlWriter {
+ public:
+
+ class ScopedElement {
+ public:
+ ScopedElement( XmlWriter* writer )
+ : m_writer( writer )
+ {}
+
+ ScopedElement( const ScopedElement& other )
+ : m_writer( other.m_writer ){
+ other.m_writer = NULL;
+ }
+
+ ~ScopedElement() {
+ if( m_writer )
+ m_writer->endElement();
+ }
+
+ ScopedElement& writeText( const std::string& text ) {
+ m_writer->writeText( text );
+ return *this;
+ }
+
+ template<typename T>
+ ScopedElement& writeAttribute( const std::string& name, const T& attribute ) {
+ m_writer->writeAttribute( name, attribute );
+ return *this;
+ }
+
+ private:
+ mutable XmlWriter* m_writer;
+ };
+
+ XmlWriter()
+ : m_tagIsOpen( false ),
+ m_needsNewline( false ),
+ m_os( &std::cout )
+ {}
+
+ XmlWriter( std::ostream& os )
+ : m_tagIsOpen( false ),
+ m_needsNewline( false ),
+ m_os( &os )
+ {}
+
+ ~XmlWriter() {
+ while( !m_tags.empty() )
+ endElement();
+ }
+
+ XmlWriter& operator = ( const XmlWriter& other ) {
+ XmlWriter temp( other );
+ swap( temp );
+ return *this;
+ }
+
+ void swap( XmlWriter& other ) {
+ std::swap( m_tagIsOpen, other.m_tagIsOpen );
+ std::swap( m_needsNewline, other.m_needsNewline );
+ std::swap( m_tags, other.m_tags );
+ std::swap( m_indent, other.m_indent );
+ std::swap( m_os, other.m_os );
+ }
+
+ XmlWriter& startElement( const std::string& name ) {
+ ensureTagClosed();
+ newlineIfNecessary();
+ stream() << m_indent << "<" << name;
+ m_tags.push_back( name );
+ m_indent += " ";
+ m_tagIsOpen = true;
+ return *this;
+ }
+
+ ScopedElement scopedElement( const std::string& name ) {
+ ScopedElement scoped( this );
+ startElement( name );
+ return scoped;
+ }
+
+ XmlWriter& endElement() {
+ newlineIfNecessary();
+ m_indent = m_indent.substr( 0, m_indent.size()-2 );
+ if( m_tagIsOpen ) {
+ stream() << "/>\n";
+ m_tagIsOpen = false;
+ }
+ else {
+ stream() << m_indent << "</" << m_tags.back() << ">\n";
+ }
+ m_tags.pop_back();
+ return *this;
+ }
+
+ XmlWriter& writeAttribute( const std::string& name, const std::string& attribute ) {
+ if( !name.empty() && !attribute.empty() ) {
+ stream() << " " << name << "=\"";
+ writeEncodedText( attribute );
+ stream() << "\"";
+ }
+ return *this;
+ }
+
+ XmlWriter& writeAttribute( const std::string& name, bool attribute ) {
+ stream() << " " << name << "=\"" << ( attribute ? "true" : "false" ) << "\"";
+ return *this;
+ }
+
+ template<typename T>
+ XmlWriter& writeAttribute( const std::string& name, const T& attribute ) {
+ if( !name.empty() )
+ stream() << " " << name << "=\"" << attribute << "\"";
+ return *this;
+ }
+
+ XmlWriter& writeText( const std::string& text ) {
+ if( !text.empty() ){
+ bool tagWasOpen = m_tagIsOpen;
+ ensureTagClosed();
+ if( tagWasOpen )
+ stream() << m_indent;
+ writeEncodedText( text );
+ m_needsNewline = true;
+ }
+ return *this;
+ }
+
+ XmlWriter& writeComment( const std::string& text ) {
+ ensureTagClosed();
+ stream() << m_indent << "<!--" << text << "-->";
+ m_needsNewline = true;
+ return *this;
+ }
+
+ XmlWriter& writeBlankLine() {
+ ensureTagClosed();
+ stream() << "\n";
+ return *this;
+ }
+
+ private:
+
+ std::ostream& stream() {
+ return *m_os;
+ }
+
+ void ensureTagClosed() {
+ if( m_tagIsOpen ) {
+ stream() << ">\n";
+ m_tagIsOpen = false;
+ }
+ }
+
+ void newlineIfNecessary() {
+ if( m_needsNewline ) {
+ stream() << "\n";
+ m_needsNewline = false;
+ }
+ }
+
+ void writeEncodedText( const std::string& text ) {
+ static const char* charsToEncode = "<&\"";
+ std::string mtext = text;
+ std::string::size_type pos = mtext.find_first_of( charsToEncode );
+ while( pos != std::string::npos ) {
+ stream() << mtext.substr( 0, pos );
+
+ switch( mtext[pos] ) {
+ case '<':
+ stream() << "&lt;";
+ break;
+ case '&':
+ stream() << "&amp;";
+ break;
+ case '\"':
+ stream() << "&quot;";
+ break;
+ }
+ mtext = mtext.substr( pos+1 );
+ pos = mtext.find_first_of( charsToEncode );
+ }
+ stream() << mtext;
+ }
+
+ bool m_tagIsOpen;
+ bool m_needsNewline;
+ std::vector<std::string> m_tags;
+ std::string m_indent;
+ std::ostream* m_os;
+ };
+
+}
+namespace Catch {
+ class XmlReporter : public SharedImpl<IReporter> {
+ public:
+ XmlReporter( const ReporterConfig& config ) : m_config( config ) {}
+
+ static std::string getDescription() {
+ return "Reports test results as an XML document";
+ }
+ virtual ~XmlReporter();
+
+ private: // IReporter
+
+ virtual bool shouldRedirectStdout() const {
+ return true;
+ }
+
+ virtual void StartTesting() {
+ m_xml = XmlWriter( m_config.stream );
+ m_xml.startElement( "Catch" );
+ if( !m_config.name.empty() )
+ m_xml.writeAttribute( "name", m_config.name );
+ }
+
+ virtual void EndTesting( const Totals& totals ) {
+ m_xml.scopedElement( "OverallResults" )
+ .writeAttribute( "successes", totals.assertions.passed )
+ .writeAttribute( "failures", totals.assertions.failed );
+ m_xml.endElement();
+ }
+
+ virtual void StartGroup( const std::string& groupName ) {
+ m_xml.startElement( "Group" )
+ .writeAttribute( "name", groupName );
+ }
+
+ virtual void EndGroup( const std::string&, const Totals& totals ) {
+ m_xml.scopedElement( "OverallResults" )
+ .writeAttribute( "successes", totals.assertions.passed )
+ .writeAttribute( "failures", totals.assertions.failed );
+ m_xml.endElement();
+ }
+
+ virtual void StartSection( const std::string& sectionName, const std::string& description ) {
+ m_xml.startElement( "Section" )
+ .writeAttribute( "name", sectionName )
+ .writeAttribute( "description", description );
+ }
+ virtual void NoAssertionsInSection( const std::string& ) {}
+ virtual void NoAssertionsInTestCase( const std::string& ) {}
+
+ virtual void EndSection( const std::string& /*sectionName*/, const Counts& assertions ) {
+ m_xml.scopedElement( "OverallResults" )
+ .writeAttribute( "successes", assertions.passed )
+ .writeAttribute( "failures", assertions.failed );
+ m_xml.endElement();
+ }
+
+ virtual void StartTestCase( const Catch::TestCaseInfo& testInfo ) {
+ m_xml.startElement( "TestCase" ).writeAttribute( "name", testInfo.getName() );
+ m_currentTestSuccess = true;
+ }
+
+ virtual void Result( const Catch::AssertionResult& assertionResult ) {
+ if( !m_config.includeSuccessfulResults && assertionResult.getResultType() == ResultWas::Ok )
+ return;
+
+ if( assertionResult.hasExpression() ) {
+ m_xml.startElement( "Expression" )
+ .writeAttribute( "success", assertionResult.succeeded() )
+ .writeAttribute( "filename", assertionResult.getSourceInfo().file )
+ .writeAttribute( "line", assertionResult.getSourceInfo().line );
+
+ m_xml.scopedElement( "Original" )
+ .writeText( assertionResult.getExpression() );
+ m_xml.scopedElement( "Expanded" )
+ .writeText( assertionResult.getExpandedExpression() );
+ m_currentTestSuccess &= assertionResult.succeeded();
+ }
+
+ switch( assertionResult.getResultType() ) {
+ case ResultWas::ThrewException:
+ m_xml.scopedElement( "Exception" )
+ .writeAttribute( "filename", assertionResult.getSourceInfo().file )
+ .writeAttribute( "line", assertionResult.getSourceInfo().line )
+ .writeText( assertionResult.getMessage() );
+ m_currentTestSuccess = false;
+ break;
+ case ResultWas::Info:
+ m_xml.scopedElement( "Info" )
+ .writeText( assertionResult.getMessage() );
+ break;
+ case ResultWas::Warning:
+ m_xml.scopedElement( "Warning" )
+ .writeText( assertionResult.getMessage() );
+ break;
+ case ResultWas::ExplicitFailure:
+ m_xml.scopedElement( "Failure" )
+ .writeText( assertionResult.getMessage() );
+ m_currentTestSuccess = false;
+ break;
+ case ResultWas::Unknown:
+ case ResultWas::Ok:
+ case ResultWas::FailureBit:
+ case ResultWas::ExpressionFailed:
+ case ResultWas::Exception:
+ case ResultWas::DidntThrowException:
+ break;
+ }
+ if( assertionResult.hasExpression() )
+ m_xml.endElement();
+ }
+
+ virtual void Aborted() {
+ // !TBD
+ }
+
+ virtual void EndTestCase( const Catch::TestCaseInfo&, const Totals&, const std::string&, const std::string& ) {
+ m_xml.scopedElement( "OverallResult" ).writeAttribute( "success", m_currentTestSuccess );
+ m_xml.endElement();
+ }
+
+ private:
+ ReporterConfig m_config;
+ bool m_currentTestSuccess;
+ XmlWriter m_xml;
+ };
+
+} // end namespace Catch
+
+// #included from: ../reporters/catch_reporter_junit.hpp
+#define TWOBLUECUBES_CATCH_REPORTER_JUNIT_HPP_INCLUDED
+
+namespace Catch {
+
+ class JunitReporter : public SharedImpl<IReporter> {
+
+ struct TestStats {
+ std::string m_element;
+ std::string m_resultType;
+ std::string m_message;
+ std::string m_content;
+ };
+
+ struct TestCaseStats {
+
+ TestCaseStats( const std::string& className, const std::string& name )
+ : m_className( className ),
+ m_name( name )
+ {}
+
+ double m_timeInSeconds;
+ std::string m_status;
+ std::string m_className;
+ std::string m_name;
+ std::vector<TestStats> m_testStats;
+ };
+
+ struct Stats {
+
+ Stats( const std::string& name = std::string() )
+ : m_testsCount( 0 ),
+ m_failuresCount( 0 ),
+ m_disabledCount( 0 ),
+ m_errorsCount( 0 ),
+ m_timeInSeconds( 0 ),
+ m_name( name )
+ {}
+
+ std::size_t m_testsCount;
+ std::size_t m_failuresCount;
+ std::size_t m_disabledCount;
+ std::size_t m_errorsCount;
+ double m_timeInSeconds;
+ std::string m_name;
+
+ std::vector<TestCaseStats> m_testCaseStats;
+ };
+
+ public:
+ JunitReporter( const ReporterConfig& config )
+ : m_config( config ),
+ m_testSuiteStats( "AllTests" ),
+ m_currentStats( &m_testSuiteStats )
+ {}
+ virtual ~JunitReporter();
+
+ static std::string getDescription() {
+ return "Reports test results in an XML format that looks like Ant's junitreport target";
+ }
+
+ private: // IReporter
+
+ virtual bool shouldRedirectStdout() const {
+ return true;
+ }
+
+ virtual void StartTesting(){}
+
+ virtual void StartGroup( const std::string& groupName ) {
+ m_statsForSuites.push_back( Stats( groupName ) );
+ m_currentStats = &m_statsForSuites.back();
+ }
+
+ virtual void EndGroup( const std::string&, const Totals& totals ) {
+ m_currentStats->m_testsCount = totals.assertions.total();
+ m_currentStats = &m_testSuiteStats;
+ }
+
+ virtual void StartSection( const std::string&, const std::string& ){}
+
+ virtual void NoAssertionsInSection( const std::string& ) {}
+ virtual void NoAssertionsInTestCase( const std::string& ) {}
+
+ virtual void EndSection( const std::string&, const Counts& ) {}
+
+ virtual void StartTestCase( const Catch::TestCaseInfo& testInfo ) {
+ m_currentStats->m_testCaseStats.push_back( TestCaseStats( testInfo.getClassName(), testInfo.getName() ) );
+ }
+
+ virtual void Result( const Catch::AssertionResult& assertionResult ) {
+ if( assertionResult.getResultType() != ResultWas::Ok || m_config.includeSuccessfulResults ) {
+ TestCaseStats& testCaseStats = m_currentStats->m_testCaseStats.back();
+ TestStats stats;
+ std::ostringstream oss;
+ if( !assertionResult.getMessage().empty() )
+ oss << assertionResult.getMessage() << " at ";
+ oss << assertionResult.getSourceInfo();
+ stats.m_content = oss.str();
+ stats.m_message = assertionResult.getExpandedExpression();
+ stats.m_resultType = assertionResult.getTestMacroName();
+
+ switch( assertionResult.getResultType() ) {
+ case ResultWas::ThrewException:
+ stats.m_element = "error";
+ m_currentStats->m_errorsCount++;
+ break;
+ case ResultWas::Info:
+ stats.m_element = "info"; // !TBD ?
+ break;
+ case ResultWas::Warning:
+ stats.m_element = "warning"; // !TBD ?
+ break;
+ case ResultWas::ExplicitFailure:
+ stats.m_element = "failure";
+ m_currentStats->m_failuresCount++;
+ break;
+ case ResultWas::ExpressionFailed:
+ stats.m_element = "failure";
+ m_currentStats->m_failuresCount++;
+ break;
+ case ResultWas::Ok:
+ stats.m_element = "success";
+ break;
+ case ResultWas::Unknown:
+ case ResultWas::FailureBit:
+ case ResultWas::Exception:
+ case ResultWas::DidntThrowException:
+ break;
+ }
+ testCaseStats.m_testStats.push_back( stats );
+ }
+ }
+
+ virtual void EndTestCase( const Catch::TestCaseInfo&, const Totals&, const std::string& stdOut, const std::string& stdErr ) {
+ if( !stdOut.empty() )
+ m_stdOut << stdOut << "\n";
+ if( !stdErr.empty() )
+ m_stdErr << stdErr << "\n";
+ }
+
+ virtual void Aborted() {
+ // !TBD
+ }
+
+ virtual void EndTesting( const Totals& ) {
+ std::ostream& str = m_config.stream;
+ {
+ XmlWriter xml( str );
+
+ if( m_statsForSuites.size() > 0 )
+ xml.startElement( "testsuites" );
+
+ std::vector<Stats>::const_iterator it = m_statsForSuites.begin();
+ std::vector<Stats>::const_iterator itEnd = m_statsForSuites.end();
+
+ for(; it != itEnd; ++it ) {
+ XmlWriter::ScopedElement e = xml.scopedElement( "testsuite" );
+ xml.writeAttribute( "name", it->m_name );
+ xml.writeAttribute( "errors", it->m_errorsCount );
+ xml.writeAttribute( "failures", it->m_failuresCount );
+ xml.writeAttribute( "tests", it->m_testsCount );
+ xml.writeAttribute( "hostname", "tbd" );
+ xml.writeAttribute( "time", "tbd" );
+ xml.writeAttribute( "timestamp", "tbd" );
+
+ OutputTestCases( xml, *it );
+ }
+
+ xml.scopedElement( "system-out" ).writeText( trim( m_stdOut.str() ) );
+ xml.scopedElement( "system-err" ).writeText( trim( m_stdErr.str() ) );
+ }
+ }
+
+ void OutputTestCases( XmlWriter& xml, const Stats& stats ) {
+ std::vector<TestCaseStats>::const_iterator it = stats.m_testCaseStats.begin();
+ std::vector<TestCaseStats>::const_iterator itEnd = stats.m_testCaseStats.end();
+ for(; it != itEnd; ++it ) {
+ xml.writeBlankLine();
+ xml.writeComment( "Test case" );
+
+ XmlWriter::ScopedElement e = xml.scopedElement( "testcase" );
+ xml.writeAttribute( "classname", it->m_className );
+ xml.writeAttribute( "name", it->m_name );
+ xml.writeAttribute( "time", "tbd" );
+
+ OutputTestResult( xml, *it );
+ }
+ }
+
+ void OutputTestResult( XmlWriter& xml, const TestCaseStats& stats ) {
+ std::vector<TestStats>::const_iterator it = stats.m_testStats.begin();
+ std::vector<TestStats>::const_iterator itEnd = stats.m_testStats.end();
+ for(; it != itEnd; ++it ) {
+ if( it->m_element != "success" ) {
+ XmlWriter::ScopedElement e = xml.scopedElement( it->m_element );
+
+ xml.writeAttribute( "message", it->m_message );
+ xml.writeAttribute( "type", it->m_resultType );
+ if( !it->m_content.empty() )
+ xml.writeText( it->m_content );
+ }
+ }
+ }
+
+ private:
+ ReporterConfig m_config;
+ bool m_currentTestSuccess;
+
+ Stats m_testSuiteStats;
+ Stats* m_currentStats;
+ std::vector<Stats> m_statsForSuites;
+ std::ostringstream m_stdOut;
+ std::ostringstream m_stdErr;
+ };
+
+} // end namespace Catch
+
+namespace Catch {
+ NonCopyable::~NonCopyable() {}
+ IShared::~IShared() {}
+ StreamBufBase::~StreamBufBase() {}
+ IContext::~IContext() {}
+ IResultCapture::~IResultCapture() {}
+ ITestCase::~ITestCase() {}
+ ITestCaseRegistry::~ITestCaseRegistry() {}
+ IRegistryHub::~IRegistryHub() {}
+ IMutableRegistryHub::~IMutableRegistryHub() {}
+ IExceptionTranslator::~IExceptionTranslator() {}
+ IExceptionTranslatorRegistry::~IExceptionTranslatorRegistry() {}
+ IReporter::~IReporter() {}
+ IReporterFactory::~IReporterFactory() {}
+ IReporterRegistry::~IReporterRegistry() {}
+ BasicReporter::~BasicReporter() {}
+ IRunner::~IRunner() {}
+ IMutableContext::~IMutableContext() {}
+ IConfig::~IConfig() {}
+ XmlReporter::~XmlReporter() {}
+ JunitReporter::~JunitReporter() {}
+ TestRegistry::~TestRegistry() {}
+ FreeFunctionTestCase::~FreeFunctionTestCase() {}
+ IGeneratorInfo::~IGeneratorInfo() {}
+ IGeneratorsForTest::~IGeneratorsForTest() {}
+ TagParser::~TagParser() {}
+ TagExtracter::~TagExtracter() {}
+ TagExpressionParser::~TagExpressionParser() {}
+
+ Matchers::Impl::StdString::Equals::~Equals() {}
+ Matchers::Impl::StdString::Contains::~Contains() {}
+ Matchers::Impl::StdString::StartsWith::~StartsWith() {}
+ Matchers::Impl::StdString::EndsWith::~EndsWith() {}
+
+ void Config::dummy() {}
+
+ INTERNAL_CATCH_REGISTER_REPORTER( "basic", BasicReporter )
+ INTERNAL_CATCH_REGISTER_REPORTER( "xml", XmlReporter )
+ INTERNAL_CATCH_REGISTER_REPORTER( "junit", JunitReporter )
+
+}
+
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+
+#endif
+
+#ifdef CATCH_CONFIG_MAIN
+// #included from: internal/catch_default_main.hpp
+#define TWOBLUECUBES_CATCH_DEFAULT_MAIN_HPP_INCLUDED
+
+#ifndef __OBJC__
+
+// Standard C/C++ main entry point
+int main (int argc, char * const argv[]) {
+ return Catch::Main( argc, argv );
+}
+
+#else // __OBJC__
+
+// Objective-C entry point
+int main (int argc, char * const argv[]) {
+#if !CATCH_ARC_ENABLED
+ NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
+#endif
+
+ Catch::registerTestMethods();
+ int result = Catch::Main( argc, (char* const*)argv );
+
+#if !CATCH_ARC_ENABLED
+ [pool drain];
+#endif
+
+ return result;
+}
+
+#endif // __OBJC__
+
+#endif
+
+//////
+
+// If this config identifier is defined then all CATCH macros are prefixed with CATCH_
+#ifdef CATCH_CONFIG_PREFIX_ALL
+
+#define CATCH_REQUIRE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal, "CATCH_REQUIRE" )
+#define CATCH_REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal | Catch::ResultDisposition::NegateResult, "CATCH_REQUIRE_FALSE" )
+
+#define CATCH_REQUIRE_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, ..., Catch::ResultDisposition::Normal, "CATCH_REQUIRE_THROWS" )
+#define CATCH_REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_THROWS_AS" )
+#define CATCH_REQUIRE_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_NOTHROW" )
+
+#define CATCH_CHECK( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK" )
+#define CATCH_CHECK_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::NegateResult, "CATCH_CHECK_FALSE" )
+#define CATCH_CHECKED_IF( expr ) INTERNAL_CATCH_IF( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECKED_IF" )
+#define CATCH_CHECKED_ELSE( expr ) INTERNAL_CATCH_ELSE( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECKED_ELSE" )
+#define CATCH_CHECK_NOFAIL( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, "CATCH_CHECK_NOFAIL" )
+
+#define CATCH_CHECK_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, ..., Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THROWS" )
+#define CATCH_CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THROWS_AS" )
+#define CATCH_CHECK_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_NOTHROW" )
+
+#define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THAT" )
+#define CATCH_REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_THAT" )
+
+#define CATCH_INFO( msg ) INTERNAL_CATCH_MSG( msg, Catch::ResultWas::Info, Catch::ResultDisposition::ContinueOnFailure, "CATCH_INFO" )
+#define CATCH_WARN( msg ) INTERNAL_CATCH_MSG( msg, Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, "CATCH_WARN" )
+#define CATCH_FAIL( msg ) INTERNAL_CATCH_MSG( msg, Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "CATCH_FAIL" )
+#define CATCH_SUCCEED( msg ) INTERNAL_CATCH_MSG( msg, Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "CATCH_SUCCEED" )
+#define CATCH_SCOPED_INFO( msg ) INTERNAL_CATCH_SCOPED_INFO( msg, "CATCH_SCOPED_INFO" )
+#define CATCH_CAPTURE( msg ) INTERNAL_CATCH_MSG( #msg " := " << msg, Catch::ResultWas::Info, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CAPTURE" )
+#define CATCH_SCOPED_CAPTURE( msg ) INTERNAL_CATCH_SCOPED_INFO( #msg " := " << msg, "CATCH_SCOPED_CAPTURE" )
+
+#define CATCH_SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description )
+
+#define CATCH_TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description )
+#define CATCH_TEST_CASE_NORETURN( name, description ) INTERNAL_CATCH_TESTCASE_NORETURN( name, description )
+#define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( "", "Anonymous test case" )
+#define CATCH_METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description )
+
+#define CATCH_REGISTER_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType )
+
+#define CATCH_GENERATE( expr) INTERNAL_CATCH_GENERATE( expr )
+
+// If CATCH_CONFIG_PREFIX_ALL is not defined then the CATCH_ prefix is not required
+#else
+
+#define REQUIRE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal, "REQUIRE" )
+#define REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal | Catch::ResultDisposition::NegateResult, "REQUIRE_FALSE" )
+
+#define REQUIRE_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, ..., Catch::ResultDisposition::Normal, "REQUIRE_THROWS" )
+#define REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::Normal, "REQUIRE_THROWS_AS" )
+#define REQUIRE_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::Normal, "REQUIRE_NOTHROW" )
+
+#define CHECK( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECK" )
+#define CHECK_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::NegateResult, "CHECK_FALSE" )
+#define CHECKED_IF( expr ) INTERNAL_CATCH_IF( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECKED_IF" )
+#define CHECKED_ELSE( expr ) INTERNAL_CATCH_ELSE( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECKED_ELSE" )
+#define CHECK_NOFAIL( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, "CHECK_NOFAIL" )
+
+#define CHECK_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, ..., Catch::ResultDisposition::ContinueOnFailure, "CHECK_THROWS" )
+#define CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::ContinueOnFailure, "CHECK_THROWS_AS" )
+#define CHECK_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECK_NOTHROW" )
+
+#define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::ContinueOnFailure, "CHECK_THAT" )
+#define REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::Normal, "REQUIRE_THAT" )
+
+#define INFO( msg ) INTERNAL_CATCH_MSG( msg, Catch::ResultWas::Info, Catch::ResultDisposition::ContinueOnFailure, "INFO" )
+#define WARN( msg ) INTERNAL_CATCH_MSG( msg, Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, "WARN" )
+#define FAIL( msg ) INTERNAL_CATCH_MSG( msg, Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "FAIL" )
+#define SUCCEED( msg ) INTERNAL_CATCH_MSG( msg, Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "SUCCEED" )
+#define SCOPED_INFO( msg ) INTERNAL_CATCH_SCOPED_INFO( msg, "SCOPED_INFO" )
+#define CAPTURE( msg ) INTERNAL_CATCH_MSG( #msg " := " << msg, Catch::ResultWas::Info, Catch::ResultDisposition::ContinueOnFailure, "CAPTURE" )
+#define SCOPED_CAPTURE( msg ) INTERNAL_CATCH_SCOPED_INFO( #msg " := " << msg, "SCOPED_CAPTURE" )
+
+#define SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description )
+
+#define TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description )
+#define TEST_CASE_NORETURN( name, description ) INTERNAL_CATCH_TESTCASE_NORETURN( name, description )
+#define ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( "", "Anonymous test case" )
+#define METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description )
+
+#define REGISTER_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType )
+
+#define GENERATE( expr) INTERNAL_CATCH_GENERATE( expr )
+
+#endif
+
+#define CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature )
+
+using Catch::Detail::Approx;
+
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+
+#endif // TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED
+

Added: sandbox/triplegit/trunk/unittests/main.cpp
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/unittests/main.cpp 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,739 @@
+/* Unit tests for TripleGit
+(C) 2013 Niall Douglas http://www.nedprod.com/
+Created: Feb 2013
+*/
+
+#include <utility>
+#include <sstream>
+#include <iostream>
+#include "../triplegit/include/triplegit.hpp"
+#include "../triplegit/include/async_file_io.hpp"
+#include "boost/graph/topological_sort.hpp"
+#include "boost/graph/depth_first_search.hpp"
+#include "boost/graph/dijkstra_shortest_paths.hpp"
+#include "boost/graph/visitors.hpp"
+#include "boost/graph/isomorphism.hpp"
+#include "boost/lockfree/queue.hpp"
+#define CATCH_CONFIG_RUNNER
+#include "catch.hpp"
+
+enum files_e { dax_h, yow_h, boz_h, zow_h, foo_cpp,
+ foo_o, bar_cpp, bar_o, libfoobar_a,
+ zig_cpp, zig_o, zag_cpp, zag_o,
+ libzigzag_a, killerapp, N };
+const char* name[] = { "dax.h", "yow.h", "boz.h", "zow.h", "foo.cpp",
+ "foo.o", "bar.cpp", "bar.o", "libfoobar.a",
+ "zig.cpp", "zig.o", "zag.cpp", "zag.o",
+ "libzigzag.a", "killerapp" };
+typedef std::pair<int,int> Edge;
+Edge used_by[] = {
+ Edge(dax_h, foo_cpp), Edge(dax_h, bar_cpp), Edge(dax_h, yow_h),
+ Edge(yow_h, bar_cpp), Edge(yow_h, zag_cpp),
+ Edge(boz_h, bar_cpp), Edge(boz_h, zig_cpp), Edge(boz_h, zag_cpp),
+ Edge(zow_h, foo_cpp),
+ Edge(foo_cpp, foo_o),
+ Edge(foo_o, libfoobar_a),
+ Edge(bar_cpp, bar_o),
+ Edge(bar_o, libfoobar_a),
+ Edge(libfoobar_a, libzigzag_a),
+ Edge(zig_cpp, zig_o),
+ Edge(zig_o, libzigzag_a),
+ Edge(zag_cpp, zag_o),
+ Edge(zag_o, libzigzag_a),
+ Edge(libzigzag_a, killerapp)
+};
+const std::size_t nedges = sizeof(used_by)/sizeof(Edge);
+
+//static triplegit::fs_store store(std::filesystem::current_path());
+//static triplegit::collection_id testgraph(store, "unittests.testgraph");
+
+// From http://burtleburtle.net/bob/rand/smallprng.html
+typedef unsigned int u4;
+typedef struct ranctx { u4 a; u4 b; u4 c; u4 d; } ranctx;
+
+#define rot(x,k) (((x)<<(k))|((x)>>(32-(k))))
+u4 ranval( ranctx *x ) {
+ u4 e = x->a - rot(x->b, 27);
+ x->a = x->b ^ rot(x->c, 17);
+ x->b = x->c + x->d;
+ x->c = x->d + e;
+ x->d = e + x->a;
+ return x->d;
+}
+
+void raninit( ranctx *x, u4 seed ) {
+ u4 i;
+ x->a = 0xf1ea5eed, x->b = x->c = x->d = seed;
+ for (i=0; i<20; ++i) {
+ (void)ranval(x);
+ }
+}
+
+
+int main (int argc, char * const argv[]) {
+ int ret=Catch::Main( argc, argv );
+#if defined(WIN32) && !defined(NDEBUG)
+ printf("Press Return to exit ...\n");
+ getchar();
+#endif
+ return ret;
+}
+
+struct print_visitor : public boost::bfs_visitor<> {
+ std::ostream &out;
+ print_visitor(std::ostream &_out) : out(_out) { }
+ template <class Vertex, class Graph>
+ void discover_vertex(Vertex v, Graph&) {
+ out << name[v] << " ";
+ }
+};
+
+
+struct cycle_detector : public boost::dfs_visitor<>
+{
+ cycle_detector(bool& has_cycle)
+ : m_has_cycle(has_cycle) { }
+
+ template <class Edge, class Graph>
+ void back_edge(Edge, Graph&) { m_has_cycle = true; }
+protected:
+ bool& m_has_cycle;
+};
+
+template<class adjacency_list> void TestGraph(adjacency_list &g)
+{
+ using namespace boost;
+ using namespace std;
+ typedef adjacency_list Graph;
+ typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+ ostringstream out;
+
+ // Determine ordering for a full recompilation
+ // and the order with files that can be compiled in parallel
+ {
+ typedef list<Vertex> MakeOrder;
+ typename MakeOrder::iterator i;
+ MakeOrder make_order;
+
+ topological_sort(g, std::front_inserter(make_order));
+ out << "make ordering: ";
+ for (i = make_order.begin();
+ i != make_order.end(); ++i)
+ out << name[*i] << " ";
+
+ out << endl << endl;
+ cout << out.str();
+ CHECK(out.str()=="make ordering: zow.h boz.h zig.cpp zig.o dax.h yow.h zag.cpp zag.o bar.cpp bar.o foo.cpp foo.o libfoobar.a libzigzag.a killerapp \n\n");
+ out.clear();
+ out.str("");
+
+ // Parallel compilation ordering
+ std::vector<int> time(N, 0);
+ for (i = make_order.begin(); i != make_order.end(); ++i) {
+ // Walk through the in_edges an calculate the maximum time.
+ if (in_degree (*i, g) > 0) {
+ typename Graph::in_edge_iterator j, j_end;
+ int maxdist=0;
+ // Through the order from topological sort, we are sure that every
+ // time we are using here is already initialized.
+ for (boost::tie(j, j_end) = in_edges(*i, g); j != j_end; ++j)
+ maxdist=(std::max)(time[source(*j, g)], maxdist);
+ time[*i]=maxdist+1;
+ }
+ }
+
+ out << "parallel make ordering, " << endl
+ << "vertices with same group number can be made in parallel" << endl;
+ {
+ typename graph_traits<Graph>::vertex_iterator i, iend;
+ for (boost::tie(i,iend) = vertices(g); i != iend; ++i)
+ out << "time_slot[" << name[*i] << "] = " << time[*i] << endl;
+ }
+
+ }
+ out << endl;
+ cout << out.str();
+ const char *test1=R"(parallel make ordering,
+vertices with same group number can be made in parallel
+time_slot[dax.h] = 0
+time_slot[yow.h] = 1
+time_slot[boz.h] = 0
+time_slot[zow.h] = 0
+time_slot[foo.cpp] = 1
+time_slot[foo.o] = 2
+time_slot[bar.cpp] = 2
+time_slot[bar.o] = 3
+time_slot[libfoobar.a] = 4
+time_slot[zig.cpp] = 1
+time_slot[zig.o] = 2
+time_slot[zag.cpp] = 2
+time_slot[zag.o] = 3
+time_slot[libzigzag.a] = 5
+time_slot[killerapp] = 6
+
+)";
+ CHECK(out.str()==test1);
+ out.clear();
+ out.str("");
+
+ // if I change yow.h what files need to be re-made?
+ {
+ out << "A change to yow.h will cause what to be re-made?" << endl;
+ print_visitor vis(out);
+ breadth_first_search(g, vertex(yow_h, g), visitor(vis));
+ out << endl;
+ }
+ out << endl;
+ cout << out.str();
+ CHECK(out.str()=="A change to yow.h will cause what to be re-made?\nyow.h bar.cpp zag.cpp bar.o zag.o libfoobar.a libzigzag.a killerapp \n\n");
+ out.clear();
+ out.str("");
+}
+
+template<class adjacency_list> void ModifyGraph(adjacency_list &g)
+{
+ using namespace boost;
+ using namespace std;
+ typedef adjacency_list Graph;
+ typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+ ostringstream out;
+
+ // are there any cycles in the graph?
+ {
+ bool has_cycle = false;
+ cycle_detector vis(has_cycle);
+ depth_first_search(g, visitor(vis));
+ out << "The graph has a cycle? " << has_cycle << endl;
+ }
+ out << endl;
+ cout << out.str();
+ CHECK(out.str()=="The graph has a cycle? 0\n\n");
+ out.clear();
+ out.str("");
+
+ // add a dependency going from bar.cpp to dax.h
+ {
+ out << "adding edge bar_cpp -> dax_h" << endl;
+ add_edge(bar_cpp, dax_h, g);
+ }
+ out << endl;
+
+ // are there any cycles in the graph?
+ {
+ bool has_cycle = false;
+ cycle_detector vis(has_cycle);
+ depth_first_search(g, visitor(vis));
+ out << "The graph has a cycle now? " << has_cycle << endl;
+ }
+ cout << out.str();
+ CHECK(out.str()=="adding edge bar_cpp -> dax_h\n\nThe graph has a cycle now? 1\n");
+ out.clear();
+ out.str("");
+}
+
+TEST_CASE("boost.graph/works", "Tests that one of the samples from Boost.Graph works as advertised")
+{
+ using namespace boost;
+ typedef adjacency_list<vecS, vecS, bidirectionalS> Graph;
+ Graph g(used_by, used_by + nedges, N);
+ TestGraph<>(g);
+ ModifyGraph<>(g);
+}
+
+static int task()
+{
+#ifdef __GNUC__
+ triplegit::async_io::thread::id this_id = boost::this_thread::get_id();
+#else
+ std::thread::id this_id = std::this_thread::get_id();
+#endif
+ std::cout << "I am worker thread " << this_id << std::endl;
+ return 78;
+}
+TEST_CASE("async_io/thread_pool/works", "Tests that the async i/o thread pool implementation works")
+{
+ using namespace triplegit::async_io;
+#ifdef __GNUC__
+ triplegit::async_io::thread::id this_id = boost::this_thread::get_id();
+#else
+ std::thread::id this_id = std::this_thread::get_id();
+#endif
+ std::cout << "I am main thread " << this_id << std::endl;
+ thread_pool pool(4);
+ auto r=task();
+ CHECK(r==78);
+ std::vector<future<int>> results(8);
+ for(auto &i : results)
+ {
+ i=std::move(pool.enqueue(task));
+ }
+ std::vector<future<int>> results2;
+ results2.push_back(pool.enqueue(task));
+ results2.push_back(pool.enqueue(task));
+ std::pair<size_t, int> allresults2=when_any(results2.begin(), results2.end()).get();
+ CHECK(allresults2.first<2);
+ CHECK(allresults2.second==78);
+ std::vector<int> allresults=when_all(results.begin(), results.end()).get();
+ for(int i : allresults)
+ {
+ CHECK(i==78);
+ }
+}
+
+
+static void _1000_open_write_close_deletes(std::shared_ptr<triplegit::async_io::async_file_io_dispatcher_base> dispatcher, size_t bytes)
+{
+ using namespace triplegit::async_io;
+ using namespace std;
+ using triplegit::async_io::future;
+ typedef std::chrono::duration<double, ratio<1>> secs_type;
+ auto mkdir(dispatcher->dir(async_path_op_req("testdir", file_flags::Create)));
+ vector<char, NiallsCPP11Utilities::aligned_allocator<char, 4096>> towrite(bytes, 'N');
+ assert(!(((size_t) &towrite.front()) & 4095));
+
+ // Wait for six seconds to let filing system recover and prime SpeedStep
+ auto begin=std::chrono::high_resolution_clock::now();
+ while(std::chrono::duration_cast<secs_type>(std::chrono::high_resolution_clock::now()-begin).count()<6);
+
+ // Start opening 1000 files
+ begin=chrono::high_resolution_clock::now();
+ std::vector<async_path_op_req> manyfilereqs;
+ manyfilereqs.reserve(1000);
+ for(size_t n=0; n<1000; n++)
+ manyfilereqs.push_back(async_path_op_req(mkdir, "testdir/"+std::to_string(n), file_flags::Create|file_flags::Write));
+ auto manyopenfiles(dispatcher->file(manyfilereqs));
+
+ // Write to each of those 1000 files as they are opened
+ std::vector<async_data_op_req<const char>> manyfilewrites;
+ manyfilewrites.reserve(manyfilereqs.size());
+ auto openit=manyopenfiles.begin();
+ for(size_t n=0; n<manyfilereqs.size(); n++)
+ manyfilewrites.push_back(async_data_op_req<const char>(*openit++, &towrite.front(), towrite.size(), 0));
+ auto manywrittenfiles(dispatcher->write(manyfilewrites));
+
+ // Close each of those 1000 files once one byte has been written
+ auto manyclosedfiles(dispatcher->close(manywrittenfiles));
+
+ // Delete each of those 1000 files once they are closed
+ auto it(manyclosedfiles.begin());
+ for(auto &i : manyfilereqs)
+ i.precondition=*it++;
+ auto manydeletedfiles(dispatcher->rmfile(manyfilereqs));
+
+ // As a test of call() which involves significant template metaprogramming, have a do nothing callback
+ std::atomic<size_t> callcount;
+ typedef int (*callable_type)(std::atomic<size_t> &, int);
+ callable_type callable=[](std::atomic<size_t> &callcount, int i) { ++callcount; return i; };
+ std::vector<std::function<int()>> callables;
+ callables.reserve(1000);
+ for(size_t n=0; n<1000; n++)
+ callables.push_back(std::bind(callable, ref(callcount), 78));
+ auto manycallbacks(dispatcher->call(manydeletedfiles, std::move(callables)));
+ auto dispatched=chrono::high_resolution_clock::now();
+
+ // Wait for all files to open
+ when_all(manyopenfiles.begin(), manyopenfiles.end()).wait();
+ auto openedsync=chrono::high_resolution_clock::now();
+ // Wait for all files to write
+ when_all(manywrittenfiles.begin(), manywrittenfiles.end()).wait();
+ auto writtensync=chrono::high_resolution_clock::now();
+ // Wait for all files to close
+ when_all(manyclosedfiles.begin(), manyclosedfiles.end()).wait();
+ auto closedsync=chrono::high_resolution_clock::now();
+ // Wait for all files to delete
+ when_all(manydeletedfiles.begin(), manydeletedfiles.end()).wait();
+ auto deletedsync=chrono::high_resolution_clock::now();
+ // Wait for all callbacks
+ when_all(manycallbacks.second.begin(), manycallbacks.second.end()).wait();
+
+ auto end=deletedsync;
+ auto rmdir(dispatcher->rmdir(async_path_op_req("testdir")));
+
+ auto diff=chrono::duration_cast<secs_type>(end-begin);
+ cout << "It took " << diff.count() << " secs to do all operations" << endl;
+ diff=chrono::duration_cast<secs_type>(dispatched-begin);
+ cout << " It took " << diff.count() << " secs to dispatch all operations" << endl;
+ diff=chrono::duration_cast<secs_type>(end-dispatched);
+ cout << " It took " << diff.count() << " secs to finish all operations" << endl << endl;
+
+ diff=chrono::duration_cast<secs_type>(openedsync-begin);
+ cout << "It took " << diff.count() << " secs to do " << manyfilereqs.size()/diff.count() << " file opens per sec" << endl;
+ diff=chrono::duration_cast<secs_type>(writtensync-openedsync);
+ cout << "It took " << diff.count() << " secs to do " << manyfilereqs.size()/diff.count() << " file writes per sec" << endl;
+ diff=chrono::duration_cast<secs_type>(closedsync-writtensync);
+ cout << "It took " << diff.count() << " secs to do " << manyfilereqs.size()/diff.count() << " file closes per sec" << endl;
+ diff=chrono::duration_cast<secs_type>(deletedsync-closedsync);
+ cout << "It took " << diff.count() << " secs to do " << manyfilereqs.size()/diff.count() << " file deletions per sec" << endl;
+
+ // Fetch any outstanding error
+ rmdir.h.get();
+ CHECK((callcount==1000U));
+}
+
+TEST_CASE("async_io/works/1prime", "Tests that the async i/o implementation works (primes system)")
+{
+ auto dispatcher=triplegit::async_io::async_file_io_dispatcher(triplegit::async_io::process_threadpool(), triplegit::async_io::file_flags::None);
+ std::cout << "\n\n1000 file opens, writes 1 byte, closes, and deletes (primes system):\n";
+ _1000_open_write_close_deletes(dispatcher, 1);
+}
+
+TEST_CASE("async_io/works/1", "Tests that the async i/o implementation works")
+{
+ auto dispatcher=triplegit::async_io::async_file_io_dispatcher(triplegit::async_io::process_threadpool(), triplegit::async_io::file_flags::None);
+ std::cout << "\n\n1000 file opens, writes 1 byte, closes, and deletes:\n";
+ _1000_open_write_close_deletes(dispatcher, 1);
+}
+
+TEST_CASE("async_io/works/64", "Tests that the async i/o implementation works")
+{
+ auto dispatcher=triplegit::async_io::async_file_io_dispatcher(triplegit::async_io::process_threadpool(), triplegit::async_io::file_flags::None);
+ std::cout << "\n\n1000 file opens, writes 64Kb, closes, and deletes:\n";
+ _1000_open_write_close_deletes(dispatcher, 65536);
+}
+
+TEST_CASE("async_io/works/1/sync", "Tests that the synchronous async i/o implementation works")
+{
+ auto dispatcher=triplegit::async_io::async_file_io_dispatcher(triplegit::async_io::process_threadpool(), triplegit::async_io::file_flags::OSSync);
+ std::cout << "\n\n1000 file opens, writes 1 byte, closes, and deletes with synchronous i/o:\n";
+ _1000_open_write_close_deletes(dispatcher, 1);
+}
+
+TEST_CASE("async_io/works/64/sync", "Tests that the synchronous async i/o implementation works")
+{
+ auto dispatcher=triplegit::async_io::async_file_io_dispatcher(triplegit::async_io::process_threadpool(), triplegit::async_io::file_flags::OSSync);
+ std::cout << "\n\n1000 file opens, writes 64Kb, closes, and deletes with synchronous i/o:\n";
+ _1000_open_write_close_deletes(dispatcher, 65536);
+}
+
+TEST_CASE("async_io/works/1/autoflush", "Tests that the autoflush async i/o implementation works")
+{
+ auto dispatcher=triplegit::async_io::async_file_io_dispatcher(triplegit::async_io::process_threadpool(), triplegit::async_io::file_flags::AutoFlush);
+ std::cout << "\n\n1000 file opens, writes 1 byte, closes, and deletes with autoflush i/o:\n";
+ _1000_open_write_close_deletes(dispatcher, 1);
+}
+
+TEST_CASE("async_io/works/64/autoflush", "Tests that the autoflush async i/o implementation works")
+{
+ auto dispatcher=triplegit::async_io::async_file_io_dispatcher(triplegit::async_io::process_threadpool(), triplegit::async_io::file_flags::AutoFlush);
+ std::cout << "\n\n1000 file opens, writes 64Kb, closes, and deletes with autoflush i/o:\n";
+ _1000_open_write_close_deletes(dispatcher, 65536);
+}
+
+TEST_CASE("async_io/works/1/direct", "Tests that the direct async i/o implementation works")
+{
+ auto dispatcher=triplegit::async_io::async_file_io_dispatcher(triplegit::async_io::process_threadpool(), triplegit::async_io::file_flags::OSDirect);
+ std::cout << "\n\n1000 file opens, writes 1 byte, closes, and deletes with direct i/o:\n";
+ _1000_open_write_close_deletes(dispatcher, 1);
+}
+
+TEST_CASE("async_io/works/64/direct", "Tests that the direct async i/o implementation works")
+{
+ auto dispatcher=triplegit::async_io::async_file_io_dispatcher(triplegit::async_io::process_threadpool(), triplegit::async_io::file_flags::OSDirect);
+ std::cout << "\n\n1000 file opens, writes 64Kb, closes, and deletes with direct i/o:\n";
+ _1000_open_write_close_deletes(dispatcher, 65536);
+}
+
+TEST_CASE("async_io/works/1/directsync", "Tests that the direct synchronous async i/o implementation works")
+{
+ auto dispatcher=triplegit::async_io::async_file_io_dispatcher(triplegit::async_io::process_threadpool(), triplegit::async_io::file_flags::OSDirect|triplegit::async_io::file_flags::OSSync);
+ std::cout << "\n\n1000 file opens, writes 1 byte, closes, and deletes with direct synchronous i/o:\n";
+ _1000_open_write_close_deletes(dispatcher, 1);
+}
+
+TEST_CASE("async_io/works/64/directsync", "Tests that the direct synchronous async i/o implementation works")
+{
+ auto dispatcher=triplegit::async_io::async_file_io_dispatcher(triplegit::async_io::process_threadpool(), triplegit::async_io::file_flags::OSDirect|triplegit::async_io::file_flags::OSSync);
+ std::cout << "\n\n1000 file opens, writes 64Kb, closes, and deletes with direct synchronous i/o:\n";
+ _1000_open_write_close_deletes(dispatcher, 65536);
+}
+
+TEST_CASE("async_io/errors", "Tests that the async i/o error handling works")
+{
+ using namespace triplegit::async_io;
+ using namespace std;
+ using triplegit::async_io::future;
+
+ {
+ auto dispatcher=async_file_io_dispatcher();
+ auto mkdir(dispatcher->dir(async_path_op_req("testdir", file_flags::Create)));
+ {
+ vector<async_io_op> files;
+ files.push_back(dispatcher->file(async_path_op_req(mkdir, "testdir/a", file_flags::Create)));
+ files.push_back(dispatcher->file(async_path_op_req(mkdir, "testdir/b", file_flags::Create)));
+ when_all(files.begin(), files.end()).wait();
+#if 0
+ auto copy(dispatcher->call(files.front(), []{
+ std::filesystem::copy("testdir/c", "testdir/d");
+ }));
+ CHECK_THROWS(copy.second.h.get()); // This should trip with failure to copy
+ CHECK_THROWS(when_all({copy.second}).get()); // This should trip with failure to copy
+#else
+ CHECK(!"Fixme");
+#endif
+ }
+ vector<async_io_op> files;
+ files.push_back(dispatcher->rmfile(async_path_op_req(mkdir, "testdir/a")));
+ files.push_back(dispatcher->rmfile(async_path_op_req(mkdir, "testdir/b")));
+ // TODO: Insert a barrier() here once I write it.
+ files.push_back(dispatcher->rmdir(async_path_op_req(mkdir, "testdir")));
+ }
+}
+
+static void evil_random_io(std::shared_ptr<triplegit::async_io::async_file_io_dispatcher_base> dispatcher, size_t no, size_t bytes, size_t alignment=0)
+{
+ using namespace triplegit::async_io;
+ using namespace std;
+ using triplegit::async_io::future;
+ using namespace NiallsCPP11Utilities;
+ using triplegit::async_io::off_t;
+ typedef std::chrono::duration<double, ratio<1>> secs_type;
+
+ vector<vector<char, NiallsCPP11Utilities::aligned_allocator<char, 4096>>> towrite(no);
+ vector<char *> towriteptrs(no);
+ vector<size_t> towritesizes(no);
+ struct Op
+ {
+ Hash256 hash; // Only used for reading
+ bool write;
+ async_data_op_req<char> req;
+ };
+ static_assert(!(sizeof(PadSizeToMultipleOf<Op, 32>)&31), "Op's stored size must be a multiple of 32 bytes");
+ vector<vector<PadSizeToMultipleOf<Op, 32>, NiallsCPP11Utilities::aligned_allocator<Op, 32>>> todo(no);
+ vector<Hash256> hashes(no);
+ Hash256::BeginBatch(no, &hashes.front());
+ for(size_t n=0; n<no; n++)
+ {
+ towrite[n].reserve(bytes);
+ towrite[n].resize(bytes);
+ assert(!(((size_t) &towrite[n].front()) & 4095));
+ towriteptrs[n]=&towrite[n].front();
+ towritesizes[n]=bytes;
+ }
+ // We create no lots of random writes and reads representing about 50% of bytes
+ // We simulate what we _ought_ to see appear in storage during the test and
+ // SHA256 out the results
+ // We then replay the same with real storage to see if it matches
+ auto begin=std::chrono::high_resolution_clock::now();
+#pragma omp parallel for
+ for(ptrdiff_t n=0; n<(ptrdiff_t) no; n++)
+ {
+ ranctx gen;
+ raninit(&gen, 0x78adbcff^(u4) n);
+ Op op;
+ Hash256::BatchHashOp hashop=Hash256::BeginBatch(1, &op.hash);
+ Hash256::BatchItem hashopitem;
+ get<0>(hashopitem)=0;
+ auto unhashop=Undoer([hashop]{ Hash256::FinishBatch(hashop); });
+ for(off_t bytessofar=0; bytessofar<bytes/2;)
+ {
+ u4 r=ranval(&gen), toissue=(r>>24) & 15;
+ size_t thisbytes=0;
+ op.write=bytessofar<bytes/4 ? true : !(r&(1<<31));
+ op.req.buffers.resize(toissue);
+ op.req.where=toissue &~(bytes/2-1);
+ if(alignment)
+ op.req.where&=~(alignment-1);
+ for(size_t m=0; m<toissue; m++)
+ {
+ u4 s=ranval(&gen) & ((256*1024-1)&~63); // Must be a multiple of 64 bytes for SHA256
+ op.req.buffers.push_back(boost::asio::mutable_buffer((void *)(((size_t) op.req.where)+thisbytes), s));
+ if(op.write)
+ for(; s>0; s-=4, thisbytes+=4)
+ *(u4 *)(((size_t)towriteptrs[n]+(size_t) op.req.where)+thisbytes)=ranval(&gen);
+ else
+ {
+ get<1>(hashopitem)=(const char *)(((size_t)towriteptrs[n]+(size_t) op.req.where)+thisbytes);
+ get<2>(hashopitem)=s;
+ Hash256::AddSHA256ToBatch(hashop, 1, &hashopitem);
+ thisbytes+=s;
+ }
+ }
+ if(!op.write)
+ Hash256::FinishBatch(hashop, false);
+ todo[n].push_back(op);
+ bytessofar+=thisbytes;
+ }
+ }
+ auto end=std::chrono::high_resolution_clock::now();
+ auto diff=chrono::duration_cast<secs_type>(end-begin);
+ cout << "It took " << diff.count() << " secs to simulate torture test in RAM" << endl;
+ begin=std::chrono::high_resolution_clock::now();
+ vector<Hash256> memhashes(no);
+ Hash256::BatchAddSHA256To(no, &memhashes.front(), (const char **) &towriteptrs.front(), &towritesizes.front());
+ end=std::chrono::high_resolution_clock::now();
+ diff=chrono::duration_cast<secs_type>(end-begin);
+ cout << "It took " << diff.count() << " secs to SHA256 the results" << endl;
+ for(size_t n=0; n<no; n++)
+ memset(towriteptrs[n], 0, towritesizes[n]);
+
+ auto mkdir(dispatcher->dir(async_path_op_req("testdir", file_flags::Create)));
+ // Wait for three seconds to let filing system recover and prime SpeedStep
+ //begin=std::chrono::high_resolution_clock::now();
+ //while(std::chrono::duration_cast<secs_type>(std::chrono::high_resolution_clock::now()-begin).count()<3);
+
+ // Open our test files
+ begin=std::chrono::high_resolution_clock::now();
+ std::vector<async_path_op_req> manyfilereqs;
+ manyfilereqs.reserve(no);
+ for(size_t n=0; n<no; n++)
+ manyfilereqs.push_back(async_path_op_req(mkdir, "testdir/"+std::to_string(n), file_flags::Create|file_flags::Write));
+ auto manyopenfiles(dispatcher->file(manyfilereqs));
+ for(size_t n=0; n<no; n++)
+ manyfilereqs[n].precondition=dispatcher->truncate(dispatcher->close(manyopenfiles[n]), bytes);
+ manyopenfiles=dispatcher->file(manyfilereqs);
+
+ // Schedule a replay of our in-RAM simulation
+ std::vector<async_io_op> manywrittenfiles(manyopenfiles.cbegin(), manyopenfiles.cend());
+ size_t maxfailures=0;
+ for(size_t n=0; n<no; n++)
+ maxfailures+=todo[n].size();
+ boost::lockfree::queue<const Op *> failures(maxfailures);
+ auto checkHash=[&failures](Op &op, size_t, std::shared_ptr<triplegit::async_io::detail::async_io_handle> h) -> std::pair<bool, std::shared_ptr<triplegit::async_io::detail::async_io_handle>> {
+ const char *data=(const char *)(((size_t) op.req.where));
+ size_t length=0;
+ for(auto &i : op.req.buffers)
+ length+=boost::asio::buffer_size(i);
+ Hash256 hash;
+ hash.AddSHA256To(data, length);
+ if(hash!=op.hash)
+ failures.push(&op);
+ return make_pair(true, h);
+ };
+#pragma omp parallel for
+ for(ptrdiff_t n=0; n<(ptrdiff_t) no; n++)
+ {
+ for(Op &op : todo[n])
+ {
+ op.req.precondition=manywrittenfiles[n];
+ manywrittenfiles[n]=op.write ? dispatcher->write(op.req) : dispatcher->read(op.req);
+ if(!op.write)
+ dispatcher->completion(manywrittenfiles[n], std::make_pair(async_op_flags::ImmediateCompletion, std::bind(checkHash, ref(op), placeholders::_1, placeholders::_2)));
+ }
+ // After replay, read the entire file into memory
+ manywrittenfiles[n]=dispatcher->read(async_data_op_req<char>(manywrittenfiles[n], towriteptrs[n], towritesizes[n], 0));
+ }
+
+ // Close each of those files
+ auto manyclosedfiles(dispatcher->close(manywrittenfiles));
+
+ // Delete each of those files once they are closed
+ auto it(manyclosedfiles.begin());
+ for(auto &i : manyfilereqs)
+ i.precondition=*it++;
+ auto manydeletedfiles(dispatcher->rmfile(manyfilereqs));
+ auto dispatched=chrono::high_resolution_clock::now();
+
+ // Wait for all files to open
+ when_all(manyopenfiles.begin(), manyopenfiles.end()).wait();
+ auto openedsync=chrono::high_resolution_clock::now();
+ // Wait for all files to write
+ when_all(manywrittenfiles.begin(), manywrittenfiles.end()).wait();
+ auto writtensync=chrono::high_resolution_clock::now();
+ // Wait for all files to close
+ when_all(manyclosedfiles.begin(), manyclosedfiles.end()).wait();
+ auto closedsync=chrono::high_resolution_clock::now();
+ // Wait for all files to delete
+ when_all(manydeletedfiles.begin(), manydeletedfiles.end()).wait();
+ auto deletedsync=chrono::high_resolution_clock::now();
+
+ end=deletedsync;
+ auto rmdir(dispatcher->rmdir(async_path_op_req("testdir")));
+
+ diff=chrono::duration_cast<secs_type>(end-begin);
+ cout << "It took " << diff.count() << " secs to do all operations" << endl;
+ diff=chrono::duration_cast<secs_type>(dispatched-begin);
+ cout << " It took " << diff.count() << " secs to dispatch all operations" << endl;
+ diff=chrono::duration_cast<secs_type>(end-dispatched);
+ cout << " It took " << diff.count() << " secs to finish all operations" << endl << endl;
+ off_t readed=0, written=0;
+ diff=chrono::duration_cast<secs_type>(end-begin);
+ for(auto &i : manydeletedfiles)
+ {
+ readed+=i.h.get()->read_count();
+ written+=i.h.get()->write_count();
+ }
+ cout << "We read " << readed << " bytes and wrote " << written << " bytes" << endl;
+ cout << " That makes " << (readed+written)/diff.count()/1024/1024 << " Mb/sec" << endl;
+
+ diff=chrono::duration_cast<secs_type>(openedsync-begin);
+ cout << "It took " << diff.count() << " secs to do " << manyfilereqs.size()/diff.count() << " file opens per sec" << endl;
+ diff=chrono::duration_cast<secs_type>(writtensync-openedsync);
+ cout << "It took " << diff.count() << " secs to do " << manyfilereqs.size()/diff.count() << " file writes per sec" << endl;
+ diff=chrono::duration_cast<secs_type>(closedsync-writtensync);
+ cout << "It took " << diff.count() << " secs to do " << manyfilereqs.size()/diff.count() << " file closes per sec" << endl;
+ diff=chrono::duration_cast<secs_type>(deletedsync-closedsync);
+ cout << "It took " << diff.count() << " secs to do " << manyfilereqs.size()/diff.count() << " file deletions per sec" << endl;
+
+ // Fetch any outstanding error
+ rmdir.h.get();
+ CHECK(failures.empty());
+ if(!failures.empty())
+ {
+ const Op *failedop;
+ cout << "The following hash failures occurred:" << endl;
+ while(failures.pop(failedop))
+ cout << " " << (failedop->write ? "Write to" : "Read from") << " " << to_string(failedop->req.where) << endl;
+ }
+ else
+ {
+ vector<Hash256> filehashes(no);
+ Hash256::BatchAddSHA256To(no, &filehashes.front(), (const char **) &towriteptrs.front(), &towritesizes.front());
+ for(size_t n=0; n<no; n++)
+ CHECK(memhashes[n]==filehashes[n]);
+ }
+}
+
+TEST_CASE("async_io/torture", "Tortures the async i/o implementation")
+{
+ auto dispatcher=triplegit::async_io::async_file_io_dispatcher(triplegit::async_io::process_threadpool(), triplegit::async_io::file_flags::None);
+ std::cout << "\n\nSustained random i/o to 10 files of 10Mb:\n";
+ evil_random_io(dispatcher, 10, 10*1024*1024);
+}
+
+TEST_CASE("async_io/torture/sync", "Tortures the synchronous async i/o implementation")
+{
+ auto dispatcher=triplegit::async_io::async_file_io_dispatcher(triplegit::async_io::process_threadpool(), triplegit::async_io::file_flags::OSSync);
+ std::cout << "\n\nSustained random synchronous i/o to 10 files of 1Mb:\n";
+ evil_random_io(dispatcher, 10, 1*1024*1024);
+}
+
+TEST_CASE("async_io/torture/autoflush", "Tortures the autoflush async i/o implementation")
+{
+ auto dispatcher=triplegit::async_io::async_file_io_dispatcher(triplegit::async_io::process_threadpool(), triplegit::async_io::file_flags::AutoFlush);
+ std::cout << "\n\nSustained random autoflush i/o to 10 files of 1Mb:\n";
+ evil_random_io(dispatcher, 10, 1*1024*1024);
+}
+
+TEST_CASE("async_io/torture/direct", "Tortures the direct async i/o implementation")
+{
+ auto dispatcher=triplegit::async_io::async_file_io_dispatcher(triplegit::async_io::process_threadpool(), triplegit::async_io::file_flags::OSDirect);
+ std::cout << "\n\nSustained random direct i/o to 10 files of 10Mb:\n";
+ evil_random_io(dispatcher, 10, 10*1024*1024, 4096);
+}
+
+TEST_CASE("async_io/torture/directsync", "Tortures the direct synchronous async i/o implementation")
+{
+ auto dispatcher=triplegit::async_io::async_file_io_dispatcher(triplegit::async_io::process_threadpool(), triplegit::async_io::file_flags::OSDirect|triplegit::async_io::file_flags::OSSync);
+ std::cout << "\n\nSustained random direct synchronous i/o to 10 files of 1Mb:\n";
+ evil_random_io(dispatcher, 10, 1*1024*1024, 4096);
+}
+
+#if 0
+TEST_CASE("triplegit/works", "Tests that one of the samples from Boost.Graph works as advertised with triplegit")
+{
+ typedef triplegit::boost::adjacency_list<boost::vecS, boost::vecS, boost::bidirectionalS> Graph;
+ Graph g(used_by, used_by + nedges, N);
+ g.attach(store, testgraph);
+ g.begincommit().wait();
+ TestGraph<>(g);
+
+ Graph g2(store, testgraph);
+ TestGraph<>(g2);
+
+ ModifyGraph<>(g);
+ g.begincommit().wait();
+
+ Graph g3(store, testgraph);
+ CHECK(boost::isomorphism(g, g3));
+}
+#endif

Added: sandbox/triplegit/trunk/unittests/unittests.vcxproj
==============================================================================
--- (empty file)
+++ sandbox/triplegit/trunk/unittests/unittests.vcxproj 2013-05-04 18:38:05 EDT (Sat, 04 May 2013)
@@ -0,0 +1,224 @@
+<?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|ARM">
+ <Configuration>Debug</Configuration>
+ <Platform>ARM</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|ARM">
+ <Configuration>Release</Configuration>
+ <Platform>ARM</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{5D87A57F-B41E-49D3-BEE8-9D35492F62F8}</ProjectGuid>
+ <Keyword>Win32Proj</Keyword>
+ <RootNamespace>unittests</RootNamespace>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>v120_CTP_Nov2012</PlatformToolset>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>v110</PlatformToolset>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>v120_CTP_Nov2012</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>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <PlatformToolset>v110</PlatformToolset>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <PlatformToolset>v120_CTP_Nov2012</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 Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <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>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <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>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
+ <LinkIncremental>true</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <LinkIncremental>true</LinkIncremental>
+ <LibraryPath>..\boost\stage\lib;$(LibraryPath)</LibraryPath>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <LinkIncremental>false</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
+ <LinkIncremental>false</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <LinkIncremental>false</LinkIncremental>
+ <LibraryPath>..\boost\stage\lib;$(LibraryPath)</LibraryPath>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
+ <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)'=='Debug|x64'">
+ <ClCompile>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <EnableEnhancedInstructionSet>AdvancedVectorExtensions</EnableEnhancedInstructionSet>
+ <AdditionalIncludeDirectories>../boost</AdditionalIncludeDirectories>
+ </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>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
+ <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>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories>../boost</AdditionalIncludeDirectories>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="main.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\NiallsCPP11Utilities\NiallsCPP11Utilities.vcxproj">
+ <Project>{cf7497ef-702b-4237-bb7c-ad72c297b88e}</Project>
+ </ProjectReference>
+ <ProjectReference Include="..\TripleGit\TripleGit.vcxproj">
+ <Project>{d733647b-03e2-449a-9b5c-d33840f1520f}</Project>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project>
\ No newline at end of file


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk