31
class Soprano::Node::Private : public QSharedData
31
class Soprano::Node::NodeData : public QSharedData
34
NodeData( Type type_ = EmptyNode )
37
virtual ~NodeData() {}
41
virtual QString toString() const {
46
class Soprano::Node::ResourceNodeData : public NodeData
49
ResourceNodeData( const QUrl& uri_ = QUrl() )
50
: NodeData( ResourceNode ),
56
QString toString() const {
57
return uri.toString();
61
class Soprano::Node::BNodeData : public NodeData
64
BNodeData( const QString& id = QString() )
65
: NodeData( BlankNode ),
71
QString toString() const {
76
class Soprano::Node::LiteralNodeData : public NodeData
79
LiteralNodeData( const LiteralValue& val = LiteralValue(), const QString& lang = QString() )
80
: NodeData( LiteralNode ),
39
85
LiteralValue value;
88
QString toString() const {
89
return value.toString();
44
94
Soprano::Node::Node()
49
99
Soprano::Node::Node( const Node &other )
54
Soprano::Node::Node( const QUrl &uri, Type type )
58
type != LiteralNode &&
104
Soprano::Node::Node( const QUrl &uri )
106
if( !uri.isEmpty() ) {
107
d = new ResourceNodeData( uri );
114
Soprano::Node::Node( const QString &id )
116
if( !id.isEmpty() ) {
117
d = new BNodeData( id );
65
124
Soprano::Node::Node( const LiteralValue& value, const QString& lang )
68
126
if ( value.isValid() ) {
69
d->type = LiteralNode;
127
d = new LiteralNodeData( value, lang );
109
168
QUrl Soprano::Node::uri() const
111
// d->uri is only defined for Resource and blank Nodes
170
if ( const ResourceNodeData* rnd = dynamic_cast<const ResourceNodeData*>( d.constData() ) ) {
179
QString Soprano::Node::identifier() const
181
if ( const BNodeData* bnd = dynamic_cast<const BNodeData*>( d.constData() ) ) {
182
return bnd->identifier;
116
190
Soprano::LiteralValue Soprano::Node::literal() const
192
if ( const LiteralNodeData* lnd = dynamic_cast<const LiteralNodeData*>( d.constData() ) ) {
122
196
return LiteralValue();
136
210
QString Soprano::Node::language() const
212
if ( const LiteralNodeData* lnd = dynamic_cast<const LiteralNodeData*>( d.constData() ) ) {
213
return lnd->language;
141
220
QString Soprano::Node::toString() const
144
return d->value.toString();
146
else if ( isResource() || isBlank() ) {
147
return d->uri.toString();
222
return d->toString();
154
225
Soprano::Node& Soprano::Node::operator=( const Node& other )
160
231
Soprano::Node& Soprano::Node::operator=( const QUrl& resource )
163
d->type = resource.isEmpty() ? EmptyNode : ResourceNode;
164
d->value = LiteralValue();
165
d->language.truncate( 0 );
233
if ( !resource.isEmpty() ) {
234
d = new ResourceNodeData( resource );
169
242
Soprano::Node& Soprano::Node::operator=( const LiteralValue& literal )
173
d->type = literal.isValid() ? LiteralNode : EmptyNode;
244
if ( literal.isValid() ) {
245
d = new LiteralNodeData( literal );
177
253
bool Soprano::Node::operator==( const Node& other ) const
179
if (d->type != other.d->type) {
255
if ( d->type != other.d->type ) {
182
else if (d->type == ResourceNode) {
183
return d->uri == other.d->uri;
258
else if ( d->type == ResourceNode ) {
259
return( dynamic_cast<const ResourceNodeData*>( d.constData() )->uri ==
260
dynamic_cast<const ResourceNodeData*>( other.d.constData() )->uri );
262
else if ( d->type == BlankNode ) {
263
return( dynamic_cast<const BNodeData*>( d.constData() )->identifier ==
264
dynamic_cast<const BNodeData*>( other.d.constData() )->identifier );
266
else if ( d->type == LiteralNode ) {
267
return ( dynamic_cast<const LiteralNodeData*>( d.constData() )->value ==
268
dynamic_cast<const LiteralNodeData*>( other.d.constData() )->value &&
269
dynamic_cast<const LiteralNodeData*>( d.constData() )->language ==
270
dynamic_cast<const LiteralNodeData*>( other.d.constData() )->language );
186
return ( d->value == other.d->value &&
187
d->language == other.d->language );
273
// emppty nodes are always equal
191
278
bool Soprano::Node::operator!=( const Node& other ) const
193
if (d->type != other.d->type) {
280
if ( d->type != other.d->type ) {
197
else if (d->type == ResourceNode) {
198
return d->uri != other.d->uri;
284
else if ( d->type == ResourceNode ) {
285
return( dynamic_cast<const ResourceNodeData*>( d.constData() )->uri
286
!= dynamic_cast<const ResourceNodeData*>( other.d.constData() )->uri );
288
else if ( d->type == BlankNode ) {
289
return( dynamic_cast<const BNodeData*>( d.constData() )->identifier !=
290
dynamic_cast<const BNodeData*>( other.d.constData() )->identifier );
292
else if ( d->type == LiteralNode ) {
293
return ( dynamic_cast<const LiteralNodeData*>( d.constData() )->value !=
294
dynamic_cast<const LiteralNodeData*>( other.d.constData() )->value ||
295
dynamic_cast<const LiteralNodeData*>( d.constData() )->language !=
296
dynamic_cast<const LiteralNodeData*>( other.d.constData() )->language );
201
return ( d->value != other.d->value ||
202
d->language != other.d->language );
299
// emppty nodes are always equal
315
Soprano::Node Soprano::Node::createEmptyNode()
321
Soprano::Node Soprano::Node::createResourceNode( const QUrl& uri )
327
Soprano::Node Soprano::Node::createBlankNode( const QString& id )
333
Soprano::Node Soprano::Node::createLiteralNode( const LiteralValue& val, const QString& language )
335
return Node( val, language );
217
339
QDebug operator<<( QDebug s, const Soprano::Node& n )
220
342
case Soprano::Node::EmptyNode:
221
343
s.nospace() << "(empty)";
224
346
// s.nospace() << "(blank)";
226
348
case Soprano::Node::LiteralNode:
227
s.nospace() << n.literal().toString();
228
if( !n.language().isEmpty() )
229
s.nospace() << " (" << n.language() << ")";
349
s.nospace() << '\"' << n.literal().toString() << "\"";
350
if ( n.literal().isString() && !n.language().isEmpty() ) {
351
s.nospace() << "@" << n.language();
354
s.nospace() << "^^<" << n.literal().dataTypeUri().toString() << '>';
357
case Soprano::Node::BlankNode:
358
s.nospace() << "_:" << n.identifier();
232
s.nospace() << n.uri();
361
s.nospace() << n.uri().toString();
246
375
// s.nospace() << "(blank)";
248
377
case Soprano::Node::LiteralNode:
249
s << '\"' << n.literal().toString() << "\"^^<" << n.literal().dataTypeUri().toString() << '>';
250
if( !n.language().isEmpty() )
251
s << " (" << n.language() << ")";
378
s << '\"' << n.literal().toString() << "\"";
379
if ( n.literal().isString() && !n.language().isEmpty() ) {
380
s << "@" << n.language();
383
s << "^^<" << n.literal().dataTypeUri().toString() << '>';
386
case Soprano::Node::BlankNode:
387
s << "_:" << n.identifier();
254
390
s << '<' << n.uri().toString() << '>';