From ed69bd450536f2cc89330525537c9e2d1fe77739 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Wed, 26 Jul 2017 13:23:46 +0200 Subject: [PATCH] feat(app): add new source folder with object base --- src/object/object.h | 60 ++++++++++++++++++++++++++++++++++++++++++ src/object/singleton.h | 51 +++++++++++++++++++++++++++++++++++ src/utils/general.h | 49 ++++++++++++++++++++++++++++++++++ 3 files changed, 160 insertions(+) create mode 100644 src/object/object.h create mode 100644 src/object/singleton.h create mode 100644 src/utils/general.h diff --git a/src/object/object.h b/src/object/object.h new file mode 100644 index 000000000..b957d97f5 --- /dev/null +++ b/src/object/object.h @@ -0,0 +1,60 @@ +/* + * object.h + * Copyright (C) 2017 Belledonne Communications SARL + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * 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 . + */ + +#ifndef _OBJECT_H_ +#define _OBJECT_H_ + +#include "utils/general.h" + +// ============================================================================= + +namespace Linphone { + class Object; + + class ObjectPrivate { + public: + virtual ~ObjectPrivate () = default; + + protected: + Object *mPublic = nullptr; + + private: + L_DECLARE_PUBLIC(Object); + }; + + class Object { + public: + virtual ~Object () { + delete mPrivate; + } + + protected: + explicit Object (ObjectPrivate *objectPrivate) : mPrivate(objectPrivate) { + if (mPrivate) + mPrivate->mPublic = this; + } + + ObjectPrivate *mPrivate = nullptr; + + private: + L_DECLARE_PRIVATE(Object); + L_DISABLE_COPY(Object); + }; +} + +#endif // ifndef _OBJECT_H_ diff --git a/src/object/singleton.h b/src/object/singleton.h new file mode 100644 index 000000000..37506542d --- /dev/null +++ b/src/object/singleton.h @@ -0,0 +1,51 @@ +/* + * singleton.h + * Copyright (C) 2017 Belledonne Communications SARL + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * 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 . + */ + +#ifndef _SINGLETON_H_ +#define _SINGLETON_H_ + +#include "object.h" + +// ============================================================================= + +namespace Linphone { + template + class Singleton : public Object { + public: + static Singleton *getInstance () { + if (!mInstance) + mInstance = new Singleton(); + return mInstance; + } + + virtual ~Singleton () = default; + + protected: + explicit Singleton (ObjectPrivate *objectPrivate = nullptr) : Object(objectPrivate) {} + + private: + static Singleton *mInstance; + + L_DISABLE_COPY(Singleton); + }; + + template + Singleton *Singleton::mInstance = nullptr; +} + +#endif // ifndef _SINGLETON_H_ diff --git a/src/utils/general.h b/src/utils/general.h new file mode 100644 index 000000000..0fc5afe6f --- /dev/null +++ b/src/utils/general.h @@ -0,0 +1,49 @@ +/* + * general.h + * Copyright (C) 2017 Belledonne Communications SARL + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * 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 . + */ + +// ============================================================================= + +#ifndef _GENERAL_H_ +#define _GENERAL_H_ + +#define L_DECLARE_PRIVATE(CLASS) \ + inline CLASS ## Private * getPrivate() { \ + return reinterpret_cast(mPrivate); \ + } \ + inline const CLASS ## Private *getPrivate() const { \ + return reinterpret_cast(mPrivate); \ + } \ + friend class CLASS ## Private; + +#define L_DECLARE_PUBLIC(CLASS) \ + inline CLASS * getPublic() { \ + return static_cast(mPublic); \ + } \ + inline const CLASS *getPublic() const { \ + return static_cast(mPublic); \ + } \ + friend class CLASS; + +#define L_DISABLE_COPY(CLASS) \ + CLASS(const CLASS &) = delete; \ + CLASS &operator= (const CLASS &) = delete; + +#define L_D(CLASS) CLASS ## Private * const d = getPrivate(); +#define L_Q(CLASS) CLASS * const q = getPublic(); + +#endif // ifndef _GENERAL_H_