owlcpp  v0.3.3~
C++ library for working with OWL ontologies
 All Classes Namespaces Files Functions Macros Pages
map_std_ns_crtpb.hpp
Go to the documentation of this file.
1 
6 #ifndef MAP_STD_NS_CRTPB_HPP_
7 #define MAP_STD_NS_CRTPB_HPP_
8 #include "boost/assert.hpp"
9 
10 #include "owlcpp/detail/map_traits.hpp"
12 #include "owlcpp/terms/detail/max_standard_id.hpp"
13 
14 namespace owlcpp{
15 
20 template<class Super> class Map_std_ns_crtpb {
21  typedef detail::Map_traits<Super> traits;
22  typedef typename traits::map_std_type map_std_type;
23  typedef typename traits::map_ns_type map_ns_type;
24 
25  map_std_type const& _map_std() const {
26  return static_cast<Super const&>(*this).map_std_;
27  }
28 
29  map_ns_type const& _map_ns() const {
30  return static_cast<Super const&>(*this).map_ns_;
31  }
32 
33  map_ns_type& _map_ns() {
34  return static_cast<Super&>(*this).map_ns_;
35  }
36 
37 public:
38 
39  Ns_iri const& operator[](const Ns_id nsid) const {
40  return _map_std().is_standard(nsid) ?
41  _map_std()[nsid] : _map_ns()[nsid];
42  }
43 
44  Ns_iri const& at(const Ns_id nsid) const {
45  return _map_std().is_standard(nsid) ?
46  _map_std().at(nsid) : _map_ns().at(nsid);
47  }
48 
49  Ns_iri const* find(const Ns_id nsid) const {
50  return _map_std().is_standard(nsid) ?
51  _map_std().find(nsid) : _map_ns().find(nsid);
52  }
53 
58  std::string prefix(const Ns_id nsid) const {
59  return _map_std().is_standard(nsid) ?
60  _map_std().prefix(nsid) : _map_ns().prefix(nsid);
61  }
62 
67  Ns_id const* find(Ns_iri const& iri) const {
68  if( Ns_id const*const id = _map_std().find(iri) ) return id;
69  return _map_ns().find(iri);
70  }
71 
76  Ns_id const* find_prefix(std::string const& pref) const {
77  if( Ns_id const*const id = _map_std().find_prefix(pref) ) return id;
78  return _map_ns().find_prefix(pref);
79  }
80 
81  Ns_id insert(Ns_iri const& iri) {
82  if( Ns_id const*const iid = find(iri) ) return *iid;
83  return _map_ns().insert(iri);
84  }
85 
91  void insert_prefix(const Ns_id nsid, std::string const& pref) {
92  typedef typename Super::Err Err;
93  if( nsid < detail::min_ns_id() ) {
94  if( pref.empty() || pref == _map_std().prefix(nsid) ) return;
95  BOOST_THROW_EXCEPTION(
96  Err()
97  << typename Err::msg_t("cannot re-define standard prefix")
98  << typename Err::str1_t(pref)
99  << typename Err::str2_t(_map_std().prefix(nsid))
100  );
101  }
102  BOOST_ASSERT( _map_ns().find(nsid) );
103  if( pref.empty() ) {
104  _map_ns().set_prefix(nsid);
105  return;
106  }
107  Ns_id const*const iid0 = _map_ns().find_prefix(pref);
108  if( iid0 ) {
109  if( *iid0 == nsid ) return; //prefix already defined for same IRI
110  BOOST_THROW_EXCEPTION(
111  Err()
112  << typename Err::msg_t("prefix reserved for different IRI")
113  << typename Err::str1_t(pref)
114  << typename Err::str2_t(at(nsid).str())
115  << typename Err::str3_t(at(*iid0).str())
116  );
117  }
118  _map_ns().set_prefix(nsid, pref);
119  }
120 };
121 
122 }//namespace owlcpp
123 #endif /* MAP_STD_NS_CRTPB_HPP_ */