Introduced thr->threadsvp and THREADSV() for faster per-thread
[p5sagit/p5-mst-13.2.git] / hv.h
1 /*    hv.h
2  *
3  *    Copyright (c) 1991-1997, Larry Wall
4  *
5  *    You may distribute under the terms of either the GNU General Public
6  *    License or the Artistic License, as specified in the README file.
7  *
8  */
9
10 typedef struct he HE;
11 typedef struct hek HEK;
12
13 struct he {
14     HE          *hent_next;
15     HEK         *hent_hek;
16     SV          *hent_val;
17 };
18
19 struct hek {
20     U32         hek_hash;
21     I32         hek_len;
22     char        hek_key[1];
23 };
24
25 struct xpvhv {
26     char *      xhv_array;      /* pointer to malloced string */
27     STRLEN      xhv_fill;       /* how full xhv_array currently is */
28     STRLEN      xhv_max;        /* subscript of last element of xhv_array */
29     I32         xhv_keys;       /* how many elements in the array */
30     double      xnv_nv;         /* numeric value, if any */
31     MAGIC*      xmg_magic;      /* magic for scalar array */
32     HV*         xmg_stash;      /* class package */
33
34     I32         xhv_riter;      /* current root of iterator */
35     HE          *xhv_eiter;     /* current entry of iterator */
36     PMOP        *xhv_pmroot;    /* list of pm's for this package */
37     char        *xhv_name;      /* name, if a symbol table */
38 };
39
40 #define PERL_HASH(hash,str,len) \
41      STMT_START { \
42         register char *s_PeRlHaSh = str; \
43         register I32 i_PeRlHaSh = len; \
44         register U32 hash_PeRlHaSh = 0; \
45         while (i_PeRlHaSh--) \
46             hash_PeRlHaSh = hash_PeRlHaSh * 33 + *s_PeRlHaSh++; \
47         (hash) = hash_PeRlHaSh; \
48     } STMT_END
49
50
51 /* these hash entry flags ride on hent_klen (for use only in magic/tied HVs) */
52 #define HEf_SVKEY       -2      /* hent_key is a SV* */
53
54
55 #define Nullhv Null(HV*)
56 #define HvARRAY(hv)     ((HE**)((XPVHV*)  SvANY(hv))->xhv_array)
57 #define HvFILL(hv)      ((XPVHV*)  SvANY(hv))->xhv_fill
58 #define HvMAX(hv)       ((XPVHV*)  SvANY(hv))->xhv_max
59 #define HvKEYS(hv)      ((XPVHV*)  SvANY(hv))->xhv_keys
60 #define HvRITER(hv)     ((XPVHV*)  SvANY(hv))->xhv_riter
61 #define HvEITER(hv)     ((XPVHV*)  SvANY(hv))->xhv_eiter
62 #define HvPMROOT(hv)    ((XPVHV*)  SvANY(hv))->xhv_pmroot
63 #define HvNAME(hv)      ((XPVHV*)  SvANY(hv))->xhv_name
64
65 #define HvSHAREKEYS(hv)         (SvFLAGS(hv) & SVphv_SHAREKEYS)
66 #define HvSHAREKEYS_on(hv)      (SvFLAGS(hv) |= SVphv_SHAREKEYS)
67 #define HvSHAREKEYS_off(hv)     (SvFLAGS(hv) &= ~SVphv_SHAREKEYS)
68
69 #define HvLAZYDEL(hv)           (SvFLAGS(hv) & SVphv_LAZYDEL)
70 #define HvLAZYDEL_on(hv)        (SvFLAGS(hv) |= SVphv_LAZYDEL)
71 #define HvLAZYDEL_off(hv)       (SvFLAGS(hv) &= ~SVphv_LAZYDEL)
72
73 #ifdef OVERLOAD
74
75 /* Maybe amagical: */
76 /* #define HV_AMAGICmb(hv)      (SvFLAGS(hv) & (SVpgv_badAM | SVpgv_AM)) */
77
78 #define HV_AMAGIC(hv)        (SvFLAGS(hv) &   SVpgv_AM)
79 #define HV_AMAGIC_on(hv)     (SvFLAGS(hv) |=  SVpgv_AM)
80 #define HV_AMAGIC_off(hv)    (SvFLAGS(hv) &= ~SVpgv_AM)
81
82 /*
83 #define HV_AMAGICbad(hv)     (SvFLAGS(hv) & SVpgv_badAM)
84 #define HV_badAMAGIC_on(hv)  (SvFLAGS(hv) |= SVpgv_badAM)
85 #define HV_badAMAGIC_off(hv) (SvFLAGS(hv) &= ~SVpgv_badAM)
86 */
87
88 #endif /* OVERLOAD */
89
90 #define Nullhe Null(HE*)
91 #define HeNEXT(he)              (he)->hent_next
92 #define HeKEY_hek(he)           (he)->hent_hek
93 #define HeKEY(he)               HEK_KEY(HeKEY_hek(he))
94 #define HeKEY_sv(he)            (*(SV**)HeKEY(he))
95 #define HeKLEN(he)              HEK_LEN(HeKEY_hek(he))
96 #define HeVAL(he)               (he)->hent_val
97 #define HeHASH(he)              HEK_HASH(HeKEY_hek(he))
98 #define HePV(he,lp)             ((HeKLEN(he) == HEf_SVKEY) ?            \
99                                  SvPV(HeKEY_sv(he),lp) :                \
100                                  (((lp = HeKLEN(he)) >= 0) ?            \
101                                   HeKEY(he) : Nullch))
102
103 #define HeSVKEY(he)             ((HeKEY(he) &&                          \
104                                   HeKLEN(he) == HEf_SVKEY) ?            \
105                                  HeKEY_sv(he) : Nullsv)
106
107 #define HeSVKEY_force(he)       (HeKEY(he) ?                            \
108                                  ((HeKLEN(he) == HEf_SVKEY) ?           \
109                                   HeKEY_sv(he) :                        \
110                                   sv_2mortal(newSVpv(HeKEY(he),         \
111                                                      HeKLEN(he)))) :    \
112                                  &sv_undef)
113 #define HeSVKEY_set(he,sv)      ((HeKLEN(he) = HEf_SVKEY), (HeKEY_sv(he) = sv))
114
115 #define Nullhek Null(HEK*)
116 #define HEK_BASESIZE            STRUCT_OFFSET(HEK, hek_key[0])
117 #define HEK_HASH(hek)           (hek)->hek_hash
118 #define HEK_LEN(hek)            (hek)->hek_len
119 #define HEK_KEY(hek)            (hek)->hek_key