00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef PALUDIS_GUARD_PALUDIS_INSTANTIATION_POLICY_HH
00021 #define PALUDIS_GUARD_PALUDIS_INSTANTIATION_POLICY_HH 1
00022
00023 #include <paludis/util/attributes.hh>
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 namespace paludis
00036 {
00037
00038
00039
00040
00041
00042 namespace instantiation_method
00043 {
00044
00045
00046
00047
00048
00049 struct NonCopyableTag;
00050
00051
00052
00053
00054
00055
00056 struct NonInstantiableTag;
00057
00058
00059
00060
00061
00062
00063 struct SingletonTag;
00064 }
00065
00066
00067
00068
00069
00070
00071
00072 template <typename OurType_, typename InstantiationMethodTag_>
00073 struct InstantiationPolicy;
00074
00075
00076
00077
00078
00079
00080
00081
00082 template<typename OurType_>
00083 class PALUDIS_VISIBLE InstantiationPolicy<OurType_, instantiation_method::NonCopyableTag>
00084 {
00085 private:
00086 InstantiationPolicy(const InstantiationPolicy &);
00087 const InstantiationPolicy & operator= (const InstantiationPolicy &);
00088
00089 public:
00090 InstantiationPolicy()
00091 {
00092 }
00093 };
00094
00095
00096
00097
00098
00099
00100
00101 template<typename OurType_>
00102 class InstantiationPolicy<OurType_, instantiation_method::NonInstantiableTag>
00103 {
00104 private:
00105 InstantiationPolicy(const InstantiationPolicy &);
00106 const InstantiationPolicy & operator= (const InstantiationPolicy &);
00107 InstantiationPolicy();
00108 };
00109
00110
00111
00112
00113
00114
00115
00116
00117 template<typename OurType_>
00118 class PALUDIS_VISIBLE InstantiationPolicy<OurType_, instantiation_method::SingletonTag>
00119 {
00120 private:
00121 InstantiationPolicy(const InstantiationPolicy &);
00122
00123 const InstantiationPolicy & operator= (const InstantiationPolicy &);
00124
00125 static OurType_ * * _get_instance_ptr();
00126
00127 class DeleteOnDestruction;
00128 friend class DeleteOnDestruction;
00129
00130 static void _delete(OurType_ * const p);
00131
00132 class DeleteOnDestruction;
00133
00134 protected:
00135
00136
00137
00138 InstantiationPolicy()
00139 {
00140 }
00141
00142
00143
00144 public:
00145
00146
00147
00148
00149
00150
00151 static OurType_ * get_instance()
00152 PALUDIS_ATTRIBUTE((warn_unused_result));
00153
00154
00155
00156
00157 static void destroy_instance();
00158
00159
00160 };
00161 }
00162
00163 #endif