X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FShareContainer.h;h=084b044095668c1f7dbf5a307476240c52a137d0;hb=5091380d6bad1686800e384ed1bbb03836a15aab;hp=570f4110724b8e0806db21b4099d1ef3c2b57a1d;hpb=8cb2e519b3975cc643f2c93706137cf2e6a4f4d8;p=lyx.git diff --git a/src/ShareContainer.h b/src/ShareContainer.h index 570f411072..084b044095 100644 --- a/src/ShareContainer.h +++ b/src/ShareContainer.h @@ -3,27 +3,34 @@ #ifndef SHARECONTAINER_H #define SHARECONTAINER_H +#include +#include + #include #include #include -#include -#include -/// +/// Share objects between several users. +/** + This class can be used to reduce memory consuption when you have a lot + of equal objects used all over your code. + + \author Lars Gullik Bjønnes +*/ template -class ShareContainer : public noncopyable { +class ShareContainer : boost::noncopyable { public: /// typedef std::vector > Params; /// typedef typename Params::value_type value_type; - /// + /// Return a shared_ptr that points to a element equal to ps. value_type get(Share const & ps) const { // First see if we already have this ps in the container - Params::iterator it = std::find_if(params.begin(), - params.end(), - isEqual(ps)); + typename Params::iterator it = std::find_if(params.begin(), + params.end(), + isEqual(ps)); value_type tmp; if (it == params.end()) { // ok we don't have it so we should @@ -34,18 +41,18 @@ public: // some (one) unique elemements some times // but we should gain a lot in speed. clean(); - //std::sort(params.rbegin(), params.rend(), comp()); } else { // yes we have it already tmp = *it; - // move it forward + // move it forward - optimization + // makes the next find faster. if (it != params.begin()) - swap(*it, *(it - 1)); + std::swap(*it, *(it - 1)); } return tmp; } private: - /// + /// A functor returning true if the elements are equal. struct isEqual { isEqual(Share const & s) : p_(s) {} bool operator()(value_type const & p1) const { @@ -54,32 +61,26 @@ private: private: Share const & p_; }; - /// - //struct comp { - // int operator()(value_type const & p1, - // value_type const & p2) const { - // return p1.use_count() < p2.use_count(); - // } - //}; - /// + /// A functor returning true if the element is unique. struct isUnique { bool operator()(value_type const & p) const { return p.unique(); } }; - - /// + + /** Remove all unique items. + This removes all elements from params that is only referenced + from the private container. This can be considered a memory + optimizaton. + */ void clean() const { - // Remove all unique items. (i.e. entries that only - // exists in the conatainer and does not have a - // corresponding paragrah. - Params::iterator it = std::remove_if(params.begin(), - params.end(), - isUnique()); + typename Params::iterator it = std::remove_if(params.begin(), + params.end(), + isUnique()); params.erase(it, params.end()); } - - /// + + /// The actual container. mutable Params params; }; #endif