diff --git a/src/common/Module.cpp b/src/common/Module.cpp index 4621ad0e3..049da4052 100644 --- a/src/common/Module.cpp +++ b/src/common/Module.cpp @@ -60,11 +60,6 @@ namespace love Module *Module::instances[] = {}; -Module::Module() - : moduleType(M_INVALID) -{ -} - Module::~Module() { ModuleRegistry ®istry = registryInstance(); @@ -79,15 +74,14 @@ Module::~Module() } } + // Same deal with Module::getModuleType(). + for (int i = 0; i < (int) M_MAX_ENUM; i++) + { + if (instances[i] == this) + instances[i] = nullptr; + } + freeEmptyRegistry(); - - if (instances[moduleType] == this) - instances[moduleType] = nullptr; -} - -Module::ModuleType Module::getModuleType() const -{ - return moduleType; } void Module::registerInstance(Module *instance) @@ -108,12 +102,10 @@ void Module::registerInstance(Module *instance) throw Exception("Module %s already registered!", instance->getName()); } - ModuleType moduletype = instance->getModuleType(); - if (moduletype == M_INVALID) - throw love::Exception("Module %s has an invalid base module type.", instance->getName()); - registry.insert(make_pair(name, instance)); + ModuleType moduletype = instance->getModuleType(); + if (instances[moduletype] != nullptr) { printf("Warning: overwriting module instance %s with new instance %s\n", diff --git a/src/common/Module.h b/src/common/Module.h index a0468c280..9ab6eb67c 100644 --- a/src/common/Module.h +++ b/src/common/Module.h @@ -36,7 +36,6 @@ public: enum ModuleType { - M_INVALID = 0, M_AUDIO, M_EVENT, M_FILESYSTEM, @@ -56,10 +55,12 @@ public: M_MAX_ENUM }; - Module(); virtual ~Module(); - ModuleType getModuleType() const; + /** + * Gets the base type of the module. + **/ + virtual ModuleType getModuleType() const = 0; /** * Gets the name of the module. This is used in case of errors @@ -95,10 +96,6 @@ public: return (T *) instances[type]; } -protected: - - ModuleType moduleType; - private: static Module *instances[M_MAX_ENUM]; diff --git a/src/modules/audio/Audio.cpp b/src/modules/audio/Audio.cpp index fc5efe3f6..e9240add5 100644 --- a/src/modules/audio/Audio.cpp +++ b/src/modules/audio/Audio.cpp @@ -25,11 +25,6 @@ namespace love namespace audio { -Audio::Audio() -{ - moduleType = M_AUDIO; -} - StringMap::Entry Audio::distanceModelEntries[] = { {"none", Audio::DISTANCE_NONE}, diff --git a/src/modules/audio/Audio.h b/src/modules/audio/Audio.h index 24fed7d49..e02cb9700 100644 --- a/src/modules/audio/Audio.h +++ b/src/modules/audio/Audio.h @@ -64,9 +64,11 @@ public: static bool getConstant(const char *in, DistanceModel &out); static bool getConstant(DistanceModel in, const char *&out); - Audio(); virtual ~Audio() {} + // Implements Module. + virtual ModuleType getModuleType() const { return M_AUDIO; } + virtual Source *newSource(love::sound::Decoder *decoder) = 0; virtual Source *newSource(love::sound::SoundData *soundData) = 0; diff --git a/src/modules/event/Event.cpp b/src/modules/event/Event.cpp index 79365f8ba..1c7999ec3 100644 --- a/src/modules/event/Event.cpp +++ b/src/modules/event/Event.cpp @@ -82,7 +82,6 @@ Message *Message::fromLua(lua_State *L, int n) Event::Event() { - moduleType = M_EVENT; mutex = thread::newMutex(); } diff --git a/src/modules/event/Event.h b/src/modules/event/Event.h index 38037edc5..0ef2abaef 100644 --- a/src/modules/event/Event.h +++ b/src/modules/event/Event.h @@ -58,6 +58,9 @@ public: Event(); virtual ~Event(); + // Implements Module. + virtual ModuleType getModuleType() const { return M_EVENT; } + void push(Message *msg); bool poll(Message *&msg); virtual void clear(); diff --git a/src/modules/filesystem/physfs/Filesystem.cpp b/src/modules/filesystem/physfs/Filesystem.cpp index e99e0161f..4c355c06f 100644 --- a/src/modules/filesystem/physfs/Filesystem.cpp +++ b/src/modules/filesystem/physfs/Filesystem.cpp @@ -77,7 +77,6 @@ Filesystem::Filesystem() , fused(false) , fusedSet(false) { - moduleType = M_FILESYSTEM; } Filesystem::~Filesystem() diff --git a/src/modules/filesystem/physfs/Filesystem.h b/src/modules/filesystem/physfs/Filesystem.h index 025da9ac9..2f036a87f 100644 --- a/src/modules/filesystem/physfs/Filesystem.h +++ b/src/modules/filesystem/physfs/Filesystem.h @@ -80,6 +80,8 @@ public: Filesystem(); virtual ~Filesystem(); + // Implements Module. + virtual ModuleType getModuleType() const { return M_FILESYSTEM; } const char *getName() const; void init(const char *arg0); diff --git a/src/modules/font/Font.h b/src/modules/font/Font.h index 271b33841..fbcf4298f 100644 --- a/src/modules/font/Font.h +++ b/src/modules/font/Font.h @@ -40,9 +40,11 @@ class Font : public Module public: - Font() { moduleType = M_FONT; } virtual ~Font() {} + // Implements Module. + virtual ModuleType getModuleType() const { return M_FONT; } + virtual Rasterizer *newRasterizer(Data *data, int size) = 0; virtual Rasterizer *newRasterizer(love::image::ImageData *data, const std::string &glyphs) = 0; virtual Rasterizer *newRasterizer(love::image::ImageData *data, uint32 *glyphs, int length) = 0; diff --git a/src/modules/graphics/Graphics.cpp b/src/modules/graphics/Graphics.cpp index 2e9faf0c3..5688e5650 100644 --- a/src/modules/graphics/Graphics.cpp +++ b/src/modules/graphics/Graphics.cpp @@ -25,11 +25,6 @@ namespace love namespace graphics { -Graphics::Graphics() -{ - moduleType = M_GRAPHICS; -} - Graphics::~Graphics() { } diff --git a/src/modules/graphics/Graphics.h b/src/modules/graphics/Graphics.h index 8bd50b109..ed66de5d2 100644 --- a/src/modules/graphics/Graphics.h +++ b/src/modules/graphics/Graphics.h @@ -120,9 +120,11 @@ public: std::string device; }; - Graphics(); virtual ~Graphics(); + // Implements Module. + virtual ModuleType getModuleType() const { return M_GRAPHICS; } + /** * Sets the current graphics display viewport dimensions. **/ diff --git a/src/modules/image/Image.h b/src/modules/image/Image.h index 9a28100c1..bc2f85646 100644 --- a/src/modules/image/Image.h +++ b/src/modules/image/Image.h @@ -44,9 +44,11 @@ class Image : public Module { public: - Image() { moduleType = M_IMAGE; } virtual ~Image() {} + // Implements Module. + virtual ModuleType getModuleType() const { return M_IMAGE; } + /** * Creates new ImageData from FileData. * @param data The FileData containing the encoded image data. diff --git a/src/modules/joystick/JoystickModule.h b/src/modules/joystick/JoystickModule.h index a85d84b71..8c4ca63ba 100644 --- a/src/modules/joystick/JoystickModule.h +++ b/src/modules/joystick/JoystickModule.h @@ -34,9 +34,11 @@ class JoystickModule : public Module { public: - JoystickModule() { moduleType = M_JOYSTICK; } virtual ~JoystickModule() {} + // Implements Module. + virtual ModuleType getModuleType() const { return M_JOYSTICK; } + /** * Adds a connected Joystick device and opens it for use. * Returns NULL if the Joystick could not be added. diff --git a/src/modules/keyboard/Keyboard.cpp b/src/modules/keyboard/Keyboard.cpp index 1ec604de1..16e93005f 100644 --- a/src/modules/keyboard/Keyboard.cpp +++ b/src/modules/keyboard/Keyboard.cpp @@ -27,11 +27,6 @@ namespace love namespace keyboard { -Keyboard::Keyboard() -{ - moduleType = M_KEYBOARD; -} - bool Keyboard::getConstant(const char *in, Keyboard::Key &out) { return keys.find(in, out); diff --git a/src/modules/keyboard/Keyboard.h b/src/modules/keyboard/Keyboard.h index 01982481a..2ca366d74 100644 --- a/src/modules/keyboard/Keyboard.h +++ b/src/modules/keyboard/Keyboard.h @@ -244,9 +244,11 @@ public: KEY_MAX_ENUM = 512 }; - Keyboard(); virtual ~Keyboard() {} + // Implements Module. + virtual ModuleType getModuleType() const { return M_KEYBOARD; } + /** * Sets whether repeat keypress events should be sent if a key is held down. * Does not affect text input events. diff --git a/src/modules/math/MathModule.cpp b/src/modules/math/MathModule.cpp index e420a32d4..2f92bf075 100644 --- a/src/modules/math/MathModule.cpp +++ b/src/modules/math/MathModule.cpp @@ -87,8 +87,6 @@ Math Math::instance; Math::Math() : rng() { - moduleType = M_MATH; - // prevent the runtime from free()-ing this retain(); } diff --git a/src/modules/math/MathModule.h b/src/modules/math/MathModule.h index e9df716ac..69c80492f 100644 --- a/src/modules/math/MathModule.h +++ b/src/modules/math/MathModule.h @@ -115,6 +115,12 @@ public: **/ BezierCurve *newBezierCurve(const std::vector &points); + // Implements Module. + virtual ModuleType getModuleType() const + { + return M_MATH; + } + virtual const char *getName() const { return "love.math"; diff --git a/src/modules/mouse/Mouse.cpp b/src/modules/mouse/Mouse.cpp index 022b0d1a1..10db0ecd9 100644 --- a/src/modules/mouse/Mouse.cpp +++ b/src/modules/mouse/Mouse.cpp @@ -25,11 +25,6 @@ namespace love namespace mouse { -Mouse::Mouse() -{ - moduleType = M_MOUSE; -} - bool Mouse::getConstant(const char *in, Button &out) { return buttons.find(in, out); diff --git a/src/modules/mouse/Mouse.h b/src/modules/mouse/Mouse.h index 7f9d2421e..389013cfd 100644 --- a/src/modules/mouse/Mouse.h +++ b/src/modules/mouse/Mouse.h @@ -49,9 +49,11 @@ public: BUTTON_MAX_ENUM }; - Mouse(); virtual ~Mouse() {} + // Implements Module. + virtual ModuleType getModuleType() const { return M_MOUSE; } + virtual Cursor *newCursor(love::image::ImageData *data, int hotx, int hoty) = 0; virtual Cursor *getSystemCursor(Cursor::SystemCursor cursortype) = 0; diff --git a/src/modules/physics/box2d/Physics.cpp b/src/modules/physics/box2d/Physics.cpp index 819f92c85..96bc49424 100644 --- a/src/modules/physics/box2d/Physics.cpp +++ b/src/modules/physics/box2d/Physics.cpp @@ -33,11 +33,6 @@ namespace box2d int Physics::meter = Physics::DEFAULT_METER; -Physics::Physics() -{ - moduleType = M_PHYSICS; -} - const char *Physics::getName() const { return "love.physics.box2d"; diff --git a/src/modules/physics/box2d/Physics.h b/src/modules/physics/box2d/Physics.h index af64288b5..2b82f7c5d 100644 --- a/src/modules/physics/box2d/Physics.h +++ b/src/modules/physics/box2d/Physics.h @@ -61,10 +61,9 @@ public: **/ static const int DEFAULT_METER = 30; - Physics(); - // Implements Module. const char *getName() const; + virtual ModuleType getModuleType() const { return M_PHYSICS; } /** * Creates a new World. diff --git a/src/modules/sound/Sound.cpp b/src/modules/sound/Sound.cpp index daaca0d11..afe4199d5 100644 --- a/src/modules/sound/Sound.cpp +++ b/src/modules/sound/Sound.cpp @@ -25,11 +25,6 @@ namespace love namespace sound { -Sound::Sound() -{ - moduleType = M_SOUND; -} - Sound::~Sound() { } diff --git a/src/modules/sound/Sound.h b/src/modules/sound/Sound.h index aa2a2b99b..b6b093f18 100644 --- a/src/modules/sound/Sound.h +++ b/src/modules/sound/Sound.h @@ -42,9 +42,11 @@ class Sound : public Module public: - Sound(); virtual ~Sound(); + // Implements Module. + virtual ModuleType getModuleType() const { return M_SOUND; } + /** * Creates new SoundData from a decoder. Fully expands the * encoded sound data into raw sound data. Not recommended diff --git a/src/modules/system/System.cpp b/src/modules/system/System.cpp index 428c8ca44..dd74c120f 100755 --- a/src/modules/system/System.cpp +++ b/src/modules/system/System.cpp @@ -41,11 +41,6 @@ namespace love namespace system { -System::System() -{ - moduleType = M_SYSTEM; -} - std::string System::getOS() const { #if defined(LOVE_MACOSX) diff --git a/src/modules/system/System.h b/src/modules/system/System.h index bb24b1304..58eff3356 100644 --- a/src/modules/system/System.h +++ b/src/modules/system/System.h @@ -48,9 +48,11 @@ public: POWER_MAX_ENUM }; - System(); virtual ~System() {} + // Implements Module. + virtual ModuleType getModuleType() const { return M_SYSTEM; } + /** * Gets the current operating system. **/ diff --git a/src/modules/thread/ThreadModule.cpp b/src/modules/thread/ThreadModule.cpp index 02649faa2..6e433bcbf 100644 --- a/src/modules/thread/ThreadModule.cpp +++ b/src/modules/thread/ThreadModule.cpp @@ -25,11 +25,6 @@ namespace love namespace thread { -ThreadModule::ThreadModule() -{ - moduleType = M_THREAD; -} - LuaThread *ThreadModule::newThread(const std::string &name, love::Data *data) { LuaThread *lt = new LuaThread(name, data); diff --git a/src/modules/thread/ThreadModule.h b/src/modules/thread/ThreadModule.h index 5170f2cc1..9fe0bcaa8 100644 --- a/src/modules/thread/ThreadModule.h +++ b/src/modules/thread/ThreadModule.h @@ -42,7 +42,6 @@ class ThreadModule : public love::Module { public: - ThreadModule(); virtual ~ThreadModule() {} virtual LuaThread *newThread(const std::string &name, love::Data *data); virtual Channel *newChannel(); @@ -50,6 +49,7 @@ public: // Implements Module. virtual const char *getName() const; + virtual ModuleType getModuleType() const { return M_THREAD; } }; // ThreadModule diff --git a/src/modules/timer/Timer.h b/src/modules/timer/Timer.h index 1d1e125df..9290f7ba0 100644 --- a/src/modules/timer/Timer.h +++ b/src/modules/timer/Timer.h @@ -33,9 +33,11 @@ class Timer : public Module { public: - Timer() { moduleType = M_TIMER; } virtual ~Timer() {} + // Implements Module. + virtual ModuleType getModuleType() const { return M_TIMER; } + /** * Measures the time between this call and the previous call, * and updates internal values accordinly. diff --git a/src/modules/window/Window.cpp b/src/modules/window/Window.cpp index b258a9f17..87a8d14fe 100644 --- a/src/modules/window/Window.cpp +++ b/src/modules/window/Window.cpp @@ -28,11 +28,6 @@ namespace window Window *Window::singleton = nullptr; -Window::Window() -{ - moduleType = M_WINDOW; -} - Window::~Window() { if (singleton == this) diff --git a/src/modules/window/Window.h b/src/modules/window/Window.h index 1aeb87e68..393d51fec 100644 --- a/src/modules/window/Window.h +++ b/src/modules/window/Window.h @@ -75,9 +75,11 @@ public: int height; }; - Window(); virtual ~Window(); + // Implements Module. + virtual ModuleType getModuleType() const { return M_WINDOW; } + virtual bool setWindow(int width = 800, int height = 600, WindowSettings *settings = nullptr) = 0; virtual void getWindow(int &width, int &height, WindowSettings &settings) = 0;