Skip to content

Commit bbce8e6

Browse files
committed
Added option queue name argument to server fetchRemote
1 parent 346a1ce commit bbce8e6

File tree

6 files changed

+119
-27
lines changed

6 files changed

+119
-27
lines changed

Server/mods/deathmatch/logic/CGame.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,7 @@ void CGame::DoPulse ( void )
418418

419419
CLOCK_SET_SECTION( "CGame::DoPulse" );
420420
CLOCK1( "HTTPDownloadManager" );
421-
g_pNetServer->GetHTTPDownloadManager ( EDownloadMode::CALL_REMOTE )->ProcessQueuedFiles ();
421+
GetRemoteCalls()->ProcessQueuedFiles();
422422
g_pNetServer->GetHTTPDownloadManager ( EDownloadMode::ASE )->ProcessQueuedFiles ();
423423
UNCLOCK1( "HTTPDownloadManager" );
424424

Server/mods/deathmatch/logic/CRemoteCalls.cpp

Lines changed: 63 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,21 +31,21 @@ CRemoteCalls::~CRemoteCalls()
3131
}
3232

3333

34-
void CRemoteCalls::Call ( const char * szServerHost, const char * szResourceName, const char * szFunctionName, CLuaArguments * arguments, CLuaMain * luaMain, const CLuaFunctionRef& iFunction, uint uiConnectionAttempts, uint uiConnectTimeoutMs )
34+
void CRemoteCalls::Call ( const char * szServerHost, const char * szResourceName, const char * szFunctionName, CLuaArguments * arguments, CLuaMain * luaMain, const CLuaFunctionRef& iFunction, const SString& strQueueName, uint uiConnectionAttempts, uint uiConnectTimeoutMs )
3535
{
36-
m_calls.push_back ( new CRemoteCall ( szServerHost, szResourceName, szFunctionName, arguments, luaMain, iFunction, uiConnectionAttempts, uiConnectTimeoutMs ) );
36+
m_calls.push_back ( new CRemoteCall ( szServerHost, szResourceName, szFunctionName, arguments, luaMain, iFunction, strQueueName, uiConnectionAttempts, uiConnectTimeoutMs ) );
3737
m_calls.back ()->MakeCall ();
3838
}
3939

40-
void CRemoteCalls::Call ( const char * szURL, CLuaArguments * arguments, CLuaMain * luaMain, const CLuaFunctionRef& iFunction, uint uiConnectionAttempts, uint uiConnectTimeoutMs )
40+
void CRemoteCalls::Call ( const char * szURL, CLuaArguments * arguments, CLuaMain * luaMain, const CLuaFunctionRef& iFunction, const SString& strQueueName, uint uiConnectionAttempts, uint uiConnectTimeoutMs )
4141
{
42-
m_calls.push_back ( new CRemoteCall ( szURL, arguments, luaMain, iFunction, uiConnectionAttempts, uiConnectTimeoutMs ) );
42+
m_calls.push_back ( new CRemoteCall ( szURL, arguments, luaMain, iFunction, strQueueName, uiConnectionAttempts, uiConnectTimeoutMs ) );
4343
m_calls.back ()->MakeCall ();
4444
}
4545

46-
void CRemoteCalls::Call ( const char * szURL, CLuaArguments * fetchArguments, const SString& strPostData, bool bPostBinary, CLuaMain * luaMain, const CLuaFunctionRef& iFunction, uint uiConnectionAttempts, uint uiConnectTimeoutMs )
46+
void CRemoteCalls::Call ( const char * szURL, CLuaArguments * fetchArguments, const SString& strPostData, bool bPostBinary, CLuaMain * luaMain, const CLuaFunctionRef& iFunction, const SString& strQueueName, uint uiConnectionAttempts, uint uiConnectTimeoutMs )
4747
{
48-
m_calls.push_back ( new CRemoteCall ( szURL, fetchArguments, strPostData, bPostBinary, luaMain, iFunction, uiConnectionAttempts, uiConnectTimeoutMs ) );
48+
m_calls.push_back ( new CRemoteCall ( szURL, fetchArguments, strPostData, bPostBinary, luaMain, iFunction, strQueueName, uiConnectionAttempts, uiConnectTimeoutMs ) );
4949
m_calls.back ()->MakeCall ();
5050
}
5151

