Skip to content
Snippets Groups Projects
ipaaca-links.cc 3.2 KiB
Newer Older
  • Learn to ignore specific revisions
  • /*
     * This file is part of IPAACA, the
     *  "Incremental Processing Architecture
     *   for Artificial Conversational Agents".
     *
     * Copyright (c) 2009-2015 Social Cognitive Systems Group
     *                         (formerly the Sociable Agents Group)
     *                         CITEC, Bielefeld University
     *
     * http://opensource.cit-ec.de/projects/ipaaca/
     * http://purl.org/net/ipaaca
     *
     * This file may be licensed under the terms of of the
     * GNU Lesser General Public License Version 3 (the ``LGPL''),
     * or (at your option) any later version.
     *
     * Software distributed under the License is distributed
     * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
     * express or implied. See the LGPL for the specific language
     * governing rights and limitations.
     *
     * You should have received a copy of the LGPL along with this
     * program. If not, go to http://www.gnu.org/licenses/lgpl.html
     * or write to the Free Software Foundation, Inc.,
     * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
     *
     * The development of this software was supported by the
     * Excellence Cluster EXC 277 Cognitive Interaction Technology.
     * The Excellence Cluster EXC 277 is a grant of the Deutsche
     * Forschungsgemeinschaft (DFG) in the context of the German
     * Excellence Initiative.
     */
    
    #include <ipaaca/ipaaca.h>
    
    namespace ipaaca {
    
    using namespace rsb;
    using namespace rsb::filter;
    using namespace rsb::converter;
    using namespace rsb::patterns;
    
    IPAACA_EXPORT std::ostream& operator<<(std::ostream& os, const SmartLinkMap& obj)//{{{
    {
    	os << "{";
    	bool first = true;
    	for (LinkMap::const_iterator it=obj._links.begin(); it!=obj._links.end(); ++it) {
    		if (first) { first=false; } else { os << ", "; }
    		os << "'" << it->first << "': [";
    		bool firstinner = true;
    		for (LinkSet::const_iterator it2=it->second.begin(); it2!=it->second.end(); ++it2) {
    			if (firstinner) { firstinner=false; } else { os << ", "; }
    			os << "'" << *it2 << "'";
    		}
    		os << "]";
    	}
    	os << "}";
    	return os;
    }
    //}}}
    
    // SmartLinkMap//{{{
    
    IPAACA_EXPORT LinkSet SmartLinkMap::empty_link_set;
    IPAACA_EXPORT void SmartLinkMap::_add_and_remove_links(const LinkMap& add, const LinkMap& remove)
    {
    	// remove specified links
    	for (LinkMap::const_iterator it = remove.begin(); it != remove.end(); ++it ) {
    		// if link type exists
    		if (_links.count(it->first) > 0) {
    			// remove one by one
    			for (LinkSet::const_iterator it2=it->second.begin(); it2!=it->second.end(); ++it2) {
    				_links[it->first].erase(*it2);
    			}
    			// wipe the type key if no more links are left
    			if (_links[it->first].size() == 0) {
    				_links.erase(it->first);
    			}
    		}
    	}
    	// add specified links
    	for (LinkMap::const_iterator it = add.begin(); it != add.end(); ++it ) {
    		for (LinkSet::const_iterator it2=it->second.begin(); it2!=it->second.end(); ++it2) {
    			_links[it->first].insert(*it2);
    		}
    	}
    }
    IPAACA_EXPORT void SmartLinkMap::_replace_links(const LinkMap& links)
    {
    	//_links.clear();
    	_links=links;
    }
    IPAACA_EXPORT const LinkSet& SmartLinkMap::get_links(const std::string& key)
    {
    	LinkMap::const_iterator it = _links.find(key);
    	if (it==_links.end()) return empty_link_set;
    	return it->second;
    }
    IPAACA_EXPORT const LinkMap& SmartLinkMap::get_all_links()
    {
    	return _links;
    }
    //}}}
    
    } // of namespace ipaaca