20 #ifndef AKONADI_ITEM_P_H
21 #define AKONADI_ITEM_P_H
23 #include <QtCore/QDateTime>
24 #include <QtCore/QMap>
25 #include <QtCore/QVarLengthArray>
28 #include "itempayloadinternals_p.h"
31 #include <boost/bind.hpp>
46 clone_ptr() : t( 0 ) {}
47 explicit clone_ptr( T * t ) : t( t ) {}
48 clone_ptr(
const clone_ptr & other ) : t ( other.t ? other.t->clone() : 0 ) {}
49 ~clone_ptr() {
delete t; }
50 clone_ptr & operator=(
const clone_ptr & other ) {
51 if (
this != &other ) {
52 clone_ptr copy( other );
57 void swap( clone_ptr & other ) {
61 T * operator->()
const {
return get(); }
62 T & operator*()
const { assert(
get() != 0 );
return *
get(); }
63 T *
get()
const {
return t; }
64 T * release() { T *
const r = t; t = 0;
return r; }
65 void reset( T * other=0 ) {
delete t; t = other; }
68 struct _save_bool {
void f() {}; };
69 typedef void (_save_bool::*save_bool)();
71 operator save_bool ()
const {
return get() ? &_save_bool::f : 0 ; }
75 inline void swap( clone_ptr<T> & lhs, clone_ptr<T> & rhs ) {
79 template <
typename T,
size_t N>
80 class VarLengthArray {
81 QVarLengthArray<T,N> impl;
85 typedef const T* const_iterator;
87 typedef const T* const_pointer;
88 typedef T & reference;
89 typedef const T & const_reference;
91 explicit VarLengthArray(
int size=0 ) : impl( size ) {}
95 void push_back(
const T & t ) { impl.append( t ); }
96 int capacity()
const {
return impl.capacity(); }
97 void clear() { impl.clear(); }
98 size_t size()
const {
return impl.count(); }
99 bool empty()
const {
return impl.isEmpty(); }
100 void pop_back() {
return impl.removeLast(); }
101 void reserve(
size_t n ) { impl.reserve( n ); }
102 void resize(
size_t n ) { impl.resize( n ); }
104 iterator begin() {
return impl.data(); }
105 iterator end() {
return impl.data() + impl.size(); }
106 const_iterator begin()
const {
return impl.data(); }
107 const_iterator end()
const {
return impl.data() + impl.size(); }
108 const_iterator cbegin()
const {
return begin(); }
109 const_iterator cend()
const {
return end(); }
111 reference front() {
return *impl.data(); }
112 reference back() {
return *(impl.data()+impl.size()); }
113 const_reference front()
const {
return *impl.data(); }
114 const_reference back()
const {
return *(impl.data()+impl.size()); }
116 reference operator[](
size_t n ) {
return impl[n]; }
117 const_reference operator[](
size_t n )
const {
return impl[n]; }
120 struct TypedPayload {
121 clone_ptr<PayloadBase> payload;
126 struct BySharedPointerAndMetaTypeID : std::unary_function<TypedPayload,bool> {
129 BySharedPointerAndMetaTypeID(
int spid,
int mtid ) : spid( spid ), mtid( mtid ) {}
130 bool operator()(
const TypedPayload & tp )
const {
131 return ( mtid == -1 || mtid == tp.metaTypeId )
132 && ( spid == -1 || spid == tp.sharedPointerId ) ;
142 inline void swap<Akonadi::_detail::TypedPayload>( Akonadi::_detail::TypedPayload & lhs, Akonadi::_detail::TypedPayload & rhs ) {
143 lhs.payload.swap( rhs.payload );
144 swap( lhs.sharedPointerId, rhs.sharedPointerId );
145 swap( lhs.metaTypeId, rhs.metaTypeId );
151 typedef std::vector<_detail::TypedPayload> PayloadContainer;
156 class QForeachContainer<Akonadi::PayloadContainer> {};
170 mConversionInProgress(
false ),
175 mFlagsOverwritten(
false ),
176 mTagsOverwritten(
false ),
177 mSizeChanged(
false ),
178 mClearPayload(
false )
186 mFlags = other.mFlags;
187 mRevision = other.mRevision;
189 mModificationTime = other.mModificationTime;
190 mMimeType = other.mMimeType;
191 mLegacyPayload = other.mLegacyPayload;
192 mPayloads = other.mPayloads;
193 mConversionInProgress =
false;
194 mAddedFlags = other.mAddedFlags;
195 mDeletedFlags = other.mDeletedFlags;
196 mFlagsOverwritten = other.mFlagsOverwritten;
197 mSizeChanged = other.mSizeChanged;
198 mCollectionId = other.mCollectionId;
199 mClearPayload = other.mClearPayload;
207 void resetChangeLog()
209 mFlagsOverwritten =
false;
211 mDeletedFlags.clear();
212 mSizeChanged =
false;
213 mTagsOverwritten =
false;
215 mDeletedTags.clear();
223 bool hasMetaTypeId(
int mtid )
const {
224 return std::find_if( mPayloads.begin(), mPayloads.end(),
225 _detail::BySharedPointerAndMetaTypeID( -1, mtid ) )
229 PayloadBase * payloadBaseImpl(
int spid,
int mtid )
const {
230 const PayloadContainer::const_iterator it
231 = std::find_if( mPayloads.begin(), mPayloads.end(),
232 _detail::BySharedPointerAndMetaTypeID( spid, mtid ) );
233 return it == mPayloads.end() ? 0 : it->payload.get() ;
236 bool movePayloadFrom(
ItemPrivate * other,
int mtid )
const {
238 const size_t oldSize = mPayloads.size();
239 PayloadContainer & oPayloads = other->mPayloads;
240 const _detail::BySharedPointerAndMetaTypeID matcher( -1, mtid );
241 const size_t numMatching
242 = std::count_if( oPayloads.begin(), oPayloads.end(), matcher );
243 mPayloads.resize( oldSize + numMatching );
245 for ( PayloadContainer::iterator
246 dst = mPayloads.begin() + oldSize,
247 src = oPayloads.begin(), end = oPayloads.end() ; src != end ; ++src )
248 if ( matcher( *src ) ) {
252 return numMatching > 0 ;
256 std::auto_ptr<PayloadBase> takePayloadBaseImpl(
int spid,
int mtid ) {
257 PayloadContainer::iterator it
258 = std::find_if( mPayloads.begin(), mPayloads.end(),
259 _detail::BySharedPointerAndMetaTypeID( spid, mtid ) );
260 if ( it == mPayloads.end() )
261 return std::auto_ptr<PayloadBase>();
262 std::rotate( it, it + 1, mPayloads.end() );
263 std::auto_ptr<PayloadBase> result( it->payload.release() );
264 mPayloads.pop_back();
269 void setPayloadBaseImpl(
int spid,
int mtid, std::auto_ptr<PayloadBase> p,
bool add )
const {
272 mLegacyPayload.reset();
282 mPayloads.resize( add ? mPayloads.size() + 1 : 1 );
283 _detail::TypedPayload & tp = mPayloads.back();
284 tp.payload.reset( p.release() );
285 tp.sharedPointerId = spid;
286 tp.metaTypeId = mtid;
289 void setLegacyPayloadBaseImpl( std::auto_ptr<PayloadBase> p );
290 void tryEnsureLegacyPayload()
const;
292 mutable _detail::clone_ptr<PayloadBase> mLegacyPayload;
293 mutable PayloadContainer mPayloads;
294 mutable bool mConversionInProgress;
300 QDateTime mModificationTime;
303 Item::Flags mAddedFlags;
304 Item::Flags mDeletedFlags;
305 Tag::List mAddedTags;
306 Tag::List mDeletedTags;
307 QSet<QByteArray> mCachedPayloadParts;
308 bool mFlagsOverwritten : 1;
309 bool mTagsOverwritten : 1;
310 bool mSizeChanged : 1;
311 bool mClearPayload : 1;
qint64 Id
Describes the unique id type.