diff --git a/Builds/VisualStudio2012/beast.vcxproj b/Builds/VisualStudio2012/beast.vcxproj index c63d3621d..934a28286 100644 --- a/Builds/VisualStudio2012/beast.vcxproj +++ b/Builds/VisualStudio2012/beast.vcxproj @@ -172,6 +172,7 @@ + diff --git a/Builds/VisualStudio2012/beast.vcxproj.filters b/Builds/VisualStudio2012/beast.vcxproj.filters index 6b718eb5c..171a1a51f 100644 --- a/Builds/VisualStudio2012/beast.vcxproj.filters +++ b/Builds/VisualStudio2012/beast.vcxproj.filters @@ -1248,6 +1248,9 @@ beast\utility + + beast\threads + diff --git a/beast/Threads.h b/beast/Threads.h index 7336bc777..6c3859d9a 100644 --- a/beast/Threads.h +++ b/beast/Threads.h @@ -32,5 +32,6 @@ #include "threads/Thread.h" #include "threads/ThreadLocalValue.h" #include "threads/WaitableEvent.h" +#include "threads/ScopedWrapperContext.h" #endif diff --git a/beast/threads/ScopedWrapperContext.h b/beast/threads/ScopedWrapperContext.h new file mode 100644 index 000000000..6a0b88324 --- /dev/null +++ b/beast/threads/ScopedWrapperContext.h @@ -0,0 +1,93 @@ +//------------------------------------------------------------------------------ +/* + This file is part of Beast: https://github.com/vinniefalco/Beast + Copyright 2013, Vinnie Falco + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#ifndef BEAST_THREADS_WRAPSCOPED_H_INCLUDED +#define BEAST_THREADS_WRAPSCOPED_H_INCLUDED + +namespace beast { + +/** Wraps a function object so invocation happens during a scoped container lifetime. */ +/** @{ */ +namespace detail { + +template +class ScopedWrapper +{ +public: + ScopedWrapper (Context const& context, Handler const& handler) + : m_context (context) + , m_handler (handler) + { } + + void operator() () + { + ScopedType const scope (m_context); + m_handler(); + } + +private: + Context const& m_context; + Handler m_handler; +}; + +} + +//------------------------------------------------------------------------------ + +/** Helper to eliminate the template argument at call sites. */ +template +class ScopedWrapperContext +{ +public: + typedef Context context_type; + typedef ScopedType scoped_type; + + class Scope + { + public: + explicit Scope (ScopedWrapperContext const& owner) + : m_scope (owner.m_context) + { } + private: + scoped_type m_scope; + }; + + ScopedWrapperContext () + { } + + template + explicit ScopedWrapperContext (Arg& arg) + : m_context (arg) + { } + + template + detail::ScopedWrapper wrap ( + Handler const& handler) + { + return detail::ScopedWrapper ( + m_context, handler); + } + +private: + Context m_context; +}; + +} + +#endif