aboutsummaryrefslogtreecommitdiff
path: root/src/server/shared/Utilities
diff options
context:
space:
mode:
authorStormBytePP <stormbyte@gmail.com>2015-08-15 02:19:10 +0200
committerStormBytePP <stormbyte@gmail.com>2015-08-16 21:23:15 +0200
commit1f66d719f2cbbcb144b5080c89dd73fcae261798 (patch)
tree6a3778749b629c92de95cef7eb3d1d8c2630bdc4 /src/server/shared/Utilities
parent222eaccc51b8d358c7b60d8def40d6461244ed31 (diff)
Core/BuildSystem: Merge collision, debugging, threading, utilities and configuration into "common" which does not depend on shared anymore and moved database out of shared library
These changes enables to build tools only without even having MySQL installed
Diffstat (limited to 'src/server/shared/Utilities')
-rw-r--r--src/server/shared/Utilities/ByteConverter.h68
-rw-r--r--src/server/shared/Utilities/Duration.h39
-rw-r--r--src/server/shared/Utilities/EventMap.cpp136
-rw-r--r--src/server/shared/Utilities/EventMap.h342
-rw-r--r--src/server/shared/Utilities/EventProcessor.cpp99
-rw-r--r--src/server/shared/Utilities/EventProcessor.h73
-rw-r--r--src/server/shared/Utilities/ServiceWin32.cpp264
-rw-r--r--src/server/shared/Utilities/ServiceWin32.h29
-rw-r--r--src/server/shared/Utilities/StringFormat.h46
-rw-r--r--src/server/shared/Utilities/TaskScheduler.cpp229
-rw-r--r--src/server/shared/Utilities/TaskScheduler.h650
-rw-r--r--src/server/shared/Utilities/Timer.h203
-rw-r--r--src/server/shared/Utilities/Util.cpp562
-rw-r--r--src/server/shared/Utilities/Util.h545
14 files changed, 0 insertions, 3285 deletions
diff --git a/src/server/shared/Utilities/ByteConverter.h b/src/server/shared/Utilities/ByteConverter.h
deleted file mode 100644
index a077de3eb0b..00000000000
--- a/src/server/shared/Utilities/ByteConverter.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
- *
- * 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 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef TRINITY_BYTECONVERTER_H
-#define TRINITY_BYTECONVERTER_H
-
-/** ByteConverter reverse your byte order. This is use
- for cross platform where they have different endians.
- */
-
-#include "Define.h"
-#include <algorithm>
-
-namespace ByteConverter
-{
- template<size_t T>
- inline void convert(char *val)
- {
- std::swap(*val, *(val + T - 1));
- convert<T - 2>(val + 1);
- }
-
- template<> inline void convert<0>(char *) { }
- template<> inline void convert<1>(char *) { } // ignore central byte
-
- template<typename T> inline void apply(T *val)
- {
- convert<sizeof(T)>((char *)(val));
- }
-}
-
-#if TRINITY_ENDIAN == TRINITY_BIGENDIAN
-template<typename T> inline void EndianConvert(T& val) { ByteConverter::apply<T>(&val); }
-template<typename T> inline void EndianConvertReverse(T&) { }
-template<typename T> inline void EndianConvertPtr(void* val) { ByteConverter::apply<T>(val); }
-template<typename T> inline void EndianConvertPtrReverse(void*) { }
-#else
-template<typename T> inline void EndianConvert(T&) { }
-template<typename T> inline void EndianConvertReverse(T& val) { ByteConverter::apply<T>(&val); }
-template<typename T> inline void EndianConvertPtr(void*) { }
-template<typename T> inline void EndianConvertPtrReverse(void* val) { ByteConverter::apply<T>(val); }
-#endif
-
-template<typename T> void EndianConvert(T*); // will generate link error
-template<typename T> void EndianConvertReverse(T*); // will generate link error
-
-inline void EndianConvert(uint8&) { }
-inline void EndianConvert( int8&) { }
-inline void EndianConvertReverse(uint8&) { }
-inline void EndianConvertReverse( int8&) { }
-
-#endif
-
diff --git a/src/server/shared/Utilities/Duration.h b/src/server/shared/Utilities/Duration.h
deleted file mode 100644
index 58a08e5842f..00000000000
--- a/src/server/shared/Utilities/Duration.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * 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 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef _DURATION_H_
-#define _DURATION_H_
-
-#include <chrono>
-
-/// Milliseconds shorthand typedef.
-typedef std::chrono::milliseconds Milliseconds;
-
-/// Seconds shorthand typedef.
-typedef std::chrono::seconds Seconds;
-
-/// Minutes shorthand typedef.
-typedef std::chrono::minutes Minutes;
-
-/// Hours shorthand typedef.
-typedef std::chrono::hours Hours;
-
-/// Makes std::chrono_literals globally available.
-// ToDo: Enable this when TC supports C++14.
-// using namespace std::chrono_literals;
-
-#endif // _DURATION_H_
diff --git a/src/server/shared/Utilities/EventMap.cpp b/src/server/shared/Utilities/EventMap.cpp
deleted file mode 100644
index 8c3f60afe82..00000000000
--- a/src/server/shared/Utilities/EventMap.cpp
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * 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 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "EventMap.h"
-
-void EventMap::Reset()
-{
- _eventMap.clear();
- _time = 0;
- _phase = 0;
-}
-
-void EventMap::SetPhase(uint8 phase)
-{
- if (!phase)
- _phase = 0;
- else if (phase <= 8)
- _phase = uint8(1 << (phase - 1));
-}
-
-void EventMap::ScheduleEvent(uint32 eventId, uint32 time, uint32 group /*= 0*/, uint8 phase /*= 0*/)
-{
- if (group && group <= 8)
- eventId |= (1 << (group + 15));
-
- if (phase && phase <= 8)
- eventId |= (1 << (phase + 23));
-
- _eventMap.insert(EventStore::value_type(_time + time, eventId));
-}
-
-uint32 EventMap::ExecuteEvent()
-{
- while (!Empty())
- {
- EventStore::iterator itr = _eventMap.begin();
-
- if (itr->first > _time)
- return 0;
- else if (_phase && (itr->second & 0xFF000000) && !((itr->second >> 24) & _phase))
- _eventMap.erase(itr);
- else
- {
- uint32 eventId = (itr->second & 0x0000FFFF);
- _lastEvent = itr->second; // include phase/group
- _eventMap.erase(itr);
- return eventId;
- }
- }
-
- return 0;
-}
-
-void EventMap::DelayEvents(uint32 delay, uint32 group)
-{
- if (!group || group > 8 || Empty())
- return;
-
- EventStore delayed;
-
- for (EventStore::iterator itr = _eventMap.begin(); itr != _eventMap.end();)
- {
- if (itr->second & (1 << (group + 15)))
- {
- delayed.insert(EventStore::value_type(itr->first + delay, itr->second));
- _eventMap.erase(itr++);
- }
- else
- ++itr;
- }
-
- _eventMap.insert(delayed.begin(), delayed.end());
-}
-
-void EventMap::CancelEvent(uint32 eventId)
-{
- if (Empty())
- return;
-
- for (EventStore::iterator itr = _eventMap.begin(); itr != _eventMap.end();)
- {
- if (eventId == (itr->second & 0x0000FFFF))
- _eventMap.erase(itr++);
- else
- ++itr;
- }
-}
-
-void EventMap::CancelEventGroup(uint32 group)
-{
- if (!group || group > 8 || Empty())
- return;
-
- for (EventStore::iterator itr = _eventMap.begin(); itr != _eventMap.end();)
- {
- if (itr->second & (1 << (group + 15)))
- _eventMap.erase(itr++);
- else
- ++itr;
- }
-}
-
-uint32 EventMap::GetNextEventTime(uint32 eventId) const
-{
- if (Empty())
- return 0;
-
- for (EventStore::const_iterator itr = _eventMap.begin(); itr != _eventMap.end(); ++itr)
- if (eventId == (itr->second & 0x0000FFFF))
- return itr->first;
-
- return 0;
-}
-
-uint32 EventMap::GetTimeUntilEvent(uint32 eventId) const
-{
- for (EventStore::const_iterator itr = _eventMap.begin(); itr != _eventMap.end(); ++itr)
- if (eventId == (itr->second & 0x0000FFFF))
- return itr->first - _time;
-
- return std::numeric_limits<uint32>::max();
-}
diff --git a/src/server/shared/Utilities/EventMap.h b/src/server/shared/Utilities/EventMap.h
deleted file mode 100644
index 021dffc4940..00000000000
--- a/src/server/shared/Utilities/EventMap.h
+++ /dev/null
@@ -1,342 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * 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 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef _EVENT_MAP_H_
-#define _EVENT_MAP_H_
-
-#include "Common.h"
-#include "Duration.h"
-#include "Util.h"
-
-class EventMap
-{
- /**
- * Internal storage type.
- * Key: Time as uint32 when the event should occur.
- * Value: The event data as uint32.
- *
- * Structure of event data:
- * - Bit 0 - 15: Event Id.
- * - Bit 16 - 23: Group
- * - Bit 24 - 31: Phase
- * - Pattern: 0xPPGGEEEE
- */
- typedef std::multimap<uint32, uint32> EventStore;
-
-public:
- EventMap() : _time(0), _phase(0), _lastEvent(0) { }
-
- /**
- * @name Reset
- * @brief Removes all scheduled events and resets time and phase.
- */
- void Reset();
-
- /**
- * @name Update
- * @brief Updates the timer of the event map.
- * @param time Value in ms to be added to time.
- */
- void Update(uint32 time)
- {
- _time += time;
- }
-
- /**
- * @name GetTimer
- * @return Current timer in ms value.
- */
- uint32 GetTimer() const
- {
- return _time;
- }
-
- /**
- * @name GetPhaseMask
- * @return Active phases as mask.
- */
- uint8 GetPhaseMask() const
- {
- return _phase;
- }
-
- /**
- * @name Empty
- * @return True, if there are no events scheduled.
- */
- bool Empty() const
- {
- return _eventMap.empty();
- }
-
- /**
- * @name SetPhase
- * @brief Sets the phase of the map (absolute).
- * @param phase Phase which should be set. Values: 1 - 8. 0 resets phase.
- */
- void SetPhase(uint8 phase);
-
- /**
- * @name AddPhase
- * @brief Activates the given phase (bitwise).
- * @param phase Phase which should be activated. Values: 1 - 8
- */
- void AddPhase(uint8 phase)
- {
- if (phase && phase <= 8)
- _phase |= uint8(1 << (phase - 1));
- }
-
- /**
- * @name RemovePhase
- * @brief Deactivates the given phase (bitwise).
- * @param phase Phase which should be deactivated. Values: 1 - 8.
- */
- void RemovePhase(uint8 phase)
- {
- if (phase && phase <= 8)
- _phase &= uint8(~(1 << (phase - 1)));
- }
-
- /**
- * @name ScheduleEvent
- * @brief Creates new event entry in map.
- * @param eventId The id of the new event.
- * @param time The time in milliseconds as std::chrono::duration until the event occurs.
- * @param group The group which the event is associated to. Has to be between 1 and 8. 0 means it has no group.
- * @param phase The phase in which the event can occur. Has to be between 1 and 8. 0 means it can occur in all phases.
- */
- void ScheduleEvent(uint32 eventId, Milliseconds const& time, uint32 group = 0, uint8 phase = 0)
- {
- ScheduleEvent(eventId, time.count(), group, phase);
- }
-
- /**
- * @name ScheduleEvent
- * @brief Creates new event entry in map.
- * @param eventId The id of the new event.
- * @param time The time in milliseconds until the event occurs.
- * @param group The group which the event is associated to. Has to be between 1 and 8. 0 means it has no group.
- * @param phase The phase in which the event can occur. Has to be between 1 and 8. 0 means it can occur in all phases.
- */
- void ScheduleEvent(uint32 eventId, uint32 time, uint32 group = 0, uint8 phase = 0);
-
- /**
- * @name RescheduleEvent
- * @brief Cancels the given event and reschedules it.
- * @param eventId The id of the event.
- * @param time The time in milliseconds as std::chrono::duration until the event occurs.
- * @param group The group which the event is associated to. Has to be between 1 and 8. 0 means it has no group.
- * @param phase The phase in which the event can occur. Has to be between 1 and 8. 0 means it can occur in all phases.
- */
- void RescheduleEvent(uint32 eventId, Milliseconds const& time, uint32 group = 0, uint8 phase = 0)
- {
- RescheduleEvent(eventId, time.count(), group, phase);
- }
-
- /**
- * @name RescheduleEvent
- * @brief Cancels the given event and reschedules it.
- * @param eventId The id of the event.
- * @param time The time in milliseconds until the event occurs.
- * @param group The group which the event is associated to. Has to be between 1 and 8. 0 means it has no group.
- * @param phase The phase in which the event can occur. Has to be between 1 and 8. 0 means it can occur in all phases.
- */
- void RescheduleEvent(uint32 eventId, uint32 time, uint32 group = 0, uint8 phase = 0)
- {
- CancelEvent(eventId);
- ScheduleEvent(eventId, time, group, phase);
- }
-
- /**
- * @name RepeatEvent
- * @brief Repeats the mostly recently executed event.
- * @param time Time until in milliseconds as std::chrono::duration the event occurs.
- */
- void Repeat(Milliseconds const& time)
- {
- Repeat(time.count());
- }
-
- /**
- * @name RepeatEvent
- * @brief Repeats the mostly recently executed event.
- * @param time Time until the event occurs.
- */
- void Repeat(uint32 time)
- {
- _eventMap.insert(EventStore::value_type(_time + time, _lastEvent));
- }
-
- /**
- * @name RepeatEvent
- * @brief Repeats the mostly recently executed event.
- * @param minTime Minimum time as std::chrono::duration until the event occurs.
- * @param maxTime Maximum time as std::chrono::duration until the event occurs.
- */
- void Repeat(Milliseconds const& minTime, Milliseconds const& maxTime)
- {
- Repeat(minTime.count(), maxTime.count());
- }
-
- /**
- * @name RepeatEvent
- * @brief Repeats the mostly recently executed event, Equivalent to Repeat(urand(minTime, maxTime).
- * @param minTime Minimum time until the event occurs.
- * @param maxTime Maximum time until the event occurs.
- */
- void Repeat(uint32 minTime, uint32 maxTime)
- {
- Repeat(urand(minTime, maxTime));
- }
-
- /**
- * @name ExecuteEvent
- * @brief Returns the next event to execute and removes it from map.
- * @return Id of the event to execute.
- */
- uint32 ExecuteEvent();
-
- /**
- * @name DelayEvents
- * @brief Delays all events in the map. If delay is greater than or equal internal timer, delay will be 0.
- * @param delay Amount of delay in ms as std::chrono::duration.
- */
- void DelayEvents(Milliseconds const& delay)
- {
- DelayEvents(delay.count());
- }
-
- /**
- * @name DelayEvents
- * @brief Delays all events in the map. If delay is greater than or equal internal timer, delay will be 0.
- * @param delay Amount of delay.
- */
- void DelayEvents(uint32 delay)
- {
- _time = delay < _time ? _time - delay : 0;
- }
-
- /**
- * @name DelayEvents
- * @brief Delay all events of the same group.
- * @param delay Amount of delay in ms as std::chrono::duration.
- * @param group Group of the events.
- */
- void DelayEvents(Milliseconds const& delay, uint32 group)
- {
- DelayEvents(delay.count(), group);
- }
-
- /**
- * @name DelayEvents
- * @brief Delay all events of the same group.
- * @param delay Amount of delay.
- * @param group Group of the events.
- */
- void DelayEvents(uint32 delay, uint32 group);
-
- /**
- * @name CancelEvent
- * @brief Cancels all events of the specified id.
- * @param eventId Event id to cancel.
- */
- void CancelEvent(uint32 eventId);
-
- /**
- * @name CancelEventGroup
- * @brief Cancel events belonging to specified group.
- * @param group Group to cancel.
- */
- void CancelEventGroup(uint32 group);
-
- /**
- * @name GetNextEventTime
- * @brief Returns closest occurence of specified event.
- * @param eventId Wanted event id.
- * @return Time of found event.
- */
- uint32 GetNextEventTime(uint32 eventId) const;
-
- /**
- * @name GetNextEventTime
- * @return Time of next event.
- */
- uint32 GetNextEventTime() const
- {
- return Empty() ? 0 : _eventMap.begin()->first;
- }
-
- /**
- * @name IsInPhase
- * @brief Returns whether event map is in specified phase or not.
- * @param phase Wanted phase.
- * @return True, if phase of event map contains specified phase.
- */
- bool IsInPhase(uint8 phase) const
- {
- return phase <= 8 && (!phase || _phase & (1 << (phase - 1)));
- }
-
- /**
- * @name GetTimeUntilEvent
- * @brief Returns time in milliseconds until next event.
- * @param eventId of the event.
- * @return Time of next event.
- */
- uint32 GetTimeUntilEvent(uint32 eventId) const;
-
-private:
- /**
- * @name _time
- * @brief Internal timer.
- *
- * This does not represent the real date/time value.
- * It's more like a stopwatch: It can run, it can be stopped,
- * it can be resetted and so on. Events occur when this timer
- * has reached their time value. Its value is changed in the
- * Update method.
- */
- uint32 _time;
-
- /**
- * @name _phase
- * @brief Phase mask of the event map.
- *
- * Contains the phases the event map is in. Multiple
- * phases from 1 to 8 can be set with SetPhase or
- * AddPhase. RemovePhase deactives a phase.
- */
- uint8 _phase;
-
- /**
- * @name _eventMap
- * @brief Internal event storage map. Contains the scheduled events.
- *
- * See typedef at the beginning of the class for more
- * details.
- */
- EventStore _eventMap;
-
- /**
- * @name _lastEvent
- * @brief Stores information on the most recently executed event
- */
- uint32 _lastEvent;
-};
-
-#endif // _EVENT_MAP_H_
diff --git a/src/server/shared/Utilities/EventProcessor.cpp b/src/server/shared/Utilities/EventProcessor.cpp
deleted file mode 100644
index 34695665443..00000000000
--- a/src/server/shared/Utilities/EventProcessor.cpp
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
- *
- * 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 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "EventProcessor.h"
-
-EventProcessor::EventProcessor()
-{
- m_time = 0;
- m_aborting = false;
-}
-
-EventProcessor::~EventProcessor()
-{
- KillAllEvents(true);
-}
-
-void EventProcessor::Update(uint32 p_time)
-{
- // update time
- m_time += p_time;
-
- // main event loop
- EventList::iterator i;
- while (((i = m_events.begin()) != m_events.end()) && i->first <= m_time)
- {
- // get and remove event from queue
- BasicEvent* Event = i->second;
- m_events.erase(i);
-
- if (!Event->to_Abort)
- {
- if (Event->Execute(m_time, p_time))
- {
- // completely destroy event if it is not re-added
- delete Event;
- }
- }
- else
- {
- Event->Abort(m_time);
- delete Event;
- }
- }
-}
-
-void EventProcessor::KillAllEvents(bool force)
-{
- // prevent event insertions
- m_aborting = true;
-
- // first, abort all existing events
- for (EventList::iterator i = m_events.begin(); i != m_events.end();)
- {
- EventList::iterator i_old = i;
- ++i;
-
- i_old->second->to_Abort = true;
- i_old->second->Abort(m_time);
- if (force || i_old->second->IsDeletable())
- {
- delete i_old->second;
-
- if (!force) // need per-element cleanup
- m_events.erase (i_old);
- }
- }
-
- // fast clear event list (in force case)
- if (force)
- m_events.clear();
-}
-
-void EventProcessor::AddEvent(BasicEvent* Event, uint64 e_time, bool set_addtime)
-{
- if (set_addtime) Event->m_addTime = m_time;
- Event->m_execTime = e_time;
- m_events.insert(std::pair<uint64, BasicEvent*>(e_time, Event));
-}
-
-uint64 EventProcessor::CalculateTime(uint64 t_offset) const
-{
- return(m_time + t_offset);
-}
-
diff --git a/src/server/shared/Utilities/EventProcessor.h b/src/server/shared/Utilities/EventProcessor.h
deleted file mode 100644
index 3d54bd6f9f2..00000000000
--- a/src/server/shared/Utilities/EventProcessor.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
- *
- * 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 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef __EVENTPROCESSOR_H
-#define __EVENTPROCESSOR_H
-
-#include "Define.h"
-
-#include <map>
-
-// Note. All times are in milliseconds here.
-
-class BasicEvent
-{
- public:
- BasicEvent()
- {
- to_Abort = false;
- m_addTime = 0;
- m_execTime = 0;
- }
- virtual ~BasicEvent() { } // override destructor to perform some actions on event removal
-
- // this method executes when the event is triggered
- // return false if event does not want to be deleted
- // e_time is execution time, p_time is update interval
- virtual bool Execute(uint64 /*e_time*/, uint32 /*p_time*/) { return true; }
-
- virtual bool IsDeletable() const { return true; } // this event can be safely deleted
-
- virtual void Abort(uint64 /*e_time*/) { } // this method executes when the event is aborted
-
- bool to_Abort; // set by externals when the event is aborted, aborted events don't execute
- // and get Abort call when deleted
-
- // these can be used for time offset control
- uint64 m_addTime; // time when the event was added to queue, filled by event handler
- uint64 m_execTime; // planned time of next execution, filled by event handler
-};
-
-typedef std::multimap<uint64, BasicEvent*> EventList;
-
-class EventProcessor
-{
- public:
- EventProcessor();
- ~EventProcessor();
-
- void Update(uint32 p_time);
- void KillAllEvents(bool force);
- void AddEvent(BasicEvent* Event, uint64 e_time, bool set_addtime = true);
- uint64 CalculateTime(uint64 t_offset) const;
- protected:
- uint64 m_time;
- EventList m_events;
- bool m_aborting;
-};
-#endif
diff --git a/src/server/shared/Utilities/ServiceWin32.cpp b/src/server/shared/Utilities/ServiceWin32.cpp
deleted file mode 100644
index 3e5e416b1a3..00000000000
--- a/src/server/shared/Utilities/ServiceWin32.cpp
+++ /dev/null
@@ -1,264 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com>
- *
- * 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 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifdef _WIN32
-
-#include "Common.h"
-#include "Log.h"
-#include <cstring>
-#include <windows.h>
-#include <winsvc.h>
-
-#if !defined(WINADVAPI)
-#if !defined(_ADVAPI32_)
-#define WINADVAPI DECLSPEC_IMPORT
-#else
-#define WINADVAPI
-#endif
-#endif
-
-extern int main(int argc, char ** argv);
-extern char serviceLongName[];
-extern char serviceName[];
-extern char serviceDescription[];
-
-extern int m_ServiceStatus;
-
-SERVICE_STATUS serviceStatus;
-
-SERVICE_STATUS_HANDLE serviceStatusHandle = 0;
-
-typedef WINADVAPI BOOL (WINAPI *CSD_T)(SC_HANDLE, DWORD, LPCVOID);
-
-bool WinServiceInstall()
-{
- SC_HANDLE serviceControlManager = OpenSCManager(0, 0, SC_MANAGER_CREATE_SERVICE);
-
- if (serviceControlManager)
- {
- char path[_MAX_PATH + 10];
- if (GetModuleFileName( 0, path, sizeof(path)/sizeof(path[0]) ) > 0)
- {
- SC_HANDLE service;
- std::strcat(path, " --service run");
- service = CreateService(serviceControlManager,
- serviceName, // name of service
- serviceLongName, // service name to display
- SERVICE_ALL_ACCESS, // desired access
- // service type
- SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS,
- SERVICE_AUTO_START, // start type
- SERVICE_ERROR_IGNORE, // error control type
- path, // service's binary
- 0, // no load ordering group
- 0, // no tag identifier
- 0, // no dependencies
- 0, // LocalSystem account
- 0); // no password
- if (service)
- {
- HMODULE advapi32 = GetModuleHandle("ADVAPI32.DLL");
- if (!advapi32)
- {
- CloseServiceHandle(service);
- CloseServiceHandle(serviceControlManager);
- return false;
- }
-
- CSD_T ChangeService_Config2 = (CSD_T) GetProcAddress(advapi32, "ChangeServiceConfig2A");
- if (!ChangeService_Config2)
- {
- CloseServiceHandle(service);
- CloseServiceHandle(serviceControlManager);
- return false;
- }
-
- SERVICE_DESCRIPTION sdBuf;
- sdBuf.lpDescription = serviceDescription;
- ChangeService_Config2(
- service, // handle to service
- SERVICE_CONFIG_DESCRIPTION, // change: description
- &sdBuf); // new data
-
- SC_ACTION _action[1];
- _action[0].Type = SC_ACTION_RESTART;
- _action[0].Delay = 10000;
- SERVICE_FAILURE_ACTIONS sfa;
- ZeroMemory(&sfa, sizeof(SERVICE_FAILURE_ACTIONS));
- sfa.lpsaActions = _action;
- sfa.cActions = 1;
- sfa.dwResetPeriod =INFINITE;
- ChangeService_Config2(
- service, // handle to service
- SERVICE_CONFIG_FAILURE_ACTIONS, // information level
- &sfa); // new data
-
- CloseServiceHandle(service);
-
- }
- }
- CloseServiceHandle(serviceControlManager);
- }
-
- printf("Service installed\n");
- return true;
-}
-
-bool WinServiceUninstall()
-{
- SC_HANDLE serviceControlManager = OpenSCManager(0, 0, SC_MANAGER_CONNECT);
-
- if (serviceControlManager)
- {
- SC_HANDLE service = OpenService(serviceControlManager,
- serviceName, SERVICE_QUERY_STATUS | DELETE);
- if (service)
- {
- SERVICE_STATUS serviceStatus2;
- if (QueryServiceStatus(service, &serviceStatus2))
- {
- if (serviceStatus2.dwCurrentState == SERVICE_STOPPED)
- DeleteService(service);
- }
- CloseServiceHandle(service);
- }
-
- CloseServiceHandle(serviceControlManager);
- }
-
- printf("Service uninstalled\n");
- return true;
-}
-
-void WINAPI ServiceControlHandler(DWORD controlCode)
-{
- switch (controlCode)
- {
- case SERVICE_CONTROL_INTERROGATE:
- break;
-
- case SERVICE_CONTROL_SHUTDOWN:
- case SERVICE_CONTROL_STOP:
- serviceStatus.dwCurrentState = SERVICE_STOP_PENDING;
- SetServiceStatus(serviceStatusHandle, &serviceStatus);
-
- m_ServiceStatus = 0;
- return;
-
- case SERVICE_CONTROL_PAUSE:
- m_ServiceStatus = 2;
- serviceStatus.dwCurrentState = SERVICE_PAUSED;
- SetServiceStatus(serviceStatusHandle, &serviceStatus);
- break;
-
- case SERVICE_CONTROL_CONTINUE:
- serviceStatus.dwCurrentState = SERVICE_RUNNING;
- SetServiceStatus(serviceStatusHandle, &serviceStatus);
- m_ServiceStatus = 1;
- break;
-
- default:
- if ( controlCode >= 128 && controlCode <= 255 )
- // user defined control code
- break;
- else
- // unrecognized control code
- break;
- }
-
- SetServiceStatus(serviceStatusHandle, &serviceStatus);
-}
-
-void WINAPI ServiceMain(DWORD argc, char *argv[])
-{
- // initialise service status
- serviceStatus.dwServiceType = SERVICE_WIN32;
- serviceStatus.dwCurrentState = SERVICE_START_PENDING;
- serviceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE;
- serviceStatus.dwWin32ExitCode = NO_ERROR;
- serviceStatus.dwServiceSpecificExitCode = NO_ERROR;
- serviceStatus.dwCheckPoint = 0;
- serviceStatus.dwWaitHint = 0;
-
- serviceStatusHandle = RegisterServiceCtrlHandler(serviceName, ServiceControlHandler);
-
- if ( serviceStatusHandle )
- {
- char path[_MAX_PATH + 1];
- unsigned int i, last_slash = 0;
-
- GetModuleFileName(0, path, sizeof(path)/sizeof(path[0]));
-
- size_t pathLen = std::strlen(path);
- for (i = 0; i < pathLen; i++)
- {
- if (path[i] == '\\') last_slash = i;
- }
-
- path[last_slash] = 0;
-
- // service is starting
- serviceStatus.dwCurrentState = SERVICE_START_PENDING;
- SetServiceStatus(serviceStatusHandle, &serviceStatus);
-
- // do initialisation here
- SetCurrentDirectory(path);
-
- // running
- serviceStatus.dwControlsAccepted |= (SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN);
- serviceStatus.dwCurrentState = SERVICE_RUNNING;
- SetServiceStatus( serviceStatusHandle, &serviceStatus );
-
- ////////////////////////
- // service main cycle //
- ////////////////////////
-
- m_ServiceStatus = 1;
- argc = 1;
- main(argc, argv);
-
- // service was stopped
- serviceStatus.dwCurrentState = SERVICE_STOP_PENDING;
- SetServiceStatus(serviceStatusHandle, &serviceStatus);
-
- // do cleanup here
-
- // service is now stopped
- serviceStatus.dwControlsAccepted &= ~(SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN);
- serviceStatus.dwCurrentState = SERVICE_STOPPED;
- SetServiceStatus(serviceStatusHandle, &serviceStatus);
- }
-}
-
-bool WinServiceRun()
-{
- SERVICE_TABLE_ENTRY serviceTable[] =
- {
- { serviceName, ServiceMain },
- { 0, 0 }
- };
-
- if (!StartServiceCtrlDispatcher(serviceTable))
- {
- TC_LOG_ERROR("server.worldserver", "StartService Failed. Error [%u]", uint32(::GetLastError()));
- return false;
- }
- return true;
-}
-#endif
-
diff --git a/src/server/shared/Utilities/ServiceWin32.h b/src/server/shared/Utilities/ServiceWin32.h
deleted file mode 100644
index 9d9c732cd20..00000000000
--- a/src/server/shared/Utilities/ServiceWin32.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com>
- *
- * 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 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifdef _WIN32
-#ifndef _WIN32_SERVICE_
-#define _WIN32_SERVICE_
-
-bool WinServiceInstall();
-bool WinServiceUninstall();
-bool WinServiceRun();
-
-#endif // _WIN32_SERVICE_
-#endif // _WIN32
-
diff --git a/src/server/shared/Utilities/StringFormat.h b/src/server/shared/Utilities/StringFormat.h
deleted file mode 100644
index 67e0100e7c8..00000000000
--- a/src/server/shared/Utilities/StringFormat.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
- *
- * 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 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef TRINITYCORE_STRING_FORMAT_H
-#define TRINITYCORE_STRING_FORMAT_H
-
-#include "format.h"
-
-namespace Trinity
-{
- /// Default TC string format function.
- template<typename Format, typename... Args>
- inline std::string StringFormat(Format&& fmt, Args&&... args)
- {
- return fmt::sprintf(std::forward<Format>(fmt), std::forward<Args>(args)...);
- }
-
- /// Returns true if the given char pointer is null.
- inline bool IsFormatEmptyOrNull(const char* fmt)
- {
- return fmt == nullptr;
- }
-
- /// Returns true if the given std::string is empty.
- inline bool IsFormatEmptyOrNull(std::string const& fmt)
- {
- return fmt.empty();
- }
-}
-
-#endif
diff --git a/src/server/shared/Utilities/TaskScheduler.cpp b/src/server/shared/Utilities/TaskScheduler.cpp
deleted file mode 100644
index 801cc96cf77..00000000000
--- a/src/server/shared/Utilities/TaskScheduler.cpp
+++ /dev/null
@@ -1,229 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * 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 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "TaskScheduler.h"
-
-TaskScheduler& TaskScheduler::ClearValidator()
-{
- _predicate = EmptyValidator;
- return *this;
-}
-
-TaskScheduler& TaskScheduler::Update(success_t const& callback)
-{
- _now = clock_t::now();
- Dispatch(callback);
- return *this;
-}
-
-TaskScheduler& TaskScheduler::Update(size_t const milliseconds, success_t const& callback)
-{
- return Update(std::chrono::milliseconds(milliseconds), callback);
-}
-
-TaskScheduler& TaskScheduler::Async(std::function<void()> const& callable)
-{
- _asyncHolder.push(callable);
- return *this;
-}
-
-TaskScheduler& TaskScheduler::CancelAll()
-{
- /// Clear the task holder
- _task_holder.Clear();
- _asyncHolder = AsyncHolder();
- return *this;
-}
-
-TaskScheduler& TaskScheduler::CancelGroup(group_t const group)
-{
- _task_holder.RemoveIf([group](TaskContainer const& task) -> bool
- {
- return task->IsInGroup(group);
- });
- return *this;
-}
-
-TaskScheduler& TaskScheduler::CancelGroupsOf(std::vector<group_t> const& groups)
-{
- std::for_each(groups.begin(), groups.end(),
- std::bind(&TaskScheduler::CancelGroup, this, std::placeholders::_1));
-
- return *this;
-}
-
-TaskScheduler& TaskScheduler::InsertTask(TaskContainer task)
-{
- _task_holder.Push(std::move(task));
- return *this;
-}
-
-void TaskScheduler::Dispatch(success_t const& callback)
-{
- // If the validation failed abort the dispatching here.
- if (!_predicate())
- return;
-
- // Process all asyncs
- while (!_asyncHolder.empty())
- {
- _asyncHolder.front()();
- _asyncHolder.pop();
-
- // If the validation failed abort the dispatching here.
- if (!_predicate())
- return;
- }
-
- while (!_task_holder.IsEmpty())
- {
- if (_task_holder.First()->_end > _now)
- break;
-
- // Perfect forward the context to the handler
- // Use weak references to catch destruction before callbacks.
- TaskContext context(_task_holder.Pop(), std::weak_ptr<TaskScheduler>(self_reference));
-
- // Invoke the context
- context.Invoke();
-
- // If the validation failed abort the dispatching here.
- if (!_predicate())
- return;
- }
-
- // On finish call the final callback
- callback();
-}
-
-void TaskScheduler::TaskQueue::Push(TaskContainer&& task)
-{
- container.insert(task);
-}
-
-auto TaskScheduler::TaskQueue::Pop() -> TaskContainer
-{
- TaskContainer result = *container.begin();
- container.erase(container.begin());
- return result;
-}
-
-auto TaskScheduler::TaskQueue::First() const -> TaskContainer const&
-{
- return *container.begin();
-}
-
-void TaskScheduler::TaskQueue::Clear()
-{
- container.clear();
-}
-
-void TaskScheduler::TaskQueue::RemoveIf(std::function<bool(TaskContainer const&)> const& filter)
-{
- for (auto itr = container.begin(); itr != container.end();)
- if (filter(*itr))
- itr = container.erase(itr);
- else
- ++itr;
-}
-
-void TaskScheduler::TaskQueue::ModifyIf(std::function<bool(TaskContainer const&)> const& filter)
-{
- std::vector<TaskContainer> cache;
- for (auto itr = container.begin(); itr != container.end();)
- if (filter(*itr))
- {
- cache.push_back(*itr);
- itr = container.erase(itr);
- }
- else
- ++itr;
-
- container.insert(cache.begin(), cache.end());
-}
-
-bool TaskScheduler::TaskQueue::IsEmpty() const
-{
- return container.empty();
-}
-
-TaskContext& TaskContext::Dispatch(std::function<TaskScheduler&(TaskScheduler&)> const& apply)
-{
- if (auto const owner = _owner.lock())
- apply(*owner);
-
- return *this;
-}
-
-bool TaskContext::IsExpired() const
-{
- return _owner.expired();
-}
-
-bool TaskContext::IsInGroup(TaskScheduler::group_t const group) const
-{
- return _task->IsInGroup(group);
-}
-
-TaskContext& TaskContext::SetGroup(TaskScheduler::group_t const group)
-{
- _task->_group = group;
- return *this;
-}
-
-TaskContext& TaskContext::ClearGroup()
-{
- _task->_group = boost::none;
- return *this;
-}
-
-TaskScheduler::repeated_t TaskContext::GetRepeatCounter() const
-{
- return _task->_repeated;
-}
-
-TaskContext& TaskContext::Async(std::function<void()> const& callable)
-{
- return Dispatch(std::bind(&TaskScheduler::Async, std::placeholders::_1, callable));
-}
-
-TaskContext& TaskContext::CancelAll()
-{
- return Dispatch(std::mem_fn(&TaskScheduler::CancelAll));
-}
-
-TaskContext& TaskContext::CancelGroup(TaskScheduler::group_t const group)
-{
- return Dispatch(std::bind(&TaskScheduler::CancelGroup, std::placeholders::_1, group));
-}
-
-TaskContext& TaskContext::CancelGroupsOf(std::vector<TaskScheduler::group_t> const& groups)
-{
- return Dispatch(std::bind(&TaskScheduler::CancelGroupsOf, std::placeholders::_1, std::cref(groups)));
-}
-
-void TaskContext::AssertOnConsumed() const
-{
- // This was adapted to TC to prevent static analysis tools from complaining.
- // If you encounter this assertion check if you repeat a TaskContext more then 1 time!
- ASSERT(!(*_consumed) && "Bad task logic, task context was consumed already!");
-}
-
-void TaskContext::Invoke()
-{
- _task->_task(*this);
-}
diff --git a/src/server/shared/Utilities/TaskScheduler.h b/src/server/shared/Utilities/TaskScheduler.h
deleted file mode 100644
index f1fe7ea0a21..00000000000
--- a/src/server/shared/Utilities/TaskScheduler.h
+++ /dev/null
@@ -1,650 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * 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 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef _TASK_SCHEDULER_H_
-#define _TASK_SCHEDULER_H_
-
-#include <algorithm>
-#include <chrono>
-#include <vector>
-#include <queue>
-#include <memory>
-#include <utility>
-#include <set>
-
-#include <boost/optional.hpp>
-
-#include "Util.h"
-#include "Duration.h"
-
-class TaskContext;
-
-/// The TaskScheduler class provides the ability to schedule std::function's in the near future.
-/// Use TaskScheduler::Update to update the scheduler.
-/// Popular methods are:
-/// * Schedule (Schedules a std::function which will be executed in the near future).
-/// * Schedules an asynchronous function which will be executed at the next update tick.
-/// * Cancel, Delay & Reschedule (Methods to manipulate already scheduled tasks).
-/// Tasks are organized in groups (uint), multiple tasks can have the same group id,
-/// you can provide a group or not, but keep in mind that you can only manipulate specific tasks through its group id!
-/// Tasks callbacks use the function signature void(TaskContext) where TaskContext provides
-/// access to the function schedule plan which makes it possible to repeat the task
-/// with the same duration or a new one.
-/// It also provides access to the repeat counter which is useful for task that repeat itself often
-/// but behave different every time (spoken event dialogs for example).
-class TaskScheduler
-{
- friend class TaskContext;
-
- // Time definitions (use steady clock)
- typedef std::chrono::steady_clock clock_t;
- typedef clock_t::time_point timepoint_t;
- typedef clock_t::duration duration_t;
-
- // Task group type
- typedef uint32 group_t;
- // Task repeated type
- typedef uint32 repeated_t;
- // Task handle type
- typedef std::function<void(TaskContext)> task_handler_t;
- // Predicate type
- typedef std::function<bool()> predicate_t;
- // Success handle type
- typedef std::function<void()> success_t;
-
- class Task
- {
- friend class TaskContext;
- friend class TaskScheduler;
-
- timepoint_t _end;
- duration_t _duration;
- boost::optional<group_t> _group;
- repeated_t _repeated;
- task_handler_t _task;
-
- public:
- // All Argument construct
- Task(timepoint_t const& end, duration_t const& duration, boost::optional<group_t> const& group,
- repeated_t const repeated, task_handler_t const& task)
- : _end(end), _duration(duration), _group(group), _repeated(repeated), _task(task) { }
-
- // Minimal Argument construct
- Task(timepoint_t const& end, duration_t const& duration, task_handler_t const& task)
- : _end(end), _duration(duration), _group(boost::none), _repeated(0), _task(task) { }
-
- // Copy construct
- Task(Task const&) = delete;
- // Move construct
- Task(Task&&) = delete;
- // Copy Assign
- Task& operator= (Task const&) = default;
- // Move Assign
- Task& operator= (Task&& right) = delete;
-
- // Order tasks by its end
- inline bool operator< (Task const& other) const
- {
- return _end < other._end;
- }
-
- inline bool operator> (Task const& other) const
- {
- return _end > other._end;
- }
-
- // Compare tasks with its end
- inline bool operator== (Task const& other)
- {
- return _end == other._end;
- }
-
- // Returns true if the task is in the given group
- inline bool IsInGroup(group_t const group) const
- {
- return _group == group;
- }
- };
-
- typedef std::shared_ptr<Task> TaskContainer;
-
- /// Container which provides Task order, insert and reschedule operations.
- struct Compare
- {
- bool operator() (TaskContainer const& left, TaskContainer const& right)
- {
- return (*left.get()) < (*right.get());
- };
- };
-
- class TaskQueue
- {
- std::multiset<TaskContainer, Compare> container;
-
- public:
- // Pushes the task in the container
- void Push(TaskContainer&& task);
-
- /// Pops the task out of the container
- TaskContainer Pop();
-
- TaskContainer const& First() const;
-
- void Clear();
-
- void RemoveIf(std::function<bool(TaskContainer const&)> const& filter);
-
- void ModifyIf(std::function<bool(TaskContainer const&)> const& filter);
-
- bool IsEmpty() const;
- };
-
- /// Contains a self reference to track if this object was deleted or not.
- std::shared_ptr<TaskScheduler> self_reference;
-
- /// The current time point (now)
- timepoint_t _now;
-
- /// The Task Queue which contains all task objects.
- TaskQueue _task_holder;
-
- typedef std::queue<std::function<void()>> AsyncHolder;
-
- /// Contains all asynchronous tasks which will be invoked at
- /// the next update tick.
- AsyncHolder _asyncHolder;
-
- predicate_t _predicate;
-
- static bool EmptyValidator()
- {
- return true;
- }
-
- static void EmptyCallback()
- {
- }
-
-public:
- TaskScheduler()
- : self_reference(this, [](TaskScheduler const*) { }), _now(clock_t::now()), _predicate(EmptyValidator) { }
-
- template<typename P>
- TaskScheduler(P&& predicate)
- : self_reference(this, [](TaskScheduler const*) { }), _now(clock_t::now()), _predicate(std::forward<P>(predicate)) { }
-
- TaskScheduler(TaskScheduler const&) = delete;
- TaskScheduler(TaskScheduler&&) = delete;
- TaskScheduler& operator= (TaskScheduler const&) = delete;
- TaskScheduler& operator= (TaskScheduler&&) = delete;
-
- /// Sets a validator which is asked if tasks are allowed to be executed.
- template<typename P>
- TaskScheduler& SetValidator(P&& predicate)
- {
- _predicate = std::forward<P>(predicate);
- return *this;
- }
-
- /// Clears the validator which is asked if tasks are allowed to be executed.
- TaskScheduler& ClearValidator();
-
- /// Update the scheduler to the current time.
- /// Calls the optional callback on successfully finish.
- TaskScheduler& Update(success_t const& callback = EmptyCallback);
-
- /// Update the scheduler with a difftime in ms.
- /// Calls the optional callback on successfully finish.
- TaskScheduler& Update(size_t const milliseconds, success_t const& callback = EmptyCallback);
-
- /// Update the scheduler with a difftime.
- /// Calls the optional callback on successfully finish.
- template<class _Rep, class _Period>
- TaskScheduler& Update(std::chrono::duration<_Rep, _Period> const& difftime,
- success_t const& callback = EmptyCallback)
- {
- _now += difftime;
- Dispatch(callback);
- return *this;
- }
-
- /// Schedule an callable function that is executed at the next update tick.
- /// Its safe to modify the TaskScheduler from within the callable.
- TaskScheduler& Async(std::function<void()> const& callable);
-
- /// Schedule an event with a fixed rate.
- /// Never call this from within a task context! Use TaskContext::Schedule instead!
- template<class _Rep, class _Period>
- TaskScheduler& Schedule(std::chrono::duration<_Rep, _Period> const& time,
- task_handler_t const& task)
- {
- return ScheduleAt(_now, time, task);
- }
-
- /// Schedule an event with a fixed rate.
- /// Never call this from within a task context! Use TaskContext::Schedule instead!
- template<class _Rep, class _Period>
- TaskScheduler& Schedule(std::chrono::duration<_Rep, _Period> const& time,
- group_t const group, task_handler_t const& task)
- {
- return ScheduleAt(_now, time, group, task);
- }
-
- /// Schedule an event with a randomized rate between min and max rate.
- /// Never call this from within a task context! Use TaskContext::Schedule instead!
- template<class _RepLeft, class _PeriodLeft, class _RepRight, class _PeriodRight>
- TaskScheduler& Schedule(std::chrono::duration<_RepLeft, _PeriodLeft> const& min,
- std::chrono::duration<_RepRight, _PeriodRight> const& max, task_handler_t const& task)
- {
- return Schedule(RandomDurationBetween(min, max), task);
- }
-
- /// Schedule an event with a fixed rate.
- /// Never call this from within a task context! Use TaskContext::Schedule instead!
- template<class _RepLeft, class _PeriodLeft, class _RepRight, class _PeriodRight>
- TaskScheduler& Schedule(std::chrono::duration<_RepLeft, _PeriodLeft> const& min,
- std::chrono::duration<_RepRight, _PeriodRight> const& max, group_t const group,
- task_handler_t const& task)
- {
- return Schedule(RandomDurationBetween(min, max), group, task);
- }
-
- /// Cancels all tasks.
- /// Never call this from within a task context! Use TaskContext::CancelAll instead!
- TaskScheduler& CancelAll();
-
- /// Cancel all tasks of a single group.
- /// Never call this from within a task context! Use TaskContext::CancelGroup instead!
- TaskScheduler& CancelGroup(group_t const group);
-
- /// Cancels all groups in the given std::vector.
- /// Hint: Use std::initializer_list for this: "{1, 2, 3, 4}"
- TaskScheduler& CancelGroupsOf(std::vector<group_t> const& groups);
-
- /// Delays all tasks with the given duration.
- template<class _Rep, class _Period>
- TaskScheduler& DelayAll(std::chrono::duration<_Rep, _Period> const& duration)
- {
- _task_holder.ModifyIf([&duration](TaskContainer const& task) -> bool
- {
- task->_end += duration;
- return true;
- });
- return *this;
- }
-
- /// Delays all tasks with a random duration between min and max.
- template<class _RepLeft, class _PeriodLeft, class _RepRight, class _PeriodRight>
- TaskScheduler& DelayAll(std::chrono::duration<_RepLeft, _PeriodLeft> const& min,
- std::chrono::duration<_RepRight, _PeriodRight> const& max)
- {
- return DelayAll(RandomDurationBetween(min, max));
- }
-
- /// Delays all tasks of a group with the given duration.
- template<class _Rep, class _Period>
- TaskScheduler& DelayGroup(group_t const group, std::chrono::duration<_Rep, _Period> const& duration)
- {
- _task_holder.ModifyIf([&duration, group](TaskContainer const& task) -> bool
- {
- if (task->IsInGroup(group))
- {
- task->_end += duration;
- return true;
- }
- else
- return false;
- });
- return *this;
- }
-
- /// Delays all tasks of a group with a random duration between min and max.
- template<class _RepLeft, class _PeriodLeft, class _RepRight, class _PeriodRight>
- TaskScheduler& DelayGroup(group_t const group,
- std::chrono::duration<_RepLeft, _PeriodLeft> const& min,
- std::chrono::duration<_RepRight, _PeriodRight> const& max)
- {
- return DelayGroup(group, RandomDurationBetween(min, max));
- }
-
- /// Reschedule all tasks with a given duration.
- template<class _Rep, class _Period>
- TaskScheduler& RescheduleAll(std::chrono::duration<_Rep, _Period> const& duration)
- {
- auto const end = _now + duration;
- _task_holder.ModifyIf([end](TaskContainer const& task) -> bool
- {
- task->_end = end;
- return true;
- });
- return *this;
- }
-
- /// Reschedule all tasks with a random duration between min and max.
- template<class _RepLeft, class _PeriodLeft, class _RepRight, class _PeriodRight>
- TaskScheduler& RescheduleAll(std::chrono::duration<_RepLeft, _PeriodLeft> const& min,
- std::chrono::duration<_RepRight, _PeriodRight> const& max)
- {
- return RescheduleAll(RandomDurationBetween(min, max));
- }
-
- /// Reschedule all tasks of a group with the given duration.
- template<class _Rep, class _Period>
- TaskScheduler& RescheduleGroup(group_t const group, std::chrono::duration<_Rep, _Period> const& duration)
- {
- auto const end = _now + duration;
- _task_holder.ModifyIf([end, group](TaskContainer const& task) -> bool
- {
- if (task->IsInGroup(group))
- {
- task->_end = end;
- return true;
- }
- else
- return false;
- });
- return *this;
- }
-
- /// Reschedule all tasks of a group with a random duration between min and max.
- template<class _RepLeft, class _PeriodLeft, class _RepRight, class _PeriodRight>
- TaskScheduler& RescheduleGroup(group_t const group,
- std::chrono::duration<_RepLeft, _PeriodLeft> const& min,
- std::chrono::duration<_RepRight, _PeriodRight> const& max)
- {
- return RescheduleGroup(group, RandomDurationBetween(min, max));
- }
-
-private:
- /// Insert a new task to the enqueued tasks.
- TaskScheduler& InsertTask(TaskContainer task);
-
- template<class _Rep, class _Period>
- TaskScheduler& ScheduleAt(timepoint_t const& end,
- std::chrono::duration<_Rep, _Period> const& time, task_handler_t const& task)
- {
- return InsertTask(TaskContainer(new Task(end + time, time, task)));
- }
-
- /// Schedule an event with a fixed rate.
- /// Never call this from within a task context! Use TaskContext::schedule instead!
- template<class _Rep, class _Period>
- TaskScheduler& ScheduleAt(timepoint_t const& end,
- std::chrono::duration<_Rep, _Period> const& time,
- group_t const group, task_handler_t const& task)
- {
- static repeated_t const DEFAULT_REPEATED = 0;
- return InsertTask(TaskContainer(new Task(end + time, time, group, DEFAULT_REPEATED, task)));
- }
-
- // Returns a random duration between min and max
- template<class _RepLeft, class _PeriodLeft, class _RepRight, class _PeriodRight>
- static std::chrono::milliseconds
- RandomDurationBetween(std::chrono::duration<_RepLeft, _PeriodLeft> const& min,
- std::chrono::duration<_RepRight, _PeriodRight> const& max)
- {
- auto const milli_min = std::chrono::duration_cast<std::chrono::milliseconds>(min);
- auto const milli_max = std::chrono::duration_cast<std::chrono::milliseconds>(max);
-
- // TC specific: use SFMT URandom
- return std::chrono::milliseconds(urand(milli_min.count(), milli_max.count()));
- }
-
- /// Dispatch remaining tasks
- void Dispatch(success_t const& callback);
-};
-
-class TaskContext
-{
- friend class TaskScheduler;
-
- /// Associated task
- TaskScheduler::TaskContainer _task;
-
- /// Owner
- std::weak_ptr<TaskScheduler> _owner;
-
- /// Marks the task as consumed
- std::shared_ptr<bool> _consumed;
-
- /// Dispatches an action safe on the TaskScheduler
- TaskContext& Dispatch(std::function<TaskScheduler&(TaskScheduler&)> const& apply);
-
-public:
- // Empty constructor
- TaskContext()
- : _task(), _owner(), _consumed(std::make_shared<bool>(true)) { }
-
- // Construct from task and owner
- explicit TaskContext(TaskScheduler::TaskContainer&& task, std::weak_ptr<TaskScheduler>&& owner)
- : _task(task), _owner(owner), _consumed(std::make_shared<bool>(false)) { }
-
- // Copy construct
- TaskContext(TaskContext const& right)
- : _task(right._task), _owner(right._owner), _consumed(right._consumed) { }
-
- // Move construct
- TaskContext(TaskContext&& right)
- : _task(std::move(right._task)), _owner(std::move(right._owner)), _consumed(std::move(right._consumed)) { }
-
- // Copy assign
- TaskContext& operator= (TaskContext const& right)
- {
- _task = right._task;
- _owner = right._owner;
- _consumed = right._consumed;
- return *this;
- }
-
- // Move assign
- TaskContext& operator= (TaskContext&& right)
- {
- _task = std::move(right._task);
- _owner = std::move(right._owner);
- _consumed = std::move(right._consumed);
- return *this;
- }
-
- /// Returns true if the owner was deallocated and this context has expired.
- bool IsExpired() const;
-
- /// Returns true if the event is in the given group
- bool IsInGroup(TaskScheduler::group_t const group) const;
-
- /// Sets the event in the given group
- TaskContext& SetGroup(TaskScheduler::group_t const group);
-
- /// Removes the group from the event
- TaskContext& ClearGroup();
-
- /// Returns the repeat counter which increases every time the task is repeated.
- TaskScheduler::repeated_t GetRepeatCounter() const;
-
- /// Repeats the event and sets a new duration.
- /// std::chrono::seconds(5) for example.
- /// This will consume the task context, its not possible to repeat the task again
- /// from the same task context!
- template<class _Rep, class _Period>
- TaskContext& Repeat(std::chrono::duration<_Rep, _Period> const& duration)
- {
- AssertOnConsumed();
-
- // Set new duration, in-context timing and increment repeat counter
- _task->_duration = duration;
- _task->_end += duration;
- _task->_repeated += 1;
- (*_consumed) = true;
- return Dispatch(std::bind(&TaskScheduler::InsertTask, std::placeholders::_1, _task));
- }
-
- /// Repeats the event with the same duration.
- /// This will consume the task context, its not possible to repeat the task again
- /// from the same task context!
- TaskContext& Repeat()
- {
- return Repeat(_task->_duration);
- }
-
- /// Repeats the event and set a new duration that is randomized between min and max.
- /// std::chrono::seconds(5) for example.
- /// This will consume the task context, its not possible to repeat the task again
- /// from the same task context!
- template<class _RepLeft, class _PeriodLeft, class _RepRight, class _PeriodRight>
- TaskContext& Repeat(std::chrono::duration<_RepLeft, _PeriodLeft> const& min,
- std::chrono::duration<_RepRight, _PeriodRight> const& max)
- {
- return Repeat(TaskScheduler::RandomDurationBetween(min, max));
- }
-
- /// Schedule a callable function that is executed at the next update tick from within the context.
- /// Its safe to modify the TaskScheduler from within the callable.
- TaskContext& Async(std::function<void()> const& callable);
-
- /// Schedule an event with a fixed rate from within the context.
- /// Its possible that the new event is executed immediately!
- /// Use TaskScheduler::Async to create a task
- /// which will be called at the next update tick.
- template<class _Rep, class _Period>
- TaskContext& Schedule(std::chrono::duration<_Rep, _Period> const& time,
- TaskScheduler::task_handler_t const& task)
- {
- auto const end = _task->_end;
- return Dispatch([end, time, task](TaskScheduler& scheduler) -> TaskScheduler&
- {
- return scheduler.ScheduleAt<_Rep, _Period>(end, time, task);
- });
- }
-
- /// Schedule an event with a fixed rate from within the context.
- /// Its possible that the new event is executed immediately!
- /// Use TaskScheduler::Async to create a task
- /// which will be called at the next update tick.
- template<class _Rep, class _Period>
- TaskContext& Schedule(std::chrono::duration<_Rep, _Period> const& time,
- TaskScheduler::group_t const group, TaskScheduler::task_handler_t const& task)
- {
- auto const end = _task->_end;
- return Dispatch([end, time, group, task](TaskScheduler& scheduler) -> TaskScheduler&
- {
- return scheduler.ScheduleAt<_Rep, _Period>(end, time, group, task);
- });
- }
-
- /// Schedule an event with a randomized rate between min and max rate from within the context.
- /// Its possible that the new event is executed immediately!
- /// Use TaskScheduler::Async to create a task
- /// which will be called at the next update tick.
- template<class _RepLeft, class _PeriodLeft, class _RepRight, class _PeriodRight>
- TaskContext& Schedule(std::chrono::duration<_RepLeft, _PeriodLeft> const& min,
- std::chrono::duration<_RepRight, _PeriodRight> const& max, TaskScheduler::task_handler_t const& task)
- {
- return Schedule(TaskScheduler::RandomDurationBetween(min, max), task);
- }
-
- /// Schedule an event with a randomized rate between min and max rate from within the context.
- /// Its possible that the new event is executed immediately!
- /// Use TaskScheduler::Async to create a task
- /// which will be called at the next update tick.
- template<class _RepLeft, class _PeriodLeft, class _RepRight, class _PeriodRight>
- TaskContext& Schedule(std::chrono::duration<_RepLeft, _PeriodLeft> const& min,
- std::chrono::duration<_RepRight, _PeriodRight> const& max, TaskScheduler::group_t const group,
- TaskScheduler::task_handler_t const& task)
- {
- return Schedule(TaskScheduler::RandomDurationBetween(min, max), group, task);
- }
-
- /// Cancels all tasks from within the context.
- TaskContext& CancelAll();
-
- /// Cancel all tasks of a single group from within the context.
- TaskContext& CancelGroup(TaskScheduler::group_t const group);
-
- /// Cancels all groups in the given std::vector from within the context.
- /// Hint: Use std::initializer_list for this: "{1, 2, 3, 4}"
- TaskContext& CancelGroupsOf(std::vector<TaskScheduler::group_t> const& groups);
-
- /// Delays all tasks with the given duration from within the context.
- template<class _Rep, class _Period>
- TaskContext& DelayAll(std::chrono::duration<_Rep, _Period> const& duration)
- {
- return Dispatch(std::bind(&TaskScheduler::DelayAll<_Rep, _Period>, std::placeholders::_1, duration));
- }
-
- /// Delays all tasks with a random duration between min and max from within the context.
- template<class _RepLeft, class _PeriodLeft, class _RepRight, class _PeriodRight>
- TaskContext& DelayAll(std::chrono::duration<_RepLeft, _PeriodLeft> const& min,
- std::chrono::duration<_RepRight, _PeriodRight> const& max)
- {
- return DelayAll(TaskScheduler::RandomDurationBetween(min, max));
- }
-
- /// Delays all tasks of a group with the given duration from within the context.
- template<class _Rep, class _Period>
- TaskContext& DelayGroup(TaskScheduler::group_t const group, std::chrono::duration<_Rep, _Period> const& duration)
- {
- return Dispatch(std::bind(&TaskScheduler::DelayGroup<_Rep, _Period>, std::placeholders::_1, group, duration));
- }
-
- /// Delays all tasks of a group with a random duration between min and max from within the context.
- template<class _RepLeft, class _PeriodLeft, class _RepRight, class _PeriodRight>
- TaskContext& DelayGroup(TaskScheduler::group_t const group,
- std::chrono::duration<_RepLeft, _PeriodLeft> const& min,
- std::chrono::duration<_RepRight, _PeriodRight> const& max)
- {
- return DelayGroup(group, TaskScheduler::RandomDurationBetween(min, max));
- }
-
- /// Reschedule all tasks with the given duration.
- template<class _Rep, class _Period>
- TaskContext& RescheduleAll(std::chrono::duration<_Rep, _Period> const& duration)
- {
- return Dispatch(std::bind(&TaskScheduler::RescheduleAll, std::placeholders::_1, duration));
- }
-
- /// Reschedule all tasks with a random duration between min and max.
- template<class _RepLeft, class _PeriodLeft, class _RepRight, class _PeriodRight>
- TaskContext& RescheduleAll(std::chrono::duration<_RepLeft, _PeriodLeft> const& min,
- std::chrono::duration<_RepRight, _PeriodRight> const& max)
- {
- return RescheduleAll(TaskScheduler::RandomDurationBetween(min, max));
- }
-
- /// Reschedule all tasks of a group with the given duration.
- template<class _Rep, class _Period>
- TaskContext& RescheduleGroup(TaskScheduler::group_t const group, std::chrono::duration<_Rep, _Period> const& duration)
- {
- return Dispatch(std::bind(&TaskScheduler::RescheduleGroup<_Rep, _Period>, std::placeholders::_1, group, duration));
- }
-
- /// Reschedule all tasks of a group with a random duration between min and max.
- template<class _RepLeft, class _PeriodLeft, class _RepRight, class _PeriodRight>
- TaskContext& RescheduleGroup(TaskScheduler::group_t const group,
- std::chrono::duration<_RepLeft, _PeriodLeft> const& min,
- std::chrono::duration<_RepRight, _PeriodRight> const& max)
- {
- return RescheduleGroup(group, TaskScheduler::RandomDurationBetween(min, max));
- }
-
-private:
- /// Asserts if the task was consumed already.
- void AssertOnConsumed() const;
-
- /// Invokes the associated hook of the task.
- void Invoke();
-};
-
-#endif /// _TASK_SCHEDULER_H_
diff --git a/src/server/shared/Utilities/Timer.h b/src/server/shared/Utilities/Timer.h
deleted file mode 100644
index c54903d7be2..00000000000
--- a/src/server/shared/Utilities/Timer.h
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
- *
- * 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 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef TRINITY_TIMER_H
-#define TRINITY_TIMER_H
-
-#include <chrono>
-
-inline uint32 getMSTime()
-{
- using namespace std::chrono;
-
- static const system_clock::time_point ApplicationStartTime = system_clock::now();
-
- return uint32(duration_cast<milliseconds>(system_clock::now() - ApplicationStartTime).count());
-}
-
-inline uint32 getMSTimeDiff(uint32 oldMSTime, uint32 newMSTime)
-{
- // getMSTime() have limited data range and this is case when it overflow in this tick
- if (oldMSTime > newMSTime)
- return (0xFFFFFFFF - oldMSTime) + newMSTime;
- else
- return newMSTime - oldMSTime;
-}
-
-inline uint32 GetMSTimeDiffToNow(uint32 oldMSTime)
-{
- return getMSTimeDiff(oldMSTime, getMSTime());
-}
-
-struct IntervalTimer
-{
-public:
-
- IntervalTimer()
- : _interval(0), _current(0)
- {
- }
-
- void Update(time_t diff)
- {
- _current += diff;
- if (_current < 0)
- _current = 0;
- }
-
- bool Passed()
- {
- return _current >= _interval;
- }
-
- void Reset()
- {
- if (_current >= _interval)
- _current %= _interval;
- }
-
- void SetCurrent(time_t current)
- {
- _current = current;
- }
-
- void SetInterval(time_t interval)
- {
- _interval = interval;
- }
-
- time_t GetInterval() const
- {
- return _interval;
- }
-
- time_t GetCurrent() const
- {
- return _current;
- }
-
-private:
-
- time_t _interval;
- time_t _current;
-};
-
-struct TimeTracker
-{
-public:
-
- TimeTracker(time_t expiry)
- : i_expiryTime(expiry)
- {
- }
-
- void Update(time_t diff)
- {
- i_expiryTime -= diff;
- }
-
- bool Passed() const
- {
- return i_expiryTime <= 0;
- }
-
- void Reset(time_t interval)
- {
- i_expiryTime = interval;
- }
-
- time_t GetExpiry() const
- {
- return i_expiryTime;
- }
-
-private:
-
- time_t i_expiryTime;
-};
-
-struct TimeTrackerSmall
-{
-public:
-
- TimeTrackerSmall(uint32 expiry = 0)
- : i_expiryTime(expiry)
- {
- }
-
- void Update(int32 diff)
- {
- i_expiryTime -= diff;
- }
-
- bool Passed() const
- {
- return i_expiryTime <= 0;
- }
-
- void Reset(uint32 interval)
- {
- i_expiryTime = interval;
- }
-
- int32 GetExpiry() const
- {
- return i_expiryTime;
- }
-
-private:
-
- int32 i_expiryTime;
-};
-
-struct PeriodicTimer
-{
-public:
-
- PeriodicTimer(int32 period, int32 start_time)
- : i_period(period), i_expireTime(start_time)
- {
- }
-
- bool Update(const uint32 diff)
- {
- if ((i_expireTime -= diff) > 0)
- return false;
-
- i_expireTime += i_period > int32(diff) ? i_period : diff;
- return true;
- }
-
- void SetPeriodic(int32 period, int32 start_time)
- {
- i_expireTime = start_time;
- i_period = period;
- }
-
- // Tracker interface
- void TUpdate(int32 diff) { i_expireTime -= diff; }
- bool TPassed() const { return i_expireTime <= 0; }
- void TReset(int32 diff, int32 period) { i_expireTime += period > diff ? period : diff; }
-
-private:
-
- int32 i_period;
- int32 i_expireTime;
-};
-
-#endif
diff --git a/src/server/shared/Utilities/Util.cpp b/src/server/shared/Utilities/Util.cpp
deleted file mode 100644
index 33c273fb05f..00000000000
--- a/src/server/shared/Utilities/Util.cpp
+++ /dev/null
@@ -1,562 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
- *
- * 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 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "Util.h"
-#include "Common.h"
-#include "CompilerDefs.h"
-#include "utf8.h"
-#include "SFMT.h"
-#include "Errors.h" // for ASSERT
-#include <stdarg.h>
-#include <boost/thread/tss.hpp>
-
-#if COMPILER == COMPILER_GNU
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
-#endif
-
-static boost::thread_specific_ptr<SFMTRand> sfmtRand;
-
-static SFMTRand* GetRng()
-{
- SFMTRand* rand = sfmtRand.get();
-
- if (!rand)
- {
- rand = new SFMTRand();
- sfmtRand.reset(rand);
- }
-
- return rand;
-}
-
-int32 irand(int32 min, int32 max)
-{
- ASSERT(max >= min);
- return int32(GetRng()->IRandom(min, max));
-}
-
-uint32 urand(uint32 min, uint32 max)
-{
- ASSERT(max >= min);
- return GetRng()->URandom(min, max);
-}
-
-float frand(float min, float max)
-{
- ASSERT(max >= min);
- return float(GetRng()->Random() * (max - min) + min);
-}
-
-uint32 rand32()
-{
- return GetRng()->BRandom();
-}
-
-double rand_norm()
-{
- return GetRng()->Random();
-}
-
-double rand_chance()
-{
- return GetRng()->Random() * 100.0;
-}
-
-Tokenizer::Tokenizer(const std::string &src, const char sep, uint32 vectorReserve)
-{
- m_str = new char[src.length() + 1];
- memcpy(m_str, src.c_str(), src.length() + 1);
-
- if (vectorReserve)
- m_storage.reserve(vectorReserve);
-
- char* posold = m_str;
- char* posnew = m_str;
-
- for (;;)
- {
- if (*posnew == sep)
- {
- m_storage.push_back(posold);
- posold = posnew + 1;
-
- *posnew = '\0';
- }
- else if (*posnew == '\0')
- {
- // Hack like, but the old code accepted these kind of broken strings,
- // so changing it would break other things
- if (posold != posnew)
- m_storage.push_back(posold);
-
- break;
- }
-
- ++posnew;
- }
-}
-
-void stripLineInvisibleChars(std::string &str)
-{
- static std::string const invChars = " \t\7\n";
-
- size_t wpos = 0;
-
- bool space = false;
- for (size_t pos = 0; pos < str.size(); ++pos)
- {
- if (invChars.find(str[pos])!=std::string::npos)
- {
- if (!space)
- {
- str[wpos++] = ' ';
- space = true;
- }
- }
- else
- {
- if (wpos!=pos)
- str[wpos++] = str[pos];
- else
- ++wpos;
- space = false;
- }
- }
-
- if (wpos < str.size())
- str.erase(wpos, str.size());
- if (str.find("|TInterface")!=std::string::npos)
- str.clear();
-
-}
-
-#if (defined(WIN32) || defined(_WIN32) || defined(__WIN32__))
-struct tm* localtime_r(const time_t* time, struct tm *result)
-{
- localtime_s(result, time);
- return result;
-}
-#endif
-
-std::string secsToTimeString(uint64 timeInSecs, bool shortText, bool hoursOnly)
-{
- uint64 secs = timeInSecs % MINUTE;
- uint64 minutes = timeInSecs % HOUR / MINUTE;
- uint64 hours = timeInSecs % DAY / HOUR;
- uint64 days = timeInSecs / DAY;
-
- std::ostringstream ss;
- if (days)
- ss << days << (shortText ? "d" : " Day(s) ");
- if (hours || hoursOnly)
- ss << hours << (shortText ? "h" : " Hour(s) ");
- if (!hoursOnly)
- {
- if (minutes)
- ss << minutes << (shortText ? "m" : " Minute(s) ");
- if (secs || (!days && !hours && !minutes) )
- ss << secs << (shortText ? "s" : " Second(s).");
- }
-
- return ss.str();
-}
-
-int32 MoneyStringToMoney(const std::string& moneyString)
-{
- int32 money = 0;
-
- if (!(std::count(moneyString.begin(), moneyString.end(), 'g') == 1 ||
- std::count(moneyString.begin(), moneyString.end(), 's') == 1 ||
- std::count(moneyString.begin(), moneyString.end(), 'c') == 1))
- return 0; // Bad format
-
- Tokenizer tokens(moneyString, ' ');
- for (Tokenizer::const_iterator itr = tokens.begin(); itr != tokens.end(); ++itr)
- {
- std::string tokenString(*itr);
- size_t gCount = std::count(tokenString.begin(), tokenString.end(), 'g');
- size_t sCount = std::count(tokenString.begin(), tokenString.end(), 's');
- size_t cCount = std::count(tokenString.begin(), tokenString.end(), 'c');
- if (gCount + sCount + cCount != 1)
- return 0;
-
- uint32 amount = atoi(*itr);
- if (gCount == 1)
- money += amount * 100 * 100;
- else if (sCount == 1)
- money += amount * 100;
- else if (cCount == 1)
- money += amount;
- }
-
- return money;
-}
-
-uint32 TimeStringToSecs(const std::string& timestring)
-{
- uint32 secs = 0;
- uint32 buffer = 0;
- uint32 multiplier = 0;
-
- for (std::string::const_iterator itr = timestring.begin(); itr != timestring.end(); ++itr)
- {
- if (isdigit(*itr))
- {
- buffer*=10;
- buffer+= (*itr)-'0';
- }
- else
- {
- switch (*itr)
- {
- case 'd': multiplier = DAY; break;
- case 'h': multiplier = HOUR; break;
- case 'm': multiplier = MINUTE; break;
- case 's': multiplier = 1; break;
- default : return 0; //bad format
- }
- buffer*=multiplier;
- secs+=buffer;
- buffer=0;
- }
- }
-
- return secs;
-}
-
-std::string TimeToTimestampStr(time_t t)
-{
- tm aTm;
- localtime_r(&t, &aTm);
- // YYYY year
- // MM month (2 digits 01-12)
- // DD day (2 digits 01-31)
- // HH hour (2 digits 00-23)
- // MM minutes (2 digits 00-59)
- // SS seconds (2 digits 00-59)
- char buf[20];
- snprintf(buf, 20, "%04d-%02d-%02d_%02d-%02d-%02d", aTm.tm_year+1900, aTm.tm_mon+1, aTm.tm_mday, aTm.tm_hour, aTm.tm_min, aTm.tm_sec);
- return std::string(buf);
-}
-
-/// Check if the string is a valid ip address representation
-bool IsIPAddress(char const* ipaddress)
-{
- if (!ipaddress)
- return false;
-
- // Let the big boys do it.
- // Drawback: all valid ip address formats are recognized e.g.: 12.23, 121234, 0xABCD)
- return inet_addr(ipaddress) != INADDR_NONE;
-}
-
-/// create PID file
-uint32 CreatePIDFile(const std::string& filename)
-{
- FILE* pid_file = fopen (filename.c_str(), "w" );
- if (pid_file == NULL)
- return 0;
-
-#ifdef _WIN32
- DWORD pid = GetCurrentProcessId();
-#else
- pid_t pid = getpid();
-#endif
-
- fprintf(pid_file, "%u", pid );
- fclose(pid_file);
-
- return (uint32)pid;
-}
-
-size_t utf8length(std::string& utf8str)
-{
- try
- {
- return utf8::distance(utf8str.c_str(), utf8str.c_str()+utf8str.size());
- }
- catch(std::exception)
- {
- utf8str.clear();
- return 0;
- }
-}
-
-void utf8truncate(std::string& utf8str, size_t len)
-{
- try
- {
- size_t wlen = utf8::distance(utf8str.c_str(), utf8str.c_str()+utf8str.size());
- if (wlen <= len)
- return;
-
- std::wstring wstr;
- wstr.resize(wlen);
- utf8::utf8to16(utf8str.c_str(), utf8str.c_str()+utf8str.size(), &wstr[0]);
- wstr.resize(len);
- char* oend = utf8::utf16to8(wstr.c_str(), wstr.c_str()+wstr.size(), &utf8str[0]);
- utf8str.resize(oend-(&utf8str[0])); // remove unused tail
- }
- catch(std::exception)
- {
- utf8str.clear();
- }
-}
-
-bool Utf8toWStr(char const* utf8str, size_t csize, wchar_t* wstr, size_t& wsize)
-{
- try
- {
- size_t len = utf8::distance(utf8str, utf8str+csize);
- if (len > wsize)
- {
- if (wsize > 0)
- wstr[0] = L'\0';
- wsize = 0;
- return false;
- }
-
- wsize = len;
- utf8::utf8to16(utf8str, utf8str+csize, wstr);
- wstr[len] = L'\0';
- }
- catch(std::exception)
- {
- if (wsize > 0)
- wstr[0] = L'\0';
- wsize = 0;
- return false;
- }
-
- return true;
-}
-
-bool Utf8toWStr(const std::string& utf8str, std::wstring& wstr)
-{
- try
- {
- if (size_t len = utf8::distance(utf8str.c_str(), utf8str.c_str()+utf8str.size()))
- {
- wstr.resize(len);
- utf8::utf8to16(utf8str.c_str(), utf8str.c_str()+utf8str.size(), &wstr[0]);
- }
- }
- catch(std::exception)
- {
- wstr.clear();
- return false;
- }
-
- return true;
-}
-
-bool WStrToUtf8(wchar_t* wstr, size_t size, std::string& utf8str)
-{
- try
- {
- std::string utf8str2;
- utf8str2.resize(size*4); // allocate for most long case
-
- if (size)
- {
- char* oend = utf8::utf16to8(wstr, wstr+size, &utf8str2[0]);
- utf8str2.resize(oend-(&utf8str2[0])); // remove unused tail
- }
- utf8str = utf8str2;
- }
- catch(std::exception)
- {
- utf8str.clear();
- return false;
- }
-
- return true;
-}
-
-bool WStrToUtf8(std::wstring const& wstr, std::string& utf8str)
-{
- try
- {
- std::string utf8str2;
- utf8str2.resize(wstr.size()*4); // allocate for most long case
-
- if (wstr.size())
- {
- char* oend = utf8::utf16to8(wstr.c_str(), wstr.c_str()+wstr.size(), &utf8str2[0]);
- utf8str2.resize(oend-(&utf8str2[0])); // remove unused tail
- }
- utf8str = utf8str2;
- }
- catch(std::exception)
- {
- utf8str.clear();
- return false;
- }
-
- return true;
-}
-
-typedef wchar_t const* const* wstrlist;
-
-std::wstring GetMainPartOfName(std::wstring const& wname, uint32 declension)
-{
- // supported only Cyrillic cases
- if (wname.size() < 1 || !isCyrillicCharacter(wname[0]) || declension > 5)
- return wname;
-
- // Important: end length must be <= MAX_INTERNAL_PLAYER_NAME-MAX_PLAYER_NAME (3 currently)
-
- static wchar_t const a_End[] = { wchar_t(1), wchar_t(0x0430), wchar_t(0x0000)};
- static wchar_t const o_End[] = { wchar_t(1), wchar_t(0x043E), wchar_t(0x0000)};
- static wchar_t const ya_End[] = { wchar_t(1), wchar_t(0x044F), wchar_t(0x0000)};
- static wchar_t const ie_End[] = { wchar_t(1), wchar_t(0x0435), wchar_t(0x0000)};
- static wchar_t const i_End[] = { wchar_t(1), wchar_t(0x0438), wchar_t(0x0000)};
- static wchar_t const yeru_End[] = { wchar_t(1), wchar_t(0x044B), wchar_t(0x0000)};
- static wchar_t const u_End[] = { wchar_t(1), wchar_t(0x0443), wchar_t(0x0000)};
- static wchar_t const yu_End[] = { wchar_t(1), wchar_t(0x044E), wchar_t(0x0000)};
- static wchar_t const oj_End[] = { wchar_t(2), wchar_t(0x043E), wchar_t(0x0439), wchar_t(0x0000)};
- static wchar_t const ie_j_End[] = { wchar_t(2), wchar_t(0x0435), wchar_t(0x0439), wchar_t(0x0000)};
- static wchar_t const io_j_End[] = { wchar_t(2), wchar_t(0x0451), wchar_t(0x0439), wchar_t(0x0000)};
- static wchar_t const o_m_End[] = { wchar_t(2), wchar_t(0x043E), wchar_t(0x043C), wchar_t(0x0000)};
- static wchar_t const io_m_End[] = { wchar_t(2), wchar_t(0x0451), wchar_t(0x043C), wchar_t(0x0000)};
- static wchar_t const ie_m_End[] = { wchar_t(2), wchar_t(0x0435), wchar_t(0x043C), wchar_t(0x0000)};
- static wchar_t const soft_End[] = { wchar_t(1), wchar_t(0x044C), wchar_t(0x0000)};
- static wchar_t const j_End[] = { wchar_t(1), wchar_t(0x0439), wchar_t(0x0000)};
-
- static wchar_t const* const dropEnds[6][8] = {
- { &a_End[1], &o_End[1], &ya_End[1], &ie_End[1], &soft_End[1], &j_End[1], NULL, NULL },
- { &a_End[1], &ya_End[1], &yeru_End[1], &i_End[1], NULL, NULL, NULL, NULL },
- { &ie_End[1], &u_End[1], &yu_End[1], &i_End[1], NULL, NULL, NULL, NULL },
- { &u_End[1], &yu_End[1], &o_End[1], &ie_End[1], &soft_End[1], &ya_End[1], &a_End[1], NULL },
- { &oj_End[1], &io_j_End[1], &ie_j_End[1], &o_m_End[1], &io_m_End[1], &ie_m_End[1], &yu_End[1], NULL },
- { &ie_End[1], &i_End[1], NULL, NULL, NULL, NULL, NULL, NULL }
- };
-
- for (wchar_t const* const* itr = &dropEnds[declension][0]; *itr; ++itr)
- {
- size_t len = size_t((*itr)[-1]); // get length from string size field
-
- if (wname.substr(wname.size()-len, len)==*itr)
- return wname.substr(0, wname.size()-len);
- }
-
- return wname;
-}
-
-bool utf8ToConsole(const std::string& utf8str, std::string& conStr)
-{
-#if PLATFORM == PLATFORM_WINDOWS
- std::wstring wstr;
- if (!Utf8toWStr(utf8str, wstr))
- return false;
-
- conStr.resize(wstr.size());
- CharToOemBuffW(&wstr[0], &conStr[0], wstr.size());
-#else
- // not implemented yet
- conStr = utf8str;
-#endif
-
- return true;
-}
-
-bool consoleToUtf8(const std::string& conStr, std::string& utf8str)
-{
-#if PLATFORM == PLATFORM_WINDOWS
- std::wstring wstr;
- wstr.resize(conStr.size());
- OemToCharBuffW(&conStr[0], &wstr[0], conStr.size());
-
- return WStrToUtf8(wstr, utf8str);
-#else
- // not implemented yet
- utf8str = conStr;
- return true;
-#endif
-}
-
-bool Utf8FitTo(const std::string& str, std::wstring const& search)
-{
- std::wstring temp;
-
- if (!Utf8toWStr(str, temp))
- return false;
-
- // converting to lower case
- wstrToLower( temp );
-
- if (temp.find(search) == std::wstring::npos)
- return false;
-
- return true;
-}
-
-void utf8printf(FILE* out, const char *str, ...)
-{
- va_list ap;
- va_start(ap, str);
- vutf8printf(out, str, &ap);
- va_end(ap);
-}
-
-void vutf8printf(FILE* out, const char *str, va_list* ap)
-{
-#if PLATFORM == PLATFORM_WINDOWS
- char temp_buf[32*1024];
- wchar_t wtemp_buf[32*1024];
-
- size_t temp_len = vsnprintf(temp_buf, 32*1024, str, *ap);
- //vsnprintf returns -1 if the buffer is too small
- if (temp_len == size_t(-1))
- temp_len = 32*1024-1;
-
- size_t wtemp_len = 32*1024-1;
- Utf8toWStr(temp_buf, temp_len, wtemp_buf, wtemp_len);
-
- CharToOemBuffW(&wtemp_buf[0], &temp_buf[0], wtemp_len+1);
- fprintf(out, "%s", temp_buf);
-#else
- vfprintf(out, str, *ap);
-#endif
-}
-
-std::string ByteArrayToHexStr(uint8 const* bytes, uint32 arrayLen, bool reverse /* = false */)
-{
- int32 init = 0;
- int32 end = arrayLen;
- int8 op = 1;
-
- if (reverse)
- {
- init = arrayLen - 1;
- end = -1;
- op = -1;
- }
-
- std::ostringstream ss;
- for (int32 i = init; i != end; i += op)
- {
- char buffer[4];
- sprintf(buffer, "%02X", bytes[i]);
- ss << buffer;
- }
-
- return ss.str();
-}
diff --git a/src/server/shared/Utilities/Util.h b/src/server/shared/Utilities/Util.h
deleted file mode 100644
index 3da1c800410..00000000000
--- a/src/server/shared/Utilities/Util.h
+++ /dev/null
@@ -1,545 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
- *
- * 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 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef _UTIL_H
-#define _UTIL_H
-
-#include "Define.h"
-#include "Errors.h"
-
-#include <algorithm>
-#include <string>
-#include <vector>
-#include <list>
-#include <map>
-
-// Searcher for map of structs
-template<typename T, class S> struct Finder
-{
- T val_;
- T S::* idMember_;
-
- Finder(T val, T S::* idMember) : val_(val), idMember_(idMember) {}
- bool operator()(const std::pair<int, S> &obj) { return obj.second.*idMember_ == val_; }
-};
-
-class Tokenizer
-{
-public:
- typedef std::vector<char const*> StorageType;
-
- typedef StorageType::size_type size_type;
-
- typedef StorageType::const_iterator const_iterator;
- typedef StorageType::reference reference;
- typedef StorageType::const_reference const_reference;
-
-public:
- Tokenizer(const std::string &src, char const sep, uint32 vectorReserve = 0);
- ~Tokenizer() { delete[] m_str; }
-
- const_iterator begin() const { return m_storage.begin(); }
- const_iterator end() const { return m_storage.end(); }
-
- size_type size() const { return m_storage.size(); }
-
- reference operator [] (size_type i) { return m_storage[i]; }
- const_reference operator [] (size_type i) const { return m_storage[i]; }
-
-private:
- char* m_str;
- StorageType m_storage;
-};
-
-void stripLineInvisibleChars(std::string &src);
-
-int32 MoneyStringToMoney(const std::string& moneyString);
-
-struct tm* localtime_r(const time_t* time, struct tm *result);
-
-std::string secsToTimeString(uint64 timeInSecs, bool shortText = false, bool hoursOnly = false);
-uint32 TimeStringToSecs(const std::string& timestring);
-std::string TimeToTimestampStr(time_t t);
-
-/* Return a random number in the range min..max. */
-int32 irand(int32 min, int32 max);
-
-/* Return a random number in the range min..max (inclusive). */
-uint32 urand(uint32 min, uint32 max);
-
-/* Return a random number in the range 0 .. UINT32_MAX. */
-uint32 rand32();
-
-/* Return a random number in the range min..max */
-float frand(float min, float max);
-
-/* Return a random double from 0.0 to 1.0 (exclusive). */
-double rand_norm();
-
-/* Return a random double from 0.0 to 100.0 (exclusive). */
-double rand_chance();
-
-/* Return true if a random roll fits in the specified chance (range 0-100). */
-inline bool roll_chance_f(float chance)
-{
- return chance > rand_chance();
-}
-
-/* Return true if a random roll fits in the specified chance (range 0-100). */
-inline bool roll_chance_i(int chance)
-{
- return chance > irand(0, 99);
-}
-
-inline void ApplyPercentModFloatVar(float& var, float val, bool apply)
-{
- if (val == -100.0f) // prevent set var to zero
- val = -99.99f;
- var *= (apply ? (100.0f + val) / 100.0f : 100.0f / (100.0f + val));
-}
-
-// Percentage calculation
-template <class T, class U>
-inline T CalculatePct(T base, U pct)
-{
- return T(base * static_cast<float>(pct) / 100.0f);
-}
-
-template <class T, class U>
-inline T AddPct(T &base, U pct)
-{
- return base += CalculatePct(base, pct);
-}
-
-template <class T, class U>
-inline T ApplyPct(T &base, U pct)
-{
- return base = CalculatePct(base, pct);
-}
-
-template <class T>
-inline T RoundToInterval(T& num, T floor, T ceil)
-{
- return num = std::min(std::max(num, floor), ceil);
-}
-
-// UTF8 handling
-bool Utf8toWStr(const std::string& utf8str, std::wstring& wstr);
-// in wsize==max size of buffer, out wsize==real string size
-bool Utf8toWStr(char const* utf8str, size_t csize, wchar_t* wstr, size_t& wsize);
-inline bool Utf8toWStr(const std::string& utf8str, wchar_t* wstr, size_t& wsize)
-{
- return Utf8toWStr(utf8str.c_str(), utf8str.size(), wstr, wsize);
-}
-
-bool WStrToUtf8(std::wstring const& wstr, std::string& utf8str);
-// size==real string size
-bool WStrToUtf8(wchar_t* wstr, size_t size, std::string& utf8str);
-
-size_t utf8length(std::string& utf8str); // set string to "" if invalid utf8 sequence
-void utf8truncate(std::string& utf8str, size_t len);
-
-inline bool isBasicLatinCharacter(wchar_t wchar)
-{
- if (wchar >= L'a' && wchar <= L'z') // LATIN SMALL LETTER A - LATIN SMALL LETTER Z
- return true;
- if (wchar >= L'A' && wchar <= L'Z') // LATIN CAPITAL LETTER A - LATIN CAPITAL LETTER Z
- return true;
- return false;
-}
-
-inline bool isExtendedLatinCharacter(wchar_t wchar)
-{
- if (isBasicLatinCharacter(wchar))
- return true;
- if (wchar >= 0x00C0 && wchar <= 0x00D6) // LATIN CAPITAL LETTER A WITH GRAVE - LATIN CAPITAL LETTER O WITH DIAERESIS
- return true;
- if (wchar >= 0x00D8 && wchar <= 0x00DE) // LATIN CAPITAL LETTER O WITH STROKE - LATIN CAPITAL LETTER THORN
- return true;
- if (wchar == 0x00DF) // LATIN SMALL LETTER SHARP S
- return true;
- if (wchar >= 0x00E0 && wchar <= 0x00F6) // LATIN SMALL LETTER A WITH GRAVE - LATIN SMALL LETTER O WITH DIAERESIS
- return true;
- if (wchar >= 0x00F8 && wchar <= 0x00FE) // LATIN SMALL LETTER O WITH STROKE - LATIN SMALL LETTER THORN
- return true;
- if (wchar >= 0x0100 && wchar <= 0x012F) // LATIN CAPITAL LETTER A WITH MACRON - LATIN SMALL LETTER I WITH OGONEK
- return true;
- if (wchar == 0x1E9E) // LATIN CAPITAL LETTER SHARP S
- return true;
- return false;
-}
-
-inline bool isCyrillicCharacter(wchar_t wchar)
-{
- if (wchar >= 0x0410 && wchar <= 0x044F) // CYRILLIC CAPITAL LETTER A - CYRILLIC SMALL LETTER YA
- return true;
- if (wchar == 0x0401 || wchar == 0x0451) // CYRILLIC CAPITAL LETTER IO, CYRILLIC SMALL LETTER IO
- return true;
- return false;
-}
-
-inline bool isEastAsianCharacter(wchar_t wchar)
-{
- if (wchar >= 0x1100 && wchar <= 0x11F9) // Hangul Jamo
- return true;
- if (wchar >= 0x3041 && wchar <= 0x30FF) // Hiragana + Katakana
- return true;
- if (wchar >= 0x3131 && wchar <= 0x318E) // Hangul Compatibility Jamo
- return true;
- if (wchar >= 0x31F0 && wchar <= 0x31FF) // Katakana Phonetic Ext.
- return true;
- if (wchar >= 0x3400 && wchar <= 0x4DB5) // CJK Ideographs Ext. A
- return true;
- if (wchar >= 0x4E00 && wchar <= 0x9FC3) // Unified CJK Ideographs
- return true;
- if (wchar >= 0xAC00 && wchar <= 0xD7A3) // Hangul Syllables
- return true;
- if (wchar >= 0xFF01 && wchar <= 0xFFEE) // Halfwidth forms
- return true;
- return false;
-}
-
-inline bool isNumeric(wchar_t wchar)
-{
- return (wchar >= L'0' && wchar <=L'9');
-}
-
-inline bool isNumeric(char c)
-{
- return (c >= '0' && c <='9');
-}
-
-inline bool isNumeric(char const* str)
-{
- for (char const* c = str; *c; ++c)
- if (!isNumeric(*c))
- return false;
-
- return true;
-}
-
-inline bool isNumericOrSpace(wchar_t wchar)
-{
- return isNumeric(wchar) || wchar == L' ';
-}
-
-inline bool isBasicLatinString(const std::wstring &wstr, bool numericOrSpace)
-{
- for (size_t i = 0; i < wstr.size(); ++i)
- if (!isBasicLatinCharacter(wstr[i]) && (!numericOrSpace || !isNumericOrSpace(wstr[i])))
- return false;
- return true;
-}
-
-inline bool isExtendedLatinString(const std::wstring &wstr, bool numericOrSpace)
-{
- for (size_t i = 0; i < wstr.size(); ++i)
- if (!isExtendedLatinCharacter(wstr[i]) && (!numericOrSpace || !isNumericOrSpace(wstr[i])))
- return false;
- return true;
-}
-
-inline bool isCyrillicString(const std::wstring &wstr, bool numericOrSpace)
-{
- for (size_t i = 0; i < wstr.size(); ++i)
- if (!isCyrillicCharacter(wstr[i]) && (!numericOrSpace || !isNumericOrSpace(wstr[i])))
- return false;
- return true;
-}
-
-inline bool isEastAsianString(const std::wstring &wstr, bool numericOrSpace)
-{
- for (size_t i = 0; i < wstr.size(); ++i)
- if (!isEastAsianCharacter(wstr[i]) && (!numericOrSpace || !isNumericOrSpace(wstr[i])))
- return false;
- return true;
-}
-
-inline wchar_t wcharToUpper(wchar_t wchar)
-{
- if (wchar >= L'a' && wchar <= L'z') // LATIN SMALL LETTER A - LATIN SMALL LETTER Z
- return wchar_t(uint16(wchar)-0x0020);
- if (wchar == 0x00DF) // LATIN SMALL LETTER SHARP S
- return wchar_t(0x1E9E);
- if (wchar >= 0x00E0 && wchar <= 0x00F6) // LATIN SMALL LETTER A WITH GRAVE - LATIN SMALL LETTER O WITH DIAERESIS
- return wchar_t(uint16(wchar)-0x0020);
- if (wchar >= 0x00F8 && wchar <= 0x00FE) // LATIN SMALL LETTER O WITH STROKE - LATIN SMALL LETTER THORN
- return wchar_t(uint16(wchar)-0x0020);
- if (wchar >= 0x0101 && wchar <= 0x012F) // LATIN SMALL LETTER A WITH MACRON - LATIN SMALL LETTER I WITH OGONEK (only %2=1)
- {
- if (wchar % 2 == 1)
- return wchar_t(uint16(wchar)-0x0001);
- }
- if (wchar >= 0x0430 && wchar <= 0x044F) // CYRILLIC SMALL LETTER A - CYRILLIC SMALL LETTER YA
- return wchar_t(uint16(wchar)-0x0020);
- if (wchar == 0x0451) // CYRILLIC SMALL LETTER IO
- return wchar_t(0x0401);
-
- return wchar;
-}
-
-inline wchar_t wcharToUpperOnlyLatin(wchar_t wchar)
-{
- return isBasicLatinCharacter(wchar) ? wcharToUpper(wchar) : wchar;
-}
-
-inline wchar_t wcharToLower(wchar_t wchar)
-{
- if (wchar >= L'A' && wchar <= L'Z') // LATIN CAPITAL LETTER A - LATIN CAPITAL LETTER Z
- return wchar_t(uint16(wchar)+0x0020);
- if (wchar >= 0x00C0 && wchar <= 0x00D6) // LATIN CAPITAL LETTER A WITH GRAVE - LATIN CAPITAL LETTER O WITH DIAERESIS
- return wchar_t(uint16(wchar)+0x0020);
- if (wchar >= 0x00D8 && wchar <= 0x00DE) // LATIN CAPITAL LETTER O WITH STROKE - LATIN CAPITAL LETTER THORN
- return wchar_t(uint16(wchar)+0x0020);
- if (wchar >= 0x0100 && wchar <= 0x012E) // LATIN CAPITAL LETTER A WITH MACRON - LATIN CAPITAL LETTER I WITH OGONEK (only %2=0)
- {
- if (wchar % 2 == 0)
- return wchar_t(uint16(wchar)+0x0001);
- }
- if (wchar == 0x1E9E) // LATIN CAPITAL LETTER SHARP S
- return wchar_t(0x00DF);
- if (wchar == 0x0401) // CYRILLIC CAPITAL LETTER IO
- return wchar_t(0x0451);
- if (wchar >= 0x0410 && wchar <= 0x042F) // CYRILLIC CAPITAL LETTER A - CYRILLIC CAPITAL LETTER YA
- return wchar_t(uint16(wchar)+0x0020);
-
- return wchar;
-}
-
-inline void wstrToUpper(std::wstring& str)
-{
- std::transform( str.begin(), str.end(), str.begin(), wcharToUpper );
-}
-
-inline void wstrToLower(std::wstring& str)
-{
- std::transform( str.begin(), str.end(), str.begin(), wcharToLower );
-}
-
-std::wstring GetMainPartOfName(std::wstring const& wname, uint32 declension);
-
-bool utf8ToConsole(const std::string& utf8str, std::string& conStr);
-bool consoleToUtf8(const std::string& conStr, std::string& utf8str);
-bool Utf8FitTo(const std::string& str, std::wstring const& search);
-void utf8printf(FILE* out, const char *str, ...);
-void vutf8printf(FILE* out, const char *str, va_list* ap);
-
-bool IsIPAddress(char const* ipaddress);
-
-uint32 CreatePIDFile(const std::string& filename);
-
-std::string ByteArrayToHexStr(uint8 const* bytes, uint32 length, bool reverse = false);
-
-// simple class for not-modifyable list
-template <typename T>
-class HookList
-{
- typedef typename std::list<T>::iterator ListIterator;
- private:
- typename std::list<T> m_list;
- public:
- HookList<T> & operator+=(T t)
- {
- m_list.push_back(t);
- return *this;
- }
- HookList<T> & operator-=(T t)
- {
- m_list.remove(t);
- return *this;
- }
- size_t size()
- {
- return m_list.size();
- }
- ListIterator begin()
- {
- return m_list.begin();
- }
- ListIterator end()
- {
- return m_list.end();
- }
-};
-
-class flag96
-{
-private:
- uint32 part[3];
-
-public:
- flag96(uint32 p1 = 0, uint32 p2 = 0, uint32 p3 = 0)
- {
- part[0] = p1;
- part[1] = p2;
- part[2] = p3;
- }
-
- inline bool IsEqual(uint32 p1 = 0, uint32 p2 = 0, uint32 p3 = 0) const
- {
- return (part[0] == p1 && part[1] == p2 && part[2] == p3);
- }
-
- inline bool HasFlag(uint32 p1 = 0, uint32 p2 = 0, uint32 p3 = 0) const
- {
- return (part[0] & p1 || part[1] & p2 || part[2] & p3);
- }
-
- inline void Set(uint32 p1 = 0, uint32 p2 = 0, uint32 p3 = 0)
- {
- part[0] = p1;
- part[1] = p2;
- part[2] = p3;
- }
-
- inline bool operator <(const flag96 &right) const
- {
- for (uint8 i = 3; i > 0; --i)
- {
- if (part[i - 1] < right.part[i - 1])
- return true;
- else if (part[i - 1] > right.part[i - 1])
- return false;
- }
- return false;
- }
-
- inline bool operator ==(const flag96 &right) const
- {
- return
- (
- part[0] == right.part[0] &&
- part[1] == right.part[1] &&
- part[2] == right.part[2]
- );
- }
-
- inline bool operator !=(const flag96 &right) const
- {
- return !this->operator ==(right);
- }
-
- inline flag96 & operator =(const flag96 &right)
- {
- part[0] = right.part[0];
- part[1] = right.part[1];
- part[2] = right.part[2];
- return *this;
- }
-
- inline flag96 operator &(const flag96 &right) const
- {
- return flag96(part[0] & right.part[0], part[1] & right.part[1],
- part[2] & right.part[2]);
- }
-
- inline flag96 & operator &=(const flag96 &right)
- {
- part[0] &= right.part[0];
- part[1] &= right.part[1];
- part[2] &= right.part[2];
- return *this;
- }
-
- inline flag96 operator |(const flag96 &right) const
- {
- return flag96(part[0] | right.part[0], part[1] | right.part[1],
- part[2] | right.part[2]);
- }
-
- inline flag96 & operator |=(const flag96 &right)
- {
- part[0] |= right.part[0];
- part[1] |= right.part[1];
- part[2] |= right.part[2];
- return *this;
- }
-
- inline flag96 operator ~() const
- {
- return flag96(~part[0], ~part[1], ~part[2]);
- }
-
- inline flag96 operator ^(const flag96 &right) const
- {
- return flag96(part[0] ^ right.part[0], part[1] ^ right.part[1],
- part[2] ^ right.part[2]);
- }
-
- inline flag96 & operator ^=(const flag96 &right)
- {
- part[0] ^= right.part[0];
- part[1] ^= right.part[1];
- part[2] ^= right.part[2];
- return *this;
- }
-
- inline operator bool() const
- {
- return (part[0] != 0 || part[1] != 0 || part[2] != 0);
- }
-
- inline bool operator !() const
- {
- return !this->operator bool();
- }
-
- inline uint32 & operator [](uint8 el)
- {
- return part[el];
- }
-
- inline const uint32 & operator [](uint8 el) const
- {
- return part[el];
- }
-};
-
-enum ComparisionType
-{
- COMP_TYPE_EQ = 0,
- COMP_TYPE_HIGH,
- COMP_TYPE_LOW,
- COMP_TYPE_HIGH_EQ,
- COMP_TYPE_LOW_EQ,
- COMP_TYPE_MAX
-};
-
-template <class T>
-bool CompareValues(ComparisionType type, T val1, T val2)
-{
- switch (type)
- {
- case COMP_TYPE_EQ:
- return val1 == val2;
- case COMP_TYPE_HIGH:
- return val1 > val2;
- case COMP_TYPE_LOW:
- return val1 < val2;
- case COMP_TYPE_HIGH_EQ:
- return val1 >= val2;
- case COMP_TYPE_LOW_EQ:
- return val1 <= val2;
- default:
- // incorrect parameter
- ASSERT(false);
- return false;
- }
-}
-
-#endif