Changeset b83467 in git for Singular/countedref.cc
- Timestamp:
- Aug 31, 2012, 12:50:14 AM (12 years ago)
- Branches:
- (u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
- Children:
- 2cdc84e758384927d435934f4ed945fbbdf5cedf
- Parents:
- a5e907a16ec70a7bfd4c506efb3f1a7b48693387
- git-author:
- Alexander Dreyer <alexander.dreyer@itwm.fraunhofer.de>2012-08-31 00:50:14+02:00
- git-committer:
- Oleksandr Motsak <motsak@mathematik.uni-kl.de>2012-09-05 15:52:16+02:00
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
Singular/countedref.cc
ra5e907 rb83467 202 202 203 203 204 BOOLEAN get(leftv result) {205 leftv next = result->next;206 result->next = NULL;207 result->CleanUp();208 209 copy(result, m_data);210 result->next = next;211 return FALSE;212 }213 204 214 205 /// Access to object … … 249 240 250 241 class LeftvDeep: 251 p ublicLeftvShallow {242 protected LeftvShallow { 252 243 typedef LeftvDeep self; 253 244 typedef LeftvShallow base; 254 245 246 self& operator=(const self&); 255 247 public: 256 248 LeftvDeep(): base() {} 257 LeftvDeep(leftv data): base(data) { 258 if(m_data->rtyp != IDHDL) { 259 m_data->data = data->CopyD(); 260 } 261 } 249 LeftvDeep(leftv data): base(data) { if(!isid()) m_data->data=data->CopyD(); } 262 250 263 251 LeftvDeep(leftv data,int,int): base() { m_data->Copy(data); } … … 269 257 270 258 ~LeftvDeep() { m_data->CleanUp(); } 271 272 self& operator=(const self& rhs) { return operator=(rhs.m_data); } 259 operator const base&() { return static_cast<const base&>(*this); } 260 261 bool like(const self& rhs) const { return m_data->data == rhs.m_data->data; } 262 273 263 self& operator=(leftv rhs) { 274 m_data->e = rhs->e;275 rhs->e=NULL;276 if(m_data->rtyp == IDHDL) {264 if(isid()) { 265 m_data->e = rhs->e; 266 rhs->e = NULL; 277 267 IDTYP((idhdl)m_data->data) = rhs->Typ(); 278 268 IDDATA((idhdl)m_data->data) = (char*) rhs->CopyD(); … … 280 270 else { 281 271 m_data->CleanUp(); 282 m_data->rtyp = rhs->Typ(); 283 m_data->data = rhs->CopyD(); 272 m_data->Copy(rhs); 284 273 } 285 286 274 return *this; 287 275 } 288 int Typ() const {return m_data->Typ(); } 289 leftv access() { return m_data; } 276 277 leftv access() { return m_data; } 278 279 280 /// Check a given context for our identifier 281 BOOLEAN brokenid(idhdl context) const { 282 assume(isid()); 283 return (context == NULL) || 284 ((context != (idhdl) m_data->data) && brokenid(IDNEXT(context))); 285 } 286 BOOLEAN get(leftv result) { 287 leftv next = result->next; 288 result->next = NULL; 289 result->CleanUp(); 290 291 copy(result, m_data); 292 result->next = next; 293 return FALSE; 294 } 295 296 BOOLEAN isid() const { return m_data->rtyp==IDHDL;} 297 BOOLEAN ringed() { return m_data->RingDependend(); } 298 BOOLEAN unassigned() const { return m_data->Typ()==0; } 290 299 }; 291 300 … … 301 310 302 311 /// Subscripted object 303 CountedRefData(idhdl handle, CountedRefPtr<self*> back): 304 base(), m_data(init(handle)), m_ring(back->Ring()), m_back(back) { } 305 312 CountedRefData(leftv wrapped, CountedRefPtr<self*> back): 313 base(), m_data(wrapped), m_ring(back->m_ring), m_back(back) { 314 315 assume(wrapped->rtyp == IDHDL); 316 ++((idhdl)m_data.access()->data)->ref; 317 } 318 319 /// Disallow assignment 320 self& operator=(const self&); 306 321 public: 307 322 /// Construct shared memory empty Singular object … … 322 337 /// Destruct 323 338 ~CountedRefData() { 324 if (m_back) CountedRefEnv::clearid((idhdl)m_data.access()->data, root()); 325 } 339 if (m_back && (--((idhdl)m_data.access()->data)->ref <= 0)) // clear only if we own 340 CountedRefEnv::clearid((idhdl)m_data.access()->data, root()); 341 } 326 342 327 343 CountedRefPtr<self*> subscripted() { 328 return new self(CountedRefEnv::idify(m_data.access(), root()), this); 329 } 330 331 /// Replace data 332 self& operator=(const self& rhs) { 333 m_data = rhs.m_data; 334 m_ring = rhs.m_ring; 344 if (m_back) 345 return new self(operator*().operator->(), m_back); 346 347 return new self(init(CountedRefEnv::idify(m_data.access(), root())), this); 348 } 349 350 /// Replace with other Singular data 351 self& operator=(leftv rhs) { 352 m_data = rhs; 353 m_ring = parent(rhs); 335 354 return *this; 336 }337 338 /// Replace with other Singular data339 void set(leftv rhs) {340 if (m_data->rtyp==IDHDL)341 m_data = rhs;342 else343 m_data->Copy(rhs);344 345 m_ring = parent(rhs);346 355 } 347 356 … … 350 359 351 360 /// Extract (shallow) copy of stored data 352 LeftvShallow operator*() const { return (broken()? LeftvShallow(): LeftvShallow(m_data)); }361 LeftvShallow operator*() const { return (broken()? LeftvShallow(): (const LeftvShallow&)m_data); } 353 362 354 363 355 364 BOOLEAN rering() { 356 if (m_ring ^ m_data ->RingDependend()) m_ring = (m_ring? NULL: currRing);365 if (m_ring ^ m_data.ringed()) m_ring = (m_ring? NULL: currRing); 357 366 return (m_back && m_back->rering()); 358 367 } … … 367 376 return complain("Referenced identifier not from current ring"); 368 377 369 return (m_data->rtyp == IDHDL) &&brokenid(currRing->idroot) &&378 return m_data.isid() && m_data.brokenid(currRing->idroot) && 370 379 complain("Referenced identifier not available in ring anymore"); 371 380 } 372 373 if (m_data->rtyp != IDHDL) return FALSE;374 returnbrokenid(IDROOT) &&375 ((currPack == basePack) || brokenid(basePack->idroot)) &&381 382 if (!m_data.isid()) return FALSE; 383 return m_data.brokenid(IDROOT) && 384 ((currPack == basePack) || m_data.brokenid(basePack->idroot)) && 376 385 complain("Referenced identifier not available in current context"); 377 386 } 378 387 379 388 BOOLEAN assign(leftv result, leftv arg) { 380 if ( m_data->rtyp!=IDHDL) {381 set(arg);389 if (!m_data.isid()) { 390 (*this) = arg; 382 391 return FALSE; 383 392 } 384 393 return get(result) || iiAssign(result, arg) || rering(); 385 }386 387 /// @note If we have a callback, our identifier was temporary, so remove it388 void clear() {389 if (m_back) CountedRefEnv::clearid((idhdl)m_data.access()->data, root());390 394 } 391 395 … … 399 403 } 400 404 401 CountedRefPtr<ring, true> Ring() { return m_ring; } 402 int Typ() const {return m_data->Typ(); } 405 BOOLEAN unassigned() const { return m_data.unassigned(); } 403 406 private: 404 407 … … 409 412 } 410 413 411 /// Check a given context for our identifier 412 BOOLEAN brokenid(idhdl context) const { 413 return (context == NULL) || 414 ((context != (idhdl) m_data->data) && brokenid(IDNEXT(context))); 415 } 414 416 415 417 416 /// Store ring for ring-dependent objects … … 439 438 }; 440 439 440 /// Supporting smart pointer @c CountedRefPtr 441 inline void CountedRefPtr_kill(CountedRefData* data) { delete data; } 442 443 441 444 /// blackbox support - initialization 442 445 /// @note deals as marker for compatible references, too. … … 446 449 } 447 450 448 449 450 inline void CountedRefPtr_kill(CountedRefData* data) { delete data; }451 451 452 452 class CountedRef { … … 469 469 470 470 /// Construct new reference from Singular data 471 CountedRef(leftv arg): m_data(new data_type(arg)) { }471 explicit CountedRef(leftv arg): m_data(new data_type(arg)) { } 472 472 473 473 protected: … … 485 485 } 486 486 487 /// Replace data that reference is pointing to488 self& operator=(leftv rhs) {489 m_data->set(rhs);490 return *this;491 }492 493 487 BOOLEAN assign(leftv result, leftv arg) { 494 488 return m_data->assign(result,arg); 495 489 } 496 490 BOOLEAN rering() { return m_data->rering(); } 491 497 492 /// Extract (shallow) copy of stored data 498 493 LeftvShallow operator*() { return m_data->operator*(); } … … 560 555 /// Check whther argument is not defined yet 561 556 BOOLEAN undefined(leftv res) { return construct(res, operator*()->Typ() == NONE); } 562 557 BOOLEAN unassigned() const { return m_data->unassigned(); } 563 558 /// Recover the actual object from raw Singular data 564 559 static self cast(void* data) { … … 579 574 return (arg->next != NULL) && resolve(arg->next); 580 575 } 581 int Typ() const {return m_data->Typ(); }576 // int Typ() const {return m_data->Typ(); } 582 577 protected: 583 578 /// Construct integer value … … 708 703 public: 709 704 CountedRefShared(): base(new data_type) { } 710 CountedRefShared(leftv arg): base(new data_type(arg, FALSE,0)) { }705 explicit CountedRefShared(leftv arg): base(new data_type(arg, FALSE,0)) { } 711 706 712 707 /// Construct copy … … 719 714 } 720 715 721 /// Replace data that reference is pointing to722 self& operator=(leftv rhs) {723 return static_cast<self&>(base::operator=(rhs));724 }725 726 716 static self cast(leftv arg) { return base::cast(arg); } 727 717 static self cast(void* arg) { return base::cast(arg); } 728 718 729 self subscripted() { 730 return self(m_data->subscripted());//new CountedRefDataIndexed(m_data->idify(), m_data); 731 } 719 /// Temporarily wrap with identifier for '[' and '.' operation 720 self subscripted() { return self(m_data->subscripted()); } 732 721 733 722 BOOLEAN retrieve(leftv res, int typ) { … … 749 738 750 739 int typ = head->Typ(); 751 return indexed.dereference(head) || CountedRef ::resolve(arg) ||740 return indexed.dereference(head) || CountedRefShared::resolve(arg) || 752 741 iiExprArith2(res, head, op, arg) || indexed.retrieve(res, typ); 753 742 } … … 793 782 { 794 783 /// Case: replace assignment behind reference 795 if ((result->Data() != NULL) && (CountedRefShared::cast(result).Typ() !=0)) {784 if ((result->Data() != NULL) && !CountedRefShared::cast(result).unassigned()) { 796 785 if (CountedRefShared::resolve(arg)) return TRUE; 797 786 return CountedRefShared::cast(result).assign(result, arg); … … 805 794 return CountedRefShared::cast(arg).outcast(result); 806 795 } 807 if(CountedRefShared::cast(result). Typ() == 0) {796 if(CountedRefShared::cast(result).unassigned()) { 808 797 // CountedRefShared::cast(result) = arg; 809 798 return CountedRefShared::cast(result).assign(result, arg);
Note: See TracChangeset
for help on using the changeset viewer.