Update mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng/RelaxngPattern.cs
[mono.git] / mcs / class / Mono.CodeContracts / Mono.CodeContracts.Static.Analysis.ExpressionAnalysis / ExpressionDecoderAdapter.cs
1 using System;
2 using Mono.CodeContracts.Static.AST;
3 using Mono.CodeContracts.Static.AST.Visitors;
4 using Mono.CodeContracts.Static.Analysis.HeapAnalysis;
5 using Mono.CodeContracts.Static.ControlFlow;
6
7 namespace Mono.CodeContracts.Static.Analysis.ExpressionAnalysis {
8         struct ExpressionDecoderAdapter<SymbolicValue, Data, Result, Visitor> 
9                 : IExpressionILVisitor<APC, SymbolicValue, SymbolicValue, Data, Result>
10                 where SymbolicValue : IEquatable<SymbolicValue> 
11                 where Visitor : ISymbolicExpressionVisitor<LabeledSymbol<APC, SymbolicValue>, LabeledSymbol<APC, SymbolicValue>, SymbolicValue, Data, Result> {
12
13                 private readonly Visitor visitor;
14
15                 public ExpressionDecoderAdapter (Visitor visitor)
16                 {
17                         this.visitor = visitor;
18                 }
19
20                 #region Implementation of IExpressionILVisitor<APC,Type,SymbolicValue,SymbolicValue,Data,Result>
21                 public Result Binary (APC pc, BinaryOperator op, SymbolicValue dest, SymbolicValue operand1, SymbolicValue operand2, Data data)
22                 {
23                         return this.visitor.Binary (Unrefine (pc, dest), op, dest, Unrefine (pc, operand1), Unrefine (pc, operand2), data);
24                 }
25
26                 public Result Isinst (APC pc, TypeNode type, SymbolicValue dest, SymbolicValue obj, Data data)
27                 {
28                         return this.visitor.Isinst (Unrefine (pc, dest), type, dest, Unrefine (pc, obj), data);
29                 }
30
31                 public Result LoadNull (APC pc, SymbolicValue dest, Data polarity)
32                 {
33                         return this.visitor.LoadNull (Unrefine (pc, dest), dest, polarity);
34                 }
35
36                 public Result LoadConst (APC pc, TypeNode type, object constant, SymbolicValue dest, Data data)
37                 {
38                         return this.visitor.LoadConst (Unrefine (pc, dest), type, constant, dest, data);
39                 }
40
41                 public Result Sizeof (APC pc, TypeNode type, SymbolicValue dest, Data data)
42                 {
43                         return this.visitor.Sizeof (Unrefine (pc, dest), type, dest, data);
44                 }
45
46                 public Result Unary (APC pc, UnaryOperator op, bool unsigned, SymbolicValue dest, SymbolicValue source, Data data)
47                 {
48                         return this.visitor.Unary (Unrefine (pc, dest), op, unsigned, dest, Unrefine (pc, source), data);
49                 }
50
51                 private LabeledSymbol<APC, SymbolicValue> Unrefine (APC pc, SymbolicValue dest)
52                 {
53                         return new LabeledSymbol<APC, SymbolicValue> (pc, dest);
54                 }
55                 #endregion
56         }
57 }