1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
#ifndef IDREF_BASE_CPP
#define IDREF_BASE_CPP
#include "dance/Logger/Log_Macros.h"
#include "IDREF_Base.h"
#include <iostream>
namespace DAnCE
{
namespace Config_Handlers
{
template <typename T>
void
IDREF_Base<T>::bind_ref (ACE_TString& id, T value)
{
DANCE_TRACE("IDREF_Base<T>::bind_ref");
int retval =
idref_map_.bind (id, value);
pos_map_.bind (value,id);
if (retval < 0)
throw Config_Error (id.c_str (),
ACE_TEXT ("Failed to bind an IDRef. This likely indicates a name clash."));
}
template <typename T>
void
IDREF_Base<T>::bind_next_available (ACE_TString &id)
{
// Note: For this function to compile and work properly,
// T must have the postincrement operator defined.
DANCE_TRACE ("IDREF_Base<T>::bind_next_available");
// ACE_DEBUG ((LM_DEBUG, "**** Binding %s to %i\n",
// id.c_str (),
// this->next_));
int retval = idref_map_.bind (id, this->next_);
int pos_retval = pos_map_.bind (this->next_, id);
++this->next_;
if (retval < 0 || pos_retval < 0)
throw Config_Error (id.c_str (),
ACE_TEXT ("Failed to bind an IDRef. This likely indicates a name clash"));
}
template <typename T>
void
IDREF_Base<T>::find_ref (const ACE_TString& id, T& val)
{
DANCE_TRACE("IDREF_Base<T>::find_ref(C_String, T)");
int retval =
idref_map_.find (id, val);
if (retval < 0)
throw Config_Error (id.c_str (),
ACE_TEXT ("Unable to look up an IDRef."));
}
template <typename T>
void
IDREF_Base<T>::find_ref (const T& value, ACE_TString& id)
{
DANCE_TRACE("IDREF_Base<T>::find_ref (T, CString)");
int retval =
pos_map_.find (value, id);
// ACE_ERROR ((LM_ERROR, "**** Looking up value %i\n",
// value));
if (retval < 0)
throw Config_Error (ACE_TEXT ("No location information for reverse IDREF lookup"),
id.c_str ());
}
template <typename T>
bool
IDREF_Base<T>::unbind_refs (void)
{
DANCE_TRACE("IDREF_Base<T>::unbind_refs");
int retval =
idref_map_.unbind_all ();
pos_map_.unbind_all ();
this->next_ = 0;
if (retval < 0)
return false;
return true;
}
}
}
#endif /* IDREF_BASE_CPP */
|