00001 // +-------------------------------------------------------------------------+ 00002 // | I__n__t__e__L__i__b 0.6.10 development | 00003 // | Copyright (c) Andrey Vikt. Stolyarov <crocodil_AT_croco.net> 2000-2007. | 00004 // | | 00005 // | This is free software. The library part is available under | 00006 // | GNU LESSER GENERAL PUBLIC LICENSE v.2.1. | 00007 // | GNU LGPL v2.1 is found in docs/gnu_gpl2.txt, or at http://www.gnu.org | 00008 // | Please see also docs/readme.txt and visit http://www.intelib.org | 00009 // | | 00010 // | !!! THERE IS NO WARRANTY OF ANY KIND, NEITHER EXPRESSED NOR IMPLIED !!! | 00011 // +-------------------------------------------------------------------------+ 00012 00013 00014 00015 00035 #ifndef INTELIB_EXTVAR_HPP_SENTRY 00036 #define INTELIB_EXTVAR_HPP_SENTRY 00037 00038 #include "../sexpress/sstring.hpp" 00039 #include "conteval.hpp" 00040 #include "lispform.hpp" 00041 00042 00044 00045 class SExpressionIndirect : public SExpressionSetfAgent { 00046 public: 00048 virtual SReference Value() const = 0; 00050 virtual void Setf(const SReference &val) = 0; 00052 virtual void* Addr() const = 0; 00053 #if INTELIB_TEXT_REPRESENTATIONS == 1 00054 virtual SString TextRepresentation() const; 00055 #endif 00056 protected: 00057 ~SExpressionIndirect() {} 00058 }; 00059 00060 00062 template <class Tt> 00063 class SExpressionIndirectTemplate : public SExpressionIndirect { 00064 Tt *var; 00065 public: 00067 SExpressionIndirectTemplate(Tt &a) : var(&a) {} 00068 00069 virtual SReference Value() const { return SReference(*var); } 00070 virtual void Setf(const SReference &val); 00071 protected: 00072 virtual void* Addr() const { return (void*)var; } 00073 ~SExpressionIndirectTemplate() {} 00074 }; 00075 00076 00077 template<> inline 00078 void SExpressionIndirectTemplate<signed char>::Setf(const SReference &val) 00079 { *var = val.GetInt(); } 00080 template<> inline 00081 void SExpressionIndirectTemplate<unsigned char>::Setf(const SReference &val) 00082 { *var = val.GetInt(); } 00083 template<> inline 00084 void SExpressionIndirectTemplate<short>::Setf(const SReference &val) 00085 { *var = val.GetInt(); } 00086 template<> inline 00087 void SExpressionIndirectTemplate<unsigned short>::Setf(const SReference &val) 00088 { *var = val.GetInt(); } 00089 template<> inline 00090 void SExpressionIndirectTemplate<int>::Setf(const SReference &val) 00091 { *var = val.GetInt(); } 00092 template<> inline 00093 void SExpressionIndirectTemplate<unsigned int>::Setf(const SReference &val) 00094 { *var = val.GetInt(); } 00095 template<> inline 00096 void SExpressionIndirectTemplate<long>::Setf(const SReference &val) 00097 { *var = val.GetInt(); } 00098 template<> inline 00099 void SExpressionIndirectTemplate<unsigned long>::Setf(const SReference &val) 00100 { *var = val.GetInt(); } 00101 template<> inline 00102 void SExpressionIndirectTemplate<long long>::Setf(const SReference &val) 00103 { *var = val.GetInt(); } 00104 template<> inline void 00105 SExpressionIndirectTemplate<unsigned long long>::Setf(const SReference &val) 00106 { *var = val.GetInt(); } 00107 00108 00109 template<> inline 00110 void SExpressionIndirectTemplate<float>::Setf(const SReference &val) 00111 { *var = val.GetFloat(); } 00112 template<> inline 00113 void SExpressionIndirectTemplate<double>::Setf(const SReference &val) 00114 { *var = val.GetFloat(); } 00115 template<> inline 00116 void SExpressionIndirectTemplate<long double>::Setf(const SReference &val) 00117 { *var = val.GetFloat(); } 00118 00119 template<> inline 00120 void SExpressionIndirectTemplate<SString>::Setf(const SReference &val) 00121 { *var = val.GetString(); } 00122 00123 template<> inline 00124 void SExpressionIndirectTemplate<SReference>::Setf(const SReference &val) 00125 { *var = val; } 00126 00127 00128 00129 00131 00138 class SExpressionIndirectAccessor : public SExpressionForm { 00139 public: 00140 virtual void Call(const SReference &formtail, 00141 IntelibContinuation &cont) const; 00142 00143 #if INTELIB_TEXT_REPRESENTATIONS == 1 00144 virtual SString TextRepresentation() const 00145 { return "#<-INDIRECT-ACCESSOR->"; } 00146 #endif 00147 00148 protected: 00149 ~SExpressionIndirectAccessor() {} 00150 }; 00151 00152 00153 #endif