Warning, /pim/akregator/src/storage/metakit/include/mk4.inl is written in an unsupported language. File is not indexed.

0001 // mk4.inl --
0002 // This is part of Metakit, the homepage is http://www.equi4.com/metakit/
0003 
0004 /** @file
0005  * Public definitions which are usually inlined
0006  */
0007 
0008 /////////////////////////////////////////////////////////////////////////////
0009 // Reordered inlines so they are always defined before their first use
0010  
0011 d4_inline c4_Cursor c4_RowRef::operator& () const
0012 {
0013   return _cursor;
0014 }
0015 
0016 /** Return a unique id for this property
0017  *
0018  *  A property object in fact merely represents an entry in a globally
0019  *  maintained symbol table.  Each property is assigned a unique id,
0020  *  which remains valid as long as some reference to that property
0021  *  exists.  In general, property id's remain unique as long as the
0022  *  application runs.  Do not store id's on file, since they are
0023  *  not guaranteed to remain the same across program invocations.
0024  *  All properties with the same name are given the same id.
0025  */
0026 d4_inline int c4_Property::GetId() const
0027 {
0028   return _id;
0029 }
0030 
0031 //////////////////////////////////////////////////////////////////////////////////
0032 
0033 #if !defined(q4_LONG64) && !defined (LONG_LONG) && !defined(HAVE_LONG_LONG)
0034 
0035 d4_inline bool operator== (const t4_i64 a_, const t4_i64 b_)
0036 {
0037   return a_.l1 == b_.l1 && a_.l2 == b_.l2;
0038 }
0039 
0040 d4_inline bool operator< (const t4_i64 a_, const t4_i64 b_)
0041 {
0042   return a_.l2 < b_.l2 || a_.l2 == b_.l2 && a_.l2 < b_.l2;
0043 }
0044 
0045 #endif
0046 
0047 //////////////////////////////////////////////////////////////////////////////////
0048 // c4_View
0049 
0050 /// Returns the number of entries in this view.
0051 d4_inline int c4_View::GetSize() const
0052 {
0053   return _seq->NumRows();
0054 }
0055 
0056 /** Change the size of this view
0057  * Since views act like dynamic arrays, you can quickly
0058  * change their size.  Increasing the size will append rows
0059  * with zero/empty values, while decreasing it will delete
0060  * the last rows.  The growBy_ parameter is currently unused.
0061  */
0062 d4_inline void c4_View::SetSize(int newSize_, int growBy_)
0063 {
0064   _seq->Resize(newSize_, growBy_);
0065 }
0066 
0067 /// Removes all entries (sets size to zero).
0068 d4_inline void c4_View::RemoveAll()
0069 {
0070   SetSize(0);
0071 }
0072 
0073 /// Return a pointer to the persistence handler, or zero
0074 d4_inline c4_Persist* c4_View::Persist() const
0075 {
0076   return _seq->Persist();
0077 }
0078 
0079 /**
0080  * Change the value of the specified entry.  If the new value has
0081  * other properties, these will be added to the underlying view.
0082  *
0083  * @param index_ the zero-based row index
0084  * @param newElem_ the row to copy to this view
0085  */
0086 d4_inline void c4_View::SetAt(int index_, const c4_RowRef& newElem_)
0087 {
0088   _seq->SetAt(index_, &newElem_);
0089 }
0090 
0091 /**
0092  * Insert a copy of the contents of another view.  This is identical to
0093  * inserting the specified number of default entries and then setting
0094  * each of them to the new element value passed as argument.
0095  */
0096 d4_inline void c4_View::InsertAt(
0097         int index_, ///< zero-based row index
0098         const c4_RowRef& newElem_, ///< the value to insert
0099         int count_ ///< number of copies to insert, must be > 0
0100     )
0101 {
0102   _seq->InsertAt(index_, &newElem_, count_);
0103 }
0104 
0105 /**
0106  * Remove entries starting at the given index.  Entries which have
0107  * other view references may cause these views to be deleted if their
0108  * reference counts drop to zero because of this removal.
0109  *
0110  * @param index_ the zero-based row index
0111  * @param count_ the number of entries to remove
0112  */
0113 d4_inline void c4_View::RemoveAt(int index_, int count_)
0114 {
0115   _seq->RemoveAt(index_, count_);
0116 }
0117 
0118 /** Return the number of properties present in this view.
0119  * @return A non-negative integer
0120  */
0121 d4_inline int c4_View::NumProperties() const
0122 {
0123   return _seq->NumHandlers();
0124 }
0125 
0126 /** Find the index of a property, given its id
0127  * @param propId_ Unique id associated to a specific propoerty
0128  * @return The index of the property, or -1 of it was not found
0129  */
0130 d4_inline int c4_View::FindProperty(int propId_)
0131 {
0132   return _seq->PropIndex(propId_);
0133 }
0134 
0135     /// Return a decription if there is a fixed structure, else zero
0136 d4_inline const char* c4_View::Description() const
0137 {
0138   return _seq->Description();
0139 }
0140 
0141     /// Increase the reference count of the associated sequence
0142 d4_inline void c4_View::_IncSeqRef()
0143 {
0144   _seq->IncRef();
0145 }
0146 
0147     /// Decrease the reference count of the associated sequence
0148 d4_inline void c4_View::_DecSeqRef()
0149 {
0150   _seq->DecRef();
0151 }
0152 
0153 /// Destructor, decrements reference count
0154 d4_inline c4_View::~c4_View ()
0155 {
0156   _DecSeqRef();
0157 }
0158 
0159     /// Return true if the contents of both views are equal
0160 d4_inline bool operator== (const c4_View& a_, const c4_View& b_)
0161 {
0162   return a_.GetSize() == b_.GetSize() && a_.Compare(b_) == 0;
0163 }
0164 
0165     /// Return true if the contents of both views are not equal
0166 d4_inline bool operator!= (const c4_View& a_, const c4_View& b_)
0167 {
0168   return !(a_ == b_);
0169 }
0170 
0171     /// True if first view is less than second view
0172 d4_inline bool operator< (const c4_View& a_, const c4_View& b_)
0173 {
0174   return a_.Compare(b_) < 0;
0175 }
0176 
0177     /// True if first view is greater than second view
0178 d4_inline bool operator> (const c4_View& a_, const c4_View& b_)
0179 {
0180   return b_ < a_;
0181 }
0182 
0183     /// True if first view is less or equal to second view
0184 d4_inline bool operator<= (const c4_View& a_, const c4_View& b_)
0185 {
0186   return !(b_ < a_);
0187 }
0188 
0189     /// True if first view is greater or equal to second view
0190 d4_inline bool operator>= (const c4_View& a_, const c4_View& b_)
0191 {                     
0192   return !(a_ < b_);
0193 }
0194 
0195 /////////////////////////////////////////////////////////////////////////////
0196 // c4_Cursor
0197 
0198 /** Constructs a new cursor.
0199  *
0200  * Cursor cannot be created without an underlying view, but you could
0201  * define a global "nullView" object and then initialize the cursor with
0202  * "&nullView[0]". This works because cursors need not point to a valid row.
0203  */
0204 d4_inline c4_Cursor::c4_Cursor (c4_Sequence& seq_, int index_)
0205     : _seq (&seq_), _index (index_)
0206 {
0207 }
0208 
0209 /// Pre-increments the cursor.
0210 d4_inline c4_Cursor& c4_Cursor::operator++ ()
0211 {
0212   ++_index;
0213   return *this;
0214 }
0215 
0216 /// Post-increments the cursor.
0217 d4_inline c4_Cursor c4_Cursor::operator++ (int)
0218 {
0219   return c4_Cursor (*_seq, _index++);
0220 }
0221 
0222 /// Pre-decrements the cursor.
0223 d4_inline c4_Cursor& c4_Cursor::operator-- ()
0224 {
0225   --_index;
0226   return *this;
0227 }
0228 
0229 /// Post-decrements the cursor.
0230 d4_inline c4_Cursor c4_Cursor::operator-- (int)
0231 {
0232   return c4_Cursor (*_seq, _index--);
0233 }
0234 
0235 /// Advances by a given offset.
0236 d4_inline c4_Cursor& c4_Cursor::operator+= (int offset_)
0237 {
0238   _index += offset_;
0239   return *this;
0240 }
0241 
0242 /// Backs up by a given offset.
0243 d4_inline c4_Cursor& c4_Cursor::operator-= (int offset_)
0244 {
0245   _index -= offset_;
0246   return *this;
0247 }
0248 
0249 /// Subtracts a specified offset.
0250 d4_inline c4_Cursor c4_Cursor::operator- (int offset_) const
0251 {
0252   return c4_Cursor (*_seq, _index - offset_);
0253 }
0254 
0255 /// Returns the distance between two cursors.
0256 d4_inline int c4_Cursor::operator- (c4_Cursor cursor_) const
0257 {
0258   return _index - cursor_._index;
0259 }
0260 
0261 /// Add a specified offset.
0262 d4_inline c4_Cursor operator+ (c4_Cursor cursor_, int offset_)
0263 {
0264   return c4_Cursor (*cursor_._seq, cursor_._index + offset_);
0265 }
0266 
0267 /// Adds specified offset to cursor.
0268 d4_inline c4_Cursor operator+ (int offset_, c4_Cursor cursor_)
0269 {
0270   return cursor_ + offset_;
0271 }
0272 
0273 d4_inline bool operator== (c4_Cursor a_, c4_Cursor b_)
0274 {
0275   return a_._seq == b_._seq && a_._index == b_._index;
0276 }
0277 
0278 d4_inline bool operator!= (c4_Cursor a_, c4_Cursor b_)
0279 {
0280   return !(a_ == b_);
0281 }
0282 
0283 d4_inline bool operator< (c4_Cursor a_, c4_Cursor b_)
0284 {
0285   return a_._seq < b_._seq ||
0286         ( a_._seq == b_._seq && a_._index < b_._index );
0287 }
0288 
0289 d4_inline bool operator> (c4_Cursor a_, c4_Cursor b_)
0290 {
0291   return b_ < a_;
0292 }
0293 
0294 d4_inline bool operator<= (c4_Cursor a_, c4_Cursor b_)
0295 {
0296   return !(b_ < a_);
0297 }
0298 
0299 d4_inline bool operator>= (c4_Cursor a_, c4_Cursor b_)
0300 {                     
0301   return !(a_ < b_);
0302 }
0303 
0304 /////////////////////////////////////////////////////////////////////////////
0305 // c4_RowRef
0306 
0307 d4_inline c4_RowRef::c4_RowRef (c4_Cursor cursor_)
0308     : _cursor (cursor_)
0309 {
0310 }
0311 
0312 d4_inline c4_RowRef c4_RowRef::operator= (const c4_RowRef& rowRef_)
0313 {
0314   if (_cursor != rowRef_._cursor)
0315     _cursor._seq->SetAt(_cursor._index, &rowRef_);
0316   
0317   return *this;
0318 }
0319 
0320 d4_inline c4_View c4_RowRef::Container() const
0321 {
0322   return _cursor._seq;
0323 }
0324 
0325 d4_inline bool operator== (const c4_RowRef& a_, const c4_RowRef& b_)
0326 {
0327   return (&a_)._seq->Compare((&a_)._index, &b_) == 0;
0328 }               
0329 
0330 d4_inline bool operator!= (const c4_RowRef& a_, const c4_RowRef& b_)
0331 {
0332   return !(a_ == b_);
0333 }
0334 
0335 d4_inline bool operator< (const c4_RowRef& a_, const c4_RowRef& b_)
0336 {
0337       // 25-5-1998: don't exchange a and b, this comparison is -not- symmetric
0338   return (&a_)._seq->Compare((&a_)._index, &b_) < 0;
0339 }               
0340 
0341 d4_inline bool operator> (const c4_RowRef& a_, const c4_RowRef& b_)
0342 {
0343       // 25-5-1998: don't exchange a and b, this comparison is -not- symmetric
0344   return (&a_)._seq->Compare((&a_)._index, &b_) > 0;
0345 }
0346 
0347 d4_inline bool operator<= (const c4_RowRef& a_, const c4_RowRef& b_)
0348 {
0349   return !(a_ > b_);
0350 }
0351 
0352 d4_inline bool operator>= (const c4_RowRef& a_, const c4_RowRef& b_)
0353 {                     
0354   return !(a_ < b_);
0355 }
0356 
0357 /////////////////////////////////////////////////////////////////////////////
0358 // c4_Bytes
0359 
0360     /// Construct an empty binary object
0361 d4_inline c4_Bytes::c4_Bytes ()
0362     : _size (0), _copy (false)
0363 { 
0364   _contents = nullptr; // moved out of intializers for DEC CXX 5.7
0365 }
0366 
0367     /// Construct an object with contents, no copy
0368 d4_inline c4_Bytes::c4_Bytes (const void* buf_, int len_)
0369     : _size (len_), _copy (false)
0370 {
0371   _contents = (t4_byte*) buf_; // moved out of intializers for DEC CXX 5.7
0372 }
0373 
0374 /// Returns a pointer to the contents.
0375 d4_inline const t4_byte* c4_Bytes::Contents() const
0376 {
0377   return _contents;
0378 }
0379 
0380 /// Returns the number of bytes of its contents.
0381 d4_inline int c4_Bytes::Size() const
0382 {
0383   return _size;
0384 }
0385 
0386 d4_inline void c4_Bytes::_LoseCopy()
0387 {
0388   if (_copy)
0389     delete [] (char*) _contents;
0390 }
0391 
0392 /// Returns true if the contents of both objects is not equal.
0393 d4_inline bool operator!= (const c4_Bytes& a_, const c4_Bytes& b_)
0394 {
0395   return !(a_ == b_);
0396 }
0397 
0398 /// Destructor, if a copy was made, it will be released here.
0399 d4_inline c4_Bytes::~c4_Bytes ()
0400 {
0401   _LoseCopy();
0402 }
0403     
0404 /////////////////////////////////////////////////////////////////////////////
0405 // c4_Reference
0406 
0407 d4_inline c4_Reference::c4_Reference (const c4_RowRef& rowRef_,
0408                                         const c4_Property& prop_)
0409     : _cursor (&rowRef_), _property (prop_)
0410 {
0411 }
0412 
0413 d4_inline int c4_Reference::GetSize() const
0414 {
0415   return _cursor._seq->ItemSize(_cursor._index, _property.GetId());
0416 }
0417 
0418 d4_inline bool c4_Reference::GetData(c4_Bytes& buf_) const
0419 {
0420   return _cursor._seq->Get(_cursor._index, _property.GetId(), buf_);
0421 }
0422 
0423 d4_inline void c4_Reference::SetData(const c4_Bytes& buf_) const
0424 {
0425   _cursor._seq->Set(_cursor._index, _property, buf_);
0426 }
0427 
0428 d4_inline bool operator!= (const c4_Reference& a_, const c4_Reference& b_)
0429 {
0430   return !(a_ == b_);
0431 }
0432 
0433 /////////////////////////////////////////////////////////////////////////////
0434 // c4_IntRef
0435 
0436 d4_inline c4_IntRef::c4_IntRef (const c4_Reference& value_)
0437     : c4_Reference (value_)
0438 {
0439 }
0440 
0441 /////////////////////////////////////////////////////////////////////////////
0442 #if !defined(q4_TINY)
0443 /////////////////////////////////////////////////////////////////////////////
0444 // c4_LongRef
0445 
0446 d4_inline c4_LongRef::c4_LongRef (const c4_Reference& value_)
0447     : c4_Reference (value_)
0448 {
0449 }
0450 
0451 /////////////////////////////////////////////////////////////////////////////
0452 // c4_FloatRef
0453 
0454 d4_inline c4_FloatRef::c4_FloatRef (const c4_Reference& value_)
0455     : c4_Reference (value_)
0456 {
0457 }
0458 
0459 /////////////////////////////////////////////////////////////////////////////
0460 // c4_DoubleRef
0461 
0462 d4_inline c4_DoubleRef::c4_DoubleRef (const c4_Reference& value_)
0463     : c4_Reference (value_)
0464 {
0465 }
0466 
0467 /////////////////////////////////////////////////////////////////////////////
0468 #endif // !q4_TINY
0469 /////////////////////////////////////////////////////////////////////////////
0470 // c4_BytesRef
0471 
0472 d4_inline c4_BytesRef::c4_BytesRef (const c4_Reference& value_)
0473     : c4_Reference (value_)
0474 {
0475 }
0476 
0477 /////////////////////////////////////////////////////////////////////////////
0478 // c4_StringRef
0479 
0480 d4_inline c4_StringRef::c4_StringRef (const c4_Reference& value_)
0481     : c4_Reference (value_)
0482 {
0483 }
0484 
0485 /////////////////////////////////////////////////////////////////////////////
0486 // c4_ViewRef
0487 
0488 d4_inline c4_ViewRef::c4_ViewRef (const c4_Reference& value_)
0489     : c4_Reference (value_)
0490 {
0491 }
0492 
0493 /////////////////////////////////////////////////////////////////////////////
0494 // c4_Property
0495 
0496 d4_inline c4_Property::c4_Property (char type_, int id_)
0497     : _id ((short) id_), _type (type_)
0498 {
0499 }
0500 
0501     /// Get or set this untyped property in a row
0502 d4_inline c4_Reference c4_Property::operator() (const c4_RowRef& rowRef_) const
0503 {
0504   return c4_Reference (rowRef_, *this);
0505 }
0506 
0507     /// Return a view like the first, with a property appended to it
0508 d4_inline c4_View c4_Property::operator, (const c4_Property& prop_) const
0509 {
0510   return c4_View (*this), prop_;
0511 }
0512 
0513     /// Return the type of this property
0514 d4_inline char c4_Property::Type() const
0515 {
0516   return _type;
0517 }
0518 
0519 /////////////////////////////////////////////////////////////////////////////
0520 // c4_IntProp
0521 
0522 d4_inline c4_IntProp::c4_IntProp (const char* name_) 
0523     : c4_Property ('I', name_)
0524 {
0525 }
0526 
0527 d4_inline c4_IntProp::~c4_IntProp ()
0528 = default;
0529 
0530 d4_inline c4_IntRef c4_IntProp::operator() (const c4_RowRef& rowRef_) const
0531 {
0532   return c4_Reference (rowRef_, *this);
0533 }
0534 
0535 d4_inline t4_i32 c4_IntProp::Get(const c4_RowRef& rowRef_) const
0536 {
0537   return operator() (rowRef_);
0538 }
0539 
0540 d4_inline void c4_IntProp::Set(const c4_RowRef& rowRef_, t4_i32 value_) const
0541 {
0542   operator() (rowRef_) = value_;
0543 }
0544 
0545 d4_inline c4_Row c4_IntProp::AsRow(t4_i32 value_) const
0546 {
0547   c4_Row row;
0548   operator() (row) = value_;
0549   return row;
0550 }
0551     
0552 d4_inline c4_Row c4_IntProp::operator[] (t4_i32 value_) const
0553 {
0554   return AsRow(value_);
0555 }
0556     
0557 /////////////////////////////////////////////////////////////////////////////
0558 #if !defined(q4_TINY)
0559 /////////////////////////////////////////////////////////////////////////////
0560 // c4_LongProp
0561 
0562 d4_inline c4_LongProp::c4_LongProp (const char* name_) 
0563     : c4_Property ('L', name_)
0564 {
0565 }
0566 
0567 d4_inline c4_LongProp::~c4_LongProp ()
0568 = default;
0569 
0570 d4_inline c4_LongRef c4_LongProp::operator() (const c4_RowRef& rowRef_) const
0571 {
0572   return c4_Reference (rowRef_, *this);
0573 }
0574 
0575 d4_inline t4_i64 c4_LongProp::Get(const c4_RowRef& rowRef_) const
0576 {
0577   return operator() (rowRef_);
0578 }
0579 
0580 d4_inline void c4_LongProp::Set(const c4_RowRef& rowRef_, t4_i64 value_) const
0581 {
0582   operator() (rowRef_) = value_;
0583 }
0584 
0585 d4_inline c4_Row c4_LongProp::AsRow(t4_i64 value_) const
0586 {
0587   c4_Row row;
0588   operator() (row) = value_;
0589   return row;
0590 }
0591     
0592 d4_inline c4_Row c4_LongProp::operator[] (t4_i64 value_) const
0593 {
0594   return AsRow(value_);
0595 }
0596     
0597 /////////////////////////////////////////////////////////////////////////////
0598 // c4_FloatProp
0599 
0600 d4_inline c4_FloatProp::c4_FloatProp (const char* name_) 
0601     : c4_Property ('F', name_)
0602 {
0603 }
0604 
0605 d4_inline c4_FloatProp::~c4_FloatProp ()
0606 = default;
0607 
0608 d4_inline c4_FloatRef c4_FloatProp::operator() (const c4_RowRef& rowRef_) const
0609 {
0610   return c4_Reference (rowRef_, *this);
0611 }
0612 
0613 d4_inline double c4_FloatProp::Get(const c4_RowRef& rowRef_) const
0614 {
0615   return operator() (rowRef_);
0616 }
0617 
0618 d4_inline void c4_FloatProp::Set(const c4_RowRef& rowRef_, double value_) const
0619 {
0620   operator() (rowRef_) = value_;
0621 }
0622 
0623 d4_inline c4_Row c4_FloatProp::AsRow(double value_) const
0624 {
0625   c4_Row row;
0626   operator() (row) = value_;
0627   return row;
0628 }
0629     
0630 d4_inline c4_Row c4_FloatProp::operator[] (double value_) const
0631 {
0632   return AsRow(value_);
0633 }
0634     
0635 /////////////////////////////////////////////////////////////////////////////
0636 // c4_DoubleProp
0637 
0638 d4_inline c4_DoubleProp::c4_DoubleProp (const char* name_) 
0639     : c4_Property ('D', name_)
0640 {
0641 }
0642 
0643 d4_inline c4_DoubleProp::~c4_DoubleProp ()
0644 = default;
0645 
0646 d4_inline c4_DoubleRef c4_DoubleProp::operator() (const c4_RowRef& rowRef_) const
0647 {
0648   return c4_Reference (rowRef_, *this);
0649 }
0650 
0651 d4_inline double c4_DoubleProp::Get(const c4_RowRef& rowRef_) const
0652 {
0653   return operator() (rowRef_);
0654 }
0655 
0656 d4_inline void c4_DoubleProp::Set(const c4_RowRef& rowRef_, double value_) const
0657 {
0658   operator() (rowRef_) = value_;
0659 }
0660 
0661 d4_inline c4_Row c4_DoubleProp::AsRow(double value_) const
0662 {
0663   c4_Row row;
0664   operator() (row) = value_;
0665   return row;
0666 }
0667     
0668 d4_inline c4_Row c4_DoubleProp::operator[] (double value_) const
0669 {
0670   return AsRow(value_);
0671 }
0672     
0673 /////////////////////////////////////////////////////////////////////////////
0674 #endif // !q4_TINY
0675 /////////////////////////////////////////////////////////////////////////////
0676 // c4_BytesProp
0677 
0678 d4_inline c4_BytesProp::c4_BytesProp (const char* name_) 
0679     : c4_Property ('B', name_)
0680 {
0681 }
0682     
0683 d4_inline c4_BytesProp::~c4_BytesProp ()
0684 = default;
0685 
0686 d4_inline c4_BytesRef c4_BytesProp::operator() (const c4_RowRef& rowRef_) const
0687 {
0688   return c4_Reference (rowRef_, *this);
0689 }
0690 
0691 d4_inline c4_Bytes c4_BytesProp::Get(const c4_RowRef& rowRef_) const
0692 {
0693   return operator() (rowRef_);
0694 }
0695 
0696 d4_inline void c4_BytesProp::Set(const c4_RowRef& rowRef_, const c4_Bytes& value_) const
0697 {
0698   operator() (rowRef_) = value_;
0699 }
0700 
0701 d4_inline c4_Row c4_BytesProp::AsRow(const c4_Bytes& value_) const
0702 {
0703   c4_Row row;
0704   operator() (row) = value_;
0705   return row;
0706 }
0707     
0708 d4_inline c4_Row c4_BytesProp::operator[] (const c4_Bytes& value_) const
0709 {
0710   return AsRow(value_);
0711 }
0712     
0713 /////////////////////////////////////////////////////////////////////////////
0714 // c4_StringProp
0715 
0716 d4_inline c4_StringProp::c4_StringProp (const char* name_) 
0717     : c4_Property ('S', name_)
0718 {
0719 }
0720     
0721 d4_inline c4_StringProp::~c4_StringProp ()
0722 = default;
0723 
0724 d4_inline c4_StringRef c4_StringProp::operator() (const c4_RowRef& rowRef_) const
0725 {
0726   return c4_Reference (rowRef_, *this);
0727 }
0728 
0729 d4_inline const char* c4_StringProp::Get(const c4_RowRef& rowRef_) const
0730 {
0731   return operator() (rowRef_);
0732 }
0733 
0734 d4_inline void c4_StringProp::Set(const c4_RowRef& rowRef_, const char* value_) const
0735 {
0736   operator() (rowRef_) = value_;
0737 }
0738 
0739 d4_inline c4_Row c4_StringProp::AsRow(const char* value_) const
0740 {
0741   c4_Row row;
0742   operator() (row) = value_;
0743   return row;
0744 }
0745     
0746 d4_inline c4_Row c4_StringProp::operator[] (const char* value_) const
0747 {
0748   return AsRow(value_);
0749 }
0750     
0751 /////////////////////////////////////////////////////////////////////////////
0752 // c4_ViewProp
0753 
0754 d4_inline c4_ViewProp::c4_ViewProp (const char* name_)
0755     : c4_Property ('V', name_)
0756 {
0757 }
0758     
0759 d4_inline c4_ViewProp::~c4_ViewProp ()
0760 = default;
0761 
0762 d4_inline c4_ViewRef c4_ViewProp::operator() (const c4_RowRef& rowRef_) const
0763 {
0764   return c4_Reference (rowRef_, *this);
0765 }
0766 
0767 d4_inline c4_View c4_ViewProp::Get(const c4_RowRef& rowRef_) const
0768 {
0769   return operator() (rowRef_);
0770 }
0771 
0772 d4_inline void c4_ViewProp::Set(const c4_RowRef& rowRef_, const c4_View& value_) const
0773 {
0774   operator() (rowRef_) = value_;
0775 }
0776 
0777 d4_inline c4_Row c4_ViewProp::AsRow(const c4_View& value_) const
0778 {
0779   c4_Row row;
0780   operator() (row) = value_;
0781   return row;
0782 }
0783     
0784 d4_inline c4_Row c4_ViewProp::operator[] (const c4_View& value_) const
0785 {
0786   return AsRow(value_);
0787 }
0788     
0789 /////////////////////////////////////////////////////////////////////////////
0790 // c4_Strategy
0791 
0792     /// True if we can do I/O with this object
0793 d4_inline bool c4_Strategy::IsValid() const
0794 { 
0795   return false; 
0796 }
0797 
0798 /////////////////////////////////////////////////////////////////////////////
0799 // c4_CustomViewer
0800 
0801 d4_inline c4_CustomViewer::c4_CustomViewer()
0802 = default;
0803 
0804 d4_inline int c4_CustomViewer::Lookup(const c4_RowRef& r_, int& n_)
0805 {
0806   return Lookup(&r_, n_); // c4_Cursor
0807 }
0808 
0809 d4_inline bool c4_CustomViewer::InsertRows(int p_, const c4_RowRef& r_, int n_)
0810 {
0811   return InsertRows(p_, &r_, n_); // c4_Cursor
0812 }
0813 
0814 /////////////////////////////////////////////////////////////////////////////
0815 // c4_Sequence
0816 
0817 d4_inline c4_Dependencies* c4_Sequence::GetDependencies() const
0818 {
0819   return _dependencies;
0820 }
0821 
0822 /////////////////////////////////////////////////////////////////////////////
0823 // Reordered inlines so they are always used after their definition
0824  
0825 /// Dereferences this cursor to "almost" a row.
0826 d4_inline c4_RowRef c4_Cursor::operator* () const
0827 {
0828   return *(c4_Cursor*) this; // cast avoids a const problem with BCPP 4.52
0829 }
0830 
0831 /// This is the same as *(cursor + offset).
0832 d4_inline c4_RowRef c4_Cursor::operator[] (int offset_) const
0833 {
0834   return *(*this + offset_);
0835 }
0836 
0837 /// Returns a reference to specified entry, for use as RHS or LHS
0838 d4_inline c4_RowRef c4_View::GetAt(int index_) const
0839 {
0840   return * c4_Cursor (*_seq, index_);
0841 }
0842 
0843 /** Element access, shorthand for GetAt
0844  * @return A reference to the specified row in the view.
0845  * This reference can be used on either side of the assignment operator.
0846  */
0847 d4_inline c4_RowRef c4_View::operator[] (
0848         int index_ ///< zero-based row index
0849     ) const
0850 {
0851   return GetAt(index_);
0852 }
0853     
0854 /** Element access, shorthand for GetAt
0855  * @return A reference to the specified row in the view.
0856  * This reference can be used on either side of the assignment operator.
0857  */
0858 d4_inline c4_RowRef c4_View::ElementAt(
0859         int index_ ///< zero-based row index
0860     )
0861 {
0862   return GetAt(index_);
0863 }
0864 
0865 /////////////////////////////////////////////////////////////////////////////