summaryrefslogtreecommitdiff
path: root/graphs/cpp/address_book/address_book.cc
diff options
context:
space:
mode:
Diffstat (limited to 'graphs/cpp/address_book/address_book.cc')
-rw-r--r--graphs/cpp/address_book/address_book.cc75
1 files changed, 75 insertions, 0 deletions
diff --git a/graphs/cpp/address_book/address_book.cc b/graphs/cpp/address_book/address_book.cc
new file mode 100644
index 0000000..92e74cf
--- /dev/null
+++ b/graphs/cpp/address_book/address_book.cc
@@ -0,0 +1,75 @@
+//
+// Created by martial.simon on 2/26/25.
+//
+
+#include "address_book.hh"
+
+#include <iostream>
+#include <stdexcept>
+bool AddressBook::add(const std::string& full_name, const std::string& email,
+ const std::string& number)
+{
+ try
+ {
+ ContactDetails details = ContactDetails::makeDetails(number, email);
+ if (full_name.empty())
+ return false;
+ contact_map_.insert({ full_name, details });
+ return true;
+ }
+ catch (std::invalid_argument& e)
+ {
+ return false;
+ }
+}
+std::vector<ContactDetails> AddressBook::find(const std::string& full_name)
+{
+ std::vector<ContactDetails> res;
+ for (auto detail = contact_map_.find(full_name);
+ detail != contact_map_.end() && detail->first == full_name; detail++)
+ {
+ res.push_back(detail->second);
+ }
+ return res;
+}
+std::size_t AddressBook::count(const std::string& full_name)
+{
+ size_t res = 0;
+ for (auto detail = contact_map_.find(full_name);
+ detail != contact_map_.end(); detail++)
+ {
+ res++;
+ }
+ return res;
+}
+bool AddressBook::remove(const std::string& full_name, std::size_t index)
+{
+ auto range = contact_map_.equal_range(full_name);
+ for (auto contact = range.first; contact != range.second; contact++)
+ {
+ if (contact->first == full_name)
+ {
+ if (index == 0)
+ {
+ contact_map_.erase(contact);
+ return true;
+ }
+ index--;
+ }
+ }
+ return false;
+}
+void AddressBook::remove_all(const std::string& full_name)
+{
+ auto range = contact_map_.equal_range(full_name);
+ contact_map_.erase(range.first, range.second);
+}
+std::ostream& operator<<(std::ostream& os, const AddressBook& b)
+{
+ os << b.contact_map_.size() << " contact(s) in the address book.\n";
+ for (auto& pair : b.contact_map_)
+ {
+ os << "- " << pair.first << ": " << pair.second;
+ }
+ return os;
+} \ No newline at end of file