From fd9f3b9fe945cb86f677f5b0cf31302d10bcfa99 Mon Sep 17 00:00:00 2001 From: Richard Nelson Date: Tue, 26 Jul 2011 14:26:27 -0700 Subject: EXP-1021 FIX Position of web content browser dictates position of profile panel - profile panel position changes do not persist EXP-1030 FIX Search button toggle can get out of synch in bottom bar made llinstancetracker::iterator do own nested level management (removing need for separate guard) added support for filename= to floaters can pass in arbitrary window_class to floaters --- indra/llcommon/llinstancetracker.h | 162 +++++++++++++++++++++++++++++-------- 1 file changed, 129 insertions(+), 33 deletions(-) (limited to 'indra/llcommon/llinstancetracker.h') diff --git a/indra/llcommon/llinstancetracker.h b/indra/llcommon/llinstancetracker.h index b971b2f914..cdddd0d7a0 100644 --- a/indra/llcommon/llinstancetracker.h +++ b/indra/llcommon/llinstancetracker.h @@ -52,13 +52,68 @@ class LLInstanceTracker : public LLInstanceTrackerBase { typedef typename std::map InstanceMap; typedef LLInstanceTracker MyT; - typedef boost::function KeyGetter; - typedef boost::function InstancePtrGetter; public: - /// Dereferencing key_iter gives you a const KEY& - typedef boost::transform_iterator key_iter; - /// Dereferencing instance_iter gives you a T& - typedef boost::indirect_iterator< boost::transform_iterator > instance_iter; + class instance_iter : public boost::iterator_facade + { + public: + instance_iter(typename InstanceMap::iterator& it) + : mIterator(it) + { + ++sIterationNestDepth; + } + + ~instance_iter() + { + --sIterationNestDepth; + } + + private: + friend class boost::iterator_core_access; + + void increment() { mIterator++; } + bool equal(instance_iter const& other) const + { + return mIterator == other.m_iterator; + } + + T& dereference() const + { + return mIterator->second; + } + + typename InstanceMap::iterator mIterator; + }; + + class key_iter : public boost::iterator_facade + { + public: + key_iter(typename InstanceMap::iterator& it) + : mIterator(it) + { + ++sIterationNestDepth; + } + + ~key_iter() + { + --sIterationNestDepth; + } + + private: + friend class boost::iterator_core_access; + + void increment() { mIterator++; } + bool equal(instance_iter const& other) const + { + return mIterator == other.m_iterator; + } + + KEY& dereference() const + { + return mIterator->first; + } + + typename InstanceMap::iterator mIterator; + }; static T* getInstance(const KEY& k) { @@ -66,42 +121,47 @@ public: return (found == getMap_().end()) ? NULL : found->second; } - static key_iter beginKeys() - { - return boost::make_transform_iterator(getMap_().begin(), - boost::bind(&InstanceMap::value_type::first, _1)); + static instance_iter beginInstances() + { + return instance_iter(getMap_().begin()); } - static key_iter endKeys() + + static instance_iter endInstances() { - return boost::make_transform_iterator(getMap_().end(), - boost::bind(&InstanceMap::value_type::first, _1)); + return instance_iter(getMap_().end()); } - static instance_iter beginInstances() + + static S32 instanceCount() { return getMap_().size(); } + + static key_iter beginKeys() { - return instance_iter(boost::make_transform_iterator(getMap_().begin(), - boost::bind(&InstanceMap::value_type::second, _1))); + return key_iter(getMap_().begin()); } - static instance_iter endInstances() + static key_iter endKeys() { - return instance_iter(boost::make_transform_iterator(getMap_().end(), - boost::bind(&InstanceMap::value_type::second, _1))); + return key_iter(getMap_().end()); } - static S32 instanceCount() { return getMap_().size(); } + protected: LLInstanceTracker(KEY key) { add_(key); } - virtual ~LLInstanceTracker() { remove_(); } + virtual ~LLInstanceTracker() + { + // it's unsafe to delete instances of this type while all instances are being iterated over. + llassert(sIterationNestDepth == 0); + remove_(); + } virtual void setKey(KEY key) { remove_(); add_(key); } - virtual const KEY& getKey() const { return mKey; } + virtual const KEY& getKey() const { return mInstanceKey; } private: void add_(KEY key) { - mKey = key; + mInstanceKey = key; getMap_()[key] = static_cast(this); } void remove_() { - getMap_().erase(mKey); + getMap_().erase(mInstanceKey); } static InstanceMap& getMap_() @@ -116,9 +176,12 @@ private: private: - KEY mKey; + KEY mInstanceKey; + static S32 sIterationNestDepth; }; +template S32 LLInstanceTracker::sIterationNestDepth = 0; + /// explicit specialization for default case where KEY is T* /// use a simple std::set template @@ -127,15 +190,52 @@ class LLInstanceTracker : public LLInstanceTrackerBase typedef typename std::set InstanceSet; typedef LLInstanceTracker MyT; public: - /// Dereferencing key_iter gives you a T* (since T* is the key) - typedef typename InstanceSet::iterator key_iter; - /// Dereferencing instance_iter gives you a T& - typedef boost::indirect_iterator instance_iter; /// for completeness of analogy with the generic implementation static T* getInstance(T* k) { return k; } static S32 instanceCount() { return getSet_().size(); } + class instance_iter : public boost::iterator_facade + { + public: + instance_iter(typename InstanceSet::iterator& it) + : mIterator(it) + { + ++sIterationNestDepth; + } + + instance_iter(const instance_iter& other) + : mIterator(other.mIterator) + { + ++sIterationNestDepth; + } + + ~instance_iter() + { + --sIterationNestDepth; + } + + private: + friend class boost::iterator_core_access; + + void increment() { mIterator++; } + bool equal(instance_iter const& other) const + { + return mIterator == other.mIterator; + } + + T& dereference() const + { + return **mIterator; + } + + typename InstanceSet::iterator mIterator; + }; + + static instance_iter beginInstances() { return instance_iter(getSet_().begin()); } + static instance_iter endInstances() { return instance_iter(getSet_().end()); } + + // DEPRECATED: iterators now increment and decrement iteration depth // Instantiate this to get access to iterators for this type. It's a 'guard' in the sense // that it treats deletes of this type as errors as long as there is an instance of // this class alive in scope somewhere (i.e. deleting while iterating is bad). @@ -154,15 +254,12 @@ public: static instance_iter beginInstances() { return instance_iter(getSet_().begin()); } static instance_iter endInstances() { return instance_iter(getSet_().end()); } - static key_iter beginKeys() { return getSet_().begin(); } - static key_iter endKeys() { return getSet_().end(); } }; protected: LLInstanceTracker() { // it's safe but unpredictable to create instances of this type while all instances are being iterated over. I hate unpredictable. This assert will probably be turned on early in the next development cycle. - //llassert(sIterationNestDepth == 0); getSet_().insert(static_cast(this)); } virtual ~LLInstanceTracker() @@ -174,7 +271,6 @@ protected: LLInstanceTracker(const LLInstanceTracker& other) { - //llassert(sIterationNestDepth == 0); getSet_().insert(static_cast(this)); } -- cgit v1.3 From df82fbffa29428af258dc84ce2acbb07180f557e Mon Sep 17 00:00:00 2001 From: Richard Nelson Date: Tue, 26 Jul 2011 14:35:54 -0700 Subject: removed last vestiges of llinstancetracerscopedguard --- indra/llcommon/llinstancetracker.h | 21 --------------------- indra/llcommon/tests/llinstancetracker_test.cpp | 7 ++----- 2 files changed, 2 insertions(+), 26 deletions(-) (limited to 'indra/llcommon/llinstancetracker.h') diff --git a/indra/llcommon/llinstancetracker.h b/indra/llcommon/llinstancetracker.h index cdddd0d7a0..1ac6629f8a 100644 --- a/indra/llcommon/llinstancetracker.h +++ b/indra/llcommon/llinstancetracker.h @@ -235,27 +235,6 @@ public: static instance_iter beginInstances() { return instance_iter(getSet_().begin()); } static instance_iter endInstances() { return instance_iter(getSet_().end()); } - // DEPRECATED: iterators now increment and decrement iteration depth - // Instantiate this to get access to iterators for this type. It's a 'guard' in the sense - // that it treats deletes of this type as errors as long as there is an instance of - // this class alive in scope somewhere (i.e. deleting while iterating is bad). - class LLInstanceTrackerScopedGuard - { - public: - LLInstanceTrackerScopedGuard() - { - ++sIterationNestDepth; - } - - ~LLInstanceTrackerScopedGuard() - { - --sIterationNestDepth; - } - - static instance_iter beginInstances() { return instance_iter(getSet_().begin()); } - static instance_iter endInstances() { return instance_iter(getSet_().end()); } - }; - protected: LLInstanceTracker() { diff --git a/indra/llcommon/tests/llinstancetracker_test.cpp b/indra/llcommon/tests/llinstancetracker_test.cpp index c7cb488ca1..af55341e1f 100644 --- a/indra/llcommon/tests/llinstancetracker_test.cpp +++ b/indra/llcommon/tests/llinstancetracker_test.cpp @@ -156,8 +156,7 @@ namespace tut keys.insert(&two); keys.insert(&three); { - Unkeyed::LLInstanceTrackerScopedGuard guard; - for (Unkeyed::key_iter ki(guard.beginKeys()), kend(guard.endKeys()); + for (Unkeyed::key_iter ki(beginKeys()), kend(endKeys()); ki != kend; ++ki) { ensure_equals("spurious key", keys.erase(*ki), 1); @@ -170,9 +169,7 @@ namespace tut instances.insert(&two); instances.insert(&three); { - Unkeyed::LLInstanceTrackerScopedGuard guard; - for (Unkeyed::instance_iter ii(guard.beginInstances()), iend(guard.endInstances()); - ii != iend; ++ii) + for (Unkeyed::instance_iter ii(beginInstances()), iend(endInstances()); ii != iend; ++ii) { Unkeyed& ref = *ii; ensure_equals("spurious instance", instances.erase(&ref), 1); -- cgit v1.3 From 75d2382dc3fd1beb190eba12188883db98278f89 Mon Sep 17 00:00:00 2001 From: Richard Nelson Date: Tue, 26 Jul 2011 18:54:07 -0700 Subject: fixed build --- indra/llcommon/llinstancetracker.h | 10 +++++----- indra/llcommon/tests/llinstancetracker_test.cpp | 16 ++-------------- 2 files changed, 7 insertions(+), 19 deletions(-) (limited to 'indra/llcommon/llinstancetracker.h') diff --git a/indra/llcommon/llinstancetracker.h b/indra/llcommon/llinstancetracker.h index 1ac6629f8a..47041f790f 100644 --- a/indra/llcommon/llinstancetracker.h +++ b/indra/llcommon/llinstancetracker.h @@ -73,12 +73,12 @@ public: void increment() { mIterator++; } bool equal(instance_iter const& other) const { - return mIterator == other.m_iterator; + return mIterator == other.mIterator; } T& dereference() const { - return mIterator->second; + return *(mIterator->second); } typename InstanceMap::iterator mIterator; @@ -102,14 +102,14 @@ public: friend class boost::iterator_core_access; void increment() { mIterator++; } - bool equal(instance_iter const& other) const + bool equal(key_iter const& other) const { - return mIterator == other.m_iterator; + return mIterator == other.mIterator; } KEY& dereference() const { - return mIterator->first; + return const_cast(mIterator->first); } typename InstanceMap::iterator mIterator; diff --git a/indra/llcommon/tests/llinstancetracker_test.cpp b/indra/llcommon/tests/llinstancetracker_test.cpp index af55341e1f..73cbd76d91 100644 --- a/indra/llcommon/tests/llinstancetracker_test.cpp +++ b/indra/llcommon/tests/llinstancetracker_test.cpp @@ -151,25 +151,13 @@ namespace tut { Unkeyed one, two, three; typedef std::set KeySet; - KeySet keys; - keys.insert(&one); - keys.insert(&two); - keys.insert(&three); - { - for (Unkeyed::key_iter ki(beginKeys()), kend(endKeys()); - ki != kend; ++ki) - { - ensure_equals("spurious key", keys.erase(*ki), 1); - } - } - ensure_equals("unreported key", keys.size(), 0); - + KeySet instances; instances.insert(&one); instances.insert(&two); instances.insert(&three); { - for (Unkeyed::instance_iter ii(beginInstances()), iend(endInstances()); ii != iend; ++ii) + for (Unkeyed::instance_iter ii(Unkeyed::beginInstances()), iend(Unkeyed::endInstances()); ii != iend; ++ii) { Unkeyed& ref = *ii; ensure_equals("spurious instance", instances.erase(&ref), 1); -- cgit v1.3 From 7a43d38eaa7fc9bcdaaf21a0f915cc44bb7d3778 Mon Sep 17 00:00:00 2001 From: Richard Nelson Date: Wed, 27 Jul 2011 10:25:45 -0700 Subject: another fix for build --- indra/llcommon/llinstancetracker.h | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'indra/llcommon/llinstancetracker.h') diff --git a/indra/llcommon/llinstancetracker.h b/indra/llcommon/llinstancetracker.h index 47041f790f..78a67653c8 100644 --- a/indra/llcommon/llinstancetracker.h +++ b/indra/llcommon/llinstancetracker.h @@ -56,6 +56,8 @@ public: class instance_iter : public boost::iterator_facade { public: + typedef boost::iterator_facade super_t; + instance_iter(typename InstanceMap::iterator& it) : mIterator(it) { @@ -67,6 +69,13 @@ public: --sIterationNestDepth; } + instance_iter& operator =(const instance_iter& other) + { + mIterator = other.mIterator; + ++sIterationNestDepth; + super_t::operator=(other); + } + private: friend class boost::iterator_core_access; @@ -87,17 +96,33 @@ public: class key_iter : public boost::iterator_facade { public: + typedef boost::iterator_facade super_t; + key_iter(typename InstanceMap::iterator& it) : mIterator(it) { ++sIterationNestDepth; } + key_iter(const key_iter& other) + : mIterator(other.mIterator) + { + ++sIterationNestDepth; + } + + key_iter& operator =(const key_iter& other) + { + mIterator = other.mIterator; + ++sIterationNestDepth; + super_t::operator=(other); + } + ~key_iter() { --sIterationNestDepth; } + private: friend class boost::iterator_core_access; -- cgit v1.3 From 061e9efd3e7b7426c69d0f57447722a3aa321d96 Mon Sep 17 00:00:00 2001 From: Richard Nelson Date: Wed, 27 Jul 2011 13:11:09 -0700 Subject: broken operator= semantics for instance tracker iterators --- indra/llcommon/llinstancetracker.h | 13 ------------- 1 file changed, 13 deletions(-) (limited to 'indra/llcommon/llinstancetracker.h') diff --git a/indra/llcommon/llinstancetracker.h b/indra/llcommon/llinstancetracker.h index 78a67653c8..3c3b40f66f 100644 --- a/indra/llcommon/llinstancetracker.h +++ b/indra/llcommon/llinstancetracker.h @@ -69,12 +69,6 @@ public: --sIterationNestDepth; } - instance_iter& operator =(const instance_iter& other) - { - mIterator = other.mIterator; - ++sIterationNestDepth; - super_t::operator=(other); - } private: friend class boost::iterator_core_access; @@ -110,13 +104,6 @@ public: ++sIterationNestDepth; } - key_iter& operator =(const key_iter& other) - { - mIterator = other.mIterator; - ++sIterationNestDepth; - super_t::operator=(other); - } - ~key_iter() { --sIterationNestDepth; -- cgit v1.3 From 61a7726611e4818466bd9fbf84d3ab7ea1b97984 Mon Sep 17 00:00:00 2001 From: Richard Nelson Date: Wed, 27 Jul 2011 15:58:52 -0700 Subject: another potential gcc fix --- indra/llcommon/llinstancetracker.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'indra/llcommon/llinstancetracker.h') diff --git a/indra/llcommon/llinstancetracker.h b/indra/llcommon/llinstancetracker.h index 3c3b40f66f..dc5ca037f9 100644 --- a/indra/llcommon/llinstancetracker.h +++ b/indra/llcommon/llinstancetracker.h @@ -58,7 +58,7 @@ public: public: typedef boost::iterator_facade super_t; - instance_iter(typename InstanceMap::iterator& it) + instance_iter(typename const InstanceMap::iterator& it) : mIterator(it) { ++sIterationNestDepth; @@ -210,7 +210,7 @@ public: class instance_iter : public boost::iterator_facade { public: - instance_iter(typename InstanceSet::iterator& it) + instance_iter(typename const InstanceSet::iterator& it) : mIterator(it) { ++sIterationNestDepth; -- cgit v1.3 From 5eec3a4e51ae73e96750118096e9ab3168943949 Mon Sep 17 00:00:00 2001 From: Aaron Stone Date: Wed, 27 Jul 2011 16:03:01 -0700 Subject: Swap typename and const. --- indra/llcommon/llinstancetracker.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'indra/llcommon/llinstancetracker.h') diff --git a/indra/llcommon/llinstancetracker.h b/indra/llcommon/llinstancetracker.h index dc5ca037f9..b4891eba67 100644 --- a/indra/llcommon/llinstancetracker.h +++ b/indra/llcommon/llinstancetracker.h @@ -58,7 +58,7 @@ public: public: typedef boost::iterator_facade super_t; - instance_iter(typename const InstanceMap::iterator& it) + instance_iter(const typename InstanceMap::iterator& it) : mIterator(it) { ++sIterationNestDepth; @@ -210,7 +210,7 @@ public: class instance_iter : public boost::iterator_facade { public: - instance_iter(typename const InstanceSet::iterator& it) + instance_iter(const typename InstanceSet::iterator& it) : mIterator(it) { ++sIterationNestDepth; -- cgit v1.3