#ifndef ROOT_TGenCollectionProxy
#define ROOT_TGenCollectionProxy
#ifndef ROOT_TVirtualCollectionProxy
#include "TVirtualCollectionProxy.h"
#endif
#ifndef ROOT_TCollectionProxyInfo
#include "TCollectionProxyInfo.h"
#endif
#include <typeinfo>
#include <string>
#include <map>
#ifndef __CINT__
#include <stdlib.h>
#endif
class TObjArray;
class TCollectionProxyFactory;
class TGenCollectionProxy
: public TVirtualCollectionProxy
{
friend class TCollectionProxyFactory;
public:
#ifdef R__HPUX
typedef const type_info& Info_t;
#else
typedef const std::type_info& Info_t;
#endif
enum {
kBIT_ISSTRING = 0x20000000,
kBIT_ISTSTRING = 0x40000000,
kBOOL_t = 21
};
struct Value {
ROOT::NewFunc_t fCtor;
ROOT::DesFunc_t fDtor;
ROOT::DelFunc_t fDelete;
UInt_t fCase;
UInt_t fProperties;
TClassRef fType;
EDataType fKind;
size_t fSize;
Value(const std::string& info, Bool_t silent);
void DeleteItem(void* ptr);
Bool_t IsValid();
};
union StreamHelper {
Bool_t boolean;
Char_t s_char;
Short_t s_short;
Int_t s_int;
Long_t s_long;
Long64_t s_longlong;
Float_t flt;
Double_t dbl;
UChar_t u_char;
UShort_t u_short;
UInt_t u_int;
ULong_t u_long;
ULong64_t u_longlong;
void* p_void;
void** pp_void;
char* kchar;
TString* tstr;
void* ptr() {
return *(&this->p_void);
}
std::string* str() {
return (std::string*)this;
}
const char* c_str() {
return ((std::string*)this)->c_str();
}
const char* c_pstr() {
return (*(std::string**)this)->c_str();
}
void set(void* p) {
*(&this->p_void) = p;
}
void read_std_string(TBuffer& b) {
TString s;
s.Streamer(b);
((std::string*)this)->assign(s.Data());
}
void* read_tstring(TBuffer& b) {
*((TString*)this) = "";
((TString*)this)->Streamer(b);
return this;
}
void read_std_string_pointer(TBuffer& b) {
TString s;
std::string* str2 = (std::string*)ptr();
if (!str2) str2 = new std::string();
s.Streamer(b);
*str2 = s;
set(str2);
}
void write_std_string_pointer(TBuffer& b) {
const char* c;
if (ptr()) {
std::string* strptr = (*(std::string**)this);
c = (const char*)(strptr->c_str());
} else c = "";
TString(c).Streamer(b);
}
void read_any_object(Value* v, TBuffer& b) {
void* p = ptr();
if ( p ) {
if ( v->fDelete ) {
(*v->fDelete)(p);
}
else if ( v->fType ) {
v->fType->Destructor(p);
}
else if ( v->fDtor ) {
(*v->fDtor)(p);
::operator delete(p);
}
else {
::operator delete(p);
}
}
set( b.ReadObjectAny(v->fType) );
}
void read_tstring_pointer(Bool_t vsn3, TBuffer& b) {
TString* s = (TString*)ptr();
if ( vsn3 ) {
if ( !s ) s = new TString();
else s->Clear();
s->Streamer(b);
set(s);
return;
}
if ( s ) delete s;
set( b.ReadObjectAny(TString::Class()) );
}
void write_tstring_pointer(TBuffer& b) {
b.WriteObjectAny(ptr(), TString::Class());
}
};
class Method {
public:
typedef void* (*Call_t)(void*);
Call_t call;
Method() : call(0) { }
Method(Call_t c) : call(c) { }
Method(const Method& m) : call(m.call) { }
Method &operator=(const Method& m) { call = m.call; return *this; }
void* invoke(void* obj) const { return (*call)(obj); }
};
class Method0 {
public:
typedef void* (*Call_t)();
Call_t call;
Method0() : call(0) { }
Method0(Call_t c) : call(c) { }
Method0(const Method0& m) : call(m.call) { }
Method0 &operator=(const Method0& m) { call = m.call; return *this; }
void* invoke() const { return (*call)(); }
};
class TStaging {
void *fTarget;
void *fContent;
size_t fReserved;
size_t fSize;
size_t fSizeOf;
TStaging(const TStaging&);
TStaging &operator=(const TStaging&);
public:
TStaging(size_t size, size_t size_of) : fTarget(0), fContent(0), fReserved(0), fSize(size), fSizeOf(size_of)
{
fReserved = fSize;
fContent = ::malloc(fReserved * fSizeOf);
}
~TStaging() {
::free(fContent);
}
void *GetContent() {
return fContent;
}
void *GetEnd() {
return ((char*)fContent) + fSize*fSizeOf;
}
size_t GetSize() {
return fSize;
}
void *GetTarget() {
return fTarget;
}
void Resize(size_t nelement) {
if (fReserved < nelement) {
fReserved = nelement;
fContent = ::realloc(fContent,fReserved * fSizeOf);
}
fSize = nelement;
}
void SetTarget(void *target) {
fTarget = target;
}
};
protected:
typedef ROOT::TCollectionProxyInfo::Environ<char[64]> Env_t;
typedef ROOT::TCollectionProxyInfo::EnvironBase EnvironBase_t;
typedef std::vector<TStaging*> Staged_t;
typedef std::vector<EnvironBase_t*> Proxies_t;
mutable TObjArray *fReadMemberWise;
mutable std::map<std::string, TObjArray*> *fConversionReadMemberWise;
mutable TStreamerInfoActions::TActionSequence *fWriteMemberWise;
typedef void (*Sizing_t)(void *obj, size_t size);
typedef void* (*Feedfunc_t)(void *from, void *to, size_t size);
typedef void* (*Collectfunc_t)(void *from, void *to);
typedef void* (*ArrIterfunc_t)(void *from, size_t size);
std::string fName;
Bool_t fPointers;
Method fClear;
Method fSize;
Sizing_t fResize;
Method fFirst;
Method fNext;
ArrIterfunc_t fConstruct;
Sizing_t fDestruct;
Feedfunc_t fFeed;
Collectfunc_t fCollect;
Method0 fCreateEnv;
Value* fValue;
Value* fVal;
Value* fKey;
EnvironBase_t*fEnv;
int fValOffset;
int fValDiff;
Proxies_t fProxyList;
Proxies_t fProxyKept;
Staged_t fStaged;
int fSTL_type;
Info_t fTypeinfo;
TClass* fOnFileClass;
CreateIterators_t fFunctionCreateIterators;
CopyIterator_t fFunctionCopyIterator;
Next_t fFunctionNextIterator;
DeleteIterator_t fFunctionDeleteIterator;
DeleteTwoIterators_t fFunctionDeleteTwoIterators;
TGenCollectionProxy* Initialize(Bool_t silent) const;
virtual TGenCollectionProxy* InitializeEx(Bool_t silent);
virtual void DeleteItem(Bool_t force, void* ptr) const;
void CheckFunctions() const;
virtual void UpdateValueClass(const TClass *oldcl, TClass *newcl);
private:
TGenCollectionProxy();
public:
virtual TVirtualCollectionProxy* Generate() const;
TGenCollectionProxy(const TGenCollectionProxy& copy);
private:
TGenCollectionProxy &operator=(const TGenCollectionProxy&);
public:
TGenCollectionProxy(Info_t typ, size_t iter_size);
TGenCollectionProxy(const ROOT::TCollectionProxyInfo &info, TClass *cl);
virtual ~TGenCollectionProxy();
virtual TClass *GetCollectionClass() const;
virtual Int_t GetCollectionType() const;
virtual ULong_t GetIncrement() const;
virtual UInt_t Sizeof() const;
virtual void PushProxy(void *objstart);
virtual void PopProxy();
virtual Bool_t HasPointers() const;
virtual TClass *GetValueClass() const;
virtual EDataType GetType() const;
virtual void *At(UInt_t idx);
virtual void Clear(const char *opt = "");
virtual void Resize(UInt_t n, Bool_t force_delete);
virtual UInt_t Size() const;
virtual void* Allocate(UInt_t n, Bool_t forceDelete);
virtual void Insert(const void *data, void *container, size_t size);
virtual void Commit(void* env);
virtual void Streamer(TBuffer &refBuffer);
virtual void Streamer(TBuffer &refBuffer, void *pObject, int siz);
virtual void operator()(TBuffer &refBuffer, void *pObject);
virtual void ReadBuffer(TBuffer &b, void *obj);
virtual void ReadBuffer(TBuffer &b, void *obj, const TClass *onfileClass);
virtual void SetOnFileClass( TClass* cl ) { fOnFileClass = cl; }
virtual TClass* GetOnFileClass() const { return fOnFileClass; }
virtual TStreamerInfoActions::TActionSequence *GetConversionReadMemberWiseActions(TClass *oldClass, Int_t version);
virtual TStreamerInfoActions::TActionSequence *GetReadMemberWiseActions(Int_t version);
virtual TStreamerInfoActions::TActionSequence *GetWriteMemberWiseActions();
virtual CreateIterators_t GetFunctionCreateIterators(Bool_t read = kTRUE);
virtual CopyIterator_t GetFunctionCopyIterator(Bool_t read = kTRUE);
virtual Next_t GetFunctionNext(Bool_t read = kTRUE);
virtual DeleteIterator_t GetFunctionDeleteIterator(Bool_t read = kTRUE);
virtual DeleteTwoIterators_t GetFunctionDeleteTwoIterators(Bool_t read = kTRUE);
};
template <typename T>
struct AnyCollectionProxy : public TGenCollectionProxy {
AnyCollectionProxy()
: TGenCollectionProxy(typeid(T::Cont_t),sizeof(T::Iter_t))
{
fValDiff = sizeof(T::Value_t);
fValOffset = T::value_offset();
fSize.call = T::size;
fResize = T::resize;
fNext.call = T::next;
fFirst.call = T::first;
fClear.call = T::clear;
fConstruct = T::construct;
fDestruct = T::destruct;
fFeed = T::feed;
CheckFunctions();
}
virtual ~AnyCollectionProxy() { }
};
#endif
TGenCollectionProxy.h:100 TGenCollectionProxy.h:101 TGenCollectionProxy.h:102 TGenCollectionProxy.h:103 TGenCollectionProxy.h:104 TGenCollectionProxy.h:105 TGenCollectionProxy.h:106 TGenCollectionProxy.h:107 TGenCollectionProxy.h:108 TGenCollectionProxy.h:109 TGenCollectionProxy.h:110 TGenCollectionProxy.h:111 TGenCollectionProxy.h:112 TGenCollectionProxy.h:113 TGenCollectionProxy.h:114 TGenCollectionProxy.h:115 TGenCollectionProxy.h:116 TGenCollectionProxy.h:117 TGenCollectionProxy.h:118 TGenCollectionProxy.h:119 TGenCollectionProxy.h:120 TGenCollectionProxy.h:121 TGenCollectionProxy.h:122 TGenCollectionProxy.h:123 TGenCollectionProxy.h:124 TGenCollectionProxy.h:125 TGenCollectionProxy.h:126 TGenCollectionProxy.h:127 TGenCollectionProxy.h:128 TGenCollectionProxy.h:129 TGenCollectionProxy.h:130 TGenCollectionProxy.h:131 TGenCollectionProxy.h:132 TGenCollectionProxy.h:133 TGenCollectionProxy.h:134 TGenCollectionProxy.h:135 TGenCollectionProxy.h:136 TGenCollectionProxy.h:137 TGenCollectionProxy.h:138 TGenCollectionProxy.h:139 TGenCollectionProxy.h:140 TGenCollectionProxy.h:141 TGenCollectionProxy.h:142 TGenCollectionProxy.h:143 TGenCollectionProxy.h:144 TGenCollectionProxy.h:145 TGenCollectionProxy.h:146 TGenCollectionProxy.h:147 TGenCollectionProxy.h:148 TGenCollectionProxy.h:149 TGenCollectionProxy.h:150 TGenCollectionProxy.h:151 TGenCollectionProxy.h:152 TGenCollectionProxy.h:153 TGenCollectionProxy.h:154 TGenCollectionProxy.h:155 TGenCollectionProxy.h:156 TGenCollectionProxy.h:157 TGenCollectionProxy.h:158 TGenCollectionProxy.h:159 TGenCollectionProxy.h:160 TGenCollectionProxy.h:161 TGenCollectionProxy.h:162 TGenCollectionProxy.h:163 TGenCollectionProxy.h:164 TGenCollectionProxy.h:165 TGenCollectionProxy.h:166 TGenCollectionProxy.h:167 TGenCollectionProxy.h:168 TGenCollectionProxy.h:169 TGenCollectionProxy.h:170 TGenCollectionProxy.h:171 TGenCollectionProxy.h:172 TGenCollectionProxy.h:173 TGenCollectionProxy.h:174 TGenCollectionProxy.h:175 TGenCollectionProxy.h:176 TGenCollectionProxy.h:177 TGenCollectionProxy.h:178 TGenCollectionProxy.h:179 TGenCollectionProxy.h:180 TGenCollectionProxy.h:181 TGenCollectionProxy.h:182 TGenCollectionProxy.h:183 TGenCollectionProxy.h:184 TGenCollectionProxy.h:185 TGenCollectionProxy.h:186 TGenCollectionProxy.h:187 TGenCollectionProxy.h:188 TGenCollectionProxy.h:189 TGenCollectionProxy.h:190 TGenCollectionProxy.h:191 TGenCollectionProxy.h:192 TGenCollectionProxy.h:193 TGenCollectionProxy.h:194 TGenCollectionProxy.h:195 TGenCollectionProxy.h:196 TGenCollectionProxy.h:197 TGenCollectionProxy.h:198 TGenCollectionProxy.h:199 TGenCollectionProxy.h:200 TGenCollectionProxy.h:201 TGenCollectionProxy.h:202 TGenCollectionProxy.h:203 TGenCollectionProxy.h:204 TGenCollectionProxy.h:205 TGenCollectionProxy.h:206 TGenCollectionProxy.h:207 TGenCollectionProxy.h:208 TGenCollectionProxy.h:209 TGenCollectionProxy.h:210 TGenCollectionProxy.h:211 TGenCollectionProxy.h:212 TGenCollectionProxy.h:213 TGenCollectionProxy.h:214 TGenCollectionProxy.h:215 TGenCollectionProxy.h:216 TGenCollectionProxy.h:217 TGenCollectionProxy.h:218 TGenCollectionProxy.h:219 TGenCollectionProxy.h:220 TGenCollectionProxy.h:221 TGenCollectionProxy.h:222 TGenCollectionProxy.h:223 TGenCollectionProxy.h:224 TGenCollectionProxy.h:225 TGenCollectionProxy.h:226 TGenCollectionProxy.h:227 TGenCollectionProxy.h:228 TGenCollectionProxy.h:229 TGenCollectionProxy.h:230 TGenCollectionProxy.h:231 TGenCollectionProxy.h:232 TGenCollectionProxy.h:233 TGenCollectionProxy.h:234 TGenCollectionProxy.h:235 TGenCollectionProxy.h:236 TGenCollectionProxy.h:237 TGenCollectionProxy.h:238 TGenCollectionProxy.h:239 TGenCollectionProxy.h:240 TGenCollectionProxy.h:241 TGenCollectionProxy.h:242 TGenCollectionProxy.h:243 TGenCollectionProxy.h:244 TGenCollectionProxy.h:245 TGenCollectionProxy.h:246 TGenCollectionProxy.h:247 TGenCollectionProxy.h:248 TGenCollectionProxy.h:249 TGenCollectionProxy.h:250 TGenCollectionProxy.h:251 TGenCollectionProxy.h:252 TGenCollectionProxy.h:253 TGenCollectionProxy.h:254 TGenCollectionProxy.h:255 TGenCollectionProxy.h:256 TGenCollectionProxy.h:257 TGenCollectionProxy.h:258 TGenCollectionProxy.h:259 TGenCollectionProxy.h:260 TGenCollectionProxy.h:261 TGenCollectionProxy.h:262 TGenCollectionProxy.h:263 TGenCollectionProxy.h:264 TGenCollectionProxy.h:265 TGenCollectionProxy.h:266 TGenCollectionProxy.h:267 TGenCollectionProxy.h:268 TGenCollectionProxy.h:269 TGenCollectionProxy.h:270 TGenCollectionProxy.h:271 TGenCollectionProxy.h:272 TGenCollectionProxy.h:273 TGenCollectionProxy.h:274 TGenCollectionProxy.h:275 TGenCollectionProxy.h:276 TGenCollectionProxy.h:277 TGenCollectionProxy.h:278 TGenCollectionProxy.h:279 TGenCollectionProxy.h:280 TGenCollectionProxy.h:281 TGenCollectionProxy.h:282 TGenCollectionProxy.h:283 TGenCollectionProxy.h:284 TGenCollectionProxy.h:285 TGenCollectionProxy.h:286 TGenCollectionProxy.h:287 TGenCollectionProxy.h:288 TGenCollectionProxy.h:289 TGenCollectionProxy.h:290 TGenCollectionProxy.h:291 TGenCollectionProxy.h:292 TGenCollectionProxy.h:293 TGenCollectionProxy.h:294 TGenCollectionProxy.h:295 TGenCollectionProxy.h:296 TGenCollectionProxy.h:297 TGenCollectionProxy.h:298 TGenCollectionProxy.h:299 TGenCollectionProxy.h:300 TGenCollectionProxy.h:301 TGenCollectionProxy.h:302 TGenCollectionProxy.h:303 TGenCollectionProxy.h:304 TGenCollectionProxy.h:305 TGenCollectionProxy.h:306 TGenCollectionProxy.h:307 TGenCollectionProxy.h:308 TGenCollectionProxy.h:309 TGenCollectionProxy.h:310 TGenCollectionProxy.h:311 TGenCollectionProxy.h:312 TGenCollectionProxy.h:313 TGenCollectionProxy.h:314 TGenCollectionProxy.h:315 TGenCollectionProxy.h:316 TGenCollectionProxy.h:317 TGenCollectionProxy.h:318 TGenCollectionProxy.h:319 TGenCollectionProxy.h:320 TGenCollectionProxy.h:321 TGenCollectionProxy.h:322 TGenCollectionProxy.h:323 TGenCollectionProxy.h:324 TGenCollectionProxy.h:325 TGenCollectionProxy.h:326 TGenCollectionProxy.h:327 TGenCollectionProxy.h:328 TGenCollectionProxy.h:329 TGenCollectionProxy.h:330 TGenCollectionProxy.h:331 TGenCollectionProxy.h:332 TGenCollectionProxy.h:333 TGenCollectionProxy.h:334 TGenCollectionProxy.h:335 TGenCollectionProxy.h:336 TGenCollectionProxy.h:337 TGenCollectionProxy.h:338 TGenCollectionProxy.h:339 TGenCollectionProxy.h:340 TGenCollectionProxy.h:341 TGenCollectionProxy.h:342 TGenCollectionProxy.h:343 TGenCollectionProxy.h:344 TGenCollectionProxy.h:345 TGenCollectionProxy.h:346 TGenCollectionProxy.h:347 TGenCollectionProxy.h:348 TGenCollectionProxy.h:349 TGenCollectionProxy.h:350 TGenCollectionProxy.h:351 TGenCollectionProxy.h:352 TGenCollectionProxy.h:353 TGenCollectionProxy.h:354 TGenCollectionProxy.h:355 TGenCollectionProxy.h:356 TGenCollectionProxy.h:357 TGenCollectionProxy.h:358 TGenCollectionProxy.h:359 TGenCollectionProxy.h:360 TGenCollectionProxy.h:361 TGenCollectionProxy.h:362 TGenCollectionProxy.h:363 TGenCollectionProxy.h:364 TGenCollectionProxy.h:365 TGenCollectionProxy.h:366 TGenCollectionProxy.h:367 TGenCollectionProxy.h:368 TGenCollectionProxy.h:369 TGenCollectionProxy.h:370 TGenCollectionProxy.h:371 TGenCollectionProxy.h:372 TGenCollectionProxy.h:373 TGenCollectionProxy.h:374 TGenCollectionProxy.h:375 TGenCollectionProxy.h:376 TGenCollectionProxy.h:377 TGenCollectionProxy.h:378 TGenCollectionProxy.h:379 TGenCollectionProxy.h:380 TGenCollectionProxy.h:381 TGenCollectionProxy.h:382 TGenCollectionProxy.h:383 TGenCollectionProxy.h:384 TGenCollectionProxy.h:385 TGenCollectionProxy.h:386 TGenCollectionProxy.h:387 TGenCollectionProxy.h:388 TGenCollectionProxy.h:389 TGenCollectionProxy.h:390 TGenCollectionProxy.h:391 TGenCollectionProxy.h:392 TGenCollectionProxy.h:393 TGenCollectionProxy.h:394 TGenCollectionProxy.h:395 TGenCollectionProxy.h:396 TGenCollectionProxy.h:397 TGenCollectionProxy.h:398 TGenCollectionProxy.h:399 TGenCollectionProxy.h:400 TGenCollectionProxy.h:401 TGenCollectionProxy.h:402 TGenCollectionProxy.h:403 TGenCollectionProxy.h:404 TGenCollectionProxy.h:405 TGenCollectionProxy.h:406 TGenCollectionProxy.h:407 TGenCollectionProxy.h:408 TGenCollectionProxy.h:409 TGenCollectionProxy.h:410 TGenCollectionProxy.h:411 TGenCollectionProxy.h:412 TGenCollectionProxy.h:413 TGenCollectionProxy.h:414 TGenCollectionProxy.h:415 TGenCollectionProxy.h:416 TGenCollectionProxy.h:417 TGenCollectionProxy.h:418 TGenCollectionProxy.h:419 TGenCollectionProxy.h:420 TGenCollectionProxy.h:421 TGenCollectionProxy.h:422 TGenCollectionProxy.h:423 TGenCollectionProxy.h:424 TGenCollectionProxy.h:425 TGenCollectionProxy.h:426 TGenCollectionProxy.h:427 TGenCollectionProxy.h:428 TGenCollectionProxy.h:429 TGenCollectionProxy.h:430 TGenCollectionProxy.h:431 TGenCollectionProxy.h:432 TGenCollectionProxy.h:433 TGenCollectionProxy.h:434 TGenCollectionProxy.h:435 TGenCollectionProxy.h:436 TGenCollectionProxy.h:437 TGenCollectionProxy.h:438 TGenCollectionProxy.h:439 TGenCollectionProxy.h:440 TGenCollectionProxy.h:441 TGenCollectionProxy.h:442 TGenCollectionProxy.h:443 TGenCollectionProxy.h:444 TGenCollectionProxy.h:445 TGenCollectionProxy.h:446 TGenCollectionProxy.h:447 TGenCollectionProxy.h:448 TGenCollectionProxy.h:449 TGenCollectionProxy.h:450 TGenCollectionProxy.h:451 TGenCollectionProxy.h:452 TGenCollectionProxy.h:453 TGenCollectionProxy.h:454 TGenCollectionProxy.h:455 TGenCollectionProxy.h:456 TGenCollectionProxy.h:457 TGenCollectionProxy.h:458 TGenCollectionProxy.h:459 TGenCollectionProxy.h:460 TGenCollectionProxy.h:461 TGenCollectionProxy.h:462 TGenCollectionProxy.h:463 TGenCollectionProxy.h:464 TGenCollectionProxy.h:465 TGenCollectionProxy.h:466 TGenCollectionProxy.h:467 TGenCollectionProxy.h:468 TGenCollectionProxy.h:469 TGenCollectionProxy.h:470 TGenCollectionProxy.h:471 TGenCollectionProxy.h:472 TGenCollectionProxy.h:473 TGenCollectionProxy.h:474 TGenCollectionProxy.h:475 TGenCollectionProxy.h:476 TGenCollectionProxy.h:477 TGenCollectionProxy.h:478 TGenCollectionProxy.h:479 TGenCollectionProxy.h:480 TGenCollectionProxy.h:481 TGenCollectionProxy.h:482 TGenCollectionProxy.h:483 TGenCollectionProxy.h:484 TGenCollectionProxy.h:485 TGenCollectionProxy.h:486 TGenCollectionProxy.h:487 TGenCollectionProxy.h:488 TGenCollectionProxy.h:489 TGenCollectionProxy.h:490 TGenCollectionProxy.h:491 TGenCollectionProxy.h:492 TGenCollectionProxy.h:493 TGenCollectionProxy.h:494 TGenCollectionProxy.h:495 TGenCollectionProxy.h:496 TGenCollectionProxy.h:497 TGenCollectionProxy.h:498 TGenCollectionProxy.h:499 TGenCollectionProxy.h:500 TGenCollectionProxy.h:501 TGenCollectionProxy.h:502 TGenCollectionProxy.h:503 TGenCollectionProxy.h:504 TGenCollectionProxy.h:505 TGenCollectionProxy.h:506