Re: Ping: Patch bug5291e

From: Dom Lachowicz (domlachowicz@yahoo.com)
Date: Mon Oct 06 2003 - 18:35:04 EDT

  • Next message: Dan Pidcock: "Re: Status of the BeOS branch ?"

    Robert,

    On the whole, this patch looks good. That said, I
    think that it adds too many lines - you basically end
    up duplicating ::find_slot.

    Can't we just implement one (UT_String) in terms of
    the other (const char *)?

    If you get that fixed up, please commit this. This
    patch is much more to my liking.

    Thanks,
    Dom

    --- Robert Wilhelm <robert.wilhelm@gmx.net> wrote:
    > Hi dom,
    >
    > here is my try to skip the UT_String constructor
    > in UT_StringPtrMap::pick(const char *). This time
    > I had to add some functions to ut_hash which take
    > (char *)
    > instead of UT_String.
    >
    > Even a little bit faster than Johnny Lee´s patch.
    >
    > Robert
    > > Index: ut_hash.cpp
    >
    ===================================================================
    > RCS file: /cvsroot/abi/src/af/util/xp/ut_hash.cpp,v
    > retrieving revision 1.39
    > diff -u -r1.39 ut_hash.cpp
    > --- ut_hash.cpp 13 Jul 2003 10:08:24 -0000 1.39
    > +++ ut_hash.cpp 6 Oct 2003 21:28:40 -0000
    > @@ -44,6 +44,11 @@
    > {
    > return (m_val == key);
    > }
    > +
    > + bool eq(const char *key) const
    > + {
    > + return (!strcmp(m_val.c_str(),key));
    > + }
    >
    > void operator=(const UT_String &k)
    > { m_val = k; }
    > @@ -64,6 +69,11 @@
    > return hashcode(key); // UT_String::hashcode
    > }
    >
    > + static UT_uint32 compute_hash(const char *key)
    > + {
    > + return hashcode(key);
    > + }
    > +
    > private:
    > UT_String m_val;
    > UT_uint32 m_hashval;
    > @@ -117,7 +127,16 @@
    > return m_key.hashval() == h;
    > #endif
    > }
    > -
    > +
    > + bool key_eq(const char *test, size_t h) const
    > + {
    > +#if 1
    > + return m_key.eq(test);
    > +#else
    > + return m_key.hashval() == h;
    > +#endif
    > + }
    > +
    > const void* m_value;
    > key_wrapper m_key;
    > };
    > @@ -184,12 +203,6 @@
    > */
    > const void* UT_StringPtrMap::pick(const char* k)
    > const
    > {
    > - UT_String aKey(k);
    > - return pick (aKey);
    > -}
    > -
    > -const void* UT_StringPtrMap::pick(const UT_String &
    > k) const
    > -{
    > hash_slot* sl = 0;
    > bool key_found = false;
    > size_t slot;
    > @@ -199,6 +212,11 @@
    > return key_found ? sl->value() : 0;
    > }
    >
    > +const void* UT_StringPtrMap::pick(const UT_String &
    > k) const
    > +{
    > + return pick (k.c_str());
    > +}
    > +
    > /*!
    > * See if the map contains the (key, value) pair
    > represented by (\k, \v)
    > * If \v is null, just see if the key \k exists
    > @@ -457,6 +475,127 @@
    > int nSlot = hashval % m_nSlots;
    >
    > xxx_UT_DEBUGMSG(("DOM: hashval for \"%s\" is %d
    > (#%dth slot)\n", k.c_str(), hashval, nSlot));
    > +
    > + hash_slot* sl = &m_pMapping[nSlot];
    > +
    > + if (sl->empty())
    > + {
    > +
    > + xxx_UT_DEBUGMSG(("DOM: empty slot\n"));
    > +
    > + slot = nSlot;
    > + key_found = false;
    > + return sl;
    > + }
    > + else
    > + {
    > + if (search_type != SM_REORG &&
    > + !sl->deleted() &&
    > + sl->key_eq(k, hashval))
    > + {
    > + slot = nSlot;
    > + key_found = true;
    > +
    > + if (v_found)
    > + {
    > + // so, if v_found is non-null, we should set
    > it.
    > + // if v is also non-null, sl->value() must
    > match v
    > + // otherwise we already have a key match, so we
    > win!
    > + if (v)
    > + {
    > + *v_found = (sl->value() == v);
    > + } else {
    > + *v_found = true;
    > + }
    > + }
    > +
    > + xxx_UT_DEBUGMSG(("DOM: found something #1\n"));
    > +
    > + return sl;
    > + }
    > + }
    > +
    > + int delta = (nSlot ? (m_nSlots - nSlot) : 1);
    > + hash_slot* tmp_sl = sl;
    > + sl = 0;
    > + size_t s = 0;
    > + key_found = false;
    > +
    > + while (1)
    > + {
    > + nSlot -= delta;
    > + if (nSlot < 0)
    > + {
    > + nSlot += m_nSlots;
    > + tmp_sl += (m_nSlots - delta);
    > + }
    > + else
    > + {
    > + tmp_sl -= delta;
    > + }
    > +
    > + if (tmp_sl->empty())
    > + {
    > + if (!s)
    > + {
    > + s = nSlot;
    > + sl = tmp_sl;
    > + }
    > + break;
    > +
    > + }
    > +
    > + if (tmp_sl->deleted())
    > + {
    > + if (!s)
    > + {
    > + s = nSlot;
    > + sl = tmp_sl;
    > + }
    > + }
    > + else if (search_type != SM_REORG &&
    > tmp_sl->key_eq(k, hashval))
    > + {
    > + s = nSlot;
    > + sl = tmp_sl;
    > + key_found = true;
    > +
    > + if (v_found)
    > + {
    > + if (v)
    > + {
    > + *v_found = (sl->value() == v);
    > + } else {
    > + *v_found = true;
    > + }
    > + }
    > + break;
    > + }
    > + }
    > +
    > + slot = s;
    > + return sl;
    > +}
    > +
    > +hash_slot*
    > +UT_StringPtrMap::find_slot(const char *k,
    > + SM_search_type search_type,
    > + size_t& slot,
    > + bool& key_found,
    > + size_t& hashval,
    > + const void* v,
    > + bool* v_found,
    > + void* vi,
    > + size_t hashval_in) const
    > +{
    > + if ( m_nSlots == 0 )
    > + {
    >
    === message truncated ===

    __________________________________
    Do you Yahoo!?
    The New Yahoo! Shopping - with improved product search
    http://shopping.yahoo.com



    This archive was generated by hypermail 2.1.4 : Mon Oct 06 2003 - 18:51:03 EDT