diff options
Diffstat (limited to 'cpp')
-rw-r--r-- | cpp/demo/Freeze/phonebook/PhoneBook.ice | 8 | ||||
-rw-r--r-- | cpp/demo/Freeze/phonebook/PhoneBookI.cpp | 32 | ||||
-rw-r--r-- | cpp/demo/Freeze/phonebook/PhoneBookI.h | 3 |
3 files changed, 34 insertions, 9 deletions
diff --git a/cpp/demo/Freeze/phonebook/PhoneBook.ice b/cpp/demo/Freeze/phonebook/PhoneBook.ice index 3650f3bf03e..2268c13c089 100644 --- a/cpp/demo/Freeze/phonebook/PhoneBook.ice +++ b/cpp/demo/Freeze/phonebook/PhoneBook.ice @@ -30,15 +30,17 @@ class Entry }; sequence<Entry*> Entries; -sequence<string> EntryIdentities; -dictionary<wstring, EntryIdentities> EntryIdentitiesDict; +sequence<string> Identities; +dictionary<wstring, Identities> NameIdentitiesDict; +sequence<wstring> Names; class PhoneBook { Entry* createEntry(); Entries findEntries(wstring name); + Names listNames(); - EntryIdentitiesDict _entryIdentitiesDict; + NameIdentitiesDict _nameIdentitiesDict; }; #endif diff --git a/cpp/demo/Freeze/phonebook/PhoneBookI.cpp b/cpp/demo/Freeze/phonebook/PhoneBookI.cpp index 9a99ce0fb42..03bf0ac8448 100644 --- a/cpp/demo/Freeze/phonebook/PhoneBookI.cpp +++ b/cpp/demo/Freeze/phonebook/PhoneBookI.cpp @@ -128,10 +128,11 @@ PhoneBookI::findEntries(const wstring& name) { JTCSyncT<JTCRecursiveMutex> sync(*this); // TODO: Reader/Writer lock - EntryIdentitiesDict::iterator p = _entryIdentitiesDict.find(name); - if (p != _entryIdentitiesDict.end()) + NameIdentitiesDict::iterator p = _nameIdentitiesDict.find(name); + if (p != _nameIdentitiesDict.end()) { Entries entries; + entries.reserve(p->second.size()); transform(p->second.begin(), p->second.end(), back_inserter(entries), IdentityToEntry(_adapter)); return entries; } @@ -141,12 +142,33 @@ PhoneBookI::findEntries(const wstring& name) } } +Names +PhoneBookI::listNames() +{ + JTCSyncT<JTCRecursiveMutex> sync(*this); // TODO: Reader/Writer lock + + Names names; + for (NameIdentitiesDict::iterator p = _nameIdentitiesDict.begin(); p != _nameIdentitiesDict.begin(); ++p) + { + // + // If there are multiple entries for one name, I want the name + // listed just as many times. + // + for (Identities::size_type i = 0; i < p->second.size(); ++i) + { + names.push_back(p->first); + } + } + + return names; +} + void PhoneBookI::add(const string& identity, const wstring& name) { JTCSyncT<JTCRecursiveMutex> sync(*this); // TODO: Reader/Writer lock - _entryIdentitiesDict[name].push_back(identity); + _nameIdentitiesDict[name].push_back(identity); } void @@ -154,8 +176,8 @@ PhoneBookI::remove(const string& identity, const wstring& name) { JTCSyncT<JTCRecursiveMutex> sync(*this); // TODO: Reader/Writer lock - EntryIdentitiesDict::iterator p = _entryIdentitiesDict.find(name); - assert(p != _entryIdentitiesDict.end()); + NameIdentitiesDict::iterator p = _nameIdentitiesDict.find(name); + assert(p != _nameIdentitiesDict.end()); p->second.erase(remove_if(p->second.begin(), p->second.end(), bind2nd(equal_to<string>(), identity)), p->second.end()); } diff --git a/cpp/demo/Freeze/phonebook/PhoneBookI.h b/cpp/demo/Freeze/phonebook/PhoneBookI.h index f3ad3c8f60e..1a59ce35e6b 100644 --- a/cpp/demo/Freeze/phonebook/PhoneBookI.h +++ b/cpp/demo/Freeze/phonebook/PhoneBookI.h @@ -51,7 +51,8 @@ public: virtual EntryPrx createEntry(); virtual Entries findEntries(const std::wstring&); - + virtual Names listNames(); + void add(const std::string&, const std::wstring&); void remove(const std::string&, const std::wstring&); void move(const std::string&, const std::wstring&, const std::wstring&); |