casa  $Rev:20696$
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
Public Member Functions | Private Attributes
casa::Fallible< T > Class Template Reference

Mark a value as valid or invalid. More...

#include <Fallible.h>

List of all members.

Public Member Functions

 Fallible ()
 The default constructor creates an invalid object.
 Fallible (const T &value)
 Create a valid object.
 Fallible (const Fallible< T > &other)
Fallible< T > & operator= (const Fallible< T > &other)
 ~Fallible ()
 operator T () const
 Automatically convert a Fallible<T> to a T.
value () const
 Sometimes it's more convenient to not rely on a compiler supplied conversion, especially when the compiler is confused.
Bool isValid () const

Private Attributes

value_p
Bool isValid_p

Detailed Description

template<class T>
class casa::Fallible< T >

Mark a value as valid or invalid.

Intended use:

Public interface

Review Status

Reviewed By:
Gareth Hunt
Date Reviewed:
1994/09/14
Test programs:
tFallible,TestCenter

Etymology

This is to be used for values which might be fallible, i.e. might not be valid.

Synopsis

This class resembles the one in Scientific and Engineering C++ by Barton and Nackman. While it was written with that book closed, the class is simple enough that resemblances likely remain.

This class essentially just holds a value (with automatic conversion) and allows inquiry as to whether the value is valid. If the value is used and is indeed invalid an exception will be thrown.

A copy of the value is stored in the Fallible<T> object, so making copies shouldn't be too expensive. It is anticipated that this class will most often be used with built in, or other small, types.

Example

Suppose we write some code that turns a day/month/year into a day of the week:

       enum DayName {Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, 
                     Saturday};
       Fallible<DayName> dayFromDate(uInt day, uInt month, uInt year); // a func.

And we also have some other function that needs a day name, for example just prints it:

       ostream &operator<<(ostream &os, DayName day); // Print name as string

Since the automatic conversions are defined, if we are certain that the dates are valid, we can just go ahead and use the value:

       cout << dayFromData(2, 1, 1962) << endl; // A valid date

If, by some chance, you are wrong and a date fails, then an exception will be thrown and a run-time error will occur.

If, as is more likely the case, you don't know a priori whether a test will succeed, you can check it:

       Fallible<DayName> result = dayFromDate(d,m,y); // who knows if valid?
       if (result.isValid()) {
          cout << result << endl;
       } else {
         // some corrective action
       }

Motivation

The alternatives are to have "special values" (e.g. have an "undefined day" in the enumeration) or return a Boolean, or change a Boolean. While those solutions are often adequate, Fallible<T> can often be more natural.

Template Type Argument Requirements (T)

Definition at line 122 of file Fallible.h.


Constructor & Destructor Documentation

template<class T>
casa::Fallible< T >::Fallible ( ) [inline]

The default constructor creates an invalid object.

Definition at line 126 of file Fallible.h.

template<class T>
casa::Fallible< T >::Fallible ( const T &  value) [inline]

Create a valid object.

Definition at line 129 of file Fallible.h.

template<class T>
casa::Fallible< T >::Fallible ( const Fallible< T > &  other) [inline]

Definition at line 132 of file Fallible.h.

template<class T>
casa::Fallible< T >::~Fallible ( ) [inline]

Definition at line 139 of file Fallible.h.


Member Function Documentation

template<class T>
Bool casa::Fallible< T >::isValid ( ) const [inline]

Definition at line 150 of file Fallible.h.

References casa::Fallible< T >::isValid_p.

template<class T>
casa::Fallible< T >::operator T ( ) const [inline]

Automatically convert a Fallible<T> to a T.

Definition at line 142 of file Fallible.h.

References casa::Fallible< T >::isValid_p, and casa::Fallible< T >::value_p.

template<class T>
Fallible<T>& casa::Fallible< T >::operator= ( const Fallible< T > &  other) [inline]

Definition at line 135 of file Fallible.h.

References casa::Fallible< T >::isValid_p, and casa::Fallible< T >::value_p.

template<class T>
T casa::Fallible< T >::value ( ) const [inline]

Sometimes it's more convenient to not rely on a compiler supplied conversion, especially when the compiler is confused.

Definition at line 147 of file Fallible.h.

References casa::Fallible< T >::isValid_p, and casa::Fallible< T >::value_p.


Member Data Documentation

template<class T>
Bool casa::Fallible< T >::isValid_p [private]
template<class T>
T casa::Fallible< T >::value_p [private]

The documentation for this class was generated from the following file: