00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
#ifndef __KGAMEPROPERTYARRAY_H_
00022
#define __KGAMEPROPERTYARRAY_H_
00023
00024
#include <qdatastream.h>
00025
#include <kdebug.h>
00026
00027
#include "kgamemessage.h"
00028
#include "kgameproperty.h"
00029
#include "kgamepropertyhandler.h"
00030
00031
00032
template<
class type>
00033
class KGamePropertyArray :
public QMemArray<type>,
public KGamePropertyBase
00034 {
00035
public:
00036 KGamePropertyArray() :
QMemArray<type>(),
KGamePropertyBase()
00037 {
00038
00039 }
00040
00041 KGamePropertyArray(
int size )
00042 {
00043
resize(size);
00044 }
00045
00046 KGamePropertyArray(
const KGamePropertyArray<type> &a ) :
QMemArray<type>(a)
00047 {
00048
QMemArray<type>::send();
00049 }
00050
00051
bool resize( uint size )
00052 {
00053
if (size!=
QMemArray<type>::size())
00054 {
00055
bool a=
true;
00056
QByteArray b;
00057
QDataStream s(b, IO_WriteOnly);
00058 KGameMessage::createPropertyCommand(s,KGamePropertyBase::IdCommand,
id(),CmdResize);
00059 s << size ;
00060
if (
policy()==PolicyClean ||
policy()==PolicyDirty)
00061 {
00062
if (mOwner)
00063 {
00064 mOwner->
sendProperty(s);
00065 }
00066 }
00067
if (
policy()==PolicyLocal ||
policy()==PolicyDirty)
00068 {
00069 extractProperty(b);
00070
00071 }
00072
return a;
00073 }
00074
else return true;
00075 }
00076
00077
void setAt(uint i,type data)
00078 {
00079
QByteArray b;
00080
QDataStream s(b, IO_WriteOnly);
00081 KGameMessage::createPropertyCommand(s,KGamePropertyBase::IdCommand,
id(),CmdAt);
00082 s << i ;
00083 s << data;
00084
if (
policy()==PolicyClean ||
policy()==PolicyDirty)
00085 {
00086
if (mOwner)
00087 {
00088 mOwner->
sendProperty(s);
00089 }
00090 }
00091
if (
policy()==PolicyLocal ||
policy()==PolicyDirty)
00092 {
00093 extractProperty(b);
00094 }
00095
00096 }
00097
00098 type at( uint i )
const
00099
{
00100
return QMemArray<type>::at(i);
00101 }
00102
00103 type operator[](
int i )
const
00104
{
00105
return QMemArray<type>::at(i);
00106 }
00107
00108 KGamePropertyArray<type> &operator=(
const KGamePropertyArray<type> &a)
00109 {
00110
return assign(a);
00111 }
00112
00113
bool truncate( uint pos )
00114 {
00115
return resize(pos);
00116 }
00117
00118
bool fill(
const type &data,
int size = -1 )
00119 {
00120
bool r=
true;
00121
QByteArray b;
00122
QDataStream s(b, IO_WriteOnly);
00123 KGameMessage::createPropertyCommand(s,KGamePropertyBase::IdCommand,
id(),CmdFill);
00124 s << data;
00125 s << size ;
00126
if (
policy()==PolicyClean ||
policy()==PolicyDirty)
00127 {
00128
if (mOwner)
00129 {
00130 mOwner->
sendProperty(s);
00131 }
00132 }
00133
if (
policy()==PolicyLocal ||
policy()==PolicyDirty)
00134 {
00135 extractProperty(b);
00136
00137 }
00138
return r;
00139 }
00140
00141 KGamePropertyArray<type>&
assign(
const KGamePropertyArray<type>& a )
00142 {
00143
00144
if (
policy()==PolicyClean ||
policy()==PolicyDirty)
00145 {
00146
sendProperty();
00147 }
00148
if (
policy()==PolicyLocal ||
policy()==PolicyDirty)
00149 {
00150
QMemArray<type>::assign(a);
00151 }
00152
return *
this;
00153 }
00154 KGamePropertyArray<type>& assign(
const type *a, uint n )
00155 {
00156
if (
policy()==PolicyClean ||
policy()==PolicyDirty)
00157 {
00158
sendProperty();
00159 }
00160
if (
policy()==PolicyLocal ||
policy()==PolicyDirty)
00161 {
00162
QMemArray<type>::assign(a,n);
00163 }
00164
return *
this;
00165 }
00166 KGamePropertyArray<type>&
duplicate(
const KGamePropertyArray<type>& a )
00167 {
00168
if (
policy()==PolicyClean ||
policy()==PolicyDirty)
00169 {
00170
sendProperty();
00171 }
00172
if (
policy()==PolicyLocal ||
policy()==PolicyDirty)
00173 {
00174
QMemArray<type>::duplicate(a);
00175 }
00176
return *
this;
00177 }
00178 KGamePropertyArray<type>& duplicate(
const type *a, uint n )
00179 {
00180
if (
policy()==PolicyClean ||
policy()==PolicyDirty)
00181 {
00182
sendProperty();
00183 }
00184
if (
policy()==PolicyLocal ||
policy()==PolicyDirty)
00185 {
00186
QMemArray<type>::duplicate(a,n);
00187 }
00188
return *
this;
00189 }
00190 KGamePropertyArray<type>& setRawData(
const type *a, uint n )
00191 {
00192
if (
policy()==PolicyClean ||
policy()==PolicyDirty)
00193 {
00194
sendProperty();
00195 }
00196
if (
policy()==PolicyLocal ||
policy()==PolicyDirty)
00197 {
00198
QMemArray<type>::setRawData(a,n);
00199 }
00200
return *
this;
00201 }
00202
void sort()
00203 {
00204
QByteArray b;
00205
QDataStream s(b, IO_WriteOnly);
00206 KGameMessage::createPropertyCommand(s,KGamePropertyBase::IdCommand,
id(),CmdSort);
00207
if (
policy()==PolicyLocal ||
policy()==PolicyDirty)
00208 {
00209
if (mOwner)
00210 {
00211 mOwner->
sendProperty(s);
00212 }
00213 }
00214
if (
policy()==PolicyLocal ||
policy()==PolicyDirty)
00215 {
00216 extractProperty(b);
00217 }
00218 }
00219
00220
void load(
QDataStream& s)
00221 {
00222
00223 type data;
00224
for (
unsigned int i=0; i<QMemArray<type>::size(); i++)
00225 {
00226 s >> data;
00227
QMemArray<type>::at(i)=data;
00228 }
00229
if (
isEmittingSignal())
00230 {
00231
emitSignal();
00232 }
00233 }
00234
void save(
QDataStream &s)
00235 {
00236
00237
for (
unsigned int i=0; i<QMemArray<type>::size(); i++)
00238 {
00239 s << at(i);
00240 }
00241 }
00242
00243
void command(
QDataStream &s,
int cmd,
bool)
00244 {
00245
KGamePropertyBase::command(s, cmd);
00246
00247
switch(cmd)
00248 {
00249
case CmdAt:
00250 {
00251 uint i;
00252 type data;
00253 s >> i >> data;
00254
QMemArray<type>::at(i)=data;
00255
00256
if (
isEmittingSignal())
00257 {
00258
emitSignal();
00259 }
00260
break;
00261 }
00262
case CmdResize:
00263 {
00264 uint size;
00265 s >> size;
00266
00267
if (
QMemArray<type>::size() != size)
00268 {
00269
QMemArray<type>::resize(size);
00270 }
00271
break;
00272 }
00273
case CmdFill:
00274 {
00275
int size;
00276 type data;
00277 s >> data >> size;
00278
00279
QMemArray<type>::fill(data,size);
00280
if (
isEmittingSignal())
00281 {
00282
emitSignal();
00283 }
00284
break;
00285 }
00286
case CmdSort:
00287 {
00288
00289
QMemArray<type>::sort();
00290
break;
00291 }
00292
default:
00293 kdError(11001) <<
"Error in KPropertyArray::command: Unknown command " << cmd << endl;
00294
break;
00295 }
00296 }
00297
protected:
00298
void extractProperty(
const QByteArray& b)
00299 {
00300
QDataStream s(b, IO_ReadOnly);
00301
int cmd;
00302
int propId;
00303 KGameMessage::extractPropertyHeader(s, propId);
00304 KGameMessage::extractPropertyCommand(s, propId, cmd);
00305 command(s, cmd,
true);
00306 }
00307
00308 };
00309
00310
#endif