1eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh/* Copyright (c) 2015, 2017 The Linux Foundation. All rights reserved. 2eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * 3eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * Redistribution and use in source and binary forms, with or without 4eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * modification, are permitted provided that the following conditions are 5eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * met: 6eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * * Redistributions of source code must retain the above copyright 7eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * notice, this list of conditions and the following disclaimer. 8eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * * Redistributions in binary form must reproduce the above 9eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * copyright notice, this list of conditions and the following 10eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * disclaimer in the documentation and/or other materials provided 11eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * with the distribution. 12eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * * Neither the name of The Linux Foundation, nor the names of its 13eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * contributors may be used to endorse or promote products derived 14eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * from this software without specific prior written permission. 15eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * 16eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 17eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 19eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 20eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 23eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 25eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 26eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * 28eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh */ 29eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 30eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include <string> 31eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include <algorithm> 32eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include <iterator> 33eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include <DataItemIndex.h> 34eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include <platform_lib_log_util.h> 35eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include <IDataItemObserver.h> 36eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include <DataItemId.h> 37eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 38eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhusing namespace std; 39eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhusing namespace loc_core; 40eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 41eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhtemplate <typename CT, typename DIT> 42eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhinline DataItemIndex <CT,DIT> :: DataItemIndex () {} 43eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 44eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhtemplate <typename CT, typename DIT> 45eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhinline DataItemIndex <CT,DIT> :: ~DataItemIndex () {} 46eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 47eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhtemplate <typename CT, typename DIT> 48eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid DataItemIndex <CT,DIT> :: getListOfSubscribedClients 49eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ( 50eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh DIT id, 51eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh list <CT> & out 52eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh) 53eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 54eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh typename map < DIT, list <CT> > :: iterator cdiIter = 55eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mClientsPerDataItemMap.find (id); 56eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (cdiIter != mClientsPerDataItemMap.end ()) { 57eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out = cdiIter->second; 58eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 59eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 60eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 61eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 62eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhtemplate <typename CT, typename DIT> 63eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhint DataItemIndex <CT,DIT> :: remove (DIT id) { 64eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh int result = 0; 65eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ENTRY_LOG (); 66eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mClientsPerDataItemMap.erase (id); 67eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh EXIT_LOG_WITH_ERROR ("%d",result); 68eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return result; 69eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 70eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 71eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhtemplate <typename CT, typename DIT> 72eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid DataItemIndex <CT,DIT> :: remove (const list <CT> & r, list <DIT> & out) { 73eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ENTRY_LOG (); 74eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh typename map < DIT, list <CT> > :: iterator cdiIter = 75eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mClientsPerDataItemMap.begin (); 76eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh while (cdiIter != mClientsPerDataItemMap.end()) { 77eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh typename list <CT> :: const_iterator it = r.begin (); 78eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh for (; it != r.end (); ++it) { 79eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh typename list <CT> :: iterator iter = 80eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh find 81eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ( 82eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh cdiIter->second.begin (), 83eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh cdiIter->second.end (), 84eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh *it 85eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ); 86eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (iter != cdiIter->second.end ()) { 87eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh cdiIter->second.erase (iter); 88eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 89eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 90eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 91eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (cdiIter->second.empty ()) { 92eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.push_back (cdiIter->first); 93eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // Post-increment operator increases the iterator but returns the 94eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // prevous one that will be invalidated by erase() 95eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mClientsPerDataItemMap.erase (cdiIter++); 96eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } else { 97eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ++cdiIter; 98eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 99eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 100eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh EXIT_LOG_WITH_ERROR ("%d",0); 101eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 102eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 103eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhtemplate <typename CT, typename DIT> 104eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid DataItemIndex <CT,DIT> :: remove 105eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh( 106eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh DIT id, 107eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh const list <CT> & r, 108eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh list <CT> & out 109eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh) 110eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 111eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ENTRY_LOG (); 112eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 113eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh typename map < DIT, list <CT> > :: iterator cdiIter = 114eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mClientsPerDataItemMap.find (id); 115eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (cdiIter != mClientsPerDataItemMap.end ()) { 116eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh set_intersection (cdiIter->second.begin (), cdiIter->second.end (), 117eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh r.begin (), r.end (), 118eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inserter (out, out.begin ())); 119eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (!out.empty ()) { 120eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh typename list <CT> :: iterator it = out.begin (); 121eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh for (; it != out.end (); ++it) { 122eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh cdiIter->second.erase (find (cdiIter->second.begin (), 123eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh cdiIter->second.end (), 124eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh *it)); 125eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 126eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 127eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (cdiIter->second.empty ()) { 128eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mClientsPerDataItemMap.erase (cdiIter); 129eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh EXIT_LOG_WITH_ERROR ("%d",0); 130eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 131eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 132eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh EXIT_LOG_WITH_ERROR ("%d",0); 133eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 134eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 135eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhtemplate <typename CT, typename DIT> 136eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid DataItemIndex <CT,DIT> :: add 137eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh( 138eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh DIT id, 139eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh const list <CT> & l, 140eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh list <CT> & out 141eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh) 142eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 143eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ENTRY_LOG (); 144eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh list <CT> difference; 145eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh typename map < DIT, list <CT> > :: iterator cdiIter = 146eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mClientsPerDataItemMap.find (id); 147eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (cdiIter != mClientsPerDataItemMap.end ()) { 148eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh set_difference (l.begin (), l.end (), 149eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh cdiIter->second.begin (), cdiIter->second.end (), 150eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inserter (difference, difference.begin ())); 151eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (!difference.empty ()) { 152eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh difference.sort (); 153eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out = difference; 154eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh cdiIter->second.merge (difference); 155eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 156eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } else { 157eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out = l; 158eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh pair < DIT, list <CT> > cndipair (id, out); 159eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mClientsPerDataItemMap.insert (cndipair); 160eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 161eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh EXIT_LOG_WITH_ERROR ("%d",0); 162eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 163eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 164eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhtemplate <typename CT, typename DIT> 165eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid DataItemIndex <CT,DIT> :: add 166eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh( 167eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh CT client, 168eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh const list <DIT> & l, 169eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh list <DIT> & out 170eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh) 171eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 172eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ENTRY_LOG (); 173eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh typename map < DIT, list <CT> > :: iterator cdiIter; 174eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh typename list <DIT> :: const_iterator it = l.begin (); 175eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh for (; it != l.end (); ++it) { 176eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh cdiIter = mClientsPerDataItemMap.find (*it); 177eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (cdiIter == mClientsPerDataItemMap.end ()) { 178eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.push_back (*it); 179eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh pair < DIT, list <CT> > cndiPair (*it, list <CT> (1, client)); 180eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mClientsPerDataItemMap.insert (cndiPair); 181eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } else { 182eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh typename list<CT> :: iterator clientIter = 183eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh find 184eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ( 185eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh cdiIter->second.begin (), 186eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh cdiIter->second.end (), 187eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh client 188eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ); 189eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (clientIter == cdiIter->second.end()) { 190eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh cdiIter->second.push_back (client); 191eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 192eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 193eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 194eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh EXIT_LOG_WITH_ERROR ("%d",0); 195eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 196eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 197eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh// Explicit instantiation must occur in same namespace where class is defined 198eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhnamespace loc_core 199eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 200eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh template class DataItemIndex <IDataItemObserver *, DataItemId>; 201eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh template class DataItemIndex <string, DataItemId>; 202eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 203