From 11d0a473602ff47f09b6447f927e56f6b0910432 Mon Sep 17 00:00:00 2001 From: badlogic Date: Thu, 15 Feb 2018 18:45:24 +0100 Subject: [PATCH] [cpp] Fixed up memory issues & crashes. HashMap is a linked list atm, need a better replacement. --- spine-cpp/CMakeLists.txt | 2 +- spine-cpp/spine-cpp-unit-tests/CMakeLists.txt | 3 +- .../spine-cpp-unit-tests/src/TestHarness.cpp | 2 + .../spine-cpp-unit-tests/src/TestHarness.h | 2 +- spine-cpp/spine-cpp-unit-tests/src/main.cpp | 4 +- .../include/spine/AtlasAttachmentLoader.h | 2 +- .../spine-cpp/include/spine/Attachment.h | 2 +- .../include/spine/AttachmentLoader.h | 2 +- .../include/spine/AttachmentTimeline.h | 2 +- spine-cpp/spine-cpp/include/spine/Bone.h | 2 +- spine-cpp/spine-cpp/include/spine/BoneData.h | 2 +- .../include/spine/BoundingBoxAttachment.h | 2 +- .../include/spine/ClippingAttachment.h | 2 +- .../spine-cpp/include/spine/ColorTimeline.h | 2 +- .../spine-cpp/include/spine/Constraint.h | 2 +- .../spine-cpp/include/spine/CurveTimeline.h | 2 +- .../spine-cpp/include/spine/DeformTimeline.h | 2 +- .../include/spine/DrawOrderTimeline.h | 2 +- .../spine-cpp/include/spine/EventTimeline.h | 2 +- spine-cpp/spine-cpp/include/spine/HashMap.h | 210 ++++-------------- .../spine-cpp/include/spine/IkConstraint.h | 2 +- .../include/spine/IkConstraintTimeline.h | 2 +- .../spine-cpp/include/spine/MeshAttachment.h | 2 +- .../spine-cpp/include/spine/PathAttachment.h | 2 +- .../spine-cpp/include/spine/PathConstraint.h | 2 +- .../include/spine/PathConstraintMixTimeline.h | 2 +- .../spine/PathConstraintPositionTimeline.h | 2 +- .../spine/PathConstraintSpacingTimeline.h | 2 +- .../spine-cpp/include/spine/PointAttachment.h | 2 +- .../include/spine/RegionAttachment.h | 2 +- .../spine-cpp/include/spine/RotateTimeline.h | 2 +- .../spine-cpp/include/spine/ScaleTimeline.h | 2 +- .../spine-cpp/include/spine/ShearTimeline.h | 2 +- spine-cpp/spine-cpp/include/spine/Skin.h | 7 +- .../spine-cpp/include/spine/SpineObject.h | 3 +- spine-cpp/spine-cpp/include/spine/Timeline.h | 2 +- .../include/spine/TransformConstraint.h | 2 +- .../spine/TransformConstraintTimeline.h | 2 +- .../spine-cpp/include/spine/TransformMode.h | 2 +- .../include/spine/TranslateTimeline.h | 2 +- .../include/spine/TwoColorTimeline.h | 2 +- spine-cpp/spine-cpp/include/spine/Updatable.h | 2 +- spine-cpp/spine-cpp/include/spine/Vector.h | 117 ++++++---- .../include/spine/VertexAttachment.h | 2 +- .../src/spine/AtlasAttachmentLoader.cpp | 1 - spine-cpp/spine-cpp/src/spine/Extension.cpp | 9 +- spine-cpp/spine-cpp/src/spine/Skeleton.cpp | 2 +- spine-cpp/spine-cpp/src/spine/Skin.cpp | 3 - spine-cpp/spine-cpp/src/spine/SpineObject.cpp | 4 + 49 files changed, 181 insertions(+), 258 deletions(-) diff --git a/spine-cpp/CMakeLists.txt b/spine-cpp/CMakeLists.txt index b5d0c99ba..64794e770 100644 --- a/spine-cpp/CMakeLists.txt +++ b/spine-cpp/CMakeLists.txt @@ -2,7 +2,7 @@ include_directories(include) file(GLOB INCLUDES "spine-cpp/include/**/*.h") file(GLOB SOURCES "spine-cpp/src/**/*.cpp") -set(CMAKE_CPP_FLAGS "${CMAKE_CPP_FLAGS} -Wall -std=c++03 -pedantic -fno-exceptions -fno-rtti") +set(CMAKE_CPP_FLAGS "${CMAKE_CPP_FLAGS} -Wall -Wall -Wextra -Wshadow -Wnon-virtual-dtor -pedantic -std=c++03 -fno-exceptions -fno-rtti") add_library(spine-cpp STATIC ${SOURCES} ${INCLUDES}) target_include_directories(spine-cpp PUBLIC spine-cpp/include) install(TARGETS spine-cpp DESTINATION dist/lib) diff --git a/spine-cpp/spine-cpp-unit-tests/CMakeLists.txt b/spine-cpp/spine-cpp-unit-tests/CMakeLists.txt index 17a5f1907..1273428a4 100755 --- a/spine-cpp/spine-cpp-unit-tests/CMakeLists.txt +++ b/spine-cpp/spine-cpp-unit-tests/CMakeLists.txt @@ -3,7 +3,8 @@ project(spine_cpp_unit_test) set(CMAKE_INSTALL_PREFIX "./") set(CMAKE_VERBOSE_MAKEFILE ON) -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -stdlib=libc++ ") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wall -Wextra -Wshadow -Wnon-virtual-dtor -pedantic -std=c++03 -fno-exceptions -fno-rtti") +set(CMAKE_CPP_FLAGS "${CMAKE_CPP_FLAGS} -Wall -Wall -Wextra -Wshadow -Wnon-virtual-dtor -pedantic -std=c++03 -fno-exceptions -fno-rtti") include_directories(../spine-cpp/include teamcity minicppunit tests memory) diff --git a/spine-cpp/spine-cpp-unit-tests/src/TestHarness.cpp b/spine-cpp/spine-cpp-unit-tests/src/TestHarness.cpp index 5d76f0ff5..38146e8dc 100644 --- a/spine-cpp/spine-cpp-unit-tests/src/TestHarness.cpp +++ b/spine-cpp/spine-cpp-unit-tests/src/TestHarness.cpp @@ -71,12 +71,14 @@ void Spine::TestSpineExtension::_free(void *mem, const char *file, int line) { } printf("%s:%i (address %p): Double free or not allocated through SpineExtension\n", file, line, mem); + DefaultSpineExtension::_free(mem, file, line); } void Spine::TestSpineExtension::reportLeaks() { for (std::vector::iterator it = allocated.begin(); it != allocated.end(); it++) { printf("\"%s:%i (%zu bytes at %p)\n", it->fileName, it->line, it->size, it->address); } + if (allocated.size() == 0) printf("No leaks detected"); } void Spine::TestSpineExtension::clearAllocations() { diff --git a/spine-cpp/spine-cpp-unit-tests/src/TestHarness.h b/spine-cpp/spine-cpp-unit-tests/src/TestHarness.h index ee40045ed..50fa7606e 100644 --- a/spine-cpp/spine-cpp-unit-tests/src/TestHarness.h +++ b/spine-cpp/spine-cpp-unit-tests/src/TestHarness.h @@ -42,7 +42,7 @@ namespace Spine { const char* fileName; int line; - Allocation() : Allocation (0, 0, 0, 0) { + Allocation() : address(0), size(0), fileName(0), line(0) { } Allocation(void* a, size_t s, const char* f, int l) : address(a), size(s), fileName(f), line(l) { diff --git a/spine-cpp/spine-cpp-unit-tests/src/main.cpp b/spine-cpp/spine-cpp-unit-tests/src/main.cpp index 959c97602..66a56adac 100644 --- a/spine-cpp/spine-cpp-unit-tests/src/main.cpp +++ b/spine-cpp/spine-cpp-unit-tests/src/main.cpp @@ -79,7 +79,7 @@ int main (int argc, char** argv) { TestSpineExtension* ext = new TestSpineExtension(); SpineExtension::setInstance(ext); - reproduceIssue_776(); + reproduceIssue_776(); ext->reportLeaks(); -} \ No newline at end of file +} diff --git a/spine-cpp/spine-cpp/include/spine/AtlasAttachmentLoader.h b/spine-cpp/spine-cpp/include/spine/AtlasAttachmentLoader.h index dcd1bf282..d2f0d615a 100644 --- a/spine-cpp/spine-cpp/include/spine/AtlasAttachmentLoader.h +++ b/spine-cpp/spine-cpp/include/spine/AtlasAttachmentLoader.h @@ -44,7 +44,7 @@ namespace Spine { /// See http://esotericsoftware.com/spine-loading-skeleton-data#JSON-and-binary-data about Loading Skeleton Data in the Spine Runtimes Guide. /// class AtlasAttachmentLoader : public AttachmentLoader { - RTTI_DECL; + RTTI_DECL public: AtlasAttachmentLoader(Atlas* atlas); diff --git a/spine-cpp/spine-cpp/include/spine/Attachment.h b/spine-cpp/spine-cpp/include/spine/Attachment.h index 80543c345..f8484fa25 100644 --- a/spine-cpp/spine-cpp/include/spine/Attachment.h +++ b/spine-cpp/spine-cpp/include/spine/Attachment.h @@ -37,7 +37,7 @@ namespace Spine { class Attachment : public SpineObject { - RTTI_DECL; + RTTI_DECL public: Attachment(std::string name); diff --git a/spine-cpp/spine-cpp/include/spine/AttachmentLoader.h b/spine-cpp/spine-cpp/include/spine/AttachmentLoader.h index f5e45bbe9..82b297ce4 100644 --- a/spine-cpp/spine-cpp/include/spine/AttachmentLoader.h +++ b/spine-cpp/spine-cpp/include/spine/AttachmentLoader.h @@ -45,7 +45,7 @@ namespace Spine { class ClippingAttachment; class AttachmentLoader : public SpineObject { - RTTI_DECL; + RTTI_DECL AttachmentLoader(); diff --git a/spine-cpp/spine-cpp/include/spine/AttachmentTimeline.h b/spine-cpp/spine-cpp/include/spine/AttachmentTimeline.h index 68b4d0a7c..c7c067c28 100644 --- a/spine-cpp/spine-cpp/include/spine/AttachmentTimeline.h +++ b/spine-cpp/spine-cpp/include/spine/AttachmentTimeline.h @@ -47,7 +47,7 @@ namespace Spine { friend class SkeletonBinary; friend class SkeletonJson; - RTTI_DECL; + RTTI_DECL public: AttachmentTimeline(int frameCount); diff --git a/spine-cpp/spine-cpp/include/spine/Bone.h b/spine-cpp/spine-cpp/include/spine/Bone.h index f87c4f5aa..2f4afe1f6 100644 --- a/spine-cpp/spine-cpp/include/spine/Bone.h +++ b/spine-cpp/spine-cpp/include/spine/Bone.h @@ -59,7 +59,7 @@ namespace Spine { friend class ShearTimeline; friend class TranslateTimeline; - RTTI_DECL; + RTTI_DECL public: static void setYDown(bool inValue); diff --git a/spine-cpp/spine-cpp/include/spine/BoneData.h b/spine-cpp/spine-cpp/include/spine/BoneData.h index 358d466be..34ebeabef 100644 --- a/spine-cpp/spine-cpp/include/spine/BoneData.h +++ b/spine-cpp/spine-cpp/include/spine/BoneData.h @@ -52,7 +52,7 @@ namespace Spine { /// The index of the bone in Skeleton.Bones const int getIndex(); - + /// The name of the bone, which is unique within the skeleton. const std::string& getName(); diff --git a/spine-cpp/spine-cpp/include/spine/BoundingBoxAttachment.h b/spine-cpp/spine-cpp/include/spine/BoundingBoxAttachment.h index e79b1e8e9..ee48fd8ff 100644 --- a/spine-cpp/spine-cpp/include/spine/BoundingBoxAttachment.h +++ b/spine-cpp/spine-cpp/include/spine/BoundingBoxAttachment.h @@ -37,7 +37,7 @@ namespace Spine { /// Attachment that has a polygon for bounds checking. class BoundingBoxAttachment : public VertexAttachment { - RTTI_DECL; + RTTI_DECL BoundingBoxAttachment(std::string name); }; diff --git a/spine-cpp/spine-cpp/include/spine/ClippingAttachment.h b/spine-cpp/spine-cpp/include/spine/ClippingAttachment.h index 5f4a56545..8767b8862 100644 --- a/spine-cpp/spine-cpp/include/spine/ClippingAttachment.h +++ b/spine-cpp/spine-cpp/include/spine/ClippingAttachment.h @@ -42,7 +42,7 @@ namespace Spine { friend class SkeletonClipping; - RTTI_DECL; + RTTI_DECL public: ClippingAttachment(std::string name); diff --git a/spine-cpp/spine-cpp/include/spine/ColorTimeline.h b/spine-cpp/spine-cpp/include/spine/ColorTimeline.h index 14b74a5b0..423d173b2 100644 --- a/spine-cpp/spine-cpp/include/spine/ColorTimeline.h +++ b/spine-cpp/spine-cpp/include/spine/ColorTimeline.h @@ -38,7 +38,7 @@ namespace Spine { friend class SkeletonBinary; friend class SkeletonJson; - RTTI_DECL; + RTTI_DECL public: static const int ENTRIES; diff --git a/spine-cpp/spine-cpp/include/spine/Constraint.h b/spine-cpp/spine-cpp/include/spine/Constraint.h index 4979d7602..4c98334ef 100644 --- a/spine-cpp/spine-cpp/include/spine/Constraint.h +++ b/spine-cpp/spine-cpp/include/spine/Constraint.h @@ -36,7 +36,7 @@ namespace Spine { /// The interface for all constraints. class Constraint : public Updatable { - RTTI_DECL; + RTTI_DECL public: Constraint(); diff --git a/spine-cpp/spine-cpp/include/spine/CurveTimeline.h b/spine-cpp/spine-cpp/include/spine/CurveTimeline.h index df149f896..ce2e387bf 100644 --- a/spine-cpp/spine-cpp/include/spine/CurveTimeline.h +++ b/spine-cpp/spine-cpp/include/spine/CurveTimeline.h @@ -39,7 +39,7 @@ namespace Spine { /// Base class for frames that use an interpolation bezier curve. class CurveTimeline : public Timeline { - RTTI_DECL; + RTTI_DECL public: CurveTimeline(int frameCount); diff --git a/spine-cpp/spine-cpp/include/spine/DeformTimeline.h b/spine-cpp/spine-cpp/include/spine/DeformTimeline.h index 031c420f3..d5758b49b 100644 --- a/spine-cpp/spine-cpp/include/spine/DeformTimeline.h +++ b/spine-cpp/spine-cpp/include/spine/DeformTimeline.h @@ -40,7 +40,7 @@ namespace Spine { friend class SkeletonBinary; friend class SkeletonJson; - RTTI_DECL; + RTTI_DECL public: DeformTimeline(int frameCount); diff --git a/spine-cpp/spine-cpp/include/spine/DrawOrderTimeline.h b/spine-cpp/spine-cpp/include/spine/DrawOrderTimeline.h index 263336954..925002d06 100644 --- a/spine-cpp/spine-cpp/include/spine/DrawOrderTimeline.h +++ b/spine-cpp/spine-cpp/include/spine/DrawOrderTimeline.h @@ -38,7 +38,7 @@ namespace Spine { friend class SkeletonBinary; friend class SkeletonJson; - RTTI_DECL; + RTTI_DECL public: DrawOrderTimeline(int frameCount); diff --git a/spine-cpp/spine-cpp/include/spine/EventTimeline.h b/spine-cpp/spine-cpp/include/spine/EventTimeline.h index 51f290529..b7544c45e 100644 --- a/spine-cpp/spine-cpp/include/spine/EventTimeline.h +++ b/spine-cpp/spine-cpp/include/spine/EventTimeline.h @@ -38,7 +38,7 @@ namespace Spine { friend class SkeletonBinary; friend class SkeletonJson; - RTTI_DECL; + RTTI_DECL public: EventTimeline(int frameCount); diff --git a/spine-cpp/spine-cpp/include/spine/HashMap.h b/spine-cpp/spine-cpp/include/spine/HashMap.h index 72deaa225..412329e6f 100755 --- a/spine-cpp/spine-cpp/include/spine/HashMap.h +++ b/spine-cpp/spine-cpp/include/spine/HashMap.h @@ -75,194 +75,77 @@ namespace Spine { Entry* _entry; }; - HashMap(size_t capacity = 65535) : + HashMap() : + _head(NULL), _hashFunction(), - _capacity(capacity), - _header(), - _trailer(), - _hashSize(0) { - _hashTable.reserve(capacity); - for (int i = 0; i < _capacity; ++i) { - _hashTable.push_back(Entry()); - } - - _header.prev = &_header; - _header.next = &_trailer; - _trailer.prev = &_header; - _trailer.next = &_trailer; + _size(0) { + } ~HashMap() { for (Iterator it = begin(); it != end(); ++it) { delete it._entry; } - _hashSize = 0; } size_t size() { - return _hashSize; + return _size; } Iterator begin() { - return Iterator(_header.next); + return Iterator(_head); } Iterator end() { - return Iterator(&_trailer); + return Iterator(NULL); } - std::pair insert(const K& key, const V& value) { - Iterator iter = find(key); - - if (iter._entry != &_trailer) { - return std::make_pair(iter, false); - } - - size_t index = hash(key); - - Entry* entry = new (__FILE__, __LINE__) Entry(); - entry->_key = key; - entry->_value = value; - - _hashSize++; - - if (_header.next == (&_trailer)) { - _hashTable[index].next = entry; - _hashTable[index].prev = entry; - _header.next = entry; - entry->prev = &_header; - entry->next = &_trailer; - _trailer.prev = entry; - - return std::make_pair(Iterator(entry), true); - } - - if (_hashTable[index].next == NULL) { - _hashTable[index].next = entry; - _hashTable[index].prev = entry; - if (index < hash(_header.next->_key)) { - entry->next = _header.next; - entry->prev = &_header; - _header.next->prev = entry; - _header.next = entry; + void insert(const K& key, const V& value) { + Entry* entry = find(key)._entry; + if (entry) { + entry->_key = key; + entry->_value = value; + } else { + entry = new (__FILE__, __LINE__) Entry(); + entry->_key = key; + entry->_value = value; + + Entry* oldHead = _head; + + if (oldHead) { + _head = entry; + oldHead->prev = entry; + entry->next = oldHead; + } else { + _head = entry; } - else { - entry->next = &_trailer; - entry->prev = _trailer.prev; - _trailer.prev = entry; - entry->prev->next = entry; - } - - return std::make_pair(Iterator(entry), true); } - - if (index == hash(_header.next->_key)) { - _header.next = entry; - entry->next = _hashTable[index].next; - entry->prev = &_header; - _hashTable[index].next->prev = entry; - _hashTable[index].next = entry; - } - else { - entry->next = _hashTable[index].next; - entry->prev = _hashTable[index].next->prev; - entry->next->prev = entry; - entry->prev->next = entry; - _hashTable[index].next = entry; - } - - return std::make_pair(Iterator(entry), true); } Iterator find(const K& key) { - const size_t index = hash(key); - Iterator iter(_hashTable[index].next); - - if (iter._entry != NULL) { - for ( ; hash(iter._entry->_key) == index ; ++iter) { - if (iter._entry->_key == key) { - return iter; - } - } + for (Iterator it = begin(); it != end(); ++it) { + if (it._entry && it.key() == key) + return it; } - - return Iterator(&_trailer); + return end(); } Iterator erase(Iterator pos) { - if (pos._entry != &_header && pos._entry != &_trailer) { - Entry* next = pos._entry->next; - - size_t index = hash(pos._entry->_key); - - if (_hashTable[index].next == pos._entry && _hashTable[index].prev == pos._entry) { - _hashTable[index].next = NULL; - _hashTable[index].prev = NULL; - - if (_header.next == pos._entry) { - _header.next = pos._entry->next; - pos._entry->next->prev = &_header; - } - else if (_trailer.prev == pos._entry) { - _trailer.prev = pos._entry->prev; - pos._entry->prev->next = &_trailer; - } - else { - pos._entry->prev->next = pos._entry->next; - pos._entry->next->prev = pos._entry->prev; - } - - delete pos._entry; - } - else if (_hashTable[index].next == pos._entry) { - _hashTable[index].next = pos._entry->next; - if (_header.next == pos._entry) { - _header.next = pos._entry->next; - pos._entry->next->prev = &_header; - } - else { - pos._entry->prev->next = pos._entry->next; - pos._entry->next->prev = pos._entry->prev; - } - - delete pos._entry; - } - else if (_hashTable[index].prev == pos._entry) { - _hashTable[index].prev = pos._entry->prev; - if (_trailer.prev == pos._entry) { - _trailer.prev = pos._entry->prev; - pos._entry->prev->next = &_trailer; - } - else { - pos._entry->prev->next = pos._entry->next; - pos._entry->next->prev = pos._entry->prev; - } - - delete pos._entry; - } - else { - pos._entry->prev->next = pos._entry->next; - pos._entry->next->prev = pos._entry->prev; - - delete pos._entry; - } - - _hashSize--; - - return Iterator(next); - } - - return Iterator(&_trailer); + Entry* entry = pos._entry; + Entry* prev = entry->prev; + Entry* next = entry->next; + + if (prev) prev->next = next; + else _head = next; + if (next) next->prev = entry->prev; + + delete entry; + return Iterator(next); } V operator[](const K& key) { Iterator iter = find(key); - - if (iter._entry != _trailer) { - return iter._entry->_value; - } - - return V(); + return iter; } private: @@ -272,18 +155,13 @@ namespace Spine { V _value; Entry* next; Entry* prev; + + Entry () : next(NULL), prev(NULL) {} }; const H _hashFunction; - const size_t _capacity; - Vector _hashTable; - Entry _header; - Entry _trailer; - size_t _hashSize; - - size_t hash(const K& key) { - return _hashFunction(key) % _capacity; - } + Entry* _head; + size_t _size; }; } diff --git a/spine-cpp/spine-cpp/include/spine/IkConstraint.h b/spine-cpp/spine-cpp/include/spine/IkConstraint.h index 528ebf45a..6884f25c2 100644 --- a/spine-cpp/spine-cpp/include/spine/IkConstraint.h +++ b/spine-cpp/spine-cpp/include/spine/IkConstraint.h @@ -44,7 +44,7 @@ namespace Spine { friend class Skeleton; friend class IkConstraintTimeline; - RTTI_DECL; + RTTI_DECL public: /// Adjusts the bone rotation so the tip is as close to the target position as possible. The target is specified diff --git a/spine-cpp/spine-cpp/include/spine/IkConstraintTimeline.h b/spine-cpp/spine-cpp/include/spine/IkConstraintTimeline.h index bbc75df6b..38977eb4c 100644 --- a/spine-cpp/spine-cpp/include/spine/IkConstraintTimeline.h +++ b/spine-cpp/spine-cpp/include/spine/IkConstraintTimeline.h @@ -38,7 +38,7 @@ namespace Spine { friend class SkeletonBinary; friend class SkeletonJson; - RTTI_DECL; + RTTI_DECL public: static const int ENTRIES; diff --git a/spine-cpp/spine-cpp/include/spine/MeshAttachment.h b/spine-cpp/spine-cpp/include/spine/MeshAttachment.h index 101f6dcf9..6c89f5a30 100644 --- a/spine-cpp/spine-cpp/include/spine/MeshAttachment.h +++ b/spine-cpp/spine-cpp/include/spine/MeshAttachment.h @@ -44,7 +44,7 @@ namespace Spine { friend class SkeletonJson; friend class AtlasAttachmentLoader; - RTTI_DECL; + RTTI_DECL public: MeshAttachment(std::string name); diff --git a/spine-cpp/spine-cpp/include/spine/PathAttachment.h b/spine-cpp/spine-cpp/include/spine/PathAttachment.h index 4463f1d01..5782e8bf3 100644 --- a/spine-cpp/spine-cpp/include/spine/PathAttachment.h +++ b/spine-cpp/spine-cpp/include/spine/PathAttachment.h @@ -38,7 +38,7 @@ namespace Spine { friend class SkeletonBinary; friend class SkeletonJson; - RTTI_DECL; + RTTI_DECL public: PathAttachment(std::string name); diff --git a/spine-cpp/spine-cpp/include/spine/PathConstraint.h b/spine-cpp/spine-cpp/include/spine/PathConstraint.h index abb073a82..9bc041010 100644 --- a/spine-cpp/spine-cpp/include/spine/PathConstraint.h +++ b/spine-cpp/spine-cpp/include/spine/PathConstraint.h @@ -48,7 +48,7 @@ namespace Spine { friend class PathConstraintPositionTimeline; friend class PathConstraintSpacingTimeline; - RTTI_DECL; + RTTI_DECL public: PathConstraint(PathConstraintData& data, Skeleton& skeleton); diff --git a/spine-cpp/spine-cpp/include/spine/PathConstraintMixTimeline.h b/spine-cpp/spine-cpp/include/spine/PathConstraintMixTimeline.h index 5e93c1235..da6facdcf 100644 --- a/spine-cpp/spine-cpp/include/spine/PathConstraintMixTimeline.h +++ b/spine-cpp/spine-cpp/include/spine/PathConstraintMixTimeline.h @@ -38,7 +38,7 @@ namespace Spine { friend class SkeletonBinary; friend class SkeletonJson; - RTTI_DECL; + RTTI_DECL public: static const int ENTRIES; diff --git a/spine-cpp/spine-cpp/include/spine/PathConstraintPositionTimeline.h b/spine-cpp/spine-cpp/include/spine/PathConstraintPositionTimeline.h index ef782b91e..e26a1830c 100644 --- a/spine-cpp/spine-cpp/include/spine/PathConstraintPositionTimeline.h +++ b/spine-cpp/spine-cpp/include/spine/PathConstraintPositionTimeline.h @@ -38,7 +38,7 @@ namespace Spine { friend class SkeletonBinary; friend class SkeletonJson; - RTTI_DECL; + RTTI_DECL public: static const int ENTRIES; diff --git a/spine-cpp/spine-cpp/include/spine/PathConstraintSpacingTimeline.h b/spine-cpp/spine-cpp/include/spine/PathConstraintSpacingTimeline.h index ca723f907..64bc39742 100644 --- a/spine-cpp/spine-cpp/include/spine/PathConstraintSpacingTimeline.h +++ b/spine-cpp/spine-cpp/include/spine/PathConstraintSpacingTimeline.h @@ -38,7 +38,7 @@ namespace Spine { friend class SkeletonBinary; friend class SkeletonJson; - RTTI_DECL; + RTTI_DECL public: PathConstraintSpacingTimeline(int frameCount); diff --git a/spine-cpp/spine-cpp/include/spine/PointAttachment.h b/spine-cpp/spine-cpp/include/spine/PointAttachment.h index eba6a0f8d..0536d5eb2 100644 --- a/spine-cpp/spine-cpp/include/spine/PointAttachment.h +++ b/spine-cpp/spine-cpp/include/spine/PointAttachment.h @@ -47,7 +47,7 @@ namespace Spine { friend class SkeletonBinary; friend class SkeletonJson; - RTTI_DECL; + RTTI_DECL public: PointAttachment(std::string name); diff --git a/spine-cpp/spine-cpp/include/spine/RegionAttachment.h b/spine-cpp/spine-cpp/include/spine/RegionAttachment.h index e23ea4986..5dd0da008 100644 --- a/spine-cpp/spine-cpp/include/spine/RegionAttachment.h +++ b/spine-cpp/spine-cpp/include/spine/RegionAttachment.h @@ -48,7 +48,7 @@ namespace Spine { friend class SkeletonJson; friend class AtlasAttachmentLoader; - RTTI_DECL; + RTTI_DECL public: RegionAttachment(std::string name); diff --git a/spine-cpp/spine-cpp/include/spine/RotateTimeline.h b/spine-cpp/spine-cpp/include/spine/RotateTimeline.h index 558f5a96b..e7ae048cb 100644 --- a/spine-cpp/spine-cpp/include/spine/RotateTimeline.h +++ b/spine-cpp/spine-cpp/include/spine/RotateTimeline.h @@ -39,7 +39,7 @@ namespace Spine { friend class SkeletonJson; friend class AnimationState; - RTTI_DECL; + RTTI_DECL public: static const int ENTRIES = 2; diff --git a/spine-cpp/spine-cpp/include/spine/ScaleTimeline.h b/spine-cpp/spine-cpp/include/spine/ScaleTimeline.h index 32f434287..97dd36e99 100644 --- a/spine-cpp/spine-cpp/include/spine/ScaleTimeline.h +++ b/spine-cpp/spine-cpp/include/spine/ScaleTimeline.h @@ -38,7 +38,7 @@ namespace Spine { friend class SkeletonBinary; friend class SkeletonJson; - RTTI_DECL; + RTTI_DECL public: ScaleTimeline(int frameCount); diff --git a/spine-cpp/spine-cpp/include/spine/ShearTimeline.h b/spine-cpp/spine-cpp/include/spine/ShearTimeline.h index fa687e15d..e09c6942d 100644 --- a/spine-cpp/spine-cpp/include/spine/ShearTimeline.h +++ b/spine-cpp/spine-cpp/include/spine/ShearTimeline.h @@ -38,7 +38,7 @@ namespace Spine { friend class SkeletonBinary; friend class SkeletonJson; - RTTI_DECL; + RTTI_DECL public: ShearTimeline(int frameCount); diff --git a/spine-cpp/spine-cpp/include/spine/Skin.h b/spine-cpp/spine-cpp/include/spine/Skin.h index 7c5b68e11..cdab8ab05 100644 --- a/spine-cpp/spine-cpp/include/spine/Skin.h +++ b/spine-cpp/spine-cpp/include/spine/Skin.h @@ -46,12 +46,17 @@ namespace Spine { friend class Skeleton; public: - class AttachmentKey : public SpineObject { + class AttachmentKey { public: int _slotIndex; std::string _name; AttachmentKey(int slotIndex = 0, std::string name = ""); + + AttachmentKey(const AttachmentKey &other) { + this->_slotIndex = other._slotIndex; + this->_name = other._name; + } bool operator==(const AttachmentKey &other) const; }; diff --git a/spine-cpp/spine-cpp/include/spine/SpineObject.h b/spine-cpp/spine-cpp/include/spine/SpineObject.h index d5445196c..ef1b86166 100644 --- a/spine-cpp/spine-cpp/include/spine/SpineObject.h +++ b/spine-cpp/spine-cpp/include/spine/SpineObject.h @@ -37,9 +37,10 @@ namespace Spine { class SpineObject { public: void* operator new(size_t sz, const char* file, int line); + void* operator new(size_t sz, void* ptr); void operator delete(void* p); virtual ~SpineObject(); }; } -#endif \ No newline at end of file +#endif diff --git a/spine-cpp/spine-cpp/include/spine/Timeline.h b/spine-cpp/spine-cpp/include/spine/Timeline.h index 1d69ace46..614c47798 100644 --- a/spine-cpp/spine-cpp/include/spine/Timeline.h +++ b/spine-cpp/spine-cpp/include/spine/Timeline.h @@ -42,7 +42,7 @@ namespace Spine { class Event; class Timeline : public SpineObject { - RTTI_DECL; + RTTI_DECL public: Timeline(); diff --git a/spine-cpp/spine-cpp/include/spine/TransformConstraint.h b/spine-cpp/spine-cpp/include/spine/TransformConstraint.h index b878c0f4c..69dc172ff 100644 --- a/spine-cpp/spine-cpp/include/spine/TransformConstraint.h +++ b/spine-cpp/spine-cpp/include/spine/TransformConstraint.h @@ -44,7 +44,7 @@ namespace Spine { friend class Skeleton; friend class TransformConstraintTimeline; - RTTI_DECL; + RTTI_DECL public: TransformConstraint(TransformConstraintData& data, Skeleton& skeleton); diff --git a/spine-cpp/spine-cpp/include/spine/TransformConstraintTimeline.h b/spine-cpp/spine-cpp/include/spine/TransformConstraintTimeline.h index f117bbf82..05142ae67 100644 --- a/spine-cpp/spine-cpp/include/spine/TransformConstraintTimeline.h +++ b/spine-cpp/spine-cpp/include/spine/TransformConstraintTimeline.h @@ -38,7 +38,7 @@ namespace Spine { friend class SkeletonBinary; friend class SkeletonJson; - RTTI_DECL; + RTTI_DECL public: static const int ENTRIES; diff --git a/spine-cpp/spine-cpp/include/spine/TransformMode.h b/spine-cpp/spine-cpp/include/spine/TransformMode.h index d3cb2b7f9..0348193cb 100644 --- a/spine-cpp/spine-cpp/include/spine/TransformMode.h +++ b/spine-cpp/spine-cpp/include/spine/TransformMode.h @@ -38,7 +38,7 @@ namespace Spine { TransformMode_OnlyTranslation = 7, // 0111 TransformMode_NoRotationOrReflection = 1, // 0001 TransformMode_NoScale = 2, // 0010 - TransformMode_NoScaleOrReflection = 6, // 0110 + TransformMode_NoScaleOrReflection = 6 // 0110 }; } diff --git a/spine-cpp/spine-cpp/include/spine/TranslateTimeline.h b/spine-cpp/spine-cpp/include/spine/TranslateTimeline.h index 0f14769ea..50d30f4ca 100644 --- a/spine-cpp/spine-cpp/include/spine/TranslateTimeline.h +++ b/spine-cpp/spine-cpp/include/spine/TranslateTimeline.h @@ -41,7 +41,7 @@ namespace Spine { friend class SkeletonBinary; friend class SkeletonJson; - RTTI_DECL; + RTTI_DECL public: static const int ENTRIES; diff --git a/spine-cpp/spine-cpp/include/spine/TwoColorTimeline.h b/spine-cpp/spine-cpp/include/spine/TwoColorTimeline.h index 34977c3ec..ccb8b115f 100644 --- a/spine-cpp/spine-cpp/include/spine/TwoColorTimeline.h +++ b/spine-cpp/spine-cpp/include/spine/TwoColorTimeline.h @@ -38,7 +38,7 @@ namespace Spine { friend class SkeletonBinary; friend class SkeletonJson; - RTTI_DECL; + RTTI_DECL public: static const int ENTRIES; diff --git a/spine-cpp/spine-cpp/include/spine/Updatable.h b/spine-cpp/spine-cpp/include/spine/Updatable.h index 7d831af6f..3ae80e442 100644 --- a/spine-cpp/spine-cpp/include/spine/Updatable.h +++ b/spine-cpp/spine-cpp/include/spine/Updatable.h @@ -36,7 +36,7 @@ namespace Spine { class Updatable : public SpineObject { - RTTI_DECL; + RTTI_DECL public: Updatable(); diff --git a/spine-cpp/spine-cpp/include/spine/Vector.h b/spine-cpp/spine-cpp/include/spine/Vector.h index 6f63ca802..ece91ade3 100644 --- a/spine-cpp/spine-cpp/include/spine/Vector.h +++ b/spine-cpp/spine-cpp/include/spine/Vector.h @@ -32,11 +32,12 @@ #define Spine_Vector_h #include -#include #include #include #include +#include +#include namespace Spine { template @@ -45,106 +46,134 @@ namespace Spine { Vector() : _size(0), _capacity(0), _buffer(NULL) { // Empty } - + Vector(const Vector& inVector) : _size(inVector._size), _capacity(inVector._capacity), _buffer(NULL) { if (_capacity > 0) { _buffer = allocate(_capacity); for (size_t i = 0; i < _size; ++i) { - _buffer[i] = inVector._buffer[i]; + construct(_buffer + i, inVector._buffer[i]); } } } - + + Vector& operator=(Vector& inVector) { + if (this != &inVector) { + clear(); + deallocate(_buffer); + _buffer = NULL; + + _size = inVector._size; + _capacity = inVector._capacity; + + if (_capacity > 0) { + _buffer = allocate(_capacity); + for (size_t i = 0; i < _size; ++i) { + construct(_buffer + i, inVector._buffer[i]); + } + } + } + + return *this; + } + ~Vector() { + clear(); deallocate(_buffer); } - + bool contains(const T& inValue) { for (size_t i = 0; i < _size; ++i) { if (_buffer[i] == inValue) { return true; } } - + return false; } - + int indexOf(const T& inValue) { for (size_t i = 0; i < _size; ++i) { if (_buffer[i] == inValue) { return static_cast(i); } } - + return -1; } - + void push_back(const T& inValue) { if (_size == _capacity) { reserve(); } - - _buffer[_size++] = inValue; + + construct(_buffer + _size++, inValue); } - + void insert(size_t inIndex, const T& inValue) { assert(inIndex < _size); - + if (_size == _capacity) { reserve(); } - + for (size_t i = ++_size - 1; i > inIndex; --i) { - _buffer[i] = _buffer[i - 1]; + construct(_buffer + i, _buffer[i - 1]); + destroy(_buffer + (i - 1)); } - - _buffer[inIndex] = inValue; + + construct(_buffer + inIndex, inValue); } - + void erase(size_t inIndex) { assert(inIndex < _size); - + --_size; - + if (inIndex != _size) { for (size_t i = inIndex; i < _size; ++i) { std::swap(_buffer[i], _buffer[i + 1]); } } + + destroy(_buffer + _size); } - + void clear() { + for (size_t i = 0; i < _size; ++i) { + destroy(_buffer + (_size - 1 - i)); + } + _size = 0; } - + size_t size() const { return _size; } - + T& operator[](size_t inIndex) { assert(inIndex < _size); - + return _buffer[inIndex]; } - + void reserve(size_t inCapacity = 0) { size_t newCapacity = inCapacity > 0 ? inCapacity : _capacity > 0 ? _capacity * 2 : 1; if (newCapacity > _capacity) { - _buffer = (T*)SpineExtension::realloc(_buffer, newCapacity, __FILE__, __LINE__); + _buffer = SpineExtension::realloc(_buffer, newCapacity, __FILE__, __LINE__); _capacity = newCapacity; } } - + void setSize(size_t inValue) { assert(inValue <= _capacity); - + _size = inValue; } - + T* begin() { return &_buffer[0]; } - + T* end() { return &_buffer[_size]; } @@ -166,28 +195,38 @@ namespace Spine { friend bool operator!=(Vector& lhs, Vector& rhs) { return !(lhs == rhs); } - + private: size_t _size; size_t _capacity; T* _buffer; - + T* allocate(size_t n) { assert(n > 0); - - T* ptr = (T*)SpineExtension::alloc(n, __FILE__, __LINE__); - + + T* ptr = SpineExtension::alloc(n, __FILE__, __LINE__); + assert(ptr); - + return ptr; } - + void deallocate(T* buffer) { if (_buffer) { - SpineExtension::free(buffer, __FILE__, __LINE__); - // _buffer = 0; + SpineExtension::free(buffer, __FILE__, __LINE__); } } + + void construct(T* buffer, const T& val) { + /// This is a placement new operator + /// which basically means we are contructing a new object + /// using pre-allocated memory + new (buffer) T(val); + } + + void destroy(T* buffer) { + buffer->~T(); + } }; } diff --git a/spine-cpp/spine-cpp/include/spine/VertexAttachment.h b/spine-cpp/spine-cpp/include/spine/VertexAttachment.h index d4be95f84..33aa2049a 100644 --- a/spine-cpp/spine-cpp/include/spine/VertexAttachment.h +++ b/spine-cpp/spine-cpp/include/spine/VertexAttachment.h @@ -44,7 +44,7 @@ namespace Spine { friend class SkeletonJson; friend class DeformTimeline; - RTTI_DECL; + RTTI_DECL public: VertexAttachment(std::string name); diff --git a/spine-cpp/spine-cpp/src/spine/AtlasAttachmentLoader.cpp b/spine-cpp/spine-cpp/src/spine/AtlasAttachmentLoader.cpp index 8641846a6..07c5edd91 100644 --- a/spine-cpp/spine-cpp/src/spine/AtlasAttachmentLoader.cpp +++ b/spine-cpp/spine-cpp/src/spine/AtlasAttachmentLoader.cpp @@ -64,7 +64,6 @@ namespace Spine { attachment._regionHeight = region.height; attachment._regionOriginalWidth = region.originalWidth; attachment._regionOriginalHeight = region.originalHeight; - printf("New region attachment, %p %p\n", &attachmentP->getUVs(), &attachmentP->getOffset()); return attachmentP; } diff --git a/spine-cpp/spine-cpp/src/spine/Extension.cpp b/spine-cpp/spine-cpp/src/spine/Extension.cpp index b492e4294..20fa8385f 100644 --- a/spine-cpp/spine-cpp/src/spine/Extension.cpp +++ b/spine-cpp/spine-cpp/src/spine/Extension.cpp @@ -35,10 +35,11 @@ #include namespace Spine { - SpineExtension* SpineExtension::_instance = NULL; + DefaultSpineExtension _defaultExtension; + SpineExtension* SpineExtension::_instance = &_defaultExtension; void SpineExtension::setInstance(SpineExtension* inValue) { - assert(!_instance); + assert(inValue); _instance = inValue; } @@ -81,7 +82,6 @@ namespace Spine { if (size == 0) return 0; void* ptr = ::malloc(size); - printf("alloc %lu bytes at %p\n", size, ptr); return ptr; } @@ -93,7 +93,6 @@ namespace Spine { if (ptr) { memset(ptr, 0, size); } - printf("calloc %lu bytes at %p\n", size, ptr); return ptr; } @@ -105,12 +104,10 @@ namespace Spine { mem = ::malloc(size); else mem = ::realloc(ptr, size); - printf("realloc %lu bytes from %p to %p\n", size, ptr, mem); return mem; } void DefaultSpineExtension::_free(void* mem, const char* file, int line) { - printf("free %p\n", mem); ::free(mem); } diff --git a/spine-cpp/spine-cpp/src/spine/Skeleton.cpp b/spine-cpp/spine-cpp/src/spine/Skeleton.cpp index f988669ab..99c3cae86 100644 --- a/spine-cpp/spine-cpp/src/spine/Skeleton.cpp +++ b/spine-cpp/spine-cpp/src/spine/Skeleton.cpp @@ -656,7 +656,7 @@ namespace Spine { void Skeleton::sortPathConstraintAttachment(Skin* skin, int slotIndex, Bone& slotBone) { HashMap& attachments = skin->getAttachments(); - for (typename HashMap::Iterator i = attachments.begin(); i != attachments.end(); ++i) { + for (HashMap::Iterator i = attachments.begin(); i != attachments.end(); ++i) { Skin::AttachmentKey key = i.key(); if (key._slotIndex == slotIndex) { Attachment* value = i.value(); diff --git a/spine-cpp/spine-cpp/src/spine/Skin.cpp b/spine-cpp/spine-cpp/src/spine/Skin.cpp index 1e8785cb6..ab18751be 100644 --- a/spine-cpp/spine-cpp/src/spine/Skin.cpp +++ b/spine-cpp/spine-cpp/src/spine/Skin.cpp @@ -60,12 +60,9 @@ namespace Spine { Skin::~Skin() { HashMap::Iterator i = _attachments.begin(); - printf("Disposing skin\n"); for (; i != _attachments.end(); ++i) { - printf("%p %s\n", i.value(), i.value()->getName().c_str()); delete i.value(); } - printf("Disposing skin done\n"); } void Skin::addAttachment(int slotIndex, std::string name, Attachment* attachment) { diff --git a/spine-cpp/spine-cpp/src/spine/SpineObject.cpp b/spine-cpp/spine-cpp/src/spine/SpineObject.cpp index 981ae040a..e041ede97 100644 --- a/spine-cpp/spine-cpp/src/spine/SpineObject.cpp +++ b/spine-cpp/spine-cpp/src/spine/SpineObject.cpp @@ -37,6 +37,10 @@ namespace Spine { return SpineExtension::calloc(sz, file, line); } + void *SpineObject::operator new(size_t sz, void* ptr) { + return ptr; + } + void SpineObject::operator delete(void *p) { SpineExtension::free(p, __FILE__, __LINE__); }