@@ -86,9 +86,58 @@ bool CRemoteCalls::CallExists ( CRemoteCall * call )
8686
return false;
8787
}
8888

89+
// Map quene index into download manager id
90+
EDownloadModeType CRemoteCalls::GetDownloadModeFromQueueIndex( uint uiIndex )
91+
{
92+
uiIndex %= ( EDownloadMode::CALL_REMOTE_LAST - EDownloadMode::CALL_REMOTE_FIRST );
93+
uiIndex += EDownloadMode::CALL_REMOTE_FIRST;
94+
return (EDownloadModeType)uiIndex;
95+
}
96+
97+
// Map quene name to download manager id
98+
EDownloadModeType CRemoteCalls::GetDownloadModeForQueueName( const SString& strQueueName )
99+
{
100+
uint* pIndex = MapFind( m_QueueIndexMap, strQueueName );
101+
if ( pIndex )
102+
{
103+
return GetDownloadModeFromQueueIndex( *pIndex );
104+
}
105+
else
106+
{
107+
// Find lowest unused index
108+
uint idx = 0;
109+
while( MapContainsValue( m_QueueIndexMap, idx ) )
110+
{
111+
idx++;
112+
}
113+
// Add new mapping
114+
MapSet( m_QueueIndexMap, strQueueName, idx );
115+
return GetDownloadModeFromQueueIndex( idx );
116+
}
117+
}
118+
119+
120+
void CRemoteCalls::ProcessQueuedFiles( void )
121+
{
122+
for ( auto iter = m_QueueIndexMap.cbegin(); iter != m_QueueIndexMap.cend(); )
123+
{
124+
EDownloadModeType downloadMode = GetDownloadModeFromQueueIndex( iter->second );
125+
if ( g_pNetServer->GetHTTPDownloadManager( downloadMode )->ProcessQueuedFiles() )
126+
{
127+
// Queue empty, so remove name mapping if not default queue
128+
if ( iter->first != CALL_REMOTE_DEFAULT_QUEUE_NAME )
129+
{
130+
iter = m_QueueIndexMap.erase( iter );
131+
continue;
132+
}
133+
}
134+
++iter;
135+
}
136+
}
137+
89138
////////////////////////////////////////////////////////////////////////////////
90139

