OSDN Git Service

df07eb38644acdb8af1a546eb4f29ed17fe539a9
[pf3gnuchains/gcc-fork.git] / libstdc++-v3 / testsuite / util / common_type / assoc / common_type.hpp
1 // -*- C++ -*-
2
3 // Copyright (C) 2005, 2006 Free Software Foundation, Inc.
4 //
5 // This file is part of the GNU ISO C++ Library.  This library is free
6 // software; you can redistribute it and/or modify it under the terms
7 // of the GNU General Public License as published by the Free Software
8 // Foundation; either version 2, or (at your option) any later
9 // version.
10
11 // This library is distributed in the hope that it will be useful, but
12 // WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 // General Public License for more details.
15
16 // You should have received a copy of the GNU General Public License
17 // along with this library; see the file COPYING.  If not, write to
18 // the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
19 // MA 02111-1307, USA.
20
21 // As a special exception, you may use this file as part of a free
22 // software library without restriction.  Specifically, if other files
23 // instantiate templates or use macros or inline functions from this
24 // file, or you compile this file and link it with other files to
25 // produce an executable, this file does not by itself cause the
26 // resulting executable to be covered by the GNU General Public
27 // License.  This exception does not however invalidate any other
28 // reasons why the executable file might be covered by the GNU General
29 // Public License.
30
31 // Copyright (C) 2004 Ami Tavory and Vladimir Dreizin, IBM-HRL.
32
33 // Permission to use, copy, modify, sell, and distribute this software
34 // is hereby granted without fee, provided that the above copyright
35 // notice appears in all copies, and that both that copyright notice
36 // and this permission notice appear in supporting documentation. None
37 // of the above authors, nor IBM Haifa Research Laboratories, make any
38 // representation about the suitability of this software for any
39 // purpose. It is provided "as is" without express or implied
40 // warranty.
41
42 /**
43  * @file common_type.hpp
44  * Contains common types.
45  */
46
47 #ifndef PB_DS_COMMON_TYPES_HPP
48 #define PB_DS_COMMON_TYPES_HPP
49
50 #include <ext/pb_ds/detail/type_utils.hpp>
51 #include <common_type/assoc/template_policy.hpp>
52 #include <ext/pb_ds/assoc_container.hpp>
53
54 namespace pb_ds
55 {
56
57   namespace test
58   {
59
60     template<typename Key,
61              typename Data,
62              class Hash_Fn =
63              typename pb_ds::detail::default_hash_fn<
64       Key>::type,
65              class Eq_Fn =
66              std::equal_to<Key>,
67              class Allocator =
68              std::allocator< std::pair<const Key, Data> > >
69     struct hash_common_types
70     {
71     private:
72       typedef typename Allocator::size_type size_type;
73
74       typedef
75       pb_ds::test::hash_load_check_resize_trigger_t_<
76         Allocator,
77         1, 8,
78         1, 2,
79         false>
80       no_access_half_load_check_resize_trigger_policy;
81
82       typedef
83       pb_ds::test::hash_load_check_resize_trigger_t_<
84         Allocator,
85         1, 8,
86         1, 2,
87         true>
88       access_half_load_check_resize_trigger_policy;
89
90       typedef
91       pb_ds::test::hash_load_check_resize_trigger_t_<
92         Allocator,
93         1, 8,
94         1, 1,
95         false>
96       no_access_one_load_check_resize_trigger_policy;
97
98       typedef
99       pb_ds::test::cc_hash_max_collision_check_resize_trigger_t_<
100         Allocator,
101         1, 2,
102         false>
103       no_access_half_max_col_check_check_resize_trigger_policy;
104
105       typedef
106       pb_ds::test::cc_hash_max_collision_check_resize_trigger_t_<
107         Allocator,
108         1, 2,
109         true>
110       access_half_max_col_check_check_resize_trigger_policy;
111
112       typedef pb_ds::test::linear_probe_fn_t_< Key, Allocator> lin_p_t;
113
114       typedef pb_ds::test::quadratic_probe_fn_t_< Key, Allocator> quad_p_t;
115
116       typedef
117       typename pb_ds::detail::typelist4<
118         pb_ds::detail::false_type,
119         pb_ds::test::direct_mask_range_hashing_t_<
120         Allocator>,
121         no_access_half_load_check_resize_trigger_policy,
122         pb_ds::test::hash_exponential_size_policy_t_<
123         Allocator> >::type
124       performance_cc_policy0;
125
126       typedef
127       typename pb_ds::detail::typelist4<
128         pb_ds::detail::false_type,
129         pb_ds::test::direct_mod_range_hashing_t_<
130         Allocator>,
131         no_access_half_load_check_resize_trigger_policy,
132         pb_ds::test::hash_prime_size_policy_t_>::type
133       performance_cc_policy1;
134
135       typedef
136       typename pb_ds::detail::typelist4<
137         pb_ds::detail::false_type,
138         pb_ds::test::direct_mask_range_hashing_t_<
139         Allocator>,
140         no_access_one_load_check_resize_trigger_policy,
141         pb_ds::test::hash_exponential_size_policy_t_<
142         Allocator> >::type
143       performance_cc_policy2;
144
145       typedef
146       typename pb_ds::detail::typelist4<
147         pb_ds::detail::false_type,
148         pb_ds::test::direct_mod_range_hashing_t_<
149         Allocator>,
150         no_access_one_load_check_resize_trigger_policy,
151         pb_ds::test::hash_prime_size_policy_t_ >::type
152       performance_cc_policy3;
153
154       typedef
155       typename pb_ds::detail::typelist4<
156         pb_ds::detail::true_type,
157         pb_ds::test::direct_mask_range_hashing_t_<
158         Allocator>,
159         no_access_half_load_check_resize_trigger_policy,
160         pb_ds::test::hash_exponential_size_policy_t_<
161         Allocator> >::type
162       performance_cc_policy4;
163
164       typedef
165       typename pb_ds::detail::typelist4<
166         pb_ds::detail::false_type,
167         pb_ds::test::direct_mask_range_hashing_t_<
168         Allocator>,
169         no_access_half_max_col_check_check_resize_trigger_policy,
170         pb_ds::test::hash_exponential_size_policy_t_<
171         Allocator> >::type
172       performance_cc_policy5;
173
174       typedef
175       typename pb_ds::detail::typelist4<
176         pb_ds::detail::false_type,
177         pb_ds::test::direct_mask_range_hashing_t_<
178         Allocator>,
179         access_half_max_col_check_check_resize_trigger_policy,
180         pb_ds::test::hash_exponential_size_policy_t_<
181         Allocator> >::type
182       regression_cc_policy0;
183
184       typedef
185       typename pb_ds::detail::typelist4<
186         pb_ds::detail::false_type,
187         pb_ds::test::direct_mask_range_hashing_t_<
188         Allocator>,
189         access_half_load_check_resize_trigger_policy,
190         pb_ds::test::hash_exponential_size_policy_t_<
191         Allocator> >::type
192       regression_cc_policy1;
193
194       typedef
195       typename pb_ds::detail::typelist4<
196         pb_ds::detail::true_type,
197         pb_ds::test::direct_mod_range_hashing_t_<
198         Allocator>,
199         no_access_half_load_check_resize_trigger_policy,
200         pb_ds::test::hash_prime_size_policy_t_ >::type
201       regression_cc_policy2;
202
203       typedef
204       typename pb_ds::detail::typelist5<
205         pb_ds::detail::false_type,
206         lin_p_t,
207         pb_ds::test::direct_mask_range_hashing_t_<
208         Allocator>,
209         no_access_half_load_check_resize_trigger_policy,
210         pb_ds::test::hash_exponential_size_policy_t_<
211         Allocator> >::type
212       performance_gp_policy0;
213
214       typedef
215       typename pb_ds::detail::typelist5<
216         pb_ds::detail::false_type,
217         quad_p_t,
218         pb_ds::test::direct_mod_range_hashing_t_<
219         Allocator>,
220         no_access_half_load_check_resize_trigger_policy,
221         pb_ds::test::hash_prime_size_policy_t_ >::type
222       performance_gp_policy1;
223
224       typedef
225       typename pb_ds::detail::typelist5<
226         pb_ds::detail::false_type,
227         quad_p_t,
228         pb_ds::test::direct_mod_range_hashing_t_<
229         Allocator>,
230         access_half_load_check_resize_trigger_policy,
231         pb_ds::test::hash_prime_size_policy_t_>::type
232       regression_gp_policy0;
233
234       typedef
235       typename pb_ds::detail::typelist5<
236         pb_ds::detail::true_type,
237         lin_p_t,
238         pb_ds::test::direct_mask_range_hashing_t_<
239         Allocator>,
240         access_half_load_check_resize_trigger_policy,
241         pb_ds::test::hash_exponential_size_policy_t_<
242         Allocator> >::type
243       regression_gp_policy1;
244
245       typedef
246       typename pb_ds::detail::typelist6<
247         performance_cc_policy0,
248         performance_cc_policy1,
249         performance_cc_policy2,
250         performance_cc_policy3,
251         performance_cc_policy4,
252         performance_cc_policy5>::type
253       performance_cc_range_hashing_policies;
254
255       typedef
256       typename pb_ds::detail::typelist3<
257         regression_cc_policy0,
258         regression_cc_policy1,
259         regression_cc_policy2>::type
260       regression_cc_range_hashing_policies;
261
262       typedef
263       typename pb_ds::detail::typelist2<
264         performance_gp_policy0,
265         performance_gp_policy1>::type
266       performance_gp_range_hashing_policies;
267
268       typedef
269       typename pb_ds::detail::typelist2<
270         regression_gp_policy0,
271         regression_gp_policy1>::type
272       regression_gp_range_hashing_policies;
273
274       template<typename Policy_Tl>
275       struct no_access_generic_cc_hash_table_t
276       {
277       private:
278         typedef
279         typename pb_ds::detail::typelist_at_index<
280         Policy_Tl, 0>::type
281         store_hash_indicator;
282
283         enum
284           {
285             store_hash = store_hash_indicator::value
286           };
287
288         typedef
289         typename pb_ds::detail::typelist_at_index<
290           Policy_Tl, 1>::type
291         comb_hash_fn;
292
293         typedef
294         typename pb_ds::detail::typelist_at_index<
295           Policy_Tl, 2>::type
296         trigger_policy;
297
298         typedef
299         typename pb_ds::detail::typelist_at_index<
300           Policy_Tl, 3>::type
301         size_policy;
302
303       public:
304         typedef
305         pb_ds::cc_hash_table<
306         Key,
307         Data,
308         Hash_Fn,
309         Eq_Fn,
310         comb_hash_fn,
311         pb_ds::hash_standard_resize_policy<
312         size_policy,
313         trigger_policy,
314         false>,
315         store_hash,
316         Allocator>
317         type;
318       };
319
320       template<typename Policy_Tl>
321       struct access_generic_cc_hash_table_t
322       {
323       private:
324         typedef
325         typename pb_ds::detail::typelist_at_index<
326         Policy_Tl, 0>::type
327         store_hash_indicator;
328
329         enum
330           {
331             store_hash = store_hash_indicator::value
332           };
333
334         typedef
335         typename pb_ds::detail::typelist_at_index<
336           Policy_Tl, 1>::type
337         comb_hash_fn;
338
339         typedef
340         typename pb_ds::detail::typelist_at_index<
341           Policy_Tl, 2>::type
342         trigger_policy;
343
344         typedef
345         typename pb_ds::detail::typelist_at_index<
346           Policy_Tl, 3>::type
347         size_policy;
348
349       public:
350         typedef
351         pb_ds::cc_hash_table<
352         Key,
353         Data,
354         Hash_Fn,
355         Eq_Fn,
356         comb_hash_fn,
357         pb_ds::hash_standard_resize_policy<
358         size_policy,
359         trigger_policy,
360         true>,
361         store_hash,
362         Allocator>
363         type;
364       };
365
366       template<typename Policy_Tl>
367       struct no_access_generic_gp_hash_table_t
368       {
369       private:
370         typedef
371         typename pb_ds::detail::typelist_at_index<
372         Policy_Tl, 0>::type
373         store_hash_indicator;
374
375         enum
376           {
377             store_hash = store_hash_indicator::value
378           };
379
380         typedef
381         typename pb_ds::detail::typelist_at_index<
382           Policy_Tl, 1>::type
383         probe_fn;
384
385         typedef
386         typename pb_ds::detail::typelist_at_index<
387           Policy_Tl, 2>::type
388         comb_probe_fn;
389
390         typedef
391         typename pb_ds::detail::typelist_at_index<
392           Policy_Tl, 3>::type
393         trigger_policy;
394
395         typedef
396         typename pb_ds::detail::typelist_at_index<
397           Policy_Tl, 4>::type
398         size_policy;
399
400       public:
401         typedef
402         pb_ds::gp_hash_table<
403         Key,
404         Data,
405         Hash_Fn,
406         Eq_Fn,
407         comb_probe_fn,
408         probe_fn,
409         pb_ds::hash_standard_resize_policy<
410         size_policy,
411         trigger_policy,
412         false>,
413         store_hash,
414         Allocator>
415         type;
416       };
417
418       template<typename Policy_Tl>
419       struct access_generic_gp_hash_table_t
420       {
421       private:
422         typedef
423         typename pb_ds::detail::typelist_at_index<
424         Policy_Tl, 0>::type
425         store_hash_indicator;
426
427         enum
428           {
429             store_hash = store_hash_indicator::value
430           };
431
432         typedef
433         typename pb_ds::detail::typelist_at_index<
434           Policy_Tl, 1>::type
435         probe_fn;
436
437         typedef
438         typename pb_ds::detail::typelist_at_index<
439           Policy_Tl, 2>::type
440         comb_probe_fn;
441
442         typedef
443         typename pb_ds::detail::typelist_at_index<
444           Policy_Tl, 3>::type
445         trigger_policy;
446
447         typedef
448         typename pb_ds::detail::typelist_at_index<
449           Policy_Tl, 4>::type
450         size_policy;
451
452       public:
453         typedef
454         pb_ds::gp_hash_table<
455         Key,
456         Data,
457         Hash_Fn,
458         Eq_Fn,
459         comb_probe_fn,
460         probe_fn,
461         pb_ds::hash_standard_resize_policy<
462         size_policy,
463         trigger_policy,
464         true>,
465         store_hash,
466         Allocator>
467         type;
468       };
469
470       typedef
471       typename pb_ds::detail::typelist_transform<
472         performance_cc_range_hashing_policies,
473         no_access_generic_cc_hash_table_t>::type
474       performance_cc_types;
475
476       typedef
477       typename pb_ds::detail::typelist_transform<
478         regression_cc_range_hashing_policies,
479         access_generic_cc_hash_table_t>::type
480       regression_cc_types;
481
482       typedef
483       typename pb_ds::detail::typelist_at_index<
484         performance_cc_types,
485         0>::type
486       performance_min_cc_type;
487
488       typedef
489       typename pb_ds::detail::typelist_transform<
490         performance_gp_range_hashing_policies,
491         no_access_generic_gp_hash_table_t>::type
492       performance_gp_types;
493
494       typedef
495       typename pb_ds::detail::typelist_transform<
496         regression_gp_range_hashing_policies,
497         access_generic_gp_hash_table_t>::type
498       regression_gp_types;
499
500       typedef
501       typename pb_ds::detail::typelist_at_index<
502         performance_gp_types,
503         0>::type
504       performance_min_gp_type;
505
506     public:
507       typedef
508       typename pb_ds::detail::typelist_append<
509       performance_cc_types,
510       performance_gp_types>::type
511       performance_tl;
512
513       typedef
514       typename pb_ds::detail::typelist_append<
515         regression_gp_types,
516         regression_cc_types>::type
517       regression_tl;
518
519       typedef
520       typename pb_ds::detail::typelist1<
521         performance_min_cc_type>::type
522       performance_min_tl;
523     };
524
525     template<typename Key,
526              typename Data,
527              class Comb_Hash_Fn_TL,
528              class Comb_Probe_Fn_TL,
529              class Eq_Fn =
530              std::equal_to<Key>,
531              class Allocator =
532              std::allocator<
533       std::pair<
534       const Key,
535       Data> > >
536     struct ranged_hash_common_types
537     {
538     private:
539       typedef typename Allocator::size_type size_type;
540
541       typedef
542       pb_ds::test::hash_load_check_resize_trigger_t_<
543         Allocator,
544         1, 8,
545         1, 2,
546         false>
547       no_access_half_load_check_resize_trigger_policy;
548
549       typedef
550       pb_ds::test::hash_load_check_resize_trigger_t_<
551         Allocator,
552         1, 8,
553         1, 1,
554         false>
555       no_access_one_load_check_resize_trigger_policy;
556
557       typedef
558       pb_ds::hash_standard_resize_policy<
559         pb_ds::test::hash_exponential_size_policy_t_<
560         Allocator>,
561         no_access_half_load_check_resize_trigger_policy>
562       mask_half_resize_policy_t;
563
564       typedef
565       pb_ds::hash_standard_resize_policy<
566         pb_ds::test::hash_exponential_size_policy_t_<
567         Allocator>,
568         no_access_one_load_check_resize_trigger_policy>
569       mask_one_resize_policy_t;
570
571       typedef
572       pb_ds::hash_standard_resize_policy<
573         pb_ds::test::hash_prime_size_policy_t_,
574         no_access_half_load_check_resize_trigger_policy>
575       mod_half_resize_policy_t;
576
577       typedef
578       pb_ds::hash_standard_resize_policy<
579         pb_ds::test::hash_prime_size_policy_t_,
580         no_access_one_load_check_resize_trigger_policy>
581       mod_one_resize_policy_t;
582
583       template<typename Comb_Hash_Fn_>
584       struct half_resize_policy_selector;
585
586       template<typename Allocator_>
587       struct half_resize_policy_selector<
588         pb_ds::test::direct_mask_range_hashing_t_<
589         Allocator_> >
590       {
591         typedef mask_half_resize_policy_t type;
592       };
593
594       template<typename Allocator_>
595       struct half_resize_policy_selector<
596         pb_ds::test::direct_mod_range_hashing_t_<
597         Allocator_> >
598       {
599         typedef mod_half_resize_policy_t type;
600       };
601
602       template<typename Comb_Hash_Fn_>
603       struct one_resize_policy_selector;
604
605       template<typename Allocator_>
606       struct one_resize_policy_selector<
607         pb_ds::test::direct_mask_range_hashing_t_<
608         Allocator_> >
609       {
610         typedef mask_one_resize_policy_t type;
611       };
612
613       template<typename Allocator_>
614       struct one_resize_policy_selector<
615         pb_ds::test::direct_mod_range_hashing_t_<
616         Allocator_> >
617       {
618         typedef mod_one_resize_policy_t type;
619       };
620
621       template<typename Comb_Hash_Fn>
622       struct generic_cc_hash_table_t
623       {
624         typedef
625         pb_ds::cc_hash_table<
626           Key,
627           Data,
628           pb_ds::null_hash_fn,
629           Eq_Fn,
630           Comb_Hash_Fn,
631           typename one_resize_policy_selector<
632           typename Comb_Hash_Fn::comb_fn>::type,
633           false,
634           Allocator>
635         type;
636       };
637
638       typedef
639       typename pb_ds::detail::typelist_transform<
640         Comb_Hash_Fn_TL,
641         generic_cc_hash_table_t>::type
642       performance_cc_types;
643
644       template<typename Comb_Probe_Fn>
645       struct no_access_generic_gp_hash_table_t
646       {
647         typedef
648         pb_ds::gp_hash_table<
649           Key,
650           Data,
651           pb_ds::null_hash_fn,
652           Eq_Fn,
653           Comb_Probe_Fn,
654           pb_ds::null_probe_fn,
655           typename half_resize_policy_selector<
656           typename Comb_Probe_Fn::comb_fn>::type,
657           false,
658           Allocator>
659         type;
660       };
661
662       typedef
663       typename pb_ds::detail::typelist_transform<
664         Comb_Probe_Fn_TL,
665         no_access_generic_gp_hash_table_t>::type
666       performance_gp_types;
667
668     public:
669       typedef
670       typename pb_ds::detail::typelist_append<
671       performance_cc_types,
672       performance_gp_types>::type
673       performance_tl;
674     };
675
676     template<typename Key, typename Data, class Eq_Fn = std::equal_to<Key>,
677              class Allocator =
678              std::allocator<char> >
679     class lu_common_types
680     {
681     private:
682       typedef typename Allocator::size_type size_type;
683
684       typedef pb_ds::test::move_to_front_lu_policy_t_ mtf_u;
685
686       typedef pb_ds::test::counter_lu_policy_t_< Allocator, 5> cnt_5_u;
687
688       typedef typename pb_ds::detail::typelist1< mtf_u>::type lu_policy0;
689
690       typedef typename pb_ds::detail::typelist1< cnt_5_u>::type lu_policy1;
691
692       typedef
693       typename pb_ds::detail::typelist2<
694         lu_policy0,
695         lu_policy1>::type
696       lu_policies;
697
698       template<typename Policy_Tl>
699       struct generic_list_update_t
700       {
701       private:
702         typedef
703         typename pb_ds::detail::typelist_at_index<
704         Policy_Tl, 0>::type
705         update_policy_t;
706
707       public:
708         typedef
709         pb_ds::list_update<
710         Key,
711         Data,
712         Eq_Fn,
713         update_policy_t,
714         Allocator>
715         type;
716       };
717
718       typedef
719       typename pb_ds::detail::typelist_transform<
720         lu_policies,
721         generic_list_update_t>::type
722       lu_types;
723
724       typedef
725       typename pb_ds::detail::typelist_at_index<
726         lu_types,
727         0>::type
728       min_lu_type;
729
730     public:
731       typedef lu_types performance_tl;
732
733       typedef lu_types regression_tl;
734
735       typedef
736       typename pb_ds::detail::typelist1<
737         min_lu_type>::type
738       performance_min_tl;
739     };
740
741     template<typename Key, typename Data, class Cmp_Fn = std::less<Key>,
742              template<typename Const_Node_Iterator,
743                       class Node_Iterator,
744                       class Cmp_Fn_,
745                       class Allocator_>
746     class Node_Update =
747              pb_ds::null_tree_node_update,
748              class Allocator =
749              std::allocator<std::pair<const Key, Data> > >
750     struct tree_common_types
751     {
752     private:
753       typedef
754       pb_ds::tree<
755       Key,
756       Data,
757       Cmp_Fn,
758       pb_ds::ov_tree_tag,
759       Node_Update,
760       Allocator>
761       ov_tree_assoc_container_t;
762
763       typedef
764       pb_ds::tree<
765         Key,
766         Data,
767         Cmp_Fn,
768         pb_ds::rb_tree_tag,
769         Node_Update,
770         Allocator>
771       rb_tree_assoc_container_t;
772
773       typedef
774       pb_ds::tree<
775         Key,
776         Data,
777         Cmp_Fn,
778         pb_ds::splay_tree_tag,
779         Node_Update,
780         Allocator>
781       splay_tree_assoc_container_t;
782
783     public:
784       typedef
785       typename pb_ds::detail::typelist3<
786       splay_tree_assoc_container_t,
787       rb_tree_assoc_container_t,
788       ov_tree_assoc_container_t>::type
789       performance_tl;
790
791       typedef
792       typename pb_ds::detail::typelist3<
793         ov_tree_assoc_container_t,
794         splay_tree_assoc_container_t,
795         rb_tree_assoc_container_t>::type
796       regression_tl;
797
798       typedef
799       typename pb_ds::detail::typelist1<
800         rb_tree_assoc_container_t>::type
801       performance_min_tl;
802     };
803
804     template<typename Key,
805              typename Data,
806              class E_Access_Traits =
807              typename pb_ds::detail::default_trie_e_access_traits<
808       Key>::type,
809              class Tag =
810              pb_ds::pat_trie_tag,
811              template<typename Const_Node_Iterator,
812                       typename Node_Iterator,
813                       class E_Access_Traits_,
814                       typename Allocator_>
815     class Node_Update =
816              pb_ds::null_trie_node_update,
817              class Allocator =
818              std::allocator<char> >
819     class trie_common_types
820     {
821     private:
822       typedef
823       pb_ds::trie<
824       Key,
825       Data,
826       E_Access_Traits,
827       Tag,
828       Node_Update,
829       Allocator>
830       type;
831
832     public:
833       typedef typename pb_ds::detail::typelist1< type>::type performance_tl;
834
835       typedef typename pb_ds::detail::typelist1< type>::type regression_tl;
836
837       typedef
838       typename pb_ds::detail::typelist1<
839         type>::type
840       performance_min_tl;
841     };
842
843   } // namespace test
844
845 } // namespace pb_ds
846
847 #endif // #ifndef PB_DS_COMMON_TYPES_HPP