Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

AGS: AGS engine for ScummVM #2738

Merged
merged 215 commits into from Feb 7, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
215 commits
Select commit Hold shift + click to select a range
5fd66b0
AGS: Skeleton engine
dreammaster Nov 21, 2020
a0977d0
AGS: Added std class implementations and allegro stubs
dreammaster Nov 21, 2020
bcb91b6
AGS: Initial addition of engine/ and shared/ folders
dreammaster Nov 21, 2020
0185d6f
AGS: Adding ScummVM comment headers
dreammaster Nov 21, 2020
5130eb3
AGS: Cleaning up header file guard defines
dreammaster Nov 21, 2020
49b1418
COMMON: Added WeakPtr class, refactored SharedPtr
dreammaster Nov 16, 2020
c59ad88
AGS: Run astyle formatting
dreammaster Nov 21, 2020
6e714a7
AGS: Wrapping headers in an AGS3 namespace
dreammaster Nov 21, 2020
530dd50
AGS: Changing Common namespace to Shared
dreammaster Nov 22, 2020
189d752
AGS: Adding AGS3 namespace to cpp files
dreammaster Nov 22, 2020
1dba242
AGS: Added shared/util/ folder
dreammaster Nov 22, 2020
1fae11d
AGS: Added shared/script/
dreammaster Nov 22, 2020
276d14b
AGS: Adding shared/gui/ folder
dreammaster Nov 22, 2020
185baf4
AGS: Added shared/gfx/ and support code
dreammaster Nov 23, 2020
e4aa265
AGS: Move allegro from stubs/ to lib/
dreammaster Nov 23, 2020
63bc633
AGS: Added shared/ac/ folder
dreammaster Nov 23, 2020
7f8f3c3
AGS: Added shared/core/ folder
dreammaster Nov 23, 2020
3afa102
AGS: Added shared/debugging/ folder
dreammaster Nov 23, 2020
2aacd28
AGS: Adding shared/game/ folder
dreammaster Nov 23, 2020
1b9ac49
AGS: Beginnings of engine/ inclusion
dreammaster Nov 23, 2020
8c2a877
AGS: Added engine/gui/ folder
dreammaster Nov 24, 2020
ee27727
AGS: Added engine/game/ folder
dreammaster Nov 24, 2020
0c80547
AGS: Added engine/font/ folder
dreammaster Nov 24, 2020
797404b
AGS: Added engine/platform/ folder
dreammaster Nov 24, 2020
e05f33b
AGS: Added engine/plugin/ folder
dreammaster Nov 24, 2020
6840ccb
AGS: Adding engine/script/ folder
dreammaster Nov 24, 2020
1983274
AGS: gcc compilation fixes
dreammaster Nov 24, 2020
19bc381
AGS: Added engine/gfx/ folder
dreammaster Nov 25, 2020
5ee48e1
AGS: Warning fixes
dreammaster Nov 26, 2020
fd79c78
AGS: Fix some const loss warnings
dreammaster Nov 26, 2020
551daa2
AGS: Added engine/device/ folder
dreammaster Nov 26, 2020
6ca4c13
AGS: Added engine/debugging/ folder
dreammaster Nov 26, 2020
b976165
AGS: gcc warning fixes
dreammaster Nov 26, 2020
055c956
AGS: std::set implementation now derives from Common::SortedArray
dreammaster Nov 26, 2020
0edf5d2
AGS: Added engine/ac/dynobj/ folder
dreammaster Nov 26, 2020
a2c3fff
AGS: Added engine/ac/statobj/ folder
dreammaster Nov 26, 2020
c710fdd
AGS: Added engine/ac/ folder
dreammaster Nov 26, 2020
fbba7ea
AGS: Warning fixes
dreammaster Nov 27, 2020
5b50e26
AGS: Added shared/font/ folder
dreammaster Nov 27, 2020
0667973
AGS: Added engine/media/audio/ folder
dreammaster Nov 28, 2020
1cd7015
AGS: Added engine/media/video/ folder
dreammaster Nov 28, 2020
465680c
AGS: Move std/ folder into lib/
dreammaster Nov 28, 2020
7360c5c
AGS: Added platform driver
dreammaster Nov 28, 2020
fcc7310
AGS: Added lib/hq2x/ folder
dreammaster Nov 28, 2020
aab28c1
AGS: Add missing files from engine/ac/ to project
dreammaster Nov 28, 2020
805bb30
AGS: Added shared/game/main_game_file.cpp to project
dreammaster Nov 28, 2020
e875b1d
AGS: Added shared/util/stdio_compat.cpp to project
dreammaster Nov 28, 2020
9ff3723
AGS: Add in missing code to project
dreammaster Nov 28, 2020
686d763
AGS: Added stubs for DUH player
dreammaster Nov 28, 2020
244ec94
AGS: Adding DUMBFILE methods to project
dreammaster Nov 28, 2020
b20315f
AGS: Add missing dll stub methods to project
dreammaster Nov 28, 2020
98060a7
AGS: Added color blending methods
dreammaster Nov 28, 2020
82ea9ef
AGS: Adding missing methods
dreammaster Nov 28, 2020
b7e2339
AGS: Added missing allegro gfx methods
dreammaster Nov 28, 2020
8841151
AGS: Further adding missing code
dreammaster Nov 28, 2020
34a9dbc
AGS: Add further missing lib/ code
dreammaster Nov 29, 2020
03dc7de
AGS: Add overall main code
dreammaster Nov 29, 2020
71076e2
AGS: Fix global objects crashing ScummVM on startup
dreammaster Nov 29, 2020
b12b2e3
AGS: Remove mistake settings from configure.engine
dreammaster Nov 29, 2020
5deca14
AGS: gcc compilation fixes
dreammaster Nov 29, 2020
a0f5cef
AGS: Fix a bunch of warnings about const loss
dreammaster Nov 29, 2020
d9e3945
AGS: Further gcc warning fixes
dreammaster Nov 29, 2020
7dadc02
AGS: Add detection for Black Cauldron Remake
dreammaster Nov 29, 2020
cdbc115
AGS: Further const loss warning fixes
dreammaster Nov 29, 2020
9813464
AGS: Fix const warnings in macro expansions
dreammaster Nov 29, 2020
705dc17
AGS: Get game filename from detection entry
dreammaster Nov 30, 2020
596147f
AGS: Add tests as an optional sub-engine
dreammaster Nov 30, 2020
6ab5c61
AGS: Remove directory logic from startup
dreammaster Dec 3, 2020
cd863d0
AGS: Fix directory/file exists methods
dreammaster Dec 30, 2020
fbd4f7b
AGS: Fix specifying game filename
dreammaster Dec 30, 2020
d502830
AGS: Fix opening game filename
dreammaster Dec 31, 2020
32828d3
AGS: Fix tyring to read config file when not present
dreammaster Dec 31, 2020
93ad5ad
AGS: Fix ustrsize stub
dreammaster Dec 31, 2020
a7ef150
AGS: Create ScummVM SYSTEM_DRIVER
dreammaster Dec 31, 2020
3c67c20
AGS: Change sound method stubs from errors to warnings
dreammaster Jan 1, 2021
8d36018
AGS: Set up digi driver detection
dreammaster Jan 1, 2021
4d737fd
AGS: Further fixes for audio init
dreammaster Jan 1, 2021
2786d14
AGS: Properly load fonts via asset manager
dreammaster Jan 4, 2021
ffc5a8c
AGS: Fixes for setup of screen resolutions
dreammaster Jan 4, 2021
c747d79
AGS: Fix creating and clearing bitmaps
dreammaster Jan 4, 2021
70dcabd
AGS: Implement glGetIntegerv method
dreammaster Jan 4, 2021
9d36ccb
AGS: Implement load_pcx method
dreammaster Jan 4, 2021
072ed14
AGS: Allow paletted bitmaps in create_bitmap_ex method
dreammaster Jan 4, 2021
0b9e7f6
AGS: Initialize screen with the needed resolution
dreammaster Jan 6, 2021
f029e6f
AGS: Fix returning GetColorDepth for paletted surfaces
dreammaster Jan 10, 2021
72500fe
AGS: Switch to using software graphics driver
dreammaster Jan 10, 2021
680016c
AGS: Rename software graphics driver to ScummVM
dreammaster Jan 10, 2021
7136301
AGS: Adding ScummVM graphics init code
dreammaster Jan 10, 2021
fa09f4f
AGS: Fix writing initial save state
dreammaster Jan 10, 2021
577d434
AGS: Implement draw_trans_sprite method
dreammaster Jan 10, 2021
0863707
AGS: Fixes to WaitForNextFrame
dreammaster Jan 10, 2021
9a109d7
AGS: Implemented keyboard/mouse event handlers
dreammaster Jan 10, 2021
cea0cf3
AGS: Palette fixes
dreammaster Jan 11, 2021
1392cb5
AGS: Another fix for getting bitmap color depths
dreammaster Jan 11, 2021
c073e93
AGS: Implemented Allegro PACKFILE
dreammaster Jan 11, 2021
1726bc0
AGS: Remove deprecated MIDI_DRIVER
dreammaster Jan 11, 2021
3a52732
AGS: Implemented ScummVM MIDI music player
dreammaster Jan 11, 2021
af50a85
AGS: Fix shutdown crash in set_gfx_mode
dreammaster Jan 11, 2021
44faee5
AGS: Added detection for AGDI KQ2
dreammaster Jan 11, 2021
e29846e
AGS: Added detection for A Tale of Two Kingdoms
dreammaster Jan 11, 2021
9c7f7a3
AGS: Added framework for implementing AGS plugin DLLs in code
dreammaster Jan 11, 2021
dcc0077
AGS: Add script method stubs for AgsCreditZ
dreammaster Jan 11, 2021
79cb66e
AGS: Set ManagedSurface palette when blitting to screen
dreammaster Jan 12, 2021
96b1b43
AGS: Reimplement std::map from scratch
dreammaster Jan 12, 2021
4f4c43e
AGS: Set palette if needed for other blitting methods
dreammaster Jan 12, 2021
33c9c5f
AGS: Implement clipping methods, fixing rendering of text dialogs
dreammaster Jan 12, 2021
67ca16c
AGS: Hook up ScummVM window close to exit game
dreammaster Jan 12, 2021
d28e3e3
AGS: Fix free after delete in PosixLibrary unload
dreammaster Jan 13, 2021
107d3f9
AGS: Disable save_config_file
dreammaster Jan 13, 2021
1071c77
AGS: Allow graceful exit after call to quit
dreammaster Jan 13, 2021
c204d13
AGS: Set the transparent color on all created surfaces
dreammaster Jan 13, 2021
c873761
AGS: Handle sprite transparency for cursors
dreammaster Jan 13, 2021
ab76748
AGS: Implementing drawing code used by pathfinder
dreammaster Jan 13, 2021
1aa01a4
AGS: Fix closing ScummVM window on title screen
dreammaster Jan 13, 2021
d891e63
AGS: Fix cursor palette intensity
dreammaster Jan 13, 2021
9747bd4
AGS: Added engine methods for load/save game
dreammaster Jan 14, 2021
33040ca
AGS: Adding saveilfe support to FileStream
dreammaster Jan 14, 2021
55abddf
AGS: Fixing keys - upper/lowercase, function keys, etc
dreammaster Jan 14, 2021
096fdc2
AGS: Simplifying passing of script method params to DLL class
dreammaster Jan 14, 2021
46f0503
AGS: Saves now has dummy path for clarity, added MetaEngine listSaves
dreammaster Jan 15, 2021
cbd2b36
AGS: Sound cleanup and hookup to ScummVM decoders
dreammaster Jan 17, 2021
d67e097
AGS: Remove deprecated audio classes
dreammaster Jan 17, 2021
13d61c1
AGS: Change some TODO warnings to comments
dreammaster Jan 17, 2021
d28f68c
AGS: Implement select_palette & unselect_palette
dreammaster Jan 17, 2021
c79ba8d
AGS: Corrections to saving games
dreammaster Jan 17, 2021
208503c
AGS: Show fatal errors in a GUI message dialog
dreammaster Jan 17, 2021
68835f3
AGS: Fix for writing audio to savegames
dreammaster Jan 17, 2021
84258bc
AGS: Don't allow audio streams to free cached sound data
dreammaster Jan 17, 2021
824e20a
AGS: gcc compilation fixes
dreammaster Jan 17, 2021
23d1c94
AGS: Properly handle transparent pixels in item z order
dreammaster Jan 18, 2021
8849e29
AGS: Add AGS credits section
dreammaster Jan 18, 2021
9d496da
AGS: Don't show GUI message on exit
dreammaster Jan 18, 2021
fe6784e
AGS: Implement horizontally flipped sprite draw
dreammaster Jan 18, 2021
c51d958
AGS: Matching keycodes to Allegro in original
dreammaster Jan 18, 2021
e70cd3b
AGS: Fix assert on ClearRect with invalid coordinates
dreammaster Jan 18, 2021
8977ad4
AGS: Fix unreachable code warnings
dreammaster Jan 18, 2021
82c458a
AGS: Fix some overflow warnings
dreammaster Jan 18, 2021
375a6a9
AGS: Fix more unreachable code warnings
dreammaster Jan 18, 2021
361a91d
AGS: Beginnings of new Globals class
dreammaster Jan 18, 2021
b7ffc3b
AGS: Mark engine with 16bit requirement
dreammaster Jan 18, 2021
b673255
AGS: Move globals from ags.cpp to Globals
dreammaster Jan 18, 2021
a2614ff
AGS: Move quit globals into Globals
dreammaster Jan 18, 2021
6bb7ba4
AGS: Move mouse globals to Globals
dreammaster Jan 19, 2021
1a9e9b6
AGS: Move debugger globals to Globals
dreammaster Jan 19, 2021
549294d
AGS: Fix spurious bool comparisons
dreammaster Jan 20, 2021
6852be9
AGS: Use empty() rather than size() == 0
dreammaster Jan 20, 2021
c9aab47
AGS: Compilation fix when tests are enabled
dreammaster Jan 20, 2021
3b8911a
AGS: Fix games that write to files in the game folder
dreammaster Jan 21, 2021
c1ebd58
AGS: Implement bitmap saving code needed by KQ2
dreammaster Jan 21, 2021
dcd9cef
AGS: Fix black box & gfx issues in ATOTK
dreammaster Jan 22, 2021
c0f5a39
AGS: Implemented Theora video player
dreammaster Jan 22, 2021
1d40f5e
AGS: Add some more detection entries
criezy Jan 22, 2021
898f3f2
AGS: Add override keyword
criezy Jan 22, 2021
9736e28
AGS: Use ScummVM endian macros
criezy Jan 22, 2021
83d36e5
AGS: Fix ReadDialogs for some AGS versions on 64 bit systems
criezy Jan 23, 2021
ef1533a
AGS: Remove redundant virtual keywords when override is present
dreammaster Jan 23, 2021
26bb2da
AGS: Match the 32-bit PixelFormat to decoded bitmaps
dreammaster Jan 23, 2021
eb09c31
AGS: Move plugins/ folder into AGS3 namespace
dreammaster Jan 23, 2021
fc00837
AGS: Fix compilation of VS 64-bit builds
dreammaster Jan 23, 2021
dd69a28
AGS: Allow plugins onEvent 64-bit pointers
dreammaster Jan 23, 2021
ce19017
AGS: Tentative draw_lit_sprite implementation
dreammaster Jan 23, 2021
5826597
AGS: Fix compilation when theoradec is disabled
criezy Jan 23, 2021
6c2afc4
AGS: Fix out of bound crossfade volume
criezy Jan 23, 2021
c6ae319
AGS: Change game folder consts from String to const char *
dreammaster Jan 24, 2021
854eda2
AGS: Fix mapping folder macros like $
dreammaster Jan 24, 2021
0796484
AGS: Framework for specifying a specific plugin version a game needs
dreammaster Jan 24, 2021
14cb959
AGS: Initial import of unmodified other plugins source
dreammaster Jan 24, 2021
017ca18
AGS: Added AGSFlashlight plugin
dreammaster Jan 24, 2021
fdb0784
AGS: Fix volume range in SOUNDCLIP::get_volume
criezy Jan 24, 2021
370fc7d
AGS: Fix game data parser for versions between 2.6 and 2.7.1
criezy Jan 24, 2021
0cf456e
AGS: Added AGSBlend plugin
dreammaster Jan 24, 2021
627e8b5
AGS: Added AGSPalRender plugin
dreammaster Jan 25, 2021
f944d60
AGS: Added AGSParallax plugin
dreammaster Jan 25, 2021
df8ef24
AGS: Make AGSParallax plugin endian safe
dreammaster Jan 25, 2021
0cf6825
AGS: Added AGSSnowRain plugin
dreammaster Jan 25, 2021
72c560f
AGS: Made AGSSnowRain endian safe
dreammaster Jan 25, 2021
01907c8
AGS: Change AGSParallax plugin to use save serializer
dreammaster Jan 25, 2021
536f8d2
AGS: Added AGSSpriteFont plugin
dreammaster Jan 25, 2021
7bb7bcf
AGS: gcc compilation fixes
dreammaster Jan 25, 2021
35c2b0f
AGS: Merged engine/plugin/ into plugins/ folder
dreammaster Jan 26, 2021
b9c86d9
AGS: Added AGSCredits 1.1 SetCredits method
dreammaster Jan 26, 2021
09d8966
AGS: Implementing AGSCreditz ScrollCredits
dreammaster Jan 27, 2021
4405e64
AGS: Hook up loading savegames from launcher
dreammaster Jan 27, 2021
732ed93
AGS: Added savegame thumbnails
dreammaster Jan 27, 2021
ad3d03c
AGS: Implement GMM saving & loading
dreammaster Jan 28, 2021
84ef104
AGS: Cleanup of transparency color in Allegro stubs
dreammaster Jan 28, 2021
a7e7857
GRAPHICS: Allow ManagedSurface blitting to ignore transparency
dreammaster Jan 30, 2021
e886398
GRAPHICS: ManagedSurface transBlitFrom ignore alpha matching transColor
dreammaster Jan 30, 2021
1bff970
AGS: Fix rendering of player in KQ2+
dreammaster Jan 30, 2021
cfd1208
AGS: Added fallback detector
dreammaster Jan 30, 2021
8083b34
AGS: Added tool to scan folders and build detection entries
dreammaster Jan 31, 2021
bbb252c
AGS: Fixes for game scanner tool
dreammaster Jan 31, 2021
9f70c2b
AGS: Added all games from agsarchives.com to detection table
dreammaster Jan 31, 2021
7bb49a1
AGS: Fix compiler warnings
dreammaster Jan 31, 2021
470028e
AGS: Add listing of some pre-2.5 games to game scanner
dreammaster Feb 1, 2021
cb0bf50
AGS: In progress adding pre-2.5 AGS game detection entries
dreammaster Feb 1, 2021
6b8b05a
AGS: More pre 2.5 detection entries
dreammaster Feb 2, 2021
3228a50
AGS: Further groupings for detection table
dreammaster Feb 2, 2021
0d7a78b
AGS: Cleanup of demo detection entries
dreammaster Feb 2, 2021
f67e9f7
AGS: Savegame screenshots now exclude in-game save dialogs
dreammaster Feb 3, 2021
c20eaab
AGS: Cleanup of qfg2 vga detection entries
dreammaster Feb 3, 2021
064d1ae
AGS: Added AGS contributors to credits.pl
dreammaster Feb 3, 2021
f3a23d2
AGS: Minor detection table cleanups
dreammaster Feb 3, 2021
ce5f324
AGS: Show md5 when AGS game found in fallbackDetect
dreammaster Feb 3, 2021
f5f299e
AGS: Further separate methods in two AgsCreditz classes
dreammaster Feb 3, 2021
0dd6589
AGS: Implemented AGSCreditz overall script methods
dreammaster Feb 4, 2021
cf662a0
AGS: Methods to read/write arrays that have safe save/load methods
dreammaster Feb 4, 2021
0feb060
AGS: Further cleaning up read/write structure arrays
dreammaster Feb 4, 2021
79c129b
AGS: Fix savegame magic number to match standalone savegames
dreammaster Feb 4, 2021
afbb9ab
AGS: Starting to add AgsCreditz 2.0 support methods
dreammaster Feb 4, 2021
32d7858
AGS: SHow GUI error dialog for unsupported games
dreammaster Feb 5, 2021
c25451f
GRAPHICS: Support 24-bit surfaces as dest for blitFrom
dreammaster Feb 5, 2021
19350d1
AGS: Fix starting up early 2.5 paletted games
dreammaster Feb 5, 2021
b60a629
AGS: Remove unused local
dreammaster Feb 7, 2021
c0abf0b
AGS: Fix std::unordered_map insert to ignore duplicates
dreammaster Feb 7, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
313 changes: 221 additions & 92 deletions common/ptr.h
Expand Up @@ -38,16 +38,16 @@ namespace Common {
* @{
*/

class SharedPtrDeletionInternal {
class BasePtrDeletionInternal {
public:
virtual ~SharedPtrDeletionInternal() {}
virtual ~BasePtrDeletionInternal() {}
};

template<class T>
class SharedPtrDeletionImpl : public SharedPtrDeletionInternal {
class BasePtrDeletionImpl : public BasePtrDeletionInternal {
public:
SharedPtrDeletionImpl(T *ptr) : _ptr(ptr) {}
~SharedPtrDeletionImpl() {
BasePtrDeletionImpl(T *ptr) : _ptr(ptr) {}
~BasePtrDeletionImpl() {
STATIC_ASSERT(sizeof(T) > 0, SharedPtr_cannot_delete_incomplete_type);
delete _ptr;
}
Expand All @@ -56,15 +56,180 @@ class SharedPtrDeletionImpl : public SharedPtrDeletionInternal {
};

template<class T, class DL>
class SharedPtrDeletionDeleterImpl : public SharedPtrDeletionInternal {
class BasePtrDeletionDeleterImpl : public BasePtrDeletionInternal {
public:
SharedPtrDeletionDeleterImpl(T *ptr, DL d) : _ptr(ptr), _deleter(d) {}
~SharedPtrDeletionDeleterImpl() { _deleter(_ptr); }
BasePtrDeletionDeleterImpl(T *ptr, DL d) : _ptr(ptr), _deleter(d) {}
~BasePtrDeletionDeleterImpl() { _deleter(_ptr); }
private:
T *_ptr;
DL _deleter;
};

/**
* A base class for both SharedPtr and WeakPtr.
*
* This base class encapsulates the logic for the reference counter
* used by both.
*/
template<class T>
class BasePtr : public SafeBool<BasePtr<T> > {
#if !defined(__GNUC__) || GCC_ATLEAST(3, 0)
template<class T2> friend class BasePtr;
#endif
public:
typedef int RefValue;
typedef T ValueType;
typedef T *PointerType;
typedef T &ReferenceType;

BasePtr() : _refCount(nullptr), _deletion(nullptr), _pointer(nullptr) {
}

explicit BasePtr(nullptr_t) : _refCount(nullptr), _deletion(nullptr), _pointer(nullptr) {
}

template<class T2>
explicit BasePtr(T2 *p) : _refCount(new RefValue(1)), _deletion(new BasePtrDeletionImpl<T2>(p)), _pointer(p) {
}

template<class T2, class DL>
BasePtr(T2 *p, DL d) : _refCount(new RefValue(1)), _deletion(new BasePtrDeletionDeleterImpl<T2, DL>(p, d)), _pointer(p) {
}

BasePtr(const BasePtr &r) : _refCount(r._refCount), _deletion(r._deletion), _pointer(r._pointer) {
if (_refCount)
++(*_refCount);
}
template<class T2>
BasePtr(const BasePtr<T2> &r) : _refCount(r._refCount), _deletion(r._deletion), _pointer(r._pointer) {
if (_refCount) ++(*_refCount);
}

~BasePtr() {
decRef();
}

/**
* Implicit conversion operator to bool for convenience, to make
* checks like "if (sharedPtr) ..." possible.
*/
bool operator_bool() const {
return _pointer != nullptr;
}

/**
* Returns the number of references to the assigned pointer.
* This should just be used for debugging purposes.
*/
RefValue refCount() const {
return _refCount ? *_refCount : 0;
}

/**
* Returns whether the referenced object isn't valid
*/
bool expired() const {
return !_refCount;
}

/**
* Checks if the object is the only object refering
* to the assigned pointer. This should just be used for
* debugging purposes.
*/
bool unique() const {
return refCount() == 1;
}

BasePtr &operator=(const BasePtr &r) {
reset(r);
return *this;
}

template<class T2>
BasePtr &operator=(const BasePtr<T2> &r) {
reset(r);
return *this;
}

/**
* Resets the object to a NULL pointer.
*/
void reset() {
decRef();
_deletion = nullptr;
_refCount = nullptr;
_pointer = nullptr;
}

/**
* Resets the object to the specified pointer
*/
void reset(const BasePtr &r) {
if (r._refCount)
++(*r._refCount);
decRef();

_refCount = r._refCount;
_deletion = r._deletion;
_pointer = r._pointer;
}

/**
* Resets the object to the specified pointer
*/
template<class T2>
void reset(const BasePtr<T2> &r) {
if (r._refCount)
++(*r._refCount);
decRef();

_refCount = r._refCount;
_deletion = r._deletion;
_pointer = r._pointer;
}

/**
* Resets the object to the specified pointer
*/
void reset(T *ptr) {
reset(BasePtr<T>(ptr));
}

protected:
RefValue *_refCount;
BasePtrDeletionInternal *_deletion;
PointerType _pointer;
protected:
/**
* Decrements the reference count to the stored pointer, and deletes it if
* there are no longer any references to it
*/
void decRef() {
if (_refCount) {
--(*_refCount);
if (!*_refCount) {
delete _refCount;
delete _deletion;
_deletion = nullptr;
_refCount = nullptr;
_pointer = nullptr;
}
}
}

/**
* Increments the reference count to the stored pointer
*/
void incRef() {
if (_refCount)
++*_refCount;
}
};

template<class T>
class WeakPtr;

/**
* A simple shared pointer implementation modelled after boost.
*
Expand All @@ -84,7 +249,7 @@ class SharedPtrDeletionDeleterImpl : public SharedPtrDeletionInternal {
* as for a normal pointer. If you need to access the plain pointer value
* itself later on use the get method. The class also supplies a operator
* ->, which does the same as the -> operator on a normal pointer.
*
*
* Be sure you are using new to initialize the pointer you want to manage.
* If you do not use new for allocating, you have to supply a deleter as
* second parameter when creating a SharedPtr object. The deleter has to
Expand All @@ -107,123 +272,87 @@ class SharedPtrDeletionDeleterImpl : public SharedPtrDeletionInternal {
* a plain pointer is only possible via SharedPtr::get.
*/
template<class T>
class SharedPtr : public SafeBool<SharedPtr<T> > {
#if !defined(__GNUC__) || GCC_ATLEAST(3, 0)
template<class T2> friend class SharedPtr;
#endif
class SharedPtr : public BasePtr<T> {
public:
typedef int RefValue;
typedef T ValueType;
typedef T *PointerType;
typedef T &ReferenceType;
using ReferenceType = typename BasePtr<T>::ReferenceType;
using PointerType = typename BasePtr<T>::PointerType;

SharedPtr() : _refCount(nullptr), _deletion(nullptr), _pointer(nullptr) {}

template<class T2>
explicit SharedPtr(T2 *p) : _refCount(new RefValue(1)), _deletion(new SharedPtrDeletionImpl<T2>(p)), _pointer(p) {}
SharedPtr() : BasePtr<T>() {
}

template<class T2, class DL>
SharedPtr(T2 *p, DL d) : _refCount(new RefValue(1)), _deletion(new SharedPtrDeletionDeleterImpl<T2, DL>(p, d)), _pointer(p) {}
SharedPtr(nullptr_t) : BasePtr<T>() {
}

SharedPtr(const SharedPtr &r) : _refCount(r._refCount), _deletion(r._deletion), _pointer(r._pointer) { if (_refCount) ++(*_refCount); }
template<class T2>
SharedPtr(const SharedPtr<T2> &r) : _refCount(r._refCount), _deletion(r._deletion), _pointer(r._pointer) { if (_refCount) ++(*_refCount); }

~SharedPtr() { decRef(); }
explicit SharedPtr(T2 *p) : BasePtr<T>(p) {
}

SharedPtr &operator=(const SharedPtr &r) {
if (r._refCount)
++(*r._refCount);
decRef();
template<class T2, class DL>
SharedPtr(T2 *p, DL d) : BasePtr<T>(p, d) {
}

_refCount = r._refCount;
_deletion = r._deletion;
_pointer = r._pointer;
SharedPtr(const SharedPtr<T> &r) : BasePtr<T>(r) {
}

return *this;
SharedPtr(const WeakPtr<T> &r) : BasePtr<T>(r) {
}

template<class T2>
SharedPtr &operator=(const SharedPtr<T2> &r) {
if (r._refCount)
++(*r._refCount);
decRef();

_refCount = r._refCount;
_deletion = r._deletion;
_pointer = r._pointer;

return *this;
SharedPtr(const SharedPtr<T2> &r) : BasePtr<T>(r) {
}

ReferenceType operator*() const { assert(_pointer); return *_pointer; }
PointerType operator->() const { assert(_pointer); return _pointer; }
T &operator*() const { assert(this->_pointer); return *this->_pointer; }
T *operator->() const { assert(this->_pointer); return this->_pointer; }

/**
* Returns the plain pointer value. Be sure you know what you
* do if you are continuing to use that pointer.
*
* @return the pointer the SharedPtr object manages
*/
PointerType get() const { return _pointer; }
PointerType get() const { return this->_pointer; }

/**
* Implicit conversion operator to bool for convenience, to make
* checks like "if (sharedPtr) ..." possible.
*/
bool operator_bool() const { return _pointer != nullptr; }
template<class T2>
bool operator==(const SharedPtr<T2> &r) const {
return this->_pointer == r.get();
}

/**
* Checks if the SharedPtr object is the only object refering
* to the assigned pointer. This should just be used for
* debugging purposes.
*/
bool unique() const { return refCount() == 1; }
template<class T2>
bool operator!=(const SharedPtr<T2> &r) const {
return this->_pointer != r.get();
}
};

/**
* Resets the SharedPtr object to a NULL pointer.
*/
void reset() {
decRef();
_deletion = nullptr;
_refCount = nullptr;
_pointer = nullptr;
/**
* Implements a smart pointer that holds a non-owning ("weak") refrence to
* a pointer. It needs to be converted to a SharedPtr to access it.
*/
template<class T>
class WeakPtr : public BasePtr<T> {
public:
WeakPtr() : BasePtr<T>() {
}

WeakPtr(nullptr_t) : BasePtr<T>() {
}

template<class T2>
bool operator==(const SharedPtr<T2> &r) const {
return _pointer == r.get();
explicit WeakPtr(T2 *p) : BasePtr<T>(p) {
}

WeakPtr(const BasePtr<T> &r) : BasePtr<T>(r) {
}

template<class T2>
bool operator!=(const SharedPtr<T2> &r) const {
return _pointer != r.get();
WeakPtr(const BasePtr<T2> &r) : BasePtr<T>(r) {
}

/**
* Returns the number of references to the assigned pointer.
* This should just be used for debugging purposes.
* Creates a SharedPtr that manages the referenced object
*/
RefValue refCount() const { return _refCount ? *_refCount : 0; }
#if !defined(__GNUC__) || GCC_ATLEAST(3, 0)
private:
#endif
void decRef() {
if (_refCount) {
--(*_refCount);
if (!*_refCount) {
delete _refCount;
delete _deletion;
_deletion = nullptr;
_refCount = nullptr;
_pointer = nullptr;
}
}
SharedPtr<T> lock() const {
return SharedPtr<T>(*this);
}

RefValue *_refCount;
SharedPtrDeletionInternal *_deletion;
PointerType _pointer;
};

template <typename T>
Expand Down