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