00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef lestes__lang__cplus__syn__semval_hh__included
00029 #define lestes__lang__cplus__syn__semval_hh__included
00030
00031 #include <lestes/common.hh>
00032 #include <lestes/intercode/intercode.g.hh>
00033
00034 package(lestes);
00035 package(lang);
00036 package(cplus);
00037 package(syn);
00038
00039
00040 typedef ::lestes::intercode::as_base semref_type;
00041
00042 template<typename T>
00043 class semref {
00044 template<typename Y>
00045 friend class semref;
00046 private:
00047 ptr<semref_type> & ref;
00048 public:
00049 explicit semref<T>( ptr<semref_type> & a_ref ) : ref(a_ref)
00050 {}
00051 void operator= ( const ptr<T> & p ) const
00052 {
00053 ref = p;
00054 }
00055 void operator= ( const semref<T> & a ) const
00056 {
00057
00058 ref = a.ref.template dncast<T>();
00059 lassert2( ref, "Pointer assigned to a semref should not be NULL." );
00060 }
00061 template<typename Y>
00062 void operator= ( const semref<Y> & a ) const
00063 {
00064
00065
00066 ptr<T> tmp = a.ref.template dncast<Y>();
00067 ref = tmp;
00068 lassert2( ref, "Pointer assigned to a semref should not be NULL." );
00069 }
00070 ptr<T> operator-> () const
00071 {
00072
00073 return ref.template dncast<T>();
00074
00075
00076 }
00077 #if 0
00078 operator ptr<T> () const
00079 {
00080 return ref.template dncast<T>();
00081 }
00082 operator srp<T> () const
00083 {
00084 return srp<T>(ref.template dncast<T>());
00085 }
00086 #endif
00087
00088 template<typename Y>
00089 operator ptr<Y> () const
00090 {
00091
00092 return ref.template dncast<T>();
00093 }
00094
00095 template<typename Y>
00096 operator srp<Y> () const
00097 {
00098
00099 return srp<Y>(ref.template dncast<T>());
00100 }
00101 };
00102
00103 class semval {
00104 private:
00105 ptr<semref_type> pp;
00106 public:
00107 explicit semval() : pp() {}
00108 template<typename T> semref<T> select()
00109 {
00110 return semref<T>(pp);
00111 }
00112 };
00113
00114 end_package(syn);
00115 end_package(cplus);
00116 end_package(lang);
00117 end_package(lestes);
00118
00119 #endif // lestes__lang__cplus__syn__semval_hh__included