00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00045 #ifndef DS_TRAIT_IMP_HPP
00046 #define DS_TRAIT_IMP_HPP
00047 
00048 namespace detail
00049 {
00050 
00051   template<class Cntnr, class DS_Category>
00052   struct erase_can_throw_imp
00053   {
00054     enum
00055       {
00056     value =
00057     pb_assoc::detail::is_same_type<
00058     DS_Category,
00059     ov_tree_ds_tag>::value
00060       };
00061   };
00062 
00063   template<class Cntnr>
00064   struct erase_can_throw_imp<
00065     Cntnr,
00066     compound_ds_tag>
00067   {
00068     enum
00069       {
00070     value = Cntnr::erase_can_throw
00071       };
00072   };
00073 
00074   template<class Cntnr, class DS_Category>
00075   struct erase_iterators_imp
00076   {
00077     enum
00078       {
00079     value =
00080     pb_assoc::detail::is_same_type<
00081     DS_Category,
00082     rb_tree_ds_tag>::value ||
00083     pb_assoc::detail::is_same_type<
00084     DS_Category,
00085     splay_tree_ds_tag>::value
00086       };
00087   };
00088 
00089   template<class Cntnr>
00090   struct erase_iterators_imp<
00091     Cntnr,
00092     compound_ds_tag>
00093   {
00094     enum
00095       {
00096     value = Cntnr::erase_iterators
00097       };
00098   };
00099 
00100   template<class Cntnr, class DS_Category>
00101   struct order_preserving_imp
00102   {
00103     enum
00104       {
00105     value =
00106     pb_assoc::detail::is_same_type<
00107     DS_Category,
00108     rb_tree_ds_tag>::value ||
00109     pb_assoc::detail::is_same_type<
00110     DS_Category,
00111     splay_tree_ds_tag>::value ||
00112     pb_assoc::detail::is_same_type<
00113     DS_Category,
00114     ov_tree_ds_tag>::value
00115       };
00116   };
00117 
00118   template<class Cntnr>
00119   struct order_preserving_imp<
00120     Cntnr,
00121     compound_ds_tag>
00122   {
00123     enum
00124       {
00125     value = Cntnr::order_preserving
00126       };
00127   };
00128 
00129   template<class Cntnr, class DS_Category>
00130   struct invalidation_guarantee_imp
00131   {
00132   private:
00133     enum
00134       {
00135     node_based =
00136     pb_assoc::detail::is_same_type<
00137     DS_Category,
00138     cc_hash_ds_tag>::value ||
00139     pb_assoc::detail::is_same_type<
00140     DS_Category,
00141     rb_tree_ds_tag>::value ||
00142     pb_assoc::detail::is_same_type<
00143     DS_Category,
00144     splay_tree_ds_tag>::value ||
00145     pb_assoc::detail::is_same_type<
00146     DS_Category,
00147     lu_ds_tag>::value
00148       };
00149 
00150     enum
00151       {
00152     vector_organized =
00153     pb_assoc::detail::is_same_type<
00154     DS_Category,
00155     cc_hash_ds_tag>::value
00156       };
00157 
00158   public:
00159     typedef
00160     typename cond_type<
00161       node_based,
00162       typename cond_type<
00163       vector_organized,
00164       find_invalidation_guarantee,
00165       range_invalidation_guarantee>::type,
00166       basic_invalidation_guarantee>::type
00167     type;
00168   };
00169 
00170   template<class Cntnr>
00171   struct invalidation_guarantee_imp<
00172     Cntnr,
00173     compound_ds_tag>
00174   {
00175     typedef typename Cntnr::invalidation_guarantee type;
00176   };
00177 
00178   template<class Cntnr, class DS_Category>
00179   struct reverse_iteration_imp
00180   {
00181     enum
00182       {
00183     value =
00184     is_same_type<
00185     DS_Category,
00186     rb_tree_ds_tag>::value ||
00187     is_same_type<
00188     DS_Category,
00189     splay_tree_ds_tag>::value
00190       };
00191   };
00192 
00193   template<class Cntnr>
00194   struct reverse_iteration_imp<
00195     Cntnr,
00196     compound_ds_tag>
00197   {
00198     enum
00199       {
00200     value = Cntnr::reverse_iteration
00201       };
00202   };
00203 
00204   template<class Cntnr, class DS_Category>
00205   struct split_join_imp
00206   {
00207     enum
00208       {
00209     value =
00210     is_same_type<
00211     DS_Category,
00212     rb_tree_ds_tag>::value ||
00213     is_same_type<
00214     DS_Category,
00215     splay_tree_ds_tag>::value ||
00216     is_same_type<
00217     DS_Category,
00218     ov_tree_ds_tag>::value
00219       };
00220   };
00221 
00222   template<class Cntnr>
00223   struct split_join_imp<
00224     Cntnr,
00225     compound_ds_tag>
00226   {
00227     enum
00228       {
00229     value = false
00230       };
00231   };
00232 
00233   template<class Cntnr>
00234   struct basic_data_structure_traits
00235   {
00236 
00237   private:
00238     typedef Cntnr cntnr;
00239 
00240     typedef typename Cntnr::ds_category ds_category;
00241 
00242   public:
00243     enum
00244       {
00245     erase_can_throw =
00246     pb_assoc::detail::erase_can_throw_imp<
00247     cntnr,
00248     ds_category>::value
00249       };
00250 
00251     enum
00252       {
00253     order_preserving =
00254     pb_assoc::detail::order_preserving_imp<
00255     cntnr,
00256     ds_category>::value
00257       };
00258 
00259     enum
00260       {
00261     erase_iterators =
00262     pb_assoc::detail::erase_iterators_imp<
00263     Cntnr,
00264     ds_category>::value
00265       };
00266 
00267     typedef
00268     typename pb_assoc::detail::invalidation_guarantee_imp<
00269       cntnr,
00270       ds_category>::type
00271     invalidation_guarantee;
00272 
00273     enum
00274       {
00275     reverse_iteration =
00276     pb_assoc::detail::reverse_iteration_imp<
00277     cntnr,
00278     ds_category>::value
00279       };
00280 
00281     enum
00282       {
00283     split_join =
00284     pb_assoc::detail::split_join_imp<
00285     cntnr,
00286     ds_category>::value
00287       };
00288   };
00289 
00290   template<class Cntnr, class DS_Category>
00291   struct data_structure_traits : public basic_data_structure_traits<
00292     Cntnr>
00293   { };
00294 
00295   template<class Cntnr>
00296   struct data_structure_traits<
00297     Cntnr,
00298     rb_tree_ds_tag> : public basic_data_structure_traits<
00299     Cntnr>
00300   {
00301   public:
00302     enum
00303       {
00304     split_join_can_throw = false
00305       };
00306   };
00307 
00308   template<class Cntnr>
00309   struct data_structure_traits<
00310     Cntnr,
00311     splay_tree_ds_tag> : public basic_data_structure_traits<
00312     Cntnr>
00313   {
00314   public:
00315     enum
00316       {
00317     split_join_can_throw = false
00318       };
00319   };
00320 
00321   template<class Cntnr>
00322   struct data_structure_traits<
00323     Cntnr,
00324     ov_tree_ds_tag> : public basic_data_structure_traits<
00325     Cntnr>
00326   {
00327   public:
00328     enum
00329       {
00330     split_join_can_throw = true
00331       };
00332   };
00333 
00334 } 
00335 
00336 #endif // #ifndef DS_TRAIT_IMP_HPP