Branch data Line data Source code
1 : : /**
2 : : * \file
3 : : *
4 : : * \author Georg Hopp
5 : : *
6 : : * \copyright
7 : : * Copyright © 2012 Georg Hopp
8 : : *
9 : : * This program is free software: you can redistribute it and/or modify
10 : : * it under the terms of the GNU General Public License as published by
11 : : * the Free Software Foundation, either version 3 of the License, or
12 : : * (at your option) any later version.
13 : : *
14 : : * This program is distributed in the hope that it will be useful,
15 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 : : * GNU General Public License for more details.
18 : : *
19 : : * You should have received a copy of the GNU General Public License
20 : : * along with this program. If not, see <http://www.gnu.org/licenses/>.
21 : : */
22 : :
23 : : #include <sys/types.h>
24 : : #include <stdlib.h>
25 : :
26 : : #include "class/interface.h"
27 : : #include "commons.h"
28 : :
29 : : static
30 : : inline
31 : : int
32 : 275 : comp(const void * _a, const void * _b)
33 : : {
34 : 275 : const struct interface * a = **(const struct interface ***)_a;
35 : 275 : const struct interface * b = **(const struct interface ***)_b;
36 : 275 : return ((a)<(b))? -1 : ((a)>(b))? 1 : 0;
37 : : }
38 : :
39 : : /**
40 : : * this one is important in selector functions to get the correct interface
41 : : * implementation of a class.
42 : : */
43 : : iface_ptr
44 : 267 : interfaceGet(iface_impl_ptr iface_impl, const iface_ptr _iface)
45 : : {
46 : 267 : const iface_ptr * iface = &_iface;
47 : : iface_ptr * found;
48 : :
49 : 267 : if (! iface_impl->simpl) {
50 : 14 : qsort((void**)(iface_impl->impl), iface_impl->nimpl, sizeof(iface_ptr), comp);
51 : 14 : iface_impl->simpl=TRUE;
52 : : }
53 : :
54 : 534 : found = bsearch(
55 : : &iface,
56 : 267 : iface_impl->impl,
57 : : iface_impl->nimpl,
58 : : sizeof(iface_ptr),
59 : : comp);
60 : :
61 : 267 : return found? *found : (iface_ptr)NULL;
62 : : }
63 : :
64 : : // vim: set ts=4 sw=4:
|