--- /dev/null
+ /*
+ $Revision: 1.9 $
+ $Date: 2010/03/11 14:42:04 $
+ $Author: faust $
+ */
+
+/*
+ * Copyright (c) 2001 by Peter Simons <simons@cryp.to>.
+ * All rights reserved.
+ */
+
+#ifndef RESETABLE_VARIABLE_H
+#define RESETABLE_VARIABLE_H
+
+// This is a wrapper class about variables where you want to keep
+// track of whether it has been assigened yet or not.
+
+#include <iostream>
+
+template <typename varT>
+class RESETABLE
+{
+ template <typename varT1>
+ friend std::ostream & operator<<(std::ostream & o, RESETABLE<varT1> v);
+public:
+ typedef varT value_type;
+
+ //-------------------------------------------------------------------------
+ RESETABLE()
+ : value(),
+ is_set(false)
+ {
+ }
+ //-------------------------------------------------------------------------
+ RESETABLE<value_type>(const RESETABLE<value_type> & rvalue)
+ : value(rvalue.value),
+ is_set(rvalue.is_set)
+ {
+ }
+ //-------------------------------------------------------------------------
+ RESETABLE(const value_type& val)
+ : value(val),
+ is_set(true)
+ {
+ }
+ //-------------------------------------------------------------------------
+ RESETABLE<value_type> & operator=(const RESETABLE<value_type> & rvalue)
+ {
+ value = rvalue.value;
+ is_set = rvalue.is_set;
+ return *this;
+ }
+ //-------------------------------------------------------------------------
+ RESETABLE<value_type> & operator= (const value_type& rhs)
+ {
+ value = rhs;
+ is_set = true;
+ return *this;
+ }
+ //-------------------------------------------------------------------------
+ const value_type& const_data() const throw()
+ {
+ return value;
+ }
+ //-------------------------------------------------------------------------
+ value_type& data() throw()
+ {
+ return value;
+ }
+ //-------------------------------------------------------------------------
+ operator const value_type&() const throw()
+ {
+ return value;
+ }
+ //-------------------------------------------------------------------------
+ bool res_empty() const throw()
+ {
+ return !is_set;
+ }
+ //-------------------------------------------------------------------------
+ void reset() throw()
+ {
+ is_set = false;
+ }
+ //-------------------------------------------------------------------------
+protected:
+ value_type value;
+ bool is_set;
+};
+//-----------------------------------------------------------------------------
+template <typename varT>
+std::ostream & operator<<(std::ostream & o, RESETABLE<varT> v)
+{
+ return o << v.value;
+}
+//-------------------------------------------------------------------------
+#endif // RESETABLE_VARIABLE_H
+