stlab.adobe.com Adobe Systems Incorporated

poly_view.hpp

Go to the documentation of this file.
00001 /*
00002     Copyright 2006-2007 Adobe Systems Incorporated
00003     Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt
00004     or a copy at http://stlab.adobe.com/licenses.html)
00005 */
00006 
00007 /*************************************************************************************************/
00008 
00009 #ifndef ADOBE_POLY_VIEW_HPP
00010 #define ADOBE_POLY_VIEW_HPP
00011 
00012 #include <adobe/config.hpp>
00013 #include <adobe/view_concept.hpp>
00014 #include <adobe/poly.hpp>
00015 
00016 /*************************************************************************************************/
00017 
00018 namespace adobe {
00019 
00020 
00021 /*************************************************************************************************/
00022 
00028 struct poly_view_interface : poly_copyable_interface
00029 {
00030     virtual void display(const any_regular_t& new_value) = 0;
00031 };
00032 
00033 /*************************************************************************************************/
00034 
00041 template <typename T>
00042 struct poly_view_instance : optimized_storage_type<T, poly_view_interface>::type
00043 {
00044     typedef typename optimized_storage_type<T, poly_view_interface>::type base_t;
00045 
00049     BOOST_CLASS_REQUIRE(T, adobe, ViewConcept);
00050 
00054     poly_view_instance(const T& x) : base_t(x) {}
00055 
00059     poly_view_instance(move_from<poly_view_instance> x) : base_t(move_from<base_t>(x.source)) {}
00060 
00061     void display(const any_regular_t& new_value)
00062     { 
00063         ViewConcept<T>::display(this->get(), new_value.cast<typename ViewConcept<T>::model_type>());
00064     }
00065 
00066 }; 
00067 
00068 /*************************************************************************************************/
00069 
00075 struct view : poly_base<poly_view_interface, poly_view_instance>
00076 {
00077     typedef poly_base<poly_view_interface, poly_view_instance> base_t;
00078 
00082     template <typename T>
00083     explicit view(const T& s) : base_t(s)  { }
00084 
00088     view(move_from<view> x) : base_t(move_from<base_t>(x.source)) {}
00089 
00090     template <typename V>
00091     void display(const V& new_value)
00092     { interface_ref().display(any_regular_t(new_value)); }
00093     
00094     void display(const any_regular_t& x) { interface_ref().display(x); }
00095 };
00096 
00097 
00098 /*************************************************************************************************/
00099 
00100 #if !defined(ADOBE_NO_DOCUMENTATION)
00101 
00102 /*************************************************************************************************/
00103 
00104 typedef poly<view> poly_view_t;
00105 
00106 /*************************************************************************************************/
00107 
00108 template <>
00109 struct view_model_type<poly_view_t> 
00110 {
00111     typedef any_regular_t type;
00112 };
00113 
00114 
00115 /*************************************************************************************************/
00116 
00117 namespace implementation {
00118 
00119     
00120 /*************************************************************************************************/
00121 
00122 template <typename ArgType, typename Function>
00123 struct function_as_view 
00124 { 
00125 //  MM: To do: write Callable1Concept
00126 //  BOOST_CLASS_REQUIRE2(Function, const ModelType&, adobe, Callable1Concept)
00127 
00128     typedef ArgType model_type;
00129 
00130     explicit function_as_view(const Function& f) : f_m(f) {}
00131 
00132     void display(const model_type& x) { f_m(x); }
00133 
00134 // MM: hack so as to work with non-regular F's
00135     friend inline bool operator==(const function_as_view&, const function_as_view&)
00136     { return true; }
00137 
00138     Function f_m;
00139 
00140 };
00141 
00142 /*************************************************************************************************/
00143 
00144 template <typename ArgType, typename Function>
00145 inline function_as_view<ArgType, Function> make_function_as_view(const Function& f)
00146 {
00147     return function_as_view<ArgType, Function>(f);
00148 }
00149 
00150 
00151 } //namespace implementation
00152 
00153 /*************************************************************************************************/
00154 
00155 #endif
00156 
00157 /*************************************************************************************************/
00158 
00182 template <typename ArgType, typename Function>
00183 inline poly<view> make_function_as_poly_view(const Function& f)
00184 {
00185     return poly<view>(implementation::function_as_view<ArgType, Function>(f));
00186 }
00187 
00188 /*************************************************************************************************/
00189 
00190 } // namespace adobe
00191 
00192 /*************************************************************************************************/
00193 
00194 #endif

Copyright © 2006-2007 Adobe Systems Incorporated.

Use of this website signifies your agreement to the Terms of Use and Online Privacy Policy.

Search powered by Google