poly_regular.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 Author(s): Mat Marcus 00007 */ 00008 00009 /*************************************************************************************************/ 00010 00011 #ifndef ADOBE_POLY_REGULAR_HPP 00012 #define ADOBE_POLY_REGULAR_HPP 00013 00014 #include <adobe/config.hpp> 00015 00016 #include <boost/concept_check.hpp> 00017 00018 #include <adobe/poly.hpp> 00019 #include <adobe/regular_concept.hpp> 00020 #include <adobe/empty.hpp> 00021 00022 /*************************************************************************************************/ 00023 00024 namespace adobe { 00025 00030 /*************************************************************************************************/ 00036 struct poly_regular_interface : poly_copyable_interface 00037 { 00038 virtual bool equals(const poly_regular_interface& new_value) const = 0; 00039 }; 00040 00041 /*************************************************************************************************/ 00042 00050 template <typename T> 00051 struct poly_regular_instance : optimized_storage_type<T, poly_regular_interface>::type 00052 { 00053 typedef typename optimized_storage_type<T, poly_regular_interface>::type base_t; 00054 00058 BOOST_CLASS_REQUIRE(T, adobe, RegularConcept); 00059 00063 poly_regular_instance(const T& x) : base_t(x) {} 00064 00068 poly_regular_instance(move_from<poly_regular_instance> x) 00069 : base_t(move_from<base_t>(x.source)) {} 00070 00071 bool equals(const poly_regular_interface& x) const 00072 { return this->type_info() == x.type_info() && this->get() == *static_cast<const T*>(x.cast()); } 00073 00074 }; 00075 00076 /*************************************************************************************************/ 00077 00084 struct regular : poly_base<poly_regular_interface, poly_regular_instance> 00085 { 00086 typedef poly_base<poly_regular_interface, poly_regular_instance> base_t; 00087 00091 template <typename T> 00092 explicit regular(const T& s) 00093 : base_t(s) { } 00094 00095 regular() 00096 : base_t(empty_t()) { } 00097 00101 regular(move_from<regular> x) 00102 : base_t(move_from<base_t>(x.source)) {} 00103 00104 }; 00105 00106 00107 /*************************************************************************************************/ 00108 00109 #if !defined(ADOBE_NO_DOCUMENTATION) 00110 00111 /*************************************************************************************************/ 00112 00113 typedef poly<regular> poly_regular_t; 00114 00115 /*************************************************************************************************/ 00116 00117 #endif 00118 00119 /*************************************************************************************************/ 00120 00121 } // namespace adobe 00122 00123 /*************************************************************************************************/ 00124 00125 #endif |