Counter Strike : Global Offensive Source Code
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

247 lines
6.1 KiB

// This is the main DLL file.
#include "stdafx.h"
extern int TestRandomNumberGeneration( int bottom, int top ) ;
extern const char *TestFileSystemHook( ) ;
using namespace ResponseRulesCLI;
namespace MikeCTest
{
public ref class Person
{
private:
String^ _name;
public:
Person( String^ name )
{
_name = name;
}
String^ Description()
{
// this is the big test!
int rndNum = TestRandomNumberGeneration( 0, 10 );
String^ foo = gcnew String(TestFileSystemHook());
return ( "My name is " + _name +
" filesystem is " + foo
// " my ID is " + rndNum.ToString()
);
}
static bool HopefullyDontCrash()
{
TestFileSystemHook( );
return true;
}
};
}
#include "response_system.h"
StrToAnsi::StrToAnsi( String ^unicodestr )
{
m_pStr = (char*)(void*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(unicodestr);
}
StrToAnsi::~StrToAnsi( )
{
System::Runtime::InteropServices::Marshal::FreeHGlobal((System::IntPtr)(void*)m_pStr);
}
StrToAnsi::operator TCHAR *() const
{
return m_pStr;
}
/*
using namespace System::Runtime::InteropServices; // for class Marshal
void PrintMessage(System::String^ str)
{
const char* str2 = (char*)(void*)Marshal::StringToHGlobalAnsi(str);
printf(str2);
Marshal::FreeHGlobal((System::IntPtr)(void*)str2);
}
PrintMessage("Method 2");
*/
using namespace ResponseRulesCLI;
// Allocate the native object on the C++ Heap via a constructor
ResponseSystemCLI::ResponseSystemCLI()
{
m_pImpl = new ResponseSystemImplementationCLI();
m_CriteriaDict = gcnew CriterionDictWrapper_t(&m_pImpl->m_Criteria);
m_ResponseGroupsDict = gcnew ResponseGroupDictWrapper_t(&m_pImpl->m_Responses);
m_RulesContainer = gcnew RulesAsList(this);
}
// Deallocate the native object on a destructor
ResponseSystemCLI::~ResponseSystemCLI()
{
this->!ResponseSystemCLI();
}
// Deallocate the native object on the finalizer just in case no destructor is called
ResponseSystemCLI::!ResponseSystemCLI()
{
delete m_pImpl;
}
void ResponseSystemCLI::LoadFromFile( String^ filename )
{
return m_pImpl->LoadFromFile( StrToAnsi(filename) );
}
int ResponseSystemCLI::CountRules()
{
return m_pImpl->CountRules();
}
ResponseSystemImplementationCLI *ResponseSystemCLI::GetNativePtr()
{
return m_pImpl;
}
void ResponseSystemCLI::RulesAsList::RulesIterator::Reset()
{
m_bIsBefore = true;
m_idx = m_System->GetNativePtr()->m_RulePartitions.First();
}
bool ResponseSystemCLI::RulesAsList::RulesIterator::MoveNext()
{
if (m_bIsBefore)
{
m_bIsBefore = false;
m_idx = m_System->GetNativePtr()->m_RulePartitions.First();
return IsValid();
}
else
{
if ( !IsValid() )
{
return false;
}
else
{
// stick the index on the stack temporarily so we can pass a reference to it
ResponseRules::ResponseRulePartition::tIndex tmp = m_idx;
m_idx = m_System->GetNativePtr()->m_RulePartitions.Next(tmp);
return IsValid();
}
}
}
bool ResponseSystemCLI::RulesAsList::RulesIterator::IsValid()
{
// stick the index on the stack temporarily so we can pass a reference to it
ResponseRules::ResponseRulePartition::tIndex tmp = m_idx;
return m_System->GetNativePtr()->m_RulePartitions.IsValid( tmp );
}
Object^ ResponseSystemCLI::RulesAsList::RulesIterator::Current::get()
{
if (IsValid())
{
ResponseRules::ResponseRulePartition::tIndex i = m_idx;
return gcnew Rule(&m_System->GetNativePtr()->m_RulePartitions[i],
i,
m_System->GetNativePtr()->m_RulePartitions.GetElementName(i) );
}
else
{
throw gcnew System::InvalidOperationException();
}
}
/*
/// access to the dictionary of index->criteria
Criterion ^ ResponseSystemCLI::Criteria::get( short key )
{
return gcnew Criterion(&m_pImpl->m_Criteria[key], key);
}
unsigned int ResponseSystemCLI::CriteriaCount::get()
{
return m_pImpl->m_Criteria.Count();
}
*/
Rule ^ ResponseSystemCLI::FindBestMatchingRule( System::Collections::IDictionary ^facts )
{
ResponseRules::CriteriaSet criteria;
TurnIDictIntoCriteriaSet( facts, &criteria );
float bestscore; // of matching rule
ResponseRules::ResponseRulePartition::tIndex bestRuleIndex = m_pImpl->FindBestMatchingRule( criteria, false, bestscore );
if ( m_pImpl->m_RulePartitions.IsValid( bestRuleIndex ) )
{
return RuleFromIdx(bestRuleIndex);
}
else
{
return nullptr;
}
}
Rule ^ResponseSystemCLI::RuleFromIdx( ResponseRules::ResponseRulePartition::tIndex idx )
{
return gcnew Rule( &m_pImpl->m_RulePartitions[idx],
idx,
m_pImpl->m_RulePartitions.GetElementName(idx) );
}
void ResponseSystemCLI::TurnIDictIntoCriteriaSet( System::Collections::IDictionary ^facts, ResponseRules::CriteriaSet *critset )
{
// for each key and value in the dictionary, add to set.
for each ( System::Collections::DictionaryEntry pair in facts )
{
critset->AppendCriteria( StrToAnsi(pair.Key->ToString()), StrToAnsi(pair.Value->ToString()) );
}
}
array< System::Collections::Generic::KeyValuePair<Rule ^,float> >^ ResponseSystemCLI::FindAllRulesMatchingCriteria( System::Collections::IDictionary ^facts )
{
ResponseRules::CriteriaSet crits;
TurnIDictIntoCriteriaSet( facts, &crits );
ResponseSystemImplementationCLI::FindAllRulesRetval_t ruleresults;
m_pImpl->FindAllRulesMatchingCriteria( &ruleresults, crits );
if ( ruleresults.Count() < 1 )
{
// return empty array.
return gcnew array< System::Collections::Generic::KeyValuePair<Rule ^,float> >(0);
}
else
{
const int count = ruleresults.Count();
array< System::Collections::Generic::KeyValuePair<Rule ^,float> >^ retval = gcnew array< System::Collections::Generic::KeyValuePair<Rule ^,float> >(count);
for (int i = 0 ; i < count ; ++i )
{
const ResponseSystemImplementationCLI::RuleAndScorePair_t &pair = ruleresults[i];
retval[i] = System::Collections::Generic::KeyValuePair<Rule ^,float>(RuleFromIdx(pair.ruleidx),pair.score);
/*
retval[i].Key = RuleFromIdx(pair.ruleidx);
retval[i].Value = pair.score;
*/
}
return retval;
}
}
/*
#pragma unmanaged
#include "../../responserules/runtime/response_types_internal.h"
#pragma managed
*/