00001
00002
00003
00004
00005
00006 #ifndef SAGA_SAGA_DETAIL_ATTRIBUTE_IMPL_HPP
00007 #define SAGA_SAGA_DETAIL_ATTRIBUTE_IMPL_HPP
00008
00009
00010 #include <vector>
00011 #include <string>
00012
00013 #include <saga/saga/impl_base.hpp>
00014 #include <saga/impl/engine/metric.hpp>
00015
00016
00017 #include <saga/saga/detail/attribute.hpp>
00018 #include <saga/saga/detail/dispatch_priv.hpp>
00019
00020
00021 #if defined(BOOST_MSVC)
00022 #pragma warning(push)
00023 #pragma warning(disable : 4251 4231 4660)
00024 #endif
00025
00027 namespace saga { namespace detail
00028 {
00029 template <typename Derived>
00030 impl::attribute_interface*
00031 attribute<Derived>::get_attr (void)
00032 {
00033 if (!derived().is_impl_valid()) {
00034 SAGA_THROW("The object has not been properly initialized.",
00035 saga::IncorrectState);
00036 }
00037 return derived().get_impl()->get_attributes();
00038 }
00039
00040 template <typename Derived>
00041 impl::attribute_interface*
00042 attribute<Derived>::get_attr (void) const
00043 {
00044 if (!derived().is_impl_valid()) {
00045 SAGA_THROW("The object has not been properly initialized.",
00046 saga::IncorrectState);
00047 }
00048 return derived().get_impl()->get_attributes();
00049 }
00050
00051 template <typename Derived>
00052 template <typename ImplType>
00053 ImplType*
00054 attribute<Derived>::get_target_object (void) const
00055 {
00056 if (!derived().is_impl_valid()) {
00057 SAGA_THROW("The object has not been properly initialized.",
00058 saga::IncorrectState);
00059 }
00060 return boost::get_pointer(derived().get_impl());
00061 }
00062
00063 template <typename Derived>
00064 inline void
00065 attribute<Derived>::init (
00066 char const* const* scalar_ro, char const* const* scalar_rw,
00067 char const* const* vector_ro, char const* const* vector_rw)
00068 {
00069 if (!derived().is_impl_valid()) {
00070 SAGA_THROW("The object has not been properly initialized.",
00071 saga::IncorrectState);
00072 }
00073 derived().get_impl()->get_attributes()->init(scalar_ro, scalar_rw, vector_ro, vector_rw);
00074 }
00075
00076 template <typename Derived>
00077 inline void
00078 attribute<Derived>::init (strmap_type const& scalar_ro,
00079 strmap_type const& scalar_rw, strmap_type const& vector_ro,
00080 strmap_type const& vector_rw)
00081 {
00082 if (!derived().is_impl_valid()) {
00083 SAGA_THROW("The object has not been properly initialized.",
00084 saga::IncorrectState);
00085 }
00086 derived().get_impl()->get_attributes()->init(scalar_ro, scalar_rw, vector_ro, vector_rw);
00087 }
00088
00089 template <typename Derived>
00090 inline void
00091 attribute<Derived>::init (bool extensible, bool cache_only)
00092 {
00093 if (!derived().is_impl_valid()) {
00094 SAGA_THROW("The object has not been properly initialized.",
00095 saga::IncorrectState);
00096 }
00097 derived().get_impl()->get_attributes()->init(extensible, cache_only);
00098 }
00099
00100 template <typename Derived>
00101 inline void
00102 attribute<Derived>::init_keynames(char const* const* keynames)
00103 {
00104 if (!derived().is_impl_valid()) {
00105 SAGA_THROW("The object has not been properly initialized.",
00106 saga::IncorrectState);
00107 }
00108 derived().get_impl()->get_attributes()->init_keynames(keynames);
00109 }
00110
00111 template <typename Derived>
00112 inline void
00113 attribute<Derived>::init_keynames (strvec_type const& keynames)
00114 {
00115 if (!derived().is_impl_valid()) {
00116 SAGA_THROW("The object has not been properly initialized.",
00117 saga::IncorrectState);
00118 }
00119 derived().get_impl()->get_attributes()->init_keynames(keynames);
00120 }
00121
00123
00125
00126 struct get_attribute_priv
00127 {
00128 template <typename Derived>
00129 static task
00130 call (Derived& this_, std::string const& key, bool sync)
00131 {
00132 impl::attribute_interface* attr = this_.get_attr();
00133 if (!attr->attribute_exists_sync(key))
00134 {
00135
00136 typedef typename Derived::implementation_base_type base_type;
00137 SAGA_THROW_VERBATIM(
00138 this_.template get_target_object<base_type>(),
00139 "attribute '" + key + "' does not exist",
00140 saga::DoesNotExist);
00141 }
00142 return attr->get_attribute (key, sync);
00143 }
00144 };
00145
00146 template <typename Derived, typename Tag>
00147 inline task
00148 attribute_priv<Derived, Tag>::get_attributepriv (
00149 Derived const& this_, std::string const& key)
00150 {
00151 return dispatch_priv<Tag>::
00152 template call<get_attribute_priv>(this_, key);
00153 }
00154
00156 template <typename Derived>
00157 inline std::string
00158 attribute_sync<Derived>::get_attribute(
00159 Derived const& this_, std::string const& key)
00160 {
00161 impl::attribute_interface* attr = this_.get_attr();
00162 if (!attr->attribute_exists_sync(key))
00163 {
00164
00165 typedef typename Derived::implementation_base_type base_type;
00166 SAGA_THROW_VERBATIM(
00167 this_.template get_target_object<base_type>(),
00168 "attribute '" + key + "' does not exist",
00169 saga::DoesNotExist);
00170 }
00171 return attr->get_attribute_sync(key);
00172 }
00173
00175 struct set_attribute_priv
00176 {
00177 template <typename Derived>
00178 static task
00179 call (Derived& this_,
00180 std::string const& key, std::string const& val, bool sync)
00181 {
00182 impl::attribute_interface* attr = this_.get_attr();
00183 if (attr->attribute_exists_sync(key) &&
00184 attr->attribute_is_readonly_sync(key))
00185 {
00186
00187 typedef typename Derived::implementation_base_type base_type;
00188 SAGA_THROW_VERBATIM(
00189 this_.template get_target_object<base_type>(),
00190 "attribute '" + key + "' is readonly", saga::PermissionDenied);
00191 }
00192 return attr->set_attribute (key, val, sync);
00193 }
00194 };
00195
00196 template <typename Derived, typename Tag>
00197 inline task
00198 attribute_priv<Derived, Tag>::set_attributepriv (Derived& this_,
00199 std::string const& key, std::string const& val)
00200 {
00201 return dispatch_priv<Tag>::
00202 template call<set_attribute_priv>(this_, key, val);
00203 }
00204
00206 template <typename Derived>
00207 inline void
00208 attribute_sync<Derived>::set_attribute(
00209 Derived& this_, std::string const& key, std::string const& val)
00210 {
00211 impl::attribute_interface* attr = this_.get_attr();
00212 if (attr->attribute_exists_sync(key) &&
00213 attr->attribute_is_readonly_sync(key))
00214 {
00215
00216 typedef typename Derived::implementation_base_type base_type;
00217 SAGA_THROW_VERBATIM(
00218 this_.template get_target_object<base_type>(),
00219 "attribute '" + key + "' is readonly", saga::PermissionDenied);
00220 }
00221 attr->set_attribute_sync(key, val);
00222 }
00223
00225 struct get_vector_attribute_priv
00226 {
00227 template <typename Derived>
00228 static task
00229 call (Derived& this_, std::string const& key, bool sync)
00230 {
00231 impl::attribute_interface* attr = this_.get_attr();
00232 if (!attr->attribute_exists_sync(key))
00233 {
00234
00235 typedef typename Derived::implementation_base_type base_type;
00236 SAGA_THROW_VERBATIM(
00237 this_.template get_target_object<base_type>(),
00238 "attribute '" + key + "' does not exist",
00239 saga::DoesNotExist);
00240 }
00241 return attr->get_vector_attribute (key, sync);
00242 }
00243 };
00244
00245 template <typename Derived, typename Tag>
00246 inline task
00247 attribute_priv<Derived, Tag>::get_vector_attributepriv (
00248 Derived const& this_, std::string const& key)
00249 {
00250 return dispatch_priv<Tag>::
00251 template call<get_vector_attribute_priv>(this_, key);
00252 }
00253
00255 template <typename Derived>
00256 inline void
00257 attribute_sync<Derived>::get_vector_attribute(
00258 Derived const& this_, std::string const& key, strvec_type& retval)
00259 {
00260 impl::attribute_interface* attr = this_.get_attr();
00261 if (!attr->attribute_exists_sync(key))
00262 {
00263
00264 typedef typename Derived::implementation_base_type base_type;
00265 SAGA_THROW_VERBATIM(
00266 this_.template get_target_object<base_type>(),
00267 "attribute '" + key + "' does not exist",
00268 saga::DoesNotExist);
00269 }
00270 attr->get_vector_attribute_sync(key, retval);
00271 }
00272
00274 struct set_vector_attribute_priv
00275 {
00276 template <typename Derived>
00277 static task
00278 call (Derived& this_, std::string const& key,
00279 typename attribute<Derived>::strvec_type const& val, bool sync)
00280 {
00281 impl::attribute_interface* attr = this_.get_attr();
00282 if (attr->attribute_exists_sync(key) &&
00283 attr->attribute_is_readonly_sync(key))
00284 {
00285
00286 typedef typename Derived::implementation_base_type base_type;
00287 SAGA_THROW_VERBATIM(
00288 this_.template get_target_object<base_type>(),
00289 "attribute '" + key + "' is readonly", saga::PermissionDenied);
00290 }
00291 return attr->set_vector_attribute (key, val, sync);
00292 }
00293 };
00294
00295 template <typename Derived, typename Tag>
00296 inline task
00297 attribute_priv<Derived, Tag>::set_vector_attributepriv (
00298 Derived& this_, std::string const& key, strvec_type const& val)
00299 {
00300 return dispatch_priv<Tag>::
00301 template call<set_vector_attribute_priv>(this_, key, val);
00302 }
00303
00305 template <typename Derived>
00306 inline void
00307 attribute_sync<Derived>::set_vector_attribute(
00308 Derived& this_, std::string const& key, strvec_type const& val)
00309 {
00310 impl::attribute_interface* attr = this_.get_attr();
00311 if (attr->attribute_exists_sync(key) &&
00312 attr->attribute_is_readonly_sync(key))
00313 {
00314
00315 typedef typename Derived::implementation_base_type base_type;
00316 SAGA_THROW_VERBATIM(
00317 this_.template get_target_object<base_type>(),
00318 "attribute '" + key + "' is readonly", saga::PermissionDenied);
00319 }
00320 attr->set_vector_attribute_sync(key, val);
00321 }
00322
00324 struct remove_attribute_priv
00325 {
00326 template <typename Derived>
00327 static task
00328 call (Derived& this_, std::string const& key, bool sync)
00329 {
00330 typedef typename Derived::implementation_base_type base_type;
00331
00332 impl::attribute_interface* attr = this_.get_attr();
00333 if (!attr->attribute_exists_sync(key))
00334 {
00335
00336 SAGA_THROW_VERBATIM(
00337 this_.template get_target_object<base_type>(),
00338 "attribute '" + key + "' does not exist",
00339 saga::DoesNotExist);
00340 }
00341 if (!this_.template get_target_object<base_type>()->get_attributes()->attributes_extensible() ||
00342 attr->attribute_is_readonly_sync(key))
00343 {
00344
00345 SAGA_THROW_VERBATIM(
00346 this_.template get_target_object<base_type>(),
00347 "attribute '" + key + "' is readonly", saga::PermissionDenied);
00348 }
00349 if (!attr->attribute_is_extended_sync(key))
00350 {
00351
00352 SAGA_THROW_VERBATIM(
00353 this_.template get_target_object<base_type>(),
00354 "attribute '" + key + "' is readonly", saga::PermissionDenied);
00355 }
00356 return attr->remove_attribute(key, sync);
00357 }
00358 };
00359
00360 template <typename Derived, typename Tag>
00361 inline task
00362 attribute_priv<Derived, Tag>::remove_attributepriv (Derived& this_,
00363 std::string const& key)
00364 {
00365 return dispatch_priv<Tag>::
00366 template call<remove_attribute_priv>(this_, key);
00367 }
00368
00370 template <typename Derived>
00371 inline void
00372 attribute_sync<Derived>::remove_attribute(
00373 Derived& this_, std::string const& key)
00374 {
00375 typedef typename Derived::implementation_base_type base_type;
00376
00377 impl::attribute_interface* attr = this_.get_attr();
00378 if (!attr->attribute_exists_sync(key))
00379 {
00380
00381 SAGA_THROW_VERBATIM(
00382 this_.template get_target_object<base_type>(),
00383 "attribute '" + key + "' does not exist",
00384 saga::DoesNotExist);
00385 }
00386 if (!this_.template get_target_object<base_type>()->get_attributes()->attributes_extensible() ||
00387 attr->attribute_is_readonly_sync(key))
00388 {
00389
00390 SAGA_THROW_VERBATIM(
00391 this_.template get_target_object<base_type>(),
00392 "attribute '" + key + "' is readonly", saga::PermissionDenied);
00393 }
00394 if (!attr->attribute_is_extended_sync(key))
00395 {
00396
00397 SAGA_THROW_VERBATIM(
00398 this_.template get_target_object<base_type>(),
00399 "attribute '" + key + "' is readonly", saga::PermissionDenied);
00400 }
00401 attr->remove_attribute_sync(key);
00402 }
00403
00405
00406 struct list_attributes_priv
00407 {
00408 template <typename Derived>
00409 static task
00410 call (Derived& this_, bool sync)
00411 {
00412 return this_.get_attr()->list_attributes(sync);
00413 }
00414 };
00415
00416 template <typename Derived, typename Tag>
00417 inline task
00418 attribute_priv<Derived, Tag>::list_attributespriv (Derived const& this_)
00419 {
00420 return dispatch_priv<Tag>::template call<list_attributes_priv>(this_);
00421 }
00422
00424 template <typename Derived>
00425 inline void
00426 attribute_sync<Derived>::list_attributes(
00427 Derived const& this_, strvec_type& retval)
00428 {
00429 this_.get_attr()->list_attributes_sync(retval);
00430 }
00431
00433 struct find_attributes_priv
00434 {
00435 template <typename Derived>
00436 static task
00437 call (Derived& this_, std::string const& pattern, bool sync)
00438 {
00439 return this_.get_attr()->find_attributes(pattern, sync);
00440 }
00441 };
00442
00443 template <typename Derived, typename Tag>
00444 inline task
00445 attribute_priv<Derived, Tag>::find_attributespriv (
00446 Derived const& this_, std::string const& pattern)
00447 {
00448 return dispatch_priv<Tag>::
00449 template call<find_attributes_priv>(this_, pattern);
00450 }
00451
00453 template <typename Derived>
00454 inline void
00455 attribute_sync<Derived>::find_attributes(
00456 Derived const& this_, std::string const& pattern, strvec_type& retval)
00457 {
00458 this_.get_attr()->find_attributes_sync(pattern, retval);
00459 }
00460
00462 struct attribute_exists_priv
00463 {
00464 template <typename Derived>
00465 static task
00466 call (Derived& this_, std::string const& key, bool sync)
00467 {
00468 return this_.get_attr()->attribute_exists(key, sync);
00469 }
00470 };
00471
00472 template <typename Derived, typename Tag>
00473 inline task
00474 attribute_priv<Derived, Tag>::attribute_existspriv (
00475 Derived const& this_, std::string const& key)
00476 {
00477 return dispatch_priv<Tag>::
00478 template call<attribute_exists_priv>(this_, key);
00479 }
00480
00482 template <typename Derived>
00483 inline bool
00484 attribute_sync<Derived>::attribute_exists(
00485 Derived const& this_, std::string const& key)
00486 {
00487 return this_.get_attr()->attribute_exists_sync(key);
00488 }
00489
00491 struct attribute_is_readonly_priv
00492 {
00493 template <typename Derived>
00494 static task
00495 call (Derived& this_, std::string const& key, bool sync)
00496 {
00497 impl::attribute_interface* attr = this_.get_attr();
00498 if (!attr->attribute_exists_sync(key))
00499 {
00500
00501 typedef typename Derived::implementation_base_type base_type;
00502 SAGA_THROW_VERBATIM(
00503 this_.template get_target_object<base_type>(),
00504 "attribute '" + key + "' does not exist",
00505 saga::DoesNotExist);
00506 }
00507 return attr->attribute_is_readonly(key, sync);
00508 }
00509 };
00510
00511 template <typename Derived, typename Tag>
00512 inline task
00513 attribute_priv<Derived, Tag>::attribute_is_readonlypriv (
00514 Derived const& this_, std::string const& key)
00515 {
00516 return dispatch_priv<Tag>::
00517 template call<attribute_is_readonly_priv>(this_, key);
00518 }
00519
00521 template <typename Derived>
00522 inline bool
00523 attribute_sync<Derived>::attribute_is_readonly(
00524 Derived const& this_, std::string const& key)
00525 {
00526 impl::attribute_interface* attr = this_.get_attr();
00527 if (!attr->attribute_exists_sync(key))
00528 {
00529
00530 typedef typename Derived::implementation_base_type base_type;
00531 SAGA_THROW_VERBATIM(
00532 this_.template get_target_object<base_type>(),
00533 "attribute '" + key + "' does not exist",
00534 saga::DoesNotExist);
00535 }
00536 return attr->attribute_is_readonly_sync(key);
00537 }
00538
00540 struct attribute_is_writable_priv
00541 {
00542 template <typename Derived>
00543 static task
00544 call (Derived& this_, std::string const& key, bool sync)
00545 {
00546 impl::attribute_interface* attr = this_.get_attr();
00547 if (!attr->attribute_exists_sync(key))
00548 {
00549
00550 typedef typename Derived::implementation_base_type base_type;
00551 SAGA_THROW_VERBATIM(
00552 this_.template get_target_object<base_type>(),
00553 "attribute '" + key + "' does not exist",
00554 saga::DoesNotExist);
00555 }
00556 return attr->attribute_is_writable (key, sync);
00557 }
00558 };
00559
00560 template <typename Derived, typename Tag>
00561 inline task
00562 attribute_priv<Derived, Tag>::attribute_is_writablepriv (
00563 Derived const& this_, std::string const& key)
00564 {
00565 return dispatch_priv<Tag>::
00566 template call<attribute_is_writable_priv>(this_, key);
00567 }
00568
00570 template <typename Derived>
00571 inline bool
00572 attribute_sync<Derived>::attribute_is_writable(
00573 Derived const& this_, std::string const& key)
00574 {
00575 impl::attribute_interface* attr = this_.get_attr();
00576 if (!attr->attribute_exists_sync(key))
00577 {
00578
00579 typedef typename Derived::implementation_base_type base_type;
00580 SAGA_THROW_VERBATIM(
00581 this_.template get_target_object<base_type>(),
00582 "attribute '" + key + "' does not exist",
00583 saga::DoesNotExist);
00584 }
00585 return attr->attribute_is_writable_sync(key);
00586 }
00587
00589 struct attribute_is_vector_priv
00590 {
00591 template <typename Derived>
00592 static task
00593 call (Derived& this_, std::string const& key, bool sync)
00594 {
00595 impl::attribute_interface* attr = this_.get_attr();
00596 if (!attr->attribute_exists_sync(key))
00597 {
00598
00599 typedef typename Derived::implementation_base_type base_type;
00600 SAGA_THROW_VERBATIM(
00601 this_.template get_target_object<base_type>(),
00602 "attribute '" + key + "' does not exist",
00603 saga::DoesNotExist);
00604 }
00605 return attr->attribute_is_vector(key, sync);
00606 }
00607 };
00608
00609 template <typename Derived, typename Tag>
00610 inline task
00611 attribute_priv<Derived, Tag>::attribute_is_vectorpriv (
00612 Derived const& this_, std::string const& key)
00613 {
00614 return dispatch_priv<Tag>::
00615 template call<attribute_is_vector_priv>(this_, key);
00616 }
00617
00619 template <typename Derived>
00620 inline bool
00621 attribute_sync<Derived>::attribute_is_vector(
00622 Derived const& this_, std::string const& key)
00623 {
00624 impl::attribute_interface* attr = this_.get_attr();
00625 if (!attr->attribute_exists_sync(key))
00626 {
00627
00628 typedef typename Derived::implementation_base_type base_type;
00629 SAGA_THROW_VERBATIM(
00630 this_.template get_target_object<base_type>(),
00631 "attribute '" + key + "' does not exist",
00632 saga::DoesNotExist);
00633 }
00634 return attr->attribute_is_vector_sync(key);
00635 }
00636
00638 struct attribute_is_removable_priv
00639 {
00640 template <typename Derived>
00641 static task
00642 call (Derived& this_, std::string const& key, bool sync)
00643 {
00644 impl::attribute_interface* attr = this_.get_attr();
00645 if (!attr->attribute_exists_sync(key))
00646 {
00647
00648 typedef typename Derived::implementation_base_type base_type;
00649 SAGA_THROW_VERBATIM(
00650 this_.template get_target_object<base_type>(),
00651 "attribute '" + key + "' does not exist",
00652 saga::DoesNotExist);
00653 }
00654 return attr->attribute_is_extended(key, sync);
00655 }
00656 };
00657
00658 template <typename Derived, typename Tag>
00659 inline task
00660 attribute_priv<Derived, Tag>::attribute_is_removablepriv (
00661 Derived const& this_, std::string const& key)
00662 {
00663 return dispatch_priv<Tag>::
00664 template call<attribute_is_removable_priv>(this_, key);
00665 }
00666
00668 template <typename Derived>
00669 inline bool
00670 attribute_sync<Derived>::attribute_is_removable(
00671 Derived const& this_, std::string const& key)
00672 {
00673 impl::attribute_interface* attr = this_.get_attr();
00674 if (!attr->attribute_exists_sync(key))
00675 {
00676
00677 typedef typename Derived::implementation_base_type base_type;
00678 SAGA_THROW_VERBATIM(
00679 this_.template get_target_object<base_type>(),
00680 "attribute '" + key + "' does not exist",
00681 saga::DoesNotExist);
00682 }
00683 return attr->attribute_is_extended_sync(key);
00684 }
00685
00687
00689 }}
00690
00691 #endif // SAGA_SAGA_DETAIL_ATTRIBUTE_IMPL_HPP
00692