/*************************************************************************
* ModernUO *
* Copyright (C) 2019-2021 - ModernUO Development Team *
* Email: hi@modernuo.com *
* File: Timer.DelayCall.cs *
* *
* This program is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation, either version 3 of the License, or *
* (at your option) any later version. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program. If not, see . *
*************************************************************************/
using System;
namespace Server
{
public delegate void TimerCallback();
public delegate void TimerStateCallback(T state);
public delegate void TimerStateCallback(T1 t1, T2 t2);
public delegate void TimerStateCallback(T1 t1, T2 t2, T3 t3);
public delegate void TimerStateCallback(T1 t1, T2 t2, T3 t3, T4 t4);
public partial class Timer
{
private static string FormatDelegate(Delegate callback) =>
callback == null ? "null" : $"{callback.Method.DeclaringType?.FullName ?? ""}.{callback.Method.Name}";
public static Timer DelayCall(TimerCallback callback) => DelayCall(TimeSpan.Zero, TimeSpan.Zero, 1, callback);
public static Timer DelayCall(TimeSpan delay, TimerCallback callback) =>
DelayCall(delay, TimeSpan.Zero, 1, callback);
public static Timer DelayCall(TimeSpan delay, TimeSpan interval, TimerCallback callback) =>
DelayCall(delay, interval, 0, callback);
public static Timer DelayCall(TimeSpan delay, TimeSpan interval, int count, TimerCallback callback)
{
Timer t = new DelayCallTimer(delay, interval, count, callback);
t.Start();
return t;
}
public static Timer DelayCall(TimerStateCallback callback, T state) =>
DelayCall(TimeSpan.Zero, TimeSpan.Zero, 1, callback, state);
public static Timer DelayCall(TimeSpan delay, TimerStateCallback callback, T state) =>
DelayCall(delay, TimeSpan.Zero, 1, callback, state);
public static Timer DelayCall(TimeSpan delay, TimeSpan interval, TimerStateCallback callback, T state) =>
DelayCall(delay, interval, 0, callback, state);
public static Timer DelayCall(
TimeSpan delay, TimeSpan interval, int count, TimerStateCallback callback,
T state
)
{
Timer t = new DelayStateCallTimer(delay, interval, count, callback, state);
t.Start();
return t;
}
public static Timer DelayCall(TimerStateCallback callback, T1 t1, T2 t2) =>
DelayCall(TimeSpan.Zero, TimeSpan.Zero, 1, callback, t1, t2);
public static Timer DelayCall(TimeSpan delay, TimerStateCallback callback, T1 t1, T2 t2) =>
DelayCall(delay, TimeSpan.Zero, 1, callback, t1, t2);
public static Timer DelayCall(
TimeSpan delay, TimeSpan interval, TimerStateCallback callback,
T1 t1, T2 t2
) => DelayCall(delay, interval, 0, callback, t1, t2);
public static Timer DelayCall(
TimeSpan delay, TimeSpan interval, int count, TimerStateCallback callback,
T1 t1, T2 t2
)
{
Timer t = new DelayStateCallTimer(delay, interval, count, callback, t1, t2);
t.Start();
return t;
}
public static Timer DelayCall(TimerStateCallback callback, T1 t1, T2 t2, T3 t3) =>
DelayCall(TimeSpan.Zero, TimeSpan.Zero, 1, callback, t1, t2, t3);
public static Timer DelayCall(
TimeSpan delay, TimerStateCallback callback, T1 t1, T2 t2, T3 t3
) =>
DelayCall(delay, TimeSpan.Zero, 1, callback, t1, t2, t3);
public static Timer DelayCall(
TimeSpan delay, TimeSpan interval, TimerStateCallback callback,
T1 t1, T2 t2, T3 t3
) => DelayCall(delay, interval, 0, callback, t1, t2, t3);
public static Timer DelayCall(
TimeSpan delay, TimeSpan interval, int count,
TimerStateCallback callback, T1 t1, T2 t2, T3 t3
)
{
Timer t = new DelayStateCallTimer(delay, interval, count, callback, t1, t2, t3);
t.Start();
return t;
}
public static Timer DelayCall(
TimerStateCallback callback, T1 t1, T2 t2, T3 t3, T4 t4
) =>
DelayCall(TimeSpan.Zero, TimeSpan.Zero, 1, callback, t1, t2, t3, t4);
public static Timer DelayCall(
TimeSpan delay, TimerStateCallback callback,
T1 t1, T2 t2, T3 t3, T4 t4
) => DelayCall(delay, TimeSpan.Zero, 1, callback, t1, t2, t3, t4);
public static Timer DelayCall(
TimeSpan delay, TimeSpan interval,
TimerStateCallback callback, T1 t1, T2 t2, T3 t3, T4 t4
) =>
DelayCall(delay, interval, 0, callback, t1, t2, t3, t4);
public static Timer DelayCall(
TimeSpan delay, TimeSpan interval, int count,
TimerStateCallback callback, T1 t1, T2 t2, T3 t3, T4 t4
)
{
Timer t = new DelayStateCallTimer(delay, interval, count, callback, t1, t2, t3, t4);
t.Start();
return t;
}
private class DelayCallTimer : Timer
{
public DelayCallTimer(TimeSpan delay, TimeSpan interval, int count, TimerCallback callback) : base(
delay,
interval,
count
)
{
Callback = callback;
}
public TimerCallback Callback { get; }
protected override void OnTick()
{
Callback?.Invoke();
}
public override string ToString() => $"DelayCallTimer[{FormatDelegate(Callback)}]";
}
private class DelayStateCallTimer : Timer
{
private readonly T m_State;
public DelayStateCallTimer(TimeSpan delay, TimeSpan interval, int count, TimerStateCallback callback, T state)
: base(delay, interval, count)
{
Callback = callback;
m_State = state;
}
public TimerStateCallback Callback { get; }
protected override void OnTick()
{
Callback?.Invoke(m_State);
}
public override string ToString() => $"DelayStateCall[{FormatDelegate(Callback)}]";
}
private class DelayStateCallTimer : Timer
{
private readonly T1 m_T1;
private readonly T2 m_T2;
public DelayStateCallTimer(
TimeSpan delay, TimeSpan interval, int count, TimerStateCallback callback,
T1 t1, T2 t2
) : base(delay, interval, count)
{
Callback = callback;
m_T1 = t1;
m_T2 = t2;
}
public TimerStateCallback Callback { get; }
protected override void OnTick()
{
Callback?.Invoke(m_T1, m_T2);
}
public override string ToString() => $"DelayStateCall[{FormatDelegate(Callback)}]";
}
private class DelayStateCallTimer : Timer
{
private readonly T1 m_T1;
private readonly T2 m_T2;
private readonly T3 m_T3;
public DelayStateCallTimer(
TimeSpan delay, TimeSpan interval, int count, TimerStateCallback callback,
T1 t1, T2 t2, T3 t3
) : base(delay, interval, count)
{
Callback = callback;
m_T1 = t1;
m_T2 = t2;
m_T3 = t3;
}
public TimerStateCallback Callback { get; }
protected override void OnTick()
{
Callback?.Invoke(m_T1, m_T2, m_T3);
}
public override string ToString() => $"DelayStateCall[{FormatDelegate(Callback)}]";
}
private class DelayStateCallTimer : Timer
{
private readonly T1 m_T1;
private readonly T2 m_T2;
private readonly T3 m_T3;
private readonly T4 m_T4;
public DelayStateCallTimer(
TimeSpan delay, TimeSpan interval, int count, TimerStateCallback callback,
T1 t1, T2 t2, T3 t3, T4 t4
) : base(delay, interval, count)
{
Callback = callback;
m_T1 = t1;
m_T2 = t2;
m_T3 = t3;
m_T4 = t4;
}
public TimerStateCallback Callback { get; }
protected override void OnTick()
{
Callback?.Invoke(m_T1, m_T2, m_T3, m_T4);
}
public override string ToString() => $"DelayStateCall[{FormatDelegate(Callback)}]";
}
}
}