usb: getting string descriptors, minor improvements
[quarnos.git] / manes / cds / type.cpp
blobb0e1b16eb215ce8ede91f9975bc5af049d83ca57
1 /* Quarn OS / Manes
3 * Type class
5 * Copyright (C) 2008-2009 Pawel Dziepak
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License along
18 * with this program; if not, write to the Free Software Foundation, Inc.,
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
23 #include "component.h"
24 #include "type.h"
25 #include "manes/error.h"
26 #include "factory.h"
27 #include "abstract.h"
29 #include "libs/string.h"
31 #include "manes/manec.h"
33 using namespace manes;
34 using namespace manes::cds;
36 type::type(const component_name &_name, const component_name &_base, const delegate<p<component> > creat) :
37 base(_base),
38 create_impl(creat) {
39 this->name = _name;
42 component_name type::get_base() const {
43 return base;
46 bool type::is(const component_name &x) const {
47 if (x == name)
48 return true;
50 p<type> tpe = manec::get()->get_factory()->get_component(component_name::from_path((string)"/type," + base.get_name())).cast<type>();
51 if (!tpe.cast<abstract>().valid())
52 return false;
54 if (!tpe.valid())
55 return false;
57 return tpe->is(x);
60 p<component> type::create_component() {
61 assert((string)"type: attempt to create implementation of abstract type: " + name.get_name(), create_impl.null());
63 p<component> comp = create_impl();
64 comp->set(this);
66 return comp;
69 bool type::operator==(const type &x) const {
70 return x.name == name;
73 bool type::operator!=(const type &x) const {
74 return !operator==(x);