![]() |
Miam-Player
0.8.0
A nice music player
|
#include <stdio.h>#include <string>#include <vector>Go to the source code of this file.
Macros | |
| #define | FACTORY_REGISTER(BASE, _ID, NAME) FACTORY_REGISTER_ID_TYPE(BASE, BASE##Id_##_ID, BASE##_ID, NAME) |
| A: Suppose we need a factory for class MyClass. More... | |
| #define | FACTORY_REGISTER_ID_TYPE(BASE, ID, TYPE, NAME) |
| #define | FACTORY_REGISTER_ID_AUTO(BASE, _ID, NAME) FACTORY_REGISTER_ID_TYPE_AUTO(BASE, BASE##Id_##_ID, BASE##_ID, NAME) |
| #define | FACTORY_REGISTER_ID_MAN(BASE, _ID, NAME) FACTORY_REGISTER_ID_TYPE_MAN(BASE, BASE##Id_##_ID, BASE##_ID, NAME) |
| #define | FACTORY_REGISTER_ID_TYPE_MAN(BASE, ID, TYPE, NAME) |
| #define | FACTORY_REGISTER_ID_TYPE_AUTO(BASE, ID, TYPE, NAME) |
| #define | FACTORY_DECLARE(T) FACTORY_DECLARE_ID(T, T##Id) |
| #define | FACTORY_DECLARE_ID(T, ID) |
| #define | FACTORY_DEFINE(T) FACTORY_DEFINE_ID(T, T##Id) |
| #define | FACTORY_DEFINE_ID(T, ID) |
| #define FACTORY_DECLARE | ( | T | ) | FACTORY_DECLARE_ID(T, T##Id) |
| #define FACTORY_DECLARE_ID | ( | T, | |
| ID | |||
| ) |
| #define FACTORY_DEFINE | ( | T | ) | FACTORY_DEFINE_ID(T, T##Id) |
| #define FACTORY_DEFINE_ID | ( | T, | |
| ID | |||
| ) |
| #define FACTORY_REGISTER | ( | BASE, | |
| _ID, | |||
| NAME | |||
| ) | FACTORY_REGISTER_ID_TYPE(BASE, BASE##Id_##_ID, BASE##_ID, NAME) |
A: Suppose we need a factory for class MyClass.
We can query a derived class of MyClass from factory by an id type MyClassId. To create the factory, just 2 steps
To create and register a new subclass MyClassSubA with it's id 0. In MyClassTypes.h (Usually just include this is enough to use the factory. And MyClassXXX.{h,cpp} can NOT include this file), MyClassSubA's ID: extern Q_AV_EXPORT MyClassId MyClassId_SubA; In MyClassTypes.cpp, define the id value: MyClassId MyClassId_SubA = some_value; We define the id in MyClassTypes.cpp because MyClassSubA may not be compiled(e.g. platform dependent features), but the id must be defined.
B: If MyClass and it's factory already exist in the library and you want to add a new subclass without changing the library, just create MyClassSubA.cpp with the content:
#include "MyClass.h"
#include "QtAV/private/prepost.h" //for PRE_FUNC_ADD()
MyClassId MyClassId_SubA = some_value; //it can be used somewhere else as "extern"
FACTORY_REGISTER_ID_AUTO(MyClass, SubA, "SubA's name")
void RegisterMyClassSubA_Man() //call it when you need as "extern"
{
FACTORY_REGISTER_ID_MAN(MyClass, SubA, "SubA's name")
}
class MyClassSubA : public MyClass
{
...
};
| #define FACTORY_REGISTER_ID_AUTO | ( | BASE, | |
| _ID, | |||
| NAME | |||
| ) | FACTORY_REGISTER_ID_TYPE_AUTO(BASE, BASE##Id_##_ID, BASE##_ID, NAME) |
| #define FACTORY_REGISTER_ID_MAN | ( | BASE, | |
| _ID, | |||
| NAME | |||
| ) | FACTORY_REGISTER_ID_TYPE_MAN(BASE, BASE##Id_##_ID, BASE##_ID, NAME) |
| #define FACTORY_REGISTER_ID_TYPE | ( | BASE, | |
| ID, | |||
| TYPE, | |||
| NAME | |||
| ) |
| #define FACTORY_REGISTER_ID_TYPE_AUTO | ( | BASE, | |
| ID, | |||
| TYPE, | |||
| NAME | |||
| ) |
| #define FACTORY_REGISTER_ID_TYPE_MAN | ( | BASE, | |
| ID, | |||
| TYPE, | |||
| NAME | |||
| ) |