Switch to side-by-side view

--- a/src/Common/Address.cc
+++ b/src/Common/Address.cc
@@ -15,51 +15,100 @@
 
 #include <Address.h>
 
-Address::Address() : ipcAddress(APN()), difName("")
+Address::Address() : ipcAddress(APN()), difName(""), apname(APN())
 {
+}
+
+Address::Address(std::string composite)
+{
+    std::string delimiter = "_";
+
+    size_t pos = 0;
+    std::vector<std::string> tokens;
+    while ((pos = composite.find(delimiter)) != std::string::npos) {
+        tokens.push_back(composite.substr(0, pos));
+        composite.erase(0, pos + delimiter.length());
+    }
+    tokens.push_back(composite);
+
+    if (tokens.size() == 2) {
+        ipcAddress = APN(tokens.front());
+        difName = DAP(tokens.back());
+        std::ostringstream os;
+        os << ipcAddress << "_" << difName;
+        apname = APN(os.str().c_str());
+    }
+
+
 }
 
 Address::Address(const char* ipcaddr, const char* difnam) :
         ipcAddress(APN(ipcaddr)), difName(DAP(difnam))
 {
+        std::ostringstream os;
+        os << ipcaddr << "_" << difnam;
+        apname = APN(os.str().c_str());
 }
 
 Address::~Address()
 {
+    ipcAddress = APN();
+    difName = DAP();
+    apname = APN();
 }
 
-const DAP& Address::getDifName() const {
+const DAP& Address::getDifName() const
+{
     return difName;
 }
 
-void Address::setDifName(const DAP& difName) {
+void Address::setDifName(const DAP& difName)
+{
     this->difName = difName;
 }
 
-const APN& Address::getIpcAddress() const {
+const APN& Address::getIpcAddress() const
+{
     return ipcAddress;
 }
 
-bool Address::operator ==(const Address& other) const {
-    return ipcAddress == other.ipcAddress && difName == other.difName;
+bool Address::operator ==(const Address& other) const
+{
+    return ipcAddress == other.ipcAddress
+            && difName == other.difName
+            && apname == other.apname;
 }
 
-std::string Address::info() const {
-    std::stringstream os;
+std::string Address::info() const
+{
+    std::ostringstream os;
     if (!ipcAddress.getName().empty() && !difName.getName().empty())
         os << ipcAddress << "(" << difName << ")";
     return os.str();
 }
 
-void Address::setIpcAddress(const APN& ipcAddress) {
+bool Address::isUnspecified() const
+{
+    return ipcAddress.getName().empty() && difName.getName().empty();
+}
+
+const APN& Address::getApname() const
+{
+    return apname;
+}
+
+void Address::setIpcAddress(const APN& ipcAddress)
+{
     this->ipcAddress = ipcAddress;
 }
 
-std::ostream& operator <<(std::ostream& os, const Address& addr) {
+std::ostream& operator <<(std::ostream& os, const Address& addr)
+{
     return os << addr.info();
 }
 
-std::ostream& operator <<(std::ostream& os, const Addresses& dims) {
+std::ostream& operator <<(std::ostream& os, const Addresses& dims)
+{
     for (AddrCItem it = dims.begin(); it != dims.end(); ++it)
         os << it->info() << endl;
     return os;