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.
155 lines
4.6 KiB
155 lines
4.6 KiB
// responserules_cli.h
|
|
|
|
#pragma once
|
|
|
|
using namespace System;
|
|
|
|
|
|
#pragma unmanaged
|
|
namespace ResponseRules
|
|
{
|
|
/// forward declare unmanaged implementation
|
|
class CriteriaSet;
|
|
}
|
|
#pragma managed
|
|
|
|
|
|
#include "response_types_marshal.h"
|
|
|
|
namespace ResponseRulesCLI {
|
|
|
|
typedef CCLIUtlDictEnumerable< ResponseRules::Criteria, short, ResponseRulesCLI::Criterion > CriterionDictWrapper_t;
|
|
typedef CCLIUtlDictEnumerable< ResponseRules::ResponseGroup, short, ResponseRulesCLI::ResponseGroup > ResponseGroupDictWrapper_t;
|
|
// enumerations aren't used right now it seems.
|
|
// typedef CCLIUtlDictEnumerable< ResponseRules::CResponseSystem::Enumeration, short, System::Single > EnumerationDictWrapper_t;
|
|
|
|
|
|
|
|
/// Encapsulates an entire response system based on a file,
|
|
/// containing responses, rules, criteria, and other data.
|
|
public ref class ResponseSystemCLI
|
|
{
|
|
public:
|
|
// Allocate the native object on the C++ Heap via a constructor
|
|
ResponseSystemCLI();
|
|
|
|
// Deallocate the native object on a destructor
|
|
~ResponseSystemCLI() ;
|
|
|
|
/// Load this system from a talker file.
|
|
virtual void LoadFromFile( String^ filename );
|
|
int CountRules();
|
|
|
|
property ResponseGroupDictWrapper_t ^ResponseGroupsDict
|
|
{
|
|
ResponseGroupDictWrapper_t ^get() { return m_ResponseGroupsDict; }
|
|
}
|
|
|
|
property CriterionDictWrapper_t ^CriteriaDict
|
|
{
|
|
CriterionDictWrapper_t ^get() { return m_CriteriaDict; }
|
|
}
|
|
|
|
/*
|
|
property EnumerationDictWrapper_t ^EnumerationsDict
|
|
{
|
|
EnumerationDictWrapper_t ^get() { return m_EnumerationsDict; }
|
|
}
|
|
*/
|
|
|
|
/// interface to enumerate rules.
|
|
ref class RulesAsList : public System::Collections::IEnumerable, System::Collections::Specialized::INotifyCollectionChanged
|
|
{
|
|
public:
|
|
|
|
ref struct RulesIterator : System::Collections::IEnumerator
|
|
{
|
|
public:
|
|
RulesIterator( ResponseSystemCLI^ enumerable ) :
|
|
m_System(enumerable), m_bIsBefore(false), m_idx(ResponseRules::ResponseRulePartition::InvalidIdx()) {Reset();};
|
|
virtual void Reset();
|
|
virtual bool MoveNext(); // return false when falling off the end
|
|
|
|
property Object^ Current
|
|
{
|
|
virtual Object^ get();
|
|
};
|
|
|
|
protected:
|
|
bool m_bIsBefore; // is "one before" everything in the array, required by iterator interface
|
|
bool IsValid() ;
|
|
ResponseSystemCLI ^m_System; ///< the system I iterate
|
|
ResponseRules::ResponseRulePartition::tIndex m_idx;
|
|
};
|
|
|
|
RulesAsList( ResponseSystemCLI^ owner ) : m_owner(owner) {};
|
|
|
|
property int Count
|
|
{
|
|
int get() { return m_owner->GetNativePtr()->CountRules(); }
|
|
}
|
|
|
|
virtual System::Collections::IEnumerator^ GetEnumerator()
|
|
{
|
|
return gcnew RulesIterator(m_owner);
|
|
}
|
|
|
|
#pragma region INotifyCollectionChanged interface
|
|
|
|
System::Collections::Specialized::NotifyCollectionChangedEventHandler ^m_CollectionChanged;
|
|
virtual event System::Collections::Specialized::NotifyCollectionChangedEventHandler ^CollectionChanged
|
|
{
|
|
void add(System::Collections::Specialized::NotifyCollectionChangedEventHandler ^ d) {
|
|
m_CollectionChanged += d;
|
|
}
|
|
void remove(System::Collections::Specialized::NotifyCollectionChangedEventHandler ^ d) {
|
|
m_CollectionChanged -= d;
|
|
}
|
|
}
|
|
virtual void OnCollectionChanged(System::Collections::Specialized::NotifyCollectionChangedEventArgs ^e)
|
|
{
|
|
if (m_CollectionChanged != nullptr)
|
|
{
|
|
m_CollectionChanged(this, e);
|
|
}
|
|
}
|
|
#pragma endregion
|
|
|
|
private:
|
|
ResponseSystemCLI^ m_owner;
|
|
};
|
|
|
|
property RulesAsList^ Rules
|
|
{
|
|
RulesAsList^ get() { return m_RulesContainer; };
|
|
}
|
|
|
|
#pragma region "Queries Into Response System"
|
|
|
|
/// Given a dictionary of key:value pairs (the contexts and their values),
|
|
/// find the best matching rule.
|
|
Rule ^FindBestMatchingRule( System::Collections::IDictionary ^facts );
|
|
|
|
/// Find *all* rules that match the given criteria, in sorted order of best to worst.
|
|
array< System::Collections::Generic::KeyValuePair<Rule ^,float> >^ FindAllRulesMatchingCriteria( System::Collections::IDictionary ^facts );
|
|
|
|
#pragma endregion
|
|
|
|
/// please be careful
|
|
ResponseSystemImplementationCLI *GetNativePtr();
|
|
|
|
protected:
|
|
// Deallocate the native object on the finalizer just in case no destructor is called
|
|
!ResponseSystemCLI() ;
|
|
ResponseSystemImplementationCLI *m_pImpl;
|
|
|
|
void TurnIDictIntoCriteriaSet( System::Collections::IDictionary ^facts, ResponseRules::CriteriaSet *critset );
|
|
Rule ^RuleFromIdx( ResponseRules::ResponseRulePartition::tIndex idx );
|
|
|
|
private:
|
|
CriterionDictWrapper_t ^m_CriteriaDict;
|
|
ResponseGroupDictWrapper_t ^m_ResponseGroupsDict;
|
|
// EnumerationDictWrapper_t ^m_EnumerationsDict;
|
|
RulesAsList ^m_RulesContainer;
|
|
};
|
|
}
|