Update copyright to LGPL on all files
[dyninst.git] / dynutil / h / Edge.h
1 /*
2  * Copyright (c) 1996-2009 Barton P. Miller
3  * 
4  * We provide the Paradyn Parallel Performance Tools (below
5  * described as "Paradyn") on an AS IS basis, and do not warrant its
6  * validity or performance.  We reserve the right to update, modify,
7  * or discontinue this software at any time.  We shall have no
8  * obligation to supply such updates or modifications or any other
9  * form of support to you.
10  * 
11  * By your use of Paradyn, you understand and agree that we (or any
12  * other person or entity with proprietary rights in Paradyn) are
13  * under no obligation to provide either maintenance services,
14  * update services, notices of latent defects, or correction of
15  * defects for Paradyn.
16  * 
17  * This library is free software; you can redistribute it and/or
18  * modify it under the terms of the GNU Lesser General Public
19  * License as published by the Free Software Foundation; either
20  * version 2.1 of the License, or (at your option) any later version.
21  * 
22  * This library is distributed in the hope that it will be useful,
23  * but WITHOUT ANY WARRANTY; without even the implied warranty of
24  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
25  * Lesser General Public License for more details.
26  * 
27  * You should have received a copy of the GNU Lesser General Public
28  * License along with this library; if not, write to the Free Software
29  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
30  */
31
32 #if !defined(EDGE_H)
33 #define EDGE_H
34
35 #include "dyn_detail/boost/shared_ptr.hpp"
36 #include "dyn_detail/boost/weak_ptr.hpp"
37 #include <set>
38 #include "Annotatable.h"
39
40 namespace Dyninst {
41 class Graph;
42 class Node;
43     
44 class Edge : public AnnotatableSparse {
45     friend class Node;
46     friend class Graph;
47     friend class Creator;
48  public:
49     typedef dyn_detail::boost::shared_ptr<Edge> Ptr;
50
51  private:
52     typedef dyn_detail::boost::shared_ptr<Node> NodeSharedPtr;
53     typedef dyn_detail::boost::weak_ptr<Node> NodePtr;
54     
55  public:
56     
57     static Ptr createEdge(const NodeSharedPtr source, const NodeSharedPtr target);
58     
59     NodeSharedPtr source() const { return source_.lock(); }
60     NodeSharedPtr target() const { return target_.lock(); }
61     
62  private:
63     Edge(const NodePtr source, const NodePtr target); 
64     Edge();
65     
66     NodePtr source_;
67     NodePtr target_;
68 };
69
70  class EdgeIteratorImpl;
71
72 class EdgeIterator {
73     friend class Node;
74     friend class Graph;
75     friend class Edge;
76
77  public:
78
79     EdgeIterator &operator++();
80     EdgeIterator operator++(int);
81     EdgeIterator &operator--();
82     EdgeIterator operator--(int);
83
84     bool operator==(const EdgeIterator &rhs) const;
85     bool operator!=(const EdgeIterator &rhs) const;
86
87     EdgeIterator &operator=(const EdgeIterator &rhs);
88
89     Edge::Ptr operator*() const;
90
91     // Make sure this is explicitly _not_ allowed (no vectors of iterators)
92     EdgeIterator() : iter_(NULL) {};
93
94     EdgeIterator(const EdgeIterator &rhs);
95
96     ~EdgeIterator();   
97
98     EdgeIterator(EdgeIteratorImpl *iter) : iter_(iter) {};
99
100  protected:
101
102     // Main constructor
103     // The iter parameter becomes owned by the iterator and will be destroyed
104     // when the iterator is destroyed.
105
106
107     // We hide the internal iteration behavior behind a pointer. 
108     // This allows us to override (yay for virtual functions).
109     EdgeIteratorImpl *iter_;
110 };
111
112 // This is a pure virtual interface class
113 class EdgeIteratorImpl {
114     friend class EdgeIterator;
115     
116  public:
117     virtual void inc() = 0;
118     virtual void dec() = 0;
119     virtual Edge::Ptr get() = 0;
120     virtual bool equals(EdgeIteratorImpl *) = 0;
121     virtual EdgeIteratorImpl *copy() = 0;
122
123     virtual ~EdgeIteratorImpl() {};
124 };
125
126 // Types of edge iteration: over a set of edges
127 class EdgeIteratorSet : public EdgeIteratorImpl {
128     friend class EdgeIterator;
129
130  public:
131     virtual void inc() { ++internal_; }
132     virtual void dec() { --internal_; }
133     virtual Edge::Ptr get() { return *internal_; }
134     virtual bool equals(EdgeIteratorImpl *rhs) {
135         EdgeIteratorSet *tmp = dynamic_cast<EdgeIteratorSet *>(rhs);
136         if (tmp == NULL) return false;
137         return internal_ == tmp->internal_;
138     }
139
140     virtual EdgeIteratorImpl *copy() {
141         EdgeIteratorSet *tmp = new EdgeIteratorSet(internal_);
142         return tmp;
143     }
144
145     virtual ~EdgeIteratorSet() {
146         // Nothing to do
147     }
148     
149     EdgeIteratorSet(const std::set<Edge::Ptr>::iterator iter) : internal_(iter) {
150     };
151
152  private:
153     std::set<Edge::Ptr>::iterator internal_;
154 };
155
156 }
157 #endif
158