91-
CRemoteCall::CRemoteCall ( const char * szServerHost, const char * szResourceName, const char * szFunctionName, CLuaArguments * arguments, CLuaMain * luaMain, const CLuaFunctionRef& iFunction, uint uiConnectionAttempts, uint uiConnectTimeoutMs )
140+
CRemoteCall::CRemoteCall ( const char * szServerHost, const char * szResourceName, const char * szFunctionName, CLuaArguments * arguments, CLuaMain * luaMain, const CLuaFunctionRef& iFunction, const SString& strQueueName, uint uiConnectionAttempts, uint uiConnectTimeoutMs )
92141
{
93142
m_VM = luaMain;
94143
m_iFunction = iFunction;
@@ -98,12 +147,13 @@ CRemoteCall::CRemoteCall ( const char * szServerHost, const char * szResourceNam
98147
m_bIsFetch = false;
99148

100149
m_strURL = SString ( "http://%s/%s/call/%s", szServerHost, szResourceName, szFunctionName );
150+
m_strQueueName = strQueueName;
101151
m_uiConnectionAttempts = uiConnectionAttempts;
102152
m_uiConnectTimeoutMs = uiConnectTimeoutMs;
103153
}
104154

105155
//arbitary URL version
106-
CRemoteCall::CRemoteCall ( const char * szURL, CLuaArguments * arguments, CLuaMain * luaMain, const CLuaFunctionRef& iFunction, uint uiConnectionAttempts, uint uiConnectTimeoutMs )
156+
CRemoteCall::CRemoteCall ( const char * szURL, CLuaArguments * arguments, CLuaMain * luaMain, const CLuaFunctionRef& iFunction, const SString& strQueueName, uint uiConnectionAttempts, uint uiConnectTimeoutMs )
107157
{
108158
m_VM = luaMain;
109159
m_iFunction = iFunction;
@@ -113,12 +163,13 @@ CRemoteCall::CRemoteCall ( const char * szURL, CLuaArguments * arguments, CLuaMa
113163
m_bIsFetch = false;
114164

115165
m_strURL = szURL;
166+
m_strQueueName = strQueueName;
116167
m_uiConnectionAttempts = uiConnectionAttempts;
117168
m_uiConnectTimeoutMs = uiConnectTimeoutMs;
118169
}
119170

120171
//Fetch version
121-
CRemoteCall::CRemoteCall ( const char * szURL, CLuaArguments * fetchArguments, const SString& strPostData, bool bPostBinary, CLuaMain * luaMain, const CLuaFunctionRef& iFunction, uint uiConnectionAttempts, uint uiConnectTimeoutMs )
172+
CRemoteCall::CRemoteCall ( const char * szURL, CLuaArguments * fetchArguments, const SString& strPostData, bool bPostBinary, CLuaMain * luaMain, const CLuaFunctionRef& iFunction, const SString& strQueueName, uint uiConnectionAttempts, uint uiConnectTimeoutMs )
122173
: m_FetchArguments ( *fetchArguments )
123174
{
124175
m_VM = luaMain;
@@ -129,6 +180,7 @@ CRemoteCall::CRemoteCall ( const char * szURL, CLuaArguments * fetchArguments, c
129180
m_bIsFetch = true;
130181

131182
m_strURL = szURL;
183+
m_strQueueName = strQueueName;
132184
m_uiConnectionAttempts = uiConnectionAttempts;
133185
m_uiConnectTimeoutMs = uiConnectTimeoutMs;
134186
}
@@ -140,7 +192,8 @@ CRemoteCall::~CRemoteCall ()
140192

141193
void CRemoteCall::MakeCall()
142194
{
143-
CNetHTTPDownloadManagerInterface * downloadManager = g_pNetServer->GetHTTPDownloadManager ( EDownloadMode::CALL_REMOTE );
195+
EDownloadModeType downloadMode = g_pGame->GetRemoteCalls()->GetDownloadModeForQueueName( m_strQueueName );
196+
CNetHTTPDownloadManagerInterface * downloadManager = g_pNetServer->GetHTTPDownloadManager( downloadMode );
144197
downloadManager->QueueFile ( m_strURL, NULL, 0, m_strData.c_str (), m_strData.length (), m_bPostBinary, this, DownloadFinishedCallback, false, m_uiConnectionAttempts, m_uiConnectTimeoutMs );
145198
}
146199

Server/mods/deathmatch/logic/CRemoteCalls.h

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
#ifndef __CREMOTECALLS_H
1414
#define __CREMOTECALLS_H
1515
#include "lua/CLuaArguments.h"
16+
#define CALL_REMOTE_DEFAULT_QUEUE_NAME "default"
17+
1618
/*
1719
This represents a single live remote call. Calls are live until the call returns
1820
i.e. the http client has downloaded all the data returned
@@ -26,14 +28,15 @@ class CRemoteCall
2628
class CLuaMain * m_VM;
2729
CLuaFunctionRef m_iFunction;
2830
SString m_strURL;
31+
SString m_strQueueName;
2932
uint m_uiConnectionAttempts;
3033
uint m_uiConnectTimeoutMs;
3134
CLuaArguments m_FetchArguments;
3235

3336
public:
34-
CRemoteCall ( const char * szServerHost, const char * szResourceName, const char * szFunctionName, CLuaArguments * arguments, CLuaMain * luaMain, const CLuaFunctionRef& iFunction, uint uiConnectionAttempts, uint uiConnectTimeoutMs );
35-
CRemoteCall ( const char * szURL, CLuaArguments * arguments, CLuaMain * luaMain, const CLuaFunctionRef& iFunction, uint uiConnectionAttempts, uint uiConnectTimeoutMs );
36-
CRemoteCall ( const char * szURL, CLuaArguments * fetchArguments, const SString& strPostData, bool bPostBinary, CLuaMain * luaMain, const CLuaFunctionRef& iFunction, uint uiConnectionAttempts, uint uiConnectTimeoutMs );
37+
CRemoteCall ( const char * szServerHost, const char * szResourceName, const char * szFunctionName, CLuaArguments * arguments, CLuaMain * luaMain, const CLuaFunctionRef& iFunction, const SString& strQueueName, uint uiConnectionAttempts, uint uiConnectTimeoutMs );
38+
CRemoteCall ( const char * szURL, CLuaArguments * arguments, CLuaMain * luaMain, const CLuaFunctionRef& iFunction, const SString& strQueueName, uint uiConnectionAttempts, uint uiConnectTimeoutMs );
39+
CRemoteCall ( const char * szURL, CLuaArguments * fetchArguments, const SString& strPostData, bool bPostBinary, CLuaMain * luaMain, const CLuaFunctionRef& iFunction, const SString& strQueueName, uint uiConnectionAttempts, uint uiConnectTimeoutMs );
3740
~CRemoteCall ();
3841
void MakeCall();
3942
static void DownloadFinishedCallback( char * data, size_t dataLength, void * obj, bool bSuccess, int iErrorCode );
@@ -51,15 +54,19 @@ class CRemoteCalls
5154
{
5255
private:
5356
list<CRemoteCall*> m_calls;
57+
std::map<SString,uint> m_QueueIndexMap;
5458
public:
5559
CRemoteCalls();
5660
~CRemoteCalls();
5761

58-
void Call ( const char * szServerHost, const char * szResourceName, const char * szFunctionName, CLuaArguments * arguments, CLuaMain * luaMain, const CLuaFunctionRef& iFunction, uint uiConnectionAttempts, uint uiConnectTimeoutMs );
59-
void Call ( const char * szURL, CLuaArguments * arguments, CLuaMain * luaMain, const CLuaFunctionRef& iFunction, uint uiConnectionAttempts, uint uiConnectTimeoutMs );
60-
void Call ( const char * szURL, CLuaArguments * fetchArguments, const SString& strPostData, bool bPostBinary, CLuaMain * luaMain, const CLuaFunctionRef& iFunction, uint uiConnectionAttempts, uint uiConnectTimeoutMs );
62+
void Call ( const char * szServerHost, const char * szResourceName, const char * szFunctionName, CLuaArguments * arguments, CLuaMain * luaMain, const CLuaFunctionRef& iFunction, const SString& strQueueName, uint uiConnectionAttempts, uint uiConnectTimeoutMs );
63+
void Call ( const char * szURL, CLuaArguments * arguments, CLuaMain * luaMain, const CLuaFunctionRef& iFunction, const SString& strQueueName, uint uiConnectionAttempts, uint uiConnectTimeoutMs );
64+
void Call ( const char * szURL, CLuaArguments * fetchArguments, const SString& strPostData, bool bPostBinary, CLuaMain * luaMain, const CLuaFunctionRef& iFunction, const SString& strQueueName, uint uiConnectionAttempts, uint uiConnectTimeoutMs );
6165
void Remove ( CLuaMain * luaMain );
6266
void Remove ( CRemoteCall * call );
6367
bool CallExists ( CRemoteCall * call );
68+
void ProcessQueuedFiles ( void );
69+
EDownloadModeType GetDownloadModeForQueueName( const SString& strQueueName );
70+
EDownloadModeType GetDownloadModeFromQueueIndex( uint uiIndex );
6471
};
6572
#endif

Server/mods/deathmatch/logic/lua/CLuaFunctionDefs.Server.cpp

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
*****************************************************************************/
2222

2323
#include "StdInc.h"
24+
#define MIN_SERVER_REQ_CALLREMOTE_QUEUE_NAME "1.5.3-9.11269"
2425
#define MIN_SERVER_REQ_CALLREMOTE_CONNECTION_ATTEMPTS "1.3.0-9.04563"
2526
#define MIN_SERVER_REQ_CALLREMOTE_CONNECT_TIMEOUT "1.3.5"
2627

@@ -532,10 +533,13 @@ int CLuaFunctionDefs::CallRemote ( lua_State* luaVM )
532533
if ( !argStream.NextIsFunction ( 1 ) && !argStream.NextIsFunction ( 2 ) )
533534
{
534535
// Call type 1
535-
// bool callRemote ( string host [, int connectionAttempts = 10, int connectTimeout = 10000 ], string resourceName, string functionName, callback callbackFunction, [ arguments... ] )
536-
SString strHost; uint uiConnectionAttempts; uint uiConnectTimeoutMs; SString strResourceName; SString strFunctionName; CLuaFunctionRef iLuaFunction; CLuaArguments args;
536+
// bool callRemote ( string host [, string queueName ][, int connectionAttempts = 10, int connectTimeout = 10000 ], string resourceName, string functionName, callback callbackFunction, [ arguments... ] )
537+
SString strHost; SString strQueueName; uint uiConnectionAttempts; uint uiConnectTimeoutMs; SString strResourceName; SString strFunctionName; CLuaFunctionRef iLuaFunction; CLuaArguments args;
537538

538539
argStream.ReadString ( strHost );
540+
if ( argStream.NextIsString () )
541+
MinServerReqCheck ( argStream, MIN_SERVER_REQ_CALLREMOTE_QUEUE_NAME, "'queue name' is being used" );
542+
argStream.ReadIfNextIsString ( strQueueName, CALL_REMOTE_DEFAULT_QUEUE_NAME );
539543
if ( argStream.NextIsNumber () )
540544
MinServerReqCheck ( argStream, MIN_SERVER_REQ_CALLREMOTE_CONNECTION_ATTEMPTS, "'connection attempts' is being used" );
541545
argStream.ReadIfNextIsNumber ( uiConnectionAttempts, 10 );
@@ -553,7 +557,7 @@ int CLuaFunctionDefs::CallRemote ( lua_State* luaVM )
553557
CLuaMain * luaMain = m_pLuaManager->GetVirtualMachine ( luaVM );
554558
if ( luaMain )
555559
{
556-
g_pGame->GetRemoteCalls ()->Call ( strHost, strResourceName, strFunctionName, &args, luaMain, iLuaFunction, uiConnectionAttempts, uiConnectTimeoutMs );
560+
g_pGame->GetRemoteCalls ()->Call ( strHost, strResourceName, strFunctionName, &args, luaMain, iLuaFunction, strQueueName, uiConnectionAttempts, uiConnectTimeoutMs );
557561
lua_pushboolean ( luaVM, true );
558562
return 1;
559563
}
@@ -562,10 +566,13 @@ int CLuaFunctionDefs::CallRemote ( lua_State* luaVM )
562566
else
563567
{
564568
// Call type 2
565-
// bool callRemote ( string URL [, int connectionAttempts = 10, int connectTimeout = 10000 ], callback callbackFunction, [ arguments... ] )
566-
SString strURL; uint uiConnectionAttempts; uint uiConnectTimeoutMs; CLuaFunctionRef iLuaFunction; CLuaArguments args;
569+
// bool callRemote ( string URL [, string queueName ][, int connectionAttempts = 10, int connectTimeout = 10000 ], callback callbackFunction, [ arguments... ] )
570+
SString strURL; SString strQueueName; uint uiConnectionAttempts; uint uiConnectTimeoutMs; CLuaFunctionRef iLuaFunction; CLuaArguments args;
567571

568572
argStream.ReadString ( strURL );
573+
if ( argStream.NextIsString () )
574+
MinServerReqCheck ( argStream, MIN_SERVER_REQ_CALLREMOTE_QUEUE_NAME, "'queue name' is being used" );
575+
argStream.ReadIfNextIsString ( strQueueName, CALL_REMOTE_DEFAULT_QUEUE_NAME );
569576
if ( argStream.NextIsNumber () )
570577
MinServerReqCheck ( argStream, MIN_SERVER_REQ_CALLREMOTE_CONNECTION_ATTEMPTS, "'connection attempts' is being used" );
571578
argStream.ReadIfNextIsNumber ( uiConnectionAttempts, 10 );
@@ -581,7 +588,7 @@ int CLuaFunctionDefs::CallRemote ( lua_State* luaVM )
581588
CLuaMain * luaMain = m_pLuaManager->GetVirtualMachine ( luaVM );
582589
if ( luaMain )
583590
{
584-
g_pGame->GetRemoteCalls ()->Call ( strURL, &args, luaMain, iLuaFunction, uiConnectionAttempts, uiConnectTimeoutMs );
591+
g_pGame->GetRemoteCalls ()->Call ( strURL, &args, luaMain, iLuaFunction, strQueueName, uiConnectionAttempts, uiConnectTimeoutMs );
585592
lua_pushboolean ( luaVM, true );
586593
return 1;
587594
}
@@ -599,11 +606,14 @@ int CLuaFunctionDefs::CallRemote ( lua_State* luaVM )
599606
// Call a function on a remote server
600607
int CLuaFunctionDefs::FetchRemote ( lua_State* luaVM )
601608
{
602-
// bool fetchRemote ( string URL [, int connectionAttempts = 10, int connectTimeout = 10000 ], callback callbackFunction, [ string postData, bool bPostBinary, arguments... ] )
609+
// bool fetchRemote ( string URL [, string queueName ][, int connectionAttempts = 10, int connectTimeout = 10000 ], callback callbackFunction, [ string postData, bool bPostBinary, arguments... ] )
603610
CScriptArgReader argStream ( luaVM );
604-
SString strURL; CLuaFunctionRef iLuaFunction; SString strPostData; bool bPostBinary; CLuaArguments args; uint uiConnectionAttempts; uint uiConnectTimeoutMs;
611+
SString strURL; SString strQueueName; CLuaFunctionRef iLuaFunction; SString strPostData; bool bPostBinary; CLuaArguments args; uint uiConnectionAttempts; uint uiConnectTimeoutMs;
605612

606613
argStream.ReadString ( strURL );
614+
if ( argStream.NextIsString () )
615+
MinServerReqCheck ( argStream, MIN_SERVER_REQ_CALLREMOTE_QUEUE_NAME, "'queue name' is being used" );
616+
argStream.ReadIfNextIsString ( strQueueName, CALL_REMOTE_DEFAULT_QUEUE_NAME );
607617
if ( argStream.NextIsNumber () )
608618
MinServerReqCheck ( argStream, MIN_SERVER_REQ_CALLREMOTE_CONNECTION_ATTEMPTS, "'connection attempts' is being used" );
609619
argStream.ReadIfNextIsNumber ( uiConnectionAttempts, 10 );
@@ -621,7 +631,7 @@ int CLuaFunctionDefs::FetchRemote ( lua_State* luaVM )
621631
CLuaMain * luaMain = m_pLuaManager->GetVirtualMachine ( luaVM );
622632
if ( luaMain )
623633
{
624-
g_pGame->GetRemoteCalls ()->Call ( strURL, &args, strPostData, bPostBinary, luaMain, iLuaFunction, uiConnectionAttempts, uiConnectTimeoutMs );
634+
g_pGame->GetRemoteCalls ()->Call ( strURL, &args, strPostData, bPostBinary, luaMain, iLuaFunction, strQueueName, uiConnectionAttempts, uiConnectTimeoutMs );
625635
lua_pushboolean ( luaVM, true );
626636
return 1;
627637
}

Server/sdk/net/CNetServer.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,9 @@ namespace EDownloadMode
2222
enum EDownloadModeType
2323
{
2424
NONE,
25-
CALL_REMOTE,
2625
ASE,
26+
CALL_REMOTE_FIRST,
27+
CALL_REMOTE_LAST = CALL_REMOTE_FIRST + 100,
2728
};
2829
}
2930
using EDownloadMode::EDownloadModeType;

Shared/sdk/SharedUtil.Map.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,27 @@ namespace SharedUtil
121121
return uiCount;
122122
}
123123

124+
// Find key in const collection
125+
template < class T, class V, class TR, class V2 >
126+
const T* MapFindByValue( const std::map < T, V, TR >& collection, const V2& value )
127+
{
128+
typename std::map < T, V, TR > ::const_iterator it = collection.begin();
129+
for ( ; it != collection.end () ; ++it )
130+
{
131+
if ( it->second == value )
132+
{
133+
return &it->first;
134+
}
135+
}
136+
return nullptr;
137+
}
138+
139+
// Returns true if the value is in the collection
140+
template < class T, class V, class TR, class V2 >
141+
bool MapContainsValue( const std::map < T, V, TR >& collection, const V2& value )
142+
{
143+
return MapFindByValue( collection, value ) != nullptr;
144+
}
124145

125146
////////////////////////////////////////////////////////////////////////////
126147
//

0 commit comments

Comments
 (0)