- Main Page
- Related Pages
- Namespaces
- Classes
- Files

- Search for |

# attribute.hpp

Go to the documentation of this file.

    00001 //  Copyright (c) 2005-2009 Hartmut Kaiser
    00002 //
    00003 //  Distributed under the Boost Software License, Version 1.0. (See accompanying
    00004 //  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
    00005
    00006 #ifndef SAGA_SAGA_DETAIL_ATTRIBUTE_HPP
    00007 #define SAGA_SAGA_DETAIL_ATTRIBUTE_HPP
    00008
    00009 // include stl
    00010 #include <map>
    00011 #include <vector>
    00012 #include <string>
    00013
    00014 // include dependent spec sections
    00015 #include <saga/saga/util.hpp>
    00016 #include <saga/saga/base.hpp>
    00017 #include <saga/saga/call.hpp>
    00018 #include <saga/saga/task.hpp>
    00019
    00020 // For symbol import/export macros
    00021 #include <saga/saga-defs.hpp>
    00022
    00023 // suppress warnings about dependent classes not being exported from the dll
    00024 #if defined(BOOST_MSVC)
    00025 #pragma warning(push)
    00026 #pragma warning(disable : 4251 4231 4660)
    00027 #endif
    00028
    00030 // for modules not belonging to the engine attributes should not be exported
    00031 #if !defined (SAGA_CREATE_PREPROCESSED_FILES) && !defined(SAGA_EXPORT_ATTRIBUTE)
    00032
    00033 # if defined(SAGA_ENGINE_EXPORTS) || defined(SAGA_ATTRIBUTE_EXPORTS)
    00034 #   define SAGA_EXPORT_ATTRIBUTE SAGA_SYMBOL_EXPORT
    00035 # elif !defined (SAGA_NO_IMPORT_ATTRIBUTE) && !defined(BUILD_SAGA_LITE)
    00036 #   define SAGA_EXPORT_ATTRIBUTE SAGA_SYMBOL_IMPORT
    00037 # else
    00038 #   define SAGA_EXPORT_ATTRIBUTE /* empty */
    00039 # endif
    00040
    00041 #endif // !SAGA_CREATE_PREPROCESSED_FILES
    00042
    00044 namespace saga { namespace detail
    00045 {
    00047     template <typename Derived, typename Tag>
    00048     struct SAGA_EXPORT_ATTRIBUTE attribute_priv
    00049     {
    00050         typedef std::vector<std::string> strvec_type;
    00051
    00052         static saga::task get_attributepriv (Derived const& this_,
    00053             std::string const&);
    00054         static saga::task set_attributepriv (Derived& this_,
    00055             std::string const&, std::string const&);
    00056
    00057         static saga::task get_vector_attributepriv(Derived const& this_,
    00058             std::string const&);
    00059         static saga::task set_vector_attributepriv(Derived& this_,
    00060             std::string const&, strvec_type const&);
    00061         static saga::task remove_attributepriv(Derived& this_,
    00062             std::string const&);
    00063
    00064         static saga::task list_attributespriv(Derived const& this_);
    00065         static saga::task find_attributespriv(Derived const& this_,
    00066             std::string const&);
    00067         static saga::task attribute_existspriv(Derived const& this_,
    00068             std::string const&);
    00069         static saga::task attribute_is_readonlypriv(Derived const& this_,
    00070             std::string const&);
    00071         static saga::task attribute_is_writablepriv(Derived const& this_,
    00072             std::string const&);
    00073         static saga::task attribute_is_vectorpriv(Derived const& this_,
    00074             std::string const&);
    00075         static saga::task attribute_is_removablepriv(Derived const& this_,
    00076             std::string const&);
    00077     };
    00078
    00079     template <typename Derived>
    00080     struct SAGA_EXPORT_ATTRIBUTE attribute_sync
    00081       : attribute_priv<Derived, saga::task_base::Sync>
    00082     {
    00083         typedef std::vector<std::string> strvec_type;
    00084
    00085         static std::string get_attribute(Derived const& this_,
    00086             std::string const&);
    00087         static void set_attribute(Derived& this_,
    00088             std::string const&, std::string const&);
    00089
    00090         static void get_vector_attribute(Derived const& this_,
    00091             std::string const&, strvec_type&);
    00092         static void set_vector_attribute(Derived& this_,
    00093             std::string const&, strvec_type const&);
    00094         static void remove_attribute(Derived& this_,
    00095             std::string const&);
    00096
    00097         static void list_attributes(Derived const& this_,
    00098             strvec_type&);
    00099         static void find_attributes(Derived const& this_,
    00100             std::string const&, strvec_type&);
    00101
    00102         static bool attribute_exists(Derived const& this_,
    00103             std::string const&);
    00104         static bool attribute_is_readonly(Derived const& this_,
    00105             std::string const&);
    00106         static bool attribute_is_writable(Derived const& this_,
    00107             std::string const&);
    00108         static bool attribute_is_vector(Derived const& this_,
    00109             std::string const&);
    00110         static bool attribute_is_removable(Derived const& this_,
    00111             std::string const&);
    00112     };
    00114
    00137     template <typename Derived>
    00138     struct SAGA_EXPORT_ATTRIBUTE attribute
    00139     {
    00140     public:
    00144         typedef std::vector <std::string>              strvec_type;
    00145
    00149         typedef std::map <std::string, std::string> strmap_type;
    00150
    00151     private:
    00152         template <typename Tag>
    00153         saga::task get_attributepriv (std::string const& p, Tag) const
    00154         { return attribute_priv<Derived, Tag>::get_attributepriv(derived(), p); }
    00155
    00156         template <typename Tag>
    00157         saga::task set_attributepriv (std::string const& p1, std::string const& p2, Tag)
    00158         { return attribute_priv<Derived, Tag>::set_attributepriv(derived(), p1, p2); }
    00159
    00160         template <typename Tag>
    00161         saga::task get_vector_attributepriv(std::string const& p, Tag) const
    00162         { return attribute_priv<Derived, Tag>::get_vector_attributepriv(derived(), p); }
    00163
    00164         template <typename Tag>
    00165         saga::task set_vector_attributepriv(std::string const& p1, strvec_type const& p2, Tag)
    00166         { return attribute_priv<Derived, Tag>::set_vector_attributepriv(derived(), p1, p2); }
    00167
    00168         template <typename Tag>
    00169         saga::task remove_attributepriv(std::string const& p, Tag)
    00170         { return attribute_priv<Derived, Tag>::remove_attributepriv(derived(), p); }
    00171
    00172         template <typename Tag>
    00173         saga::task list_attributespriv(Tag) const
    00174         { return attribute_priv<Derived, Tag>::list_attributespriv(derived()); }
    00175
    00176         template <typename Tag>
    00177         saga::task find_attributespriv(std::string const& p1, Tag) const
    00178         { return attribute_priv<Derived, Tag>::find_attributespriv(derived(), p1); }
    00179
    00180         template <typename Tag>
    00181         saga::task attribute_existspriv(std::string const& p, Tag) const
    00182         { return attribute_priv<Derived, Tag>::attribute_existspriv(derived(), p); }
    00183
    00184         template <typename Tag>
    00185         saga::task attribute_is_readonlypriv(std::string const& p, Tag) const
    00186         { return attribute_priv<Derived, Tag>::attribute_is_readonlypriv(derived(), p); }
    00187
    00188         template <typename Tag>
    00189         saga::task attribute_is_writablepriv(std::string const& p, Tag) const
    00190         { return attribute_priv<Derived, Tag>::attribute_is_writablepriv(derived(), p); }
    00191
    00192         template <typename Tag>
    00193         saga::task attribute_is_vectorpriv(std::string const& p, Tag) const
    00194         { return attribute_priv<Derived, Tag>::attribute_is_vectorpriv(derived(), p); }
    00195
    00196         template <typename Tag>
    00197         saga::task attribute_is_removablepriv(std::string const& p, Tag) const
    00198         { return attribute_priv<Derived, Tag>::attribute_is_removablepriv(derived(), p); }
    00199
    00200     public:
    00202         impl::attribute_interface* get_attr (void);
    00203         impl::attribute_interface* get_attr (void) const;
    00204
    00205         template <typename ImplType>
    00206         ImplType *get_target_object() const;
    00208
    00209     protected:
    00211         Derived& derived()
    00212             { return static_cast<Derived&>(*this); }
    00213         Derived const& derived() const
    00214             { return static_cast<Derived const&>(*this); }
    00215
    00216         void init (strmap_type const& scalar_ro  = strmap_type (),
    00217                    strmap_type const& scalar_rw  = strmap_type (),
    00218                    strmap_type const& vector_ro  = strmap_type (),
    00219                    strmap_type const& vector_rw  = strmap_type ());
    00220         void init (char const* const* scalar_ro, char const* const* scalar_rw,
    00221                    char const* const* vector_ro, char const* const* vector_rw);
    00222         void init (bool extensible, bool cache_only = false);
    00223
    00224         void init_keynames(strvec_type const& keynames);
    00225         void init_keynames(char const* const* keynames);
    00227
    00228     public:
    00234         SAGA_SYMBOL_INTERNAL
    00235         std::string get_attribute(std::string const& key) const
    00236         {
    00237             return attribute_sync<Derived>::
    00238                 get_attribute(derived(), key);
    00239         }
    00240
    00241         SAGA_CALL_CONST_PUB_1_DEF_0(get_attribute, std::string)
    00242
    00243
    00248         SAGA_SYMBOL_INTERNAL
    00249         void set_attribute(std::string const& key, std::string const& value)
    00250         {
    00251             attribute_sync<Derived>::set_attribute(derived(), key, value);
    00252         }
    00253
    00254         SAGA_CALL_PUB_2_DEF_0(set_attribute, std::string, std::string)
    00255
    00256
    00261         SAGA_SYMBOL_INTERNAL
    00262         strvec_type get_vector_attribute(std::string const& key) const
    00263         {
    00264             strvec_type retval;
    00265             attribute_sync<Derived>::get_vector_attribute(derived(), key, retval);
    00266             return retval;
    00267         }
    00268
    00269         SAGA_CALL_CONST_PUB_1_DEF_0(get_vector_attribute, std::string)
    00270
    00271
    00276         SAGA_SYMBOL_INTERNAL
    00277         void set_vector_attribute(std::string const& key, strvec_type const& value)
    00278         {
    00279             attribute_sync<Derived>::set_vector_attribute(derived(), key, value);
    00280         }
    00281
    00282         SAGA_CALL_PUB_2_DEF_0(set_vector_attribute, std::string, strvec_type)
    00283
    00284
    00288         SAGA_SYMBOL_INTERNAL
    00289         void remove_attribute(std::string const& key)
    00290         {
    00291             attribute_sync<Derived>::remove_attribute(derived(), key);
    00292         }
    00293
    00294         SAGA_CALL_PUB_1_DEF_0(remove_attribute, std::string)
    00295
    00296
    00300         SAGA_SYMBOL_INTERNAL
    00301         strvec_type list_attributes() const
    00302         {
    00303             strvec_type retval;
    00304             attribute_sync<Derived>::list_attributes(derived(), retval);
    00305             return retval;
    00306         }
    00307
    00308         SAGA_CALL_CONST_PUB_0_DEF_0(list_attributes)
    00309
    00310
    00316         SAGA_SYMBOL_INTERNAL
    00317         strvec_type find_attributes(std::string const& pattern) const
    00318         {
    00319             strvec_type retval;
    00320             attribute_sync<Derived>::find_attributes(derived(), pattern, retval);
    00321             return retval;
    00322         }
    00323
    00324         SAGA_CALL_CONST_PUB_1_DEF_0(find_attributes, std::string)
    00325
    00326
    00331         SAGA_SYMBOL_INTERNAL
    00332         bool attribute_exists(std::string const& key) const
    00333         {
    00334             return attribute_sync<Derived>::attribute_exists(derived(), key);
    00335         }
    00336
    00337         SAGA_CALL_CONST_PUB_1_DEF_0(attribute_exists, std::string)
    00338
    00339
    00344         SAGA_SYMBOL_INTERNAL
    00345         bool attribute_is_readonly(std::string const& key) const
    00346         {
    00347             return attribute_sync<Derived>::attribute_is_readonly(derived(), key);
    00348         }
    00349
    00350         SAGA_CALL_CONST_PUB_1_DEF_0(attribute_is_readonly, std::string)
    00351
    00352
    00357         SAGA_SYMBOL_INTERNAL
    00358         bool attribute_is_writable(std::string const& key) const
    00359         {
    00360             return attribute_sync<Derived>::attribute_is_writable(derived(), key);
    00361         }
    00362
    00363         SAGA_CALL_CONST_PUB_1_DEF_0(attribute_is_writable, std::string)
    00364
    00365
    00370         SAGA_SYMBOL_INTERNAL
    00371         bool attribute_is_vector(std::string const& key) const
    00372         {
    00373             return attribute_sync<Derived>::attribute_is_vector(derived(), key);
    00374         }
    00375
    00376         SAGA_CALL_CONST_PUB_1_DEF_0(attribute_is_vector, std::string)
    00377
    00378
    00383         SAGA_SYMBOL_INTERNAL
    00384         bool attribute_is_removable(std::string const& key) const
    00385         {
    00386             return attribute_sync<Derived>::attribute_is_removable(derived(), key);
    00387         }
    00388
    00389         SAGA_CALL_CONST_PUB_1_DEF_0(attribute_is_removable, std::string)
    00390     };
    00391
    00393 }}   // namespace saga::detail
    00394
    00395 #if defined(BOOST_MSVC)
    00396 #pragma warning(pop)
    00397 #endif
    00398
    00399 #endif // SAGA_SAGA_DETAIL_ATTRIBUTE_HPP
    00400