/************************************************************************* * 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)}]"; } } }