11#pragma once
2- #include " document_node_interface_access.h"
32#include < sfun/interface.h>
43#include < sfun/optional_ref.h>
5- #include < gsl/assert>
6- #include < string>
7- #include < typeinfo>
8- #include < memory>
9- #include < vector>
104
115namespace htcpp {
126class INodeCollection ;
@@ -22,39 +16,24 @@ class IDocumentNode : private sfun::interface<IDocumentNode>
2216{
2317public:
2418 template <typename TInterface>
25- auto getInterface () const
19+ sfun::optional_ref< const TInterface> as () const
2620 {
27- return (this ->*InterfaceGetterMapping<TInterface>::getterPtr ())();
21+ auto obj = dynamic_cast <const TInterface*>(this );
22+ return obj ? sfun::optional_ref<const TInterface>{*obj} : sfun::optional_ref<const TInterface>{};
2823 }
2924
3025 template <typename TInterface>
31- auto getInterface ()
26+ sfun::optional_ref<TInterface> as ()
3227 {
33- return (this ->*InterfaceGetterMapping<TInterface>::getterPtr ())();
28+ auto obj = dynamic_cast <TInterface*>(this );
29+ return obj ? sfun::optional_ref<TInterface>{*obj} : sfun::optional_ref<TInterface>{};
3430 }
3531
3632 template <typename T>
37- bool is ()
33+ bool is () const
3834 {
39- return typeid (* this ) == typeid (T );
35+ return as<T>(). has_value ( );
4036 }
41-
42- private:
43- DOCUMENT_NODE_ADD_INTERFACE_GETTER (INodeCollection);
44- DOCUMENT_NODE_ADD_INTERFACE_GETTER (IDocumentNodeRenderer);
45- DOCUMENT_NODE_ADD_INTERFACE_GETTER (IRenderedAsStringPart);
46- DOCUMENT_NODE_ADD_INTERFACE_GETTER (IConvertibleToProcedure);
47- DOCUMENT_NODE_ADD_INTERFACE_GETTER (IAttribute);
48-
49- template <typename TInterface>
50- friend struct InterfaceGetterMapping ;
5137};
5238
53- DOCUMENT_NODE_REGISTER_INTERFACE (INodeCollection);
54- DOCUMENT_NODE_REGISTER_INTERFACE (IDocumentNodeRenderer);
55- DOCUMENT_NODE_REGISTER_INTERFACE (IRenderedAsStringPart);
56- DOCUMENT_NODE_REGISTER_INTERFACE (IConvertibleToProcedure);
57- DOCUMENT_NODE_REGISTER_INTERFACE (IAttribute);
58-
59-
6039} // namespace htcpp
0 commit comments