source: ThirdParty/mpqc_open/src/lib/util/ref/identity.h@ a844d8

Candidate_v1.6.1
Last change on this file since a844d8 was 860145, checked in by Frederik Heber <heber@…>, 8 years ago

Merge commit '0b990dfaa8c6007a996d030163a25f7f5fc8a7e7' as 'ThirdParty/mpqc_open'

  • Property mode set to 100644
File size: 4.0 KB
Line 
1//
2// identity.h --- definition of the Identity class
3//
4// Copyright (C) 1996 Limit Point Systems, Inc.
5//
6// Author: Curtis Janssen <cljanss@limitpt.com>
7// Maintainer: LPS
8//
9// This file is part of the SC Toolkit.
10//
11// The SC Toolkit is free software; you can redistribute it and/or modify
12// it under the terms of the GNU Library General Public License as published by
13// the Free Software Foundation; either version 2, or (at your option)
14// any later version.
15//
16// The SC Toolkit is distributed in the hope that it will be useful,
17// but WITHOUT ANY WARRANTY; without even the implied warranty of
18// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19// GNU Library General Public License for more details.
20//
21// You should have received a copy of the GNU Library General Public License
22// along with the SC Toolkit; see the file COPYING.LIB. If not, write to
23// the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
24//
25// The U.S. Government is granted a limited license as per AL 91-7.
26//
27
28#ifndef _util_ref_identity_h
29#define _util_ref_identity_h
30
31#ifdef __GNUG__
32#pragma interface
33#endif
34
35#include <iostream>
36
37#include <scconfig.h>
38
39namespace sc {
40
41class Identity;
42
43/** Identifier's are used to distinguish and order objects. On many
44 architectures a pointer to the object will suffice, but the C++
45 standard only guarantees that this works for two pointers pointing
46 within the same structure or array. Classes need to inherit from
47 Identity to use this mechanism. Identity, Identifier, and the
48 shorthand boolean operations may have to be modified for certain
49 architectures. */
50class Identifier {
51 private:
52 const void* id;
53 public:
54 /// Create an Identifier for a null object.
55 Identifier(): id(0) {}
56 /// Create an Identifier for the given object.
57 Identifier(const Identity* i): id((void*)i) {}
58 /// Create an Identifier for the given object.
59 Identifier(const Identifier& i): id(i.id) {}
60 /// The destructor does nothing.
61 ~Identifier() {}
62
63 /// Assign to the given Identifier.
64 void operator = (const Identifier& i) { id = i.id; }
65
66 /// Less than.
67 int operator < (const Identifier&i) const { return id < i.id; }
68 /// Greater than.
69 int operator > (const Identifier&i) const { return id > i.id; }
70 /// Equal.
71 int operator == (const Identifier&i) const { return id == i.id; }
72 /// Less than or equal.
73 int operator <= (const Identifier&i) const { return id <= i.id; }
74 /// Greater than or equal.
75 int operator >= (const Identifier&i) const { return id >= i.id; }
76 /// Not equal.
77 int operator != (const Identifier&i) const { return id != i.id; }
78
79 void print(std::ostream&) const;
80};
81
82std::ostream & operator << (std::ostream &o, const Identifier &i);
83
84/** Identity gives objects a unique identity and ordering relationship
85 relative to all other objects.
86
87 Identity must be virtually inherited if multiple inheritance is
88 to be used. */
89class Identity {
90 public:
91 virtual ~Identity();
92 /** Return the Identifier for this argument.
93 Usually this is just the pointer to the object. */
94 Identifier identifier() { return this; }
95};
96/// Less than for two Identity pointers.
97inline int lt(const Identity*i, const Identity*j) { return i < j; }
98/// Greater than for two Identity pointers.
99inline int gt(const Identity*i, const Identity*j) { return i > j; }
100/// Less than or equal for two Identity pointers.
101inline int le(const Identity*i, const Identity*j) { return i <= j; }
102/// Greater than or equal for two Identity pointers.
103inline int ge(const Identity*i, const Identity*j) { return i >= j; }
104/// Equal for two Identity pointers.
105inline int eq(const Identity*i, const Identity*j) { return i == j; }
106/// Not equal for two Identity pointers.
107inline int ne(const Identity*i, const Identity*j) { return i != j; }
108/** Compare for two Identity pointers. Returns -1, 0, or 1, like
109 the C library function strcmp. */
110inline int cmp(const Identity*i, const Identity*j)
111{
112 return (i==j)?0:((i<j)?-1:1);
113}
114
115}
116
117#endif
118
119// Local Variables:
120// mode: c++
121// c-file-style: "CLJ"
122// End:
Note: See TracBrowser for help on using the repository browser.