#ifndef COMMON_ALGORITHM_FOREACH_H
#define COMMON_ALGORITHM_FOREACH_H
#include <memory>
/*
Calls the function 'callback' on every element in the container.
Example usage:
std::vector<Element> array;
ForEach(array, DoSomething);
Or, pass arguments in:
ForEach(array, DoSomething, 17, "Text");
*/
//Takes a container and passes each element to a lambda or function.
//Version for functors or non-generic lambdas (i.e. lambdas with capture lists).
template<typename ContainerType, typename CallbackFunc, typename ...Args>
void ForEach(ContainerType &container, const CallbackFunc &callback, Args&& ...args)
{
for(auto &element : container)
{
callback(element, args...);
}
}
//Const version, for functors and lambdas.
template<typename ContainerType, typename CallbackFunc, typename ...Args>
void ForEach(const ContainerType &container, CallbackFunc callback, Args&& ...args)
{
for(auto &element : container)
{
callback(element, args...);
}
}
//============================================================================
/*
Calls the member-function 'member_func' on every element in the container.
Example usage:
std::vector<Element> array;
ForEach(array, &Element::DoSomething);
Or, pass arguments in:
ForEach(array, &Element::DoSomething, 17, "Text");
*/
//Calls the member-function 'member_func' on every element in the container, optionally passing in arguments.
template<typename ContainerType, typename ElementType, typename ...MembFuncArgs, typename ...ParamArgs>
void ForEach(ContainerType &container, void (ElementType::*member_func)(MembFuncArgs...), ParamArgs&& ...args)
{
for(auto &element : container)
{
element.*member_func(args...);
}
}
//Const version of 'ForEach()' where you can pass arguments into the member-function call.
template<typename ContainerType, typename ElementType, typename ...MembFuncArgs, typename ...ParamArgs>
void ForEach(const ContainerType &container, void (ElementType::*member_func)(MembFuncArgs...) const, ParamArgs&& ...args)
{
for(const auto &element : container)
{
(element.*member_func)(args...);
}
}
//Calls the member-function 'member_func' on every element in the container, optionally passing in arguments.
//Also, returns true if any of the member-functions return true.
template<typename ContainerType, typename ElementType, typename ...MembFuncArgs, typename ...ParamArgs>
bool ForEach_Return(ContainerType &container, bool (ElementType::*member_func)(MembFuncArgs...), ParamArgs&& ...args)
{
bool result = false;
for(auto &element : container)
{
result = (result || (element.*member_func)(args...));
}
return result;
}
//Const version.
template<typename ContainerType, typename ElementType, typename ...MembFuncArgs, typename ...ParamArgs>
bool ForEach_Return(const ContainerType &container, bool (ElementType::*member_func)(MembFuncArgs...) const, ParamArgs&& ...args)
{
bool result = false;
for(const auto &element : container)
{
result = (result || (element.*member_func)(args...));
}
return result;
}
//============================================================================
//Wrappers for std::unique_ptr and std::shared_ptr, with callback-function calls.
template<typename Container, typename CallbackFunc, typename ...Args>
void priv_ForEachPtr_impl_forSharedOrUniquePtrsCallbackFunc(Container &container, CallbackFunc callback, Args&& ...args)
{
for(auto &ptr : container)
{
if(ptr)
{
callback(*ptr, args...);
}
}
}
//Wrappers for std::weak_ptr, with callback-function calls.
template<typename Container, typename CallbackFunc, typename ...Args>
void priv_ForEachPtr_impl_forWeakPtrsCallbackFunc(Container &container, CallbackFunc callback, Args&& ...args)
{
for(auto &weak_ptr : container)
{
auto shared_ptr = weak_ptr.lock();
if(shared_ptr)
{
callback(*shared_ptr, args...);
}
}
}
//============================================================================
//Wrappers for std::unique_ptr and std::shared_ptr, with member-function calls.
template<typename Container, typename MemberFunc, typename ...Args>
void priv_ForEachPtr_impl_forSharedOrUniquePtrsMemberFunc(Container &container, MemberFunc member_func, Args&& ...args)
{
for(auto &ptr : container)
{
if(ptr)
{
((*ptr).*member_func)(args...);
}
}
}
//Wrappers for std::weak_ptr, with member-function calls.
template<typename Container, typename MemberFunc, typename ...Args>
void priv_ForEachPtr_impl_forWeakPtrsMemberFunc(Container &container, MemberFunc member_func, Args&& ...args)
{
for(auto &weak_ptr : container)
{
auto shared_ptr = weak_ptr.lock();
if(shared_ptr)
{
((*shared_ptr).*member_func)(args...);
}
}
}
//============================================================================
//Overload for vectors of unique_ptr.
template<typename ElementType, typename ...MembFuncArgs, typename ...ParamArgs>
void ForEachPtr(std::vector<std::unique_ptr<ElementType>> &container, void (ElementType::*member_func)(MembFuncArgs...), ParamArgs&& ...args)
{
priv_ForEachPtr_impl_forSharedOrUniquePtrsMemberFunc(container, member_func, std::forward<ParamArgs>(args)...);
}
template<typename ElementType, typename ...MembFuncArgs, typename ...ParamArgs>
void ForEachPtr(const std::vector<std::unique_ptr<ElementType>> &container, void (ElementType::*member_func)(MembFuncArgs...) const, ParamArgs&& ...args)
{
priv_ForEachPtr_impl_forSharedOrUniquePtrsMemberFunc(container, member_func, std::forward<ParamArgs>(args)...);
}
//============================================================================
//Overload for vectors of shared_ptr.
template<typename ElementType, typename ...MembFuncArgs, typename ...ParamArgs>
void ForEachPtr(std::vector<std::shared_ptr<ElementType>> &container, void (ElementType::*member_func)(MembFuncArgs...), ParamArgs&& ...args)
{
priv_ForEachPtr_impl_forSharedOrUniquePtrsMemberFunc(container, member_func, std::forward<ParamArgs>(args)...);
}
template<typename ElementType, typename ...MembFuncArgs, typename ...ParamArgs>
void ForEachPtr(const std::vector<std::shared_ptr<ElementType>> &container, void (ElementType::*member_func)(MembFuncArgs...) const, ParamArgs&& ...args)
{
priv_ForEachPtr_impl_forSharedOrUniquePtrsMemberFunc(container, member_func, std::forward<ParamArgs>(args)...);
}
//============================================================================
//Overload for vectors of weak_ptr.
template<typename ElementType, typename ...MembFuncArgs, typename ...ParamArgs>
void ForEachPtr(std::vector<std::weak_ptr<ElementType>> &container, void (ElementType::*member_func)(MembFuncArgs...), ParamArgs&& ...args)
{
priv_ForEachPtr_impl_forSharedOrUniquePtrsMemberFunc(container, member_func, std::forward<ParamArgs>(args)...);
}
template<typename ElementType, typename ...MembFuncArgs, typename ...ParamArgs>
void ForEachPtr(const std::vector<std::weak_ptr<ElementType>> &container, void (ElementType::*member_func)(MembFuncArgs...) const, ParamArgs&& ...args)
{
priv_ForEachPtr_impl_forSharedOrUniquePtrsMemberFunc(container, member_func, std::forward<ParamArgs>(args)...);
}
//============================================================================
#endif // COMMON_ALGORITHM_FOREACH_H
I2lmbmRlZiBDT01NT05fQUxHT1JJVEhNX0ZPUkVBQ0hfSAojZGVmaW5lIENPTU1PTl9BTEdPUklUSE1fRk9SRUFDSF9ICgojaW5jbHVkZSA8bWVtb3J5PgoKLyoKCUNhbGxzIHRoZSBmdW5jdGlvbiAnY2FsbGJhY2snIG9uIGV2ZXJ5IGVsZW1lbnQgaW4gdGhlIGNvbnRhaW5lci4KCglFeGFtcGxlIHVzYWdlOgoKCQlzdGQ6OnZlY3RvcjxFbGVtZW50PiBhcnJheTsKCQlGb3JFYWNoKGFycmF5LCBEb1NvbWV0aGluZyk7CgoJT3IsIHBhc3MgYXJndW1lbnRzIGluOgoKCQlGb3JFYWNoKGFycmF5LCBEb1NvbWV0aGluZywgMTcsICJUZXh0Iik7CiovCgovL1Rha2VzIGEgY29udGFpbmVyIGFuZCBwYXNzZXMgZWFjaCBlbGVtZW50IHRvIGEgbGFtYmRhIG9yIGZ1bmN0aW9uLgovL1ZlcnNpb24gZm9yIGZ1bmN0b3JzIG9yIG5vbi1nZW5lcmljIGxhbWJkYXMgKGkuZS4gbGFtYmRhcyB3aXRoIGNhcHR1cmUgbGlzdHMpLgp0ZW1wbGF0ZTx0eXBlbmFtZSBDb250YWluZXJUeXBlLCB0eXBlbmFtZSBDYWxsYmFja0Z1bmMsIHR5cGVuYW1lIC4uLkFyZ3M+CnZvaWQgRm9yRWFjaChDb250YWluZXJUeXBlICZjb250YWluZXIsIGNvbnN0IENhbGxiYWNrRnVuYyAmY2FsbGJhY2ssIEFyZ3MmJiAuLi5hcmdzKQp7Cglmb3IoYXV0byAmZWxlbWVudCA6IGNvbnRhaW5lcikKCXsKCQljYWxsYmFjayhlbGVtZW50LCBhcmdzLi4uKTsKCX0KfQoKLy9Db25zdCB2ZXJzaW9uLCBmb3IgZnVuY3RvcnMgYW5kIGxhbWJkYXMuCnRlbXBsYXRlPHR5cGVuYW1lIENvbnRhaW5lclR5cGUsIHR5cGVuYW1lIENhbGxiYWNrRnVuYywgdHlwZW5hbWUgLi4uQXJncz4Kdm9pZCBGb3JFYWNoKGNvbnN0IENvbnRhaW5lclR5cGUgJmNvbnRhaW5lciwgQ2FsbGJhY2tGdW5jIGNhbGxiYWNrLCBBcmdzJiYgLi4uYXJncykKewoJZm9yKGF1dG8gJmVsZW1lbnQgOiBjb250YWluZXIpCgl7CgkJY2FsbGJhY2soZWxlbWVudCwgYXJncy4uLik7Cgl9Cn0KCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKLyoKCUNhbGxzIHRoZSBtZW1iZXItZnVuY3Rpb24gJ21lbWJlcl9mdW5jJyBvbiBldmVyeSBlbGVtZW50IGluIHRoZSBjb250YWluZXIuCgoJRXhhbXBsZSB1c2FnZToKCgkJc3RkOjp2ZWN0b3I8RWxlbWVudD4gYXJyYXk7CgkJRm9yRWFjaChhcnJheSwgJkVsZW1lbnQ6OkRvU29tZXRoaW5nKTsKCglPciwgcGFzcyBhcmd1bWVudHMgaW46CgoJCUZvckVhY2goYXJyYXksICZFbGVtZW50OjpEb1NvbWV0aGluZywgMTcsICJUZXh0Iik7CiovCgovL0NhbGxzIHRoZSBtZW1iZXItZnVuY3Rpb24gJ21lbWJlcl9mdW5jJyBvbiBldmVyeSBlbGVtZW50IGluIHRoZSBjb250YWluZXIsIG9wdGlvbmFsbHkgcGFzc2luZyBpbiBhcmd1bWVudHMuCnRlbXBsYXRlPHR5cGVuYW1lIENvbnRhaW5lclR5cGUsIHR5cGVuYW1lIEVsZW1lbnRUeXBlLCB0eXBlbmFtZSAuLi5NZW1iRnVuY0FyZ3MsIHR5cGVuYW1lIC4uLlBhcmFtQXJncz4Kdm9pZCBGb3JFYWNoKENvbnRhaW5lclR5cGUgJmNvbnRhaW5lciwgdm9pZCAoRWxlbWVudFR5cGU6OiptZW1iZXJfZnVuYykoTWVtYkZ1bmNBcmdzLi4uKSwgUGFyYW1BcmdzJiYgLi4uYXJncykKewoJZm9yKGF1dG8gJmVsZW1lbnQgOiBjb250YWluZXIpCgl7CgkJZWxlbWVudC4qbWVtYmVyX2Z1bmMoYXJncy4uLik7Cgl9Cn0KCi8vQ29uc3QgdmVyc2lvbiBvZiAnRm9yRWFjaCgpJyB3aGVyZSB5b3UgY2FuIHBhc3MgYXJndW1lbnRzIGludG8gdGhlIG1lbWJlci1mdW5jdGlvbiBjYWxsLgp0ZW1wbGF0ZTx0eXBlbmFtZSBDb250YWluZXJUeXBlLCB0eXBlbmFtZSBFbGVtZW50VHlwZSwgdHlwZW5hbWUgLi4uTWVtYkZ1bmNBcmdzLCB0eXBlbmFtZSAuLi5QYXJhbUFyZ3M+CnZvaWQgRm9yRWFjaChjb25zdCBDb250YWluZXJUeXBlICZjb250YWluZXIsIHZvaWQgKEVsZW1lbnRUeXBlOjoqbWVtYmVyX2Z1bmMpKE1lbWJGdW5jQXJncy4uLikgY29uc3QsIFBhcmFtQXJncyYmIC4uLmFyZ3MpCnsKCWZvcihjb25zdCBhdXRvICZlbGVtZW50IDogY29udGFpbmVyKQoJewoJCShlbGVtZW50LiptZW1iZXJfZnVuYykoYXJncy4uLik7Cgl9Cn0KCi8vQ2FsbHMgdGhlIG1lbWJlci1mdW5jdGlvbiAnbWVtYmVyX2Z1bmMnIG9uIGV2ZXJ5IGVsZW1lbnQgaW4gdGhlIGNvbnRhaW5lciwgb3B0aW9uYWxseSBwYXNzaW5nIGluIGFyZ3VtZW50cy4KLy9BbHNvLCByZXR1cm5zIHRydWUgaWYgYW55IG9mIHRoZSBtZW1iZXItZnVuY3Rpb25zIHJldHVybiB0cnVlLgp0ZW1wbGF0ZTx0eXBlbmFtZSBDb250YWluZXJUeXBlLCB0eXBlbmFtZSBFbGVtZW50VHlwZSwgdHlwZW5hbWUgLi4uTWVtYkZ1bmNBcmdzLCB0eXBlbmFtZSAuLi5QYXJhbUFyZ3M+CmJvb2wgRm9yRWFjaF9SZXR1cm4oQ29udGFpbmVyVHlwZSAmY29udGFpbmVyLCBib29sIChFbGVtZW50VHlwZTo6Km1lbWJlcl9mdW5jKShNZW1iRnVuY0FyZ3MuLi4pLCBQYXJhbUFyZ3MmJiAuLi5hcmdzKQp7Cglib29sIHJlc3VsdCA9IGZhbHNlOwoJZm9yKGF1dG8gJmVsZW1lbnQgOiBjb250YWluZXIpCgl7CgkJcmVzdWx0ID0gKHJlc3VsdCB8fCAoZWxlbWVudC4qbWVtYmVyX2Z1bmMpKGFyZ3MuLi4pKTsKCX0KCglyZXR1cm4gcmVzdWx0Owp9CgovL0NvbnN0IHZlcnNpb24uCnRlbXBsYXRlPHR5cGVuYW1lIENvbnRhaW5lclR5cGUsIHR5cGVuYW1lIEVsZW1lbnRUeXBlLCB0eXBlbmFtZSAuLi5NZW1iRnVuY0FyZ3MsIHR5cGVuYW1lIC4uLlBhcmFtQXJncz4KYm9vbCBGb3JFYWNoX1JldHVybihjb25zdCBDb250YWluZXJUeXBlICZjb250YWluZXIsIGJvb2wgKEVsZW1lbnRUeXBlOjoqbWVtYmVyX2Z1bmMpKE1lbWJGdW5jQXJncy4uLikgY29uc3QsIFBhcmFtQXJncyYmIC4uLmFyZ3MpCnsKCWJvb2wgcmVzdWx0ID0gZmFsc2U7Cglmb3IoY29uc3QgYXV0byAmZWxlbWVudCA6IGNvbnRhaW5lcikKCXsKCQlyZXN1bHQgPSAocmVzdWx0IHx8IChlbGVtZW50LiptZW1iZXJfZnVuYykoYXJncy4uLikpOwoJfQoKCXJldHVybiByZXN1bHQ7Cn0KCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKLy9XcmFwcGVycyBmb3Igc3RkOjp1bmlxdWVfcHRyIGFuZCBzdGQ6OnNoYXJlZF9wdHIsIHdpdGggY2FsbGJhY2stZnVuY3Rpb24gY2FsbHMuCnRlbXBsYXRlPHR5cGVuYW1lIENvbnRhaW5lciwgdHlwZW5hbWUgQ2FsbGJhY2tGdW5jLCB0eXBlbmFtZSAuLi5BcmdzPgp2b2lkIHByaXZfRm9yRWFjaFB0cl9pbXBsX2ZvclNoYXJlZE9yVW5pcXVlUHRyc0NhbGxiYWNrRnVuYyhDb250YWluZXIgJmNvbnRhaW5lciwgQ2FsbGJhY2tGdW5jIGNhbGxiYWNrLCBBcmdzJiYgLi4uYXJncykKewoJZm9yKGF1dG8gJnB0ciA6IGNvbnRhaW5lcikKCXsKCQlpZihwdHIpCgkJewoJCQljYWxsYmFjaygqcHRyLCBhcmdzLi4uKTsKCQl9Cgl9Cn0KCi8vV3JhcHBlcnMgZm9yIHN0ZDo6d2Vha19wdHIsIHdpdGggY2FsbGJhY2stZnVuY3Rpb24gY2FsbHMuCnRlbXBsYXRlPHR5cGVuYW1lIENvbnRhaW5lciwgdHlwZW5hbWUgQ2FsbGJhY2tGdW5jLCB0eXBlbmFtZSAuLi5BcmdzPgp2b2lkIHByaXZfRm9yRWFjaFB0cl9pbXBsX2ZvcldlYWtQdHJzQ2FsbGJhY2tGdW5jKENvbnRhaW5lciAmY29udGFpbmVyLCBDYWxsYmFja0Z1bmMgY2FsbGJhY2ssIEFyZ3MmJiAuLi5hcmdzKQp7Cglmb3IoYXV0byAmd2Vha19wdHIgOiBjb250YWluZXIpCgl7CgkJYXV0byBzaGFyZWRfcHRyID0gd2Vha19wdHIubG9jaygpOwoKCQlpZihzaGFyZWRfcHRyKQoJCXsKCQkJY2FsbGJhY2soKnNoYXJlZF9wdHIsIGFyZ3MuLi4pOwoJCX0KCX0KfQoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgovL1dyYXBwZXJzIGZvciBzdGQ6OnVuaXF1ZV9wdHIgYW5kIHN0ZDo6c2hhcmVkX3B0ciwgd2l0aCBtZW1iZXItZnVuY3Rpb24gY2FsbHMuCnRlbXBsYXRlPHR5cGVuYW1lIENvbnRhaW5lciwgdHlwZW5hbWUgTWVtYmVyRnVuYywgdHlwZW5hbWUgLi4uQXJncz4Kdm9pZCBwcml2X0ZvckVhY2hQdHJfaW1wbF9mb3JTaGFyZWRPclVuaXF1ZVB0cnNNZW1iZXJGdW5jKENvbnRhaW5lciAmY29udGFpbmVyLCBNZW1iZXJGdW5jIG1lbWJlcl9mdW5jLCBBcmdzJiYgLi4uYXJncykKewoJZm9yKGF1dG8gJnB0ciA6IGNvbnRhaW5lcikKCXsKCQlpZihwdHIpCgkJewoJCQkoKCpwdHIpLiptZW1iZXJfZnVuYykoYXJncy4uLik7CgkJfQoJfQp9CgovL1dyYXBwZXJzIGZvciBzdGQ6OndlYWtfcHRyLCB3aXRoIG1lbWJlci1mdW5jdGlvbiBjYWxscy4KdGVtcGxhdGU8dHlwZW5hbWUgQ29udGFpbmVyLCB0eXBlbmFtZSBNZW1iZXJGdW5jLCB0eXBlbmFtZSAuLi5BcmdzPgp2b2lkIHByaXZfRm9yRWFjaFB0cl9pbXBsX2ZvcldlYWtQdHJzTWVtYmVyRnVuYyhDb250YWluZXIgJmNvbnRhaW5lciwgTWVtYmVyRnVuYyBtZW1iZXJfZnVuYywgQXJncyYmIC4uLmFyZ3MpCnsKCWZvcihhdXRvICZ3ZWFrX3B0ciA6IGNvbnRhaW5lcikKCXsKCQlhdXRvIHNoYXJlZF9wdHIgPSB3ZWFrX3B0ci5sb2NrKCk7CgoJCWlmKHNoYXJlZF9wdHIpCgkJewoJCQkoKCpzaGFyZWRfcHRyKS4qbWVtYmVyX2Z1bmMpKGFyZ3MuLi4pOwoJCX0KCX0KfQoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgovL092ZXJsb2FkIGZvciB2ZWN0b3JzIG9mIHVuaXF1ZV9wdHIuCnRlbXBsYXRlPHR5cGVuYW1lIEVsZW1lbnRUeXBlLCB0eXBlbmFtZSAuLi5NZW1iRnVuY0FyZ3MsIHR5cGVuYW1lIC4uLlBhcmFtQXJncz4Kdm9pZCBGb3JFYWNoUHRyKHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxFbGVtZW50VHlwZT4+ICZjb250YWluZXIsIHZvaWQgKEVsZW1lbnRUeXBlOjoqbWVtYmVyX2Z1bmMpKE1lbWJGdW5jQXJncy4uLiksIFBhcmFtQXJncyYmIC4uLmFyZ3MpCnsKCXByaXZfRm9yRWFjaFB0cl9pbXBsX2ZvclNoYXJlZE9yVW5pcXVlUHRyc01lbWJlckZ1bmMoY29udGFpbmVyLCBtZW1iZXJfZnVuYywgc3RkOjpmb3J3YXJkPFBhcmFtQXJncz4oYXJncykuLi4pOwp9CnRlbXBsYXRlPHR5cGVuYW1lIEVsZW1lbnRUeXBlLCB0eXBlbmFtZSAuLi5NZW1iRnVuY0FyZ3MsIHR5cGVuYW1lIC4uLlBhcmFtQXJncz4Kdm9pZCBGb3JFYWNoUHRyKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxFbGVtZW50VHlwZT4+ICZjb250YWluZXIsIHZvaWQgKEVsZW1lbnRUeXBlOjoqbWVtYmVyX2Z1bmMpKE1lbWJGdW5jQXJncy4uLikgY29uc3QsIFBhcmFtQXJncyYmIC4uLmFyZ3MpCnsKCXByaXZfRm9yRWFjaFB0cl9pbXBsX2ZvclNoYXJlZE9yVW5pcXVlUHRyc01lbWJlckZ1bmMoY29udGFpbmVyLCBtZW1iZXJfZnVuYywgc3RkOjpmb3J3YXJkPFBhcmFtQXJncz4oYXJncykuLi4pOwp9CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCi8vT3ZlcmxvYWQgZm9yIHZlY3RvcnMgb2Ygc2hhcmVkX3B0ci4KdGVtcGxhdGU8dHlwZW5hbWUgRWxlbWVudFR5cGUsIHR5cGVuYW1lIC4uLk1lbWJGdW5jQXJncywgdHlwZW5hbWUgLi4uUGFyYW1BcmdzPgp2b2lkIEZvckVhY2hQdHIoc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEVsZW1lbnRUeXBlPj4gJmNvbnRhaW5lciwgdm9pZCAoRWxlbWVudFR5cGU6OiptZW1iZXJfZnVuYykoTWVtYkZ1bmNBcmdzLi4uKSwgUGFyYW1BcmdzJiYgLi4uYXJncykKewoJcHJpdl9Gb3JFYWNoUHRyX2ltcGxfZm9yU2hhcmVkT3JVbmlxdWVQdHJzTWVtYmVyRnVuYyhjb250YWluZXIsIG1lbWJlcl9mdW5jLCBzdGQ6OmZvcndhcmQ8UGFyYW1BcmdzPihhcmdzKS4uLik7Cn0KdGVtcGxhdGU8dHlwZW5hbWUgRWxlbWVudFR5cGUsIHR5cGVuYW1lIC4uLk1lbWJGdW5jQXJncywgdHlwZW5hbWUgLi4uUGFyYW1BcmdzPgp2b2lkIEZvckVhY2hQdHIoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEVsZW1lbnRUeXBlPj4gJmNvbnRhaW5lciwgdm9pZCAoRWxlbWVudFR5cGU6OiptZW1iZXJfZnVuYykoTWVtYkZ1bmNBcmdzLi4uKSBjb25zdCwgUGFyYW1BcmdzJiYgLi4uYXJncykKewoJcHJpdl9Gb3JFYWNoUHRyX2ltcGxfZm9yU2hhcmVkT3JVbmlxdWVQdHJzTWVtYmVyRnVuYyhjb250YWluZXIsIG1lbWJlcl9mdW5jLCBzdGQ6OmZvcndhcmQ8UGFyYW1BcmdzPihhcmdzKS4uLik7Cn0KCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKLy9PdmVybG9hZCBmb3IgdmVjdG9ycyBvZiB3ZWFrX3B0ci4KdGVtcGxhdGU8dHlwZW5hbWUgRWxlbWVudFR5cGUsIHR5cGVuYW1lIC4uLk1lbWJGdW5jQXJncywgdHlwZW5hbWUgLi4uUGFyYW1BcmdzPgp2b2lkIEZvckVhY2hQdHIoc3RkOjp2ZWN0b3I8c3RkOjp3ZWFrX3B0cjxFbGVtZW50VHlwZT4+ICZjb250YWluZXIsIHZvaWQgKEVsZW1lbnRUeXBlOjoqbWVtYmVyX2Z1bmMpKE1lbWJGdW5jQXJncy4uLiksIFBhcmFtQXJncyYmIC4uLmFyZ3MpCnsKCXByaXZfRm9yRWFjaFB0cl9pbXBsX2ZvclNoYXJlZE9yVW5pcXVlUHRyc01lbWJlckZ1bmMoY29udGFpbmVyLCBtZW1iZXJfZnVuYywgc3RkOjpmb3J3YXJkPFBhcmFtQXJncz4oYXJncykuLi4pOwp9CnRlbXBsYXRlPHR5cGVuYW1lIEVsZW1lbnRUeXBlLCB0eXBlbmFtZSAuLi5NZW1iRnVuY0FyZ3MsIHR5cGVuYW1lIC4uLlBhcmFtQXJncz4Kdm9pZCBGb3JFYWNoUHRyKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6d2Vha19wdHI8RWxlbWVudFR5cGU+PiAmY29udGFpbmVyLCB2b2lkIChFbGVtZW50VHlwZTo6Km1lbWJlcl9mdW5jKShNZW1iRnVuY0FyZ3MuLi4pIGNvbnN0LCBQYXJhbUFyZ3MmJiAuLi5hcmdzKQp7Cglwcml2X0ZvckVhY2hQdHJfaW1wbF9mb3JTaGFyZWRPclVuaXF1ZVB0cnNNZW1iZXJGdW5jKGNvbnRhaW5lciwgbWVtYmVyX2Z1bmMsIHN0ZDo6Zm9yd2FyZDxQYXJhbUFyZ3M+KGFyZ3MpLi4uKTsKfQoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojZW5kaWYgLy8gQ09NTU9OX0FMR09SSVRITV9GT1JFQUNIX0g=
prog.cpp:166:22: error: variable or field 'ForEachPtr' declared void
void ForEachPtr(std::vector<std::unique_ptr<ElementType>> &container, void (ElementType::*member_func)(MembFuncArgs...), ParamArgs&& ...args)
^
prog.cpp:166:17: error: 'vector' is not a member of 'std'
void ForEachPtr(std::vector<std::unique_ptr<ElementType>> &container, void (ElementType::*member_func)(MembFuncArgs...), ParamArgs&& ...args)
^
prog.cpp:166:56: error: expected primary-expression before '>' token
void ForEachPtr(std::vector<std::unique_ptr<ElementType>> &container, void (ElementType::*member_func)(MembFuncArgs...), ParamArgs&& ...args)
^
prog.cpp:166:60: error: 'container' was not declared in this scope
void ForEachPtr(std::vector<std::unique_ptr<ElementType>> &container, void (ElementType::*member_func)(MembFuncArgs...), ParamArgs&& ...args)
^
prog.cpp:166:71: error: expected primary-expression before 'void'
void ForEachPtr(std::vector<std::unique_ptr<ElementType>> &container, void (ElementType::*member_func)(MembFuncArgs...), ParamArgs&& ...args)
^
prog.cpp:166:131: error: expected primary-expression before '&&' token
void ForEachPtr(std::vector<std::unique_ptr<ElementType>> &container, void (ElementType::*member_func)(MembFuncArgs...), ParamArgs&& ...args)
^
prog.cpp:166:134: error: expected primary-expression before '...' token
void ForEachPtr(std::vector<std::unique_ptr<ElementType>> &container, void (ElementType::*member_func)(MembFuncArgs...), ParamArgs&& ...args)
^
prog.cpp:171:28: error: 'vector' in namespace 'std' does not name a template type
void ForEachPtr(const std::vector<std::unique_ptr<ElementType>> &container, void (ElementType::*member_func)(MembFuncArgs...) const, ParamArgs&& ...args)
^
prog.cpp:171:34: error: expected ',' or '...' before '<' token
void ForEachPtr(const std::vector<std::unique_ptr<ElementType>> &container, void (ElementType::*member_func)(MembFuncArgs...) const, ParamArgs&& ...args)
^
prog.cpp: In function 'void ForEachPtr(int)':
prog.cpp:173:55: error: 'container' was not declared in this scope
priv_ForEachPtr_impl_forSharedOrUniquePtrsMemberFunc(container, member_func, std::forward<ParamArgs>(args)...);
^
prog.cpp:173:66: error: 'member_func' was not declared in this scope
priv_ForEachPtr_impl_forSharedOrUniquePtrsMemberFunc(container, member_func, std::forward<ParamArgs>(args)...);
^
prog.cpp:173:103: error: 'args' was not declared in this scope
priv_ForEachPtr_impl_forSharedOrUniquePtrsMemberFunc(container, member_func, std::forward<ParamArgs>(args)...);
^
prog.cpp: At global scope:
prog.cpp:180:22: error: variable or field 'ForEachPtr' declared void
void ForEachPtr(std::vector<std::shared_ptr<ElementType>> &container, void (ElementType::*member_func)(MembFuncArgs...), ParamArgs&& ...args)
^
prog.cpp:180:17: error: 'vector' is not a member of 'std'
void ForEachPtr(std::vector<std::shared_ptr<ElementType>> &container, void (ElementType::*member_func)(MembFuncArgs...), ParamArgs&& ...args)
^
prog.cpp:180:56: error: expected primary-expression before '>' token
void ForEachPtr(std::vector<std::shared_ptr<ElementType>> &container, void (ElementType::*member_func)(MembFuncArgs...), ParamArgs&& ...args)
^
prog.cpp:180:60: error: 'container' was not declared in this scope
void ForEachPtr(std::vector<std::shared_ptr<ElementType>> &container, void (ElementType::*member_func)(MembFuncArgs...), ParamArgs&& ...args)
^
prog.cpp:180:71: error: expected primary-expression before 'void'
void ForEachPtr(std::vector<std::shared_ptr<ElementType>> &container, void (ElementType::*member_func)(MembFuncArgs...), ParamArgs&& ...args)
^
prog.cpp:180:131: error: expected primary-expression before '&&' token
void ForEachPtr(std::vector<std::shared_ptr<ElementType>> &container, void (ElementType::*member_func)(MembFuncArgs...), ParamArgs&& ...args)
^
prog.cpp:180:134: error: expected primary-expression before '...' token
void ForEachPtr(std::vector<std::shared_ptr<ElementType>> &container, void (ElementType::*member_func)(MembFuncArgs...), ParamArgs&& ...args)
^
prog.cpp:185:28: error: 'vector' in namespace 'std' does not name a template type
void ForEachPtr(const std::vector<std::shared_ptr<ElementType>> &container, void (ElementType::*member_func)(MembFuncArgs...) const, ParamArgs&& ...args)
^
prog.cpp:185:34: error: expected ',' or '...' before '<' token
void ForEachPtr(const std::vector<std::shared_ptr<ElementType>> &container, void (ElementType::*member_func)(MembFuncArgs...) const, ParamArgs&& ...args)
^
prog.cpp:185:6: error: redefinition of 'template<class ElementType, class ... MembFuncArgs, class ... ParamArgs> void ForEachPtr(int)'
void ForEachPtr(const std::vector<std::shared_ptr<ElementType>> &container, void (ElementType::*member_func)(MembFuncArgs...) const, ParamArgs&& ...args)
^
prog.cpp:171:6: note: 'template<class ElementType, class ... MembFuncArgs, class ... ParamArgs> void ForEachPtr(int)' previously declared here
void ForEachPtr(const std::vector<std::unique_ptr<ElementType>> &container, void (ElementType::*member_func)(MembFuncArgs...) const, ParamArgs&& ...args)
^
prog.cpp:194:22: error: variable or field 'ForEachPtr' declared void
void ForEachPtr(std::vector<std::weak_ptr<ElementType>> &container, void (ElementType::*member_func)(MembFuncArgs...), ParamArgs&& ...args)
^
prog.cpp:194:17: error: 'vector' is not a member of 'std'
void ForEachPtr(std::vector<std::weak_ptr<ElementType>> &container, void (ElementType::*member_func)(MembFuncArgs...), ParamArgs&& ...args)
^
prog.cpp:194:54: error: expected primary-expression before '>' token
void ForEachPtr(std::vector<std::weak_ptr<ElementType>> &container, void (ElementType::*member_func)(MembFuncArgs...), ParamArgs&& ...args)
^
prog.cpp:194:58: error: 'container' was not declared in this scope
void ForEachPtr(std::vector<std::weak_ptr<ElementType>> &container, void (ElementType::*member_func)(MembFuncArgs...), ParamArgs&& ...args)
^
prog.cpp:194:69: error: expected primary-expression before 'void'
void ForEachPtr(std::vector<std::weak_ptr<ElementType>> &container, void (ElementType::*member_func)(MembFuncArgs...), ParamArgs&& ...args)
^
prog.cpp:194:129: error: expected primary-expression before '&&' token
void ForEachPtr(std::vector<std::weak_ptr<ElementType>> &container, void (ElementType::*member_func)(MembFuncArgs...), ParamArgs&& ...args)
^
prog.cpp:194:132: error: expected primary-expression before '...' token
void ForEachPtr(std::vector<std::weak_ptr<ElementType>> &container, void (ElementType::*member_func)(MembFuncArgs...), ParamArgs&& ...args)
^
prog.cpp:199:28: error: 'vector' in namespace 'std' does not name a template type
void ForEachPtr(const std::vector<std::weak_ptr<ElementType>> &container, void (ElementType::*member_func)(MembFuncArgs...) const, ParamArgs&& ...args)
^
prog.cpp:199:34: error: expected ',' or '...' before '<' token
void ForEachPtr(const std::vector<std::weak_ptr<ElementType>> &container, void (ElementType::*member_func)(MembFuncArgs...) const, ParamArgs&& ...args)
^
prog.cpp:199:6: error: redefinition of 'template<class ElementType, class ... MembFuncArgs, class ... ParamArgs> void ForEachPtr(int)'
void ForEachPtr(const std::vector<std::weak_ptr<ElementType>> &container, void (ElementType::*member_func)(MembFuncArgs...) const, ParamArgs&& ...args)
^
prog.cpp:171:6: note: 'template<class ElementType, class ... MembFuncArgs, class ... ParamArgs> void ForEachPtr(int)' previously declared here
void ForEachPtr(const std::vector<std::unique_ptr<ElementType>> &container, void (ElementType::*member_func)(MembFuncArgs...) const, ParamArgs&& ...args)
^