An alternative to UBB.threads
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.
FLocal/Patcher/DB/AbstractConstraint.cs

122 lines
2.9 KiB

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Patcher.DB
{
abstract class AbstractConstraint
{
public interface IVisitor
{
void Visit(ForeignKeyConstraint constraint);
void Visit(UniqueConstraint constraint);
void Visit(CheckConstraint constraint);
}
public interface IVisitor<T>
{
T Visit(ForeignKeyConstraint constraint);
T Visit(UniqueConstraint constraint);
T Visit(CheckConstraint constraint);
}
private class Visitor : IVisitor
{
private Action<ForeignKeyConstraint> foreignKeyAction;
private Action<UniqueConstraint> uniqueAction;
private Action<CheckConstraint> checkAction;
public Visitor(
Action<ForeignKeyConstraint> foreignKeyAction
,Action<UniqueConstraint> uniqueAction
,Action<CheckConstraint> checkAction
)
{
this.foreignKeyAction = foreignKeyAction;
this.uniqueAction = uniqueAction;
this.checkAction = checkAction;
}
void IVisitor.Visit(ForeignKeyConstraint constraint)
{
this.foreignKeyAction(constraint);
}
public void Visit(UniqueConstraint constraint)
{
this.uniqueAction(constraint);
}
public void Visit(CheckConstraint constraint)
{
this.checkAction(constraint);
}
}
private class Visitor<T> : IVisitor<T>
{
private Func<ForeignKeyConstraint, T> foreignKeyAction;
private Func<UniqueConstraint, T> uniqueAction;
private Func<CheckConstraint, T> checkAction;
public Visitor(
Func<ForeignKeyConstraint, T> foreignKeyAction
,Func<UniqueConstraint, T> uniqueAction
,Func<CheckConstraint, T> checkAction
)
{
this.foreignKeyAction = foreignKeyAction;
this.uniqueAction = uniqueAction;
this.checkAction = checkAction;
}
T IVisitor<T>.Visit(ForeignKeyConstraint constraint)
{
return this.foreignKeyAction(constraint);
}
public T Visit(UniqueConstraint constraint)
{
return this.uniqueAction(constraint);
}
public T Visit(CheckConstraint constraint)
{
return this.checkAction(constraint);
}
}
abstract public void Accept(IVisitor visitor);
abstract public T Accept<T>(IVisitor<T> visitor);
public void Accept(
Action<ForeignKeyConstraint> foreignKeyAction
,Action<UniqueConstraint> uniqueAction
,Action<CheckConstraint> checkAction
)
{
this.Accept(new Visitor(foreignKeyAction, uniqueAction, checkAction));
}
public T Accept<T>(
Func<ForeignKeyConstraint, T> foreignKeyFunc
,Func<UniqueConstraint, T> uniqueFunc
,Func<CheckConstraint, T> checkFunc
)
{
return this.Accept(new Visitor<T>(foreignKeyFunc, uniqueFunc, checkFunc));
}
public readonly string table;
public readonly string name;
protected AbstractConstraint(string table, string name)
{
this.table = table;
this.name = name;
}
}
}