You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@stdcxx.apache.org by "Farid Zaripov (JIRA)" <ji...@apache.org> on 2008/12/04 16:52:44 UTC

[jira] Updated: (STDCXX-995) __rw_new_capacity() doesn't control map, set

     [ https://issues.apache.org/jira/browse/STDCXX-995?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Farid Zaripov updated STDCXX-995:
---------------------------------

    Attachment: stdcxx-995.patch

What about just passing the particular container type to __rb_tree<> class using additional template parameter?

The proposed patch is attached.

> __rw_new_capacity() doesn't control map, set
> --------------------------------------------
>
>                 Key: STDCXX-995
>                 URL: https://issues.apache.org/jira/browse/STDCXX-995
>             Project: C++ Standard Library
>          Issue Type: Bug
>          Components: 23. Containers
>    Affects Versions: 4.1.2, 4.1.3, 4.1.4, 4.2.0, 4.2.1
>            Reporter: Martin Sebor
>            Priority: Minor
>             Fix For: 4.2.2
>
>         Attachments: stdcxx-995.patch
>
>   Original Estimate: 2h
>  Remaining Estimate: 2h
>
> -------- Original Message --------
> Subject: Re:  Controlling allocation policy of STL set.
> Date: Thu, 17 Jul 2008 17:18:17 -0700 (PDT)
> From: Dennis Handly <dhandly AT cup DOT hp DOT com>
> To: sebor AT roguewave DOT com
> CC: boris.gubenko AT hp DOT com, dhandly AT cup DOT hp DOT com, premanand.rao AT hp DOT com
> We had this question from a user recently.  I was able to reverse engineer
> how to do this with map/set.
> Is this level of difficulty known?
> Here is a link where we mention the info about {{__rw_new_capacity}}:
> http://docs.hp.com/en/10946/libs.htm#container_alloc
> I would be nice if we could just use the private typedef
> {{std::map<K,V>::__rep_type}}.
> Then we could just use:
> {noformat}
> #include <set>
> typedef std::set<key_type> BlagPset;
> typedef BlagPset::__rep_type BlagPtree;
> // forward
> template<>
> inline size_t __rw::__rw_new_capacity<BlagPtree>(size_t size, BlagPtree const*);
> {noformat}
> Do you see any issues with making {{__rep_type}} public?
> (Your Apache code still has it private but as {{_C_repT}}.)
> ===========================================================================
> Do you know why the following code fragment does not work for me?
> i.e it controls the vector's allocation policy as I expect, but not the
> set's. I can believe there is some stupid mistake in there, but I have been
> staring at it for a while now...
> {noformat}
> #include <stdio.h>
> #include <vector>
> #include <set>
> class Blag { int a; };
> std::vector<Blag*> bvec;
> std::set<Blag*> bset;
> template<>
> inline size_t __rw::__rw_new_capacity<std::vector<Blag*> >(size_t size,
>                                       std::vector<Blag*> const*) {
>     if (size == 0) {
>         fprintf(stderr, "Initial size will be 8 for vector\n");
>         return 8;
>     } else
>         return size * 2;
> }
> template<>
> inline size_t __rw::__rw_new_capacity<std::set<Blag*> >(size_t size,
>                                        std::set<Blag*> const*) {
>     if (size == 0) {
>         fprintf(stderr, "Initial size will be 8 for set\n");
>         return 8;
>     } else
>         return size * 2;
> }
> int main() {
>     bset.insert(0);
>     bvec.push_back(0);
> }
> {noformat}
> ===========================================================================
> >From: Dennis Handly <dhandly AT cup DOT hp DOT com>
> >Do you know why the following code fragment does not work for me?
> Storage isn't allocated for the set but by the {{__rbtree}}.
> >I can believe there is some stupid mistake in there
> It isn't easy, you have to find the {{__rw_new_capacity call}}.
> {noformat}
> #include <stdio.h>
> #include <vector>
> class Blag { int a; };
> typedef Blag* key_type;
> // start kludge
> #include <functional>
> namespace __rw {
> template <class _Key, class _Val, class _KeyOf, class _Comp, class _Alloc>
> class __rb_tree;
> template <class _TypeT, class _TypeU>
> struct __ident;
> } // namespace __rw
> typedef __rw::__rb_tree<key_type, key_type, __rw::__ident<key_type, key_type>,
>                         std::less<key_type>, std::allocator<key_type> >
>                         BlagPtree;
> // forward
> template<>
> inline size_t __rw::__rw_new_capacity<BlagPtree>(size_t size, BlagPtree const*);
> // end kludge
> #include <set>
> typedef std::vector<key_type> BlagPvec;
> typedef std::set<key_type> BlagPset;
> BlagPvec bvec;
> BlagPset bset;
> template<>
> inline size_t __rw::__rw_new_capacity<BlagPvec>(size_t size, BlagPvec const*) {
>     if (size == 0) {
>         fprintf(stderr, "Initial size will be 8 for vector\n");
>         return 8;
>     } else
>         return size * 2;
> }
> // useless
> template<>
> inline size_t __rw::__rw_new_capacity<BlagPset>(size_t size, BlagPset const*) {
>     if (size == 0) {
>         fprintf(stderr, "Initial size will be 8 for set\n");
>         return 8;
>     } else
>         return size * 2;
> }
> template<>
> inline size_t __rw::__rw_new_capacity<BlagPtree>(size_t size, BlagPtree const*){
>     if (size == 0) {
>         fprintf(stderr, "Initial size will be 8 for tree\n");
>         return 8;
>     } else
>         return size * 2;
> }
> int main() {
>     bset.insert(0);
>     bvec.push_back(0);
> }
> {noformat}

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.