--- src/yafraycore/tools.h	Tue Feb  3 16:42:26 2004
+++ /Users/krug/Desktop/yafray-0.0.6-2/src/yafraycore/tools.h	Thu Feb 19 15:44:11 2004
@@ -98,31 +98,84 @@
 
 	public:
 
+		// Conversion<T,destructible *>::exists
+		//
+		// Ahem.
+		//
+		// Difficile de faire plus r�pugnant.
+		// Le principe: si la classe d�rive de destructible, on passe true comme troisi�me
+		// param�tre de back< ... >, sinon on passe false.
+		//
+		// Mais gcc:
+		// Thread model: posix
+		// gcc version 3.3 20030304 (Apple Computer, Inc. build 1495)
+		//
+		// n'aime pas du tout (ce qui ne semble pas extr�mement surprenant, je me demande si
+		// une version de gcc accepte vraiment ce code.)
+		//
+		// La hi�rarchie des types est la suivante:
+		//	destructible
+		//		photonData_t
+		//		hemiSampler_t
+		//			haltonSampler_t
+		//			randomSampler_t
+		//			photonSampler_t
+		//
+		// Donc si *T est un de ces types, on choisit la version _d (destructible)
+		// sinon, la version _nd. D'apr�s ce que j'ai vu, c'est ou bien un de ces types ou bien
+		// float.
+		// On pourrait raffiner en sp�cialisant pour float.
+
 		template<class T>
-		void context_t::store(const T &d,T v)
+		void context_t::store_nd(const T &d,T v)
 		{
 			back<T,
 					sizeof(T)<=sizeof(double),
-					Conversion<T,destructible *>::exists>
+					false >
+					::store(d,v,data,destructibles);
+		}
+		template<class T>
+		T get_nd(const T &d)
+		{
+			bool present=true;
+			return back<T,
+									sizeof(T)<=sizeof(double),
+									false >
+									::get(d,data,present,destructibles);
+		};
+		template<class T>
+		T get_nd(const T &d,bool &present)
+		{
+			present=true;
+			return back<T,
+									sizeof(T)<=sizeof(double),
+									false >
+									::get(d,data,present,destructibles);
+		};
+		template<class T>
+		void context_t::store_d(const T &d,T v)
+		{
+			back<T,
+					sizeof(T)<=sizeof(double),
+					true >
 					::store(d,v,data,destructibles);
 		}
-
 		template<class T>
-		T get(const T &d)
+		T get_d(const T &d)
 		{
 			bool present=true;
 			return back<T,
 									sizeof(T)<=sizeof(double),
-									Conversion<T,destructible *>::exists>
+									true >
 									::get(d,data,present,destructibles);
 		};
 		template<class T>
-		T get(const T &d,bool &present)
+		T get_d(const T &d,bool &present)
 		{
 			present=true;
 			return back<T,
 									sizeof(T)<=sizeof(double),
-									Conversion<T,destructible *>::exists>
+									true >
 									::get(d,data,present,destructibles);
 		};