protected static TBaseStatus[] Convert <TStatus>(TStatus[] statuses) where TStatus : struct { if (statuses == null) { return(null); } var result = new TBaseStatus[statuses.Length]; for (int i = 0; i < statuses.Length; ++i) { result[i] = StatusSystem <TObject> .Convert(statuses[i]); } return(result); }
internal StatusTracker(TObject obj, StatusSystem <TObject> rules) { this.obj = obj; this.rules = rules; if (rules != null) { rules.TrackerCreated = true; } currentActualValues = new DefaultValueDictionary <TBaseStatus, int>(); currentRaw = new Dictionary <InstanceType, DefaultValueDictionary <TBaseStatus, int> >(); statusInstances = new Dictionary <InstanceType, MultiValueDictionary <TBaseStatus, StatusInstance <TObject> > >(); internalFeeds = new Dictionary <InstanceType, Dictionary <TBaseStatus, Dictionary <TBaseStatus, int> > >(); changeStack = new List <DefaultValueDictionary <StatusChange, OnChangedHandler <TObject> > >(); foreach (InstanceType type in Enum.GetValues(typeof(InstanceType))) { currentRaw[type] = new DefaultValueDictionary <TBaseStatus, int>(); statusInstances[type] = new MultiValueDictionary <TBaseStatus, StatusInstance <TObject> >(); internalFeeds[type] = new Dictionary <TBaseStatus, Dictionary <TBaseStatus, int> >(); } }
/// <summary> /// Open "<paramref name="filename"/>" and parse its text as rules. Apply the parsed rules to "<paramref name="rules"/>". /// </summary> public static StatusSystem <TObject> ParseRulesText <TObject>(this StatusSystem <TObject> rules, string filename) { if (!File.Exists(filename)) { throw new FileNotFoundException($"{filename} cannot be found here."); } List <string> text = new List <string>(); using (StreamReader stream = new StreamReader(filename)) { while (true) { string line = stream.ReadLine(); if (line == null) { break; } text.Add(line); } } return(rules.ParseRulesText(text)); }
internal StatusParserInternal(StatusSystem <TObject> rules, List <string> tokens) { this.rules = rules; this.tokens = tokens; extraEnums = rules.extraEnumTypes; if (rules.DefaultValueAggregator == rules.Total) { rulesDefaultAggregator = "total"; } else if (rules.DefaultValueAggregator == rules.Bool) { rulesDefaultAggregator = "bool"; } else if (rules.DefaultValueAggregator == rules.MaximumOrZero) { rulesDefaultAggregator = "max"; } else { rulesDefaultAggregator = null; } parserDefaultAggregator = rulesDefaultAggregator; parserDefaultInstanceLimit = "multiple"; }
internal RuleChecker(StatusSystem <TObject> rules) { visitedRps = new EasyHashSet <List <TStatus> >(new IEnumValueEquality <TStatus>()); // Compare lists with value equality! this.rules = rules; CheckRules(); }
/// <summary> /// Parse "<paramref name="text"/>" as rules. Apply the parsed rules to "<paramref name="rules"/>". /// </summary> public static StatusSystem <TObject> ParseRulesText <TObject>(this StatusSystem <TObject> rules, IEnumerable <string> text) { new StatusParserInternal <TObject>(rules, Tokenize(text)).Parse(); return(rules); }
internal StatusRules(StatusSystem <TObject> rules, TBaseStatus status) : base(rules, status, status) { this.rules = rules; this.status = status; }
protected static TBaseStatus Convert <TStatus>(TStatus status) where TStatus : struct { return(StatusSystem <TObject> .Convert(status)); }