/**************************************************************************\

MODULE: pair

SUMMARY:

Pair templates.

The decalaration 

   Pair<S,T> p;

creates a pair object using the default constructors for S and T.  The
member p.a is the first component (of type S) and the member p.b is
the second component (of type T).


\**************************************************************************/



#include <NTL/tools.h>

template<class S, class T>
class Pair {  
public:  
   S a;  
   T b;  
  
   Pair(); 
   // default constructor...invokes default constructors for S and T

   Pair(const S& x, const T& y);  // initialize with (x, y)

   ~Pair(); 
   // destructor...invokes destructors for S and T

   // defaut copy and move constructors and assignment 
};  
  
template<class S, class T>
Pair<S,T> cons(const S& x, const T& y); 
// returns Pair<S,T>(x, y)


/**************************************************************************\

                             Input/Output

The I/O format for a Pair is

   [a b]

\**************************************************************************/


template<class S, class T>
istream& operator>>(istream&, Pair<S,T>&);  

template<class S, class T>
ostream& operator<<(ostream&, const Pair<S,T>&);  


/**************************************************************************\

                              Equality Testing

\**************************************************************************/


template<class S, class T>
long operator==(const Pair<S,T>& x, const Pair<S,T>& y);

template<class S, class T>
long operator!=(const Pair<S,T>& x, const Pair<S,T>& y); 


