8 #include "networktables2/AbstractNetworkTableEntryStore.h"
9 #include "networktables2/TableKeyExistsWithDifferentTypeException.h"
15 AbstractNetworkTableEntryStore::AbstractNetworkTableEntryStore(
TableListenerManager& lstnManager):
16 listenerManager(lstnManager){
19 AbstractNetworkTableEntryStore::~AbstractNetworkTableEntryStore(){
21 std::map<std::string, NetworkTableEntry*>::iterator itr;
22 for(itr = namedEntries.begin(); itr != namedEntries.end();){
24 namedEntries.erase(itr++);
36 std::map<std::string, NetworkTableEntry*>::iterator value_itr = namedEntries.find(name);
37 if(value_itr != namedEntries.end()) {
38 return value_itr->second;
48 std::map<EntryId, NetworkTableEntry*>::iterator value_itr = idEntries.find(entryId);
49 if(value_itr != idEntries.end()) {
50 return value_itr->second;
56 std::vector<std::string>* AbstractNetworkTableEntryStore::keys(){
59 std::vector<std::string>* keys =
new std::vector<std::string>();
60 std::map<std::string, NetworkTableEntry*>::iterator itr;
62 for(itr = namedEntries.begin(); itr != namedEntries.end(); itr++)
64 std::string key = (*itr).first;
92 std::map<std::string, NetworkTableEntry*>::iterator itr;
95 for(itr = namedEntries.begin(); itr != namedEntries.end(); itr++)
103 outgoingReceiver = receiver;
107 incomingReceiver = receiver;
123 std::map<std::string, NetworkTableEntry*>::iterator index = namedEntries.find(name);
125 if(index == namedEntries.end())
128 if(addEntry(tableEntry))
130 tableEntry->FireListener(listenerManager);
131 outgoingReceiver->offerOutgoingAssignment(tableEntry);
136 tableEntry = index->second;
137 if(tableEntry->GetType()->id != type->id){
142 if(!type->
areEqual(value, oldValue)){
143 if(updateEntry(tableEntry, (SequenceNumber)(tableEntry->
GetSequenceNumber() + 1), value)){
144 outgoingReceiver->offerOutgoingUpdate(tableEntry);
147 tableEntry->FireListener(listenerManager);
158 if(!type->
areEqual(value, oldValue)){
159 if(updateEntry(tableEntry, (SequenceNumber)(tableEntry->
GetSequenceNumber() + 1), value)){
160 outgoingReceiver->offerOutgoingUpdate(tableEntry);
163 tableEntry->FireListener(listenerManager);
168 void AbstractNetworkTableEntryStore::offerIncomingAssignment(
NetworkTableEntry* entry){
171 std::map<std::string, NetworkTableEntry*>::iterator itr = namedEntries.find(entry->
name);
174 if(itr != namedEntries.end()){
175 tableEntry = itr->second;
181 tableEntry->FireListener(listenerManager);
182 incomingReceiver->offerOutgoingAssignment(tableEntry);
189 void AbstractNetworkTableEntryStore::offerIncomingUpdate(
NetworkTableEntry* entry, SequenceNumber squenceNumber,
EntryValue value){
192 if(updateEntry(entry, squenceNumber, value)){
193 entry->FireListener(listenerManager);
194 incomingReceiver->offerOutgoingUpdate(entry);
207 std::map<std::string, NetworkTableEntry*>::iterator itr;
208 for(itr = namedEntries.begin(); itr != namedEntries.end(); itr++)
211 listener->
ValueChanged(table, itr->first, entry->GetValue(),
true);
void notifyEntries(ITable *table, ITableListener *listener)
virtual void ValueChanged(ITable *source, const std::string &key, EntryValue value, bool isNew)=0
void PutOutgoing(std::string &name, NetworkTableEntryType *type, EntryValue value)
SequenceNumber GetSequenceNumber()
virtual bool areEqual(EntryValue v1, EntryValue v2)=0