Sierra Toolkit  Version of the Day
NamedPair.hpp
1 /*------------------------------------------------------------------------*/
2 /* Copyright 2010 Sandia Corporation. */
3 /* Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive */
4 /* license for use of this work by or on behalf of the U.S. Government. */
5 /* Export of this program may require a license from the */
6 /* United States Government. */
7 /*------------------------------------------------------------------------*/
8 
9 #ifndef stk_util_util_NamedPair_hpp
10 #define stk_util_util_NamedPair_hpp
11 
12 #define NAMED_PAIR( STRUCT_NAME , FIRST_TYPE , FIRST_NAME , SECOND_TYPE , SECOND_NAME ) \
13 struct STRUCT_NAME { \
14  typedef FIRST_TYPE first_type; \
15  typedef SECOND_TYPE second_type; \
16  \
17  first_type FIRST_NAME ; \
18  second_type SECOND_NAME ; \
19  \
20  STRUCT_NAME ( const first_type & arg_ ## FIRST_NAME , \
21  const second_type & arg_ ## SECOND_NAME ) \
22  : FIRST_NAME ( arg_ ## FIRST_NAME ) , \
23  SECOND_NAME ( arg_ ## SECOND_NAME ) {} \
24  \
25  ~ STRUCT_NAME () {} \
26  STRUCT_NAME () {} \
27  STRUCT_NAME ( const STRUCT_NAME & arg_rhs ) \
28  : FIRST_NAME ( arg_rhs. FIRST_NAME ) , \
29  SECOND_NAME ( arg_rhs. SECOND_NAME ) {} \
30  STRUCT_NAME & operator = ( const STRUCT_NAME & arg_rhs ) \
31  { FIRST_NAME = arg_rhs. FIRST_NAME ; \
32  SECOND_NAME = arg_rhs. SECOND_NAME ; \
33  return *this ; } \
34 }; \
35 \
36 inline \
37 bool operator == ( const STRUCT_NAME & arg_lhs , \
38  const STRUCT_NAME & arg_rhs ) \
39  { return arg_lhs. FIRST_NAME == arg_rhs. FIRST_NAME && \
40  arg_lhs. SECOND_NAME == arg_rhs. SECOND_NAME ; } \
41 \
42 inline \
43 bool operator != ( const STRUCT_NAME & arg_lhs , \
44  const STRUCT_NAME & arg_rhs ) \
45  { return arg_lhs. FIRST_NAME != arg_rhs. FIRST_NAME || \
46  arg_lhs. SECOND_NAME != arg_rhs. SECOND_NAME ; } \
47 \
48 inline \
49 bool operator < ( const STRUCT_NAME & arg_lhs , \
50  const STRUCT_NAME & arg_rhs ) \
51  { return arg_lhs. FIRST_NAME < arg_rhs. FIRST_NAME || \
52  ( ! ( arg_rhs. FIRST_NAME < arg_lhs. FIRST_NAME ) && \
53  arg_lhs. SECOND_NAME < arg_rhs. SECOND_NAME ) ; } \
54 \
55 inline \
56 bool operator > ( const STRUCT_NAME & arg_lhs , \
57  const STRUCT_NAME & arg_rhs ) \
58  { return operator < ( arg_rhs , arg_lhs ); } \
59 
60 #endif
61