Ryan Bloom wrote:

>On Saturday 08 September 2001 15:25, Brian Pane wrote:
>
>>Ryan Bloom wrote:
>>
>>>>>The latter.  Having two API's to the same functions should only be done
>>>>>as a stop-gap.
>>>>>
>>>>I disagree.  It's inevitable to have two APIs, as long as we have two
>>>>'table' types with very different semantics.
>>>>
>>>>apr_table_t is statically typed (uses char*), and apr_hash_t isn't (uses
>>>>void*).
>>>>If we did a direct replacement of apr_table_t with apr_hash_t in the
>>>>httpd, we'd be sacrificing static type-safety for a lot of code.
>>>>
>>>So create a simple set of prototypes and macros for a char * version of
>>>the hash code, the same way we did for ap_strchr and ap_strchr_c.  If you
>>>do that, you will be adding probably two or three new functions to APR.\
>>>
>>Yes, macro wrappers would work.  But if we use that approach, it would
>>be advantageous to use macro names like "apr_table_get" so that all
>>the existing httpd code and 3rd party modules can be used without
>>modification.
>>This would be functionally equivalent to the "implement apr_table_t using
>>apr_hash_t" approach that I prefer.
>>
>
>That would make tables a hash again, which is what I disagree with.  Yes,
>creating a new API will require module authors to modify their code to take
>advantage of the hash table performance.  But, it keeps the table API refering
>to tables, instead of hashes.  This will also require more modifications to
>httpd, but in the end, it keeps the code easier to read and understand.
>
To me, a table, even if implemented using apr_hash_t, is different from
an apr_hash_t.  The apr_table_t, as it's been used in the httpd, isn't a
general-purpose set-of-strings.  Rather, it's a set-of-strings-with-special-
support-for-concatenation-and-merging-that-works-well-for-http-headers.
Operations that are essential on tables, like apr_table_merge() and the
corresponding support in apr_table_overlap(), don't make sense for the
general-purpose, type-neutral apr_hash_t.

I'm also opposed to having a declaration like:
   apr_hash_t *headers_in;
   apr_hash_t *headers_out;
in the request_rec.  Architecturally, those objects need to be unordered 
sets with
fast access and the aforementioned merge support.  They don't need to be 
hash tables
specifically.  The implementation could just as well be a balanced tree; 
all the code
in the httpd that uses the httpd shouldn't know or care about how the 
"unordered set"
object is implemented.

--Brian


Reply via email to