00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef __TSUBSTANCE_INCLUDED
00019 #define __TSUBSTANCE_INCLUDED
00020
00021 #include "common/osval.h"
00022 #include "common/link.h"
00023 #include "common/plist.h"
00024
00025 #include <string>
00026 #include <vector>
00027 class TDataPackageList;
00028
00029 class TSubstance;
00030 class TSubstanceType;
00031 class TSubstanceSet;
00032 class TSubstanceHold;
00033
00038 typedef uint2 SubstanceId;
00039
00040
00057 class TSubstanceType : public TLinkable
00058 {
00059 public:
00073 TSubstanceType(const string& name, const string& abbrev,
00074 const uint2 cclass, const int2 usize, const int2 umass,
00075 const bool update = false);
00079 virtual ~TSubstanceType(void);
00080
00081
00086 const string& Name(void) const;
00091 const string& Abbrev(void) const;
00096 const uint2 Id(void) const;
00101 const uint2 CargoClass(void) const;
00106 const int2 UnitSize(void) const;
00111 const int2 UnitMass(void) const;
00117 const bool Updatable(void) const;
00118
00124 static const uint4 NumberSubstances(void);
00130 static const uint2 NumberCargoClasses(void);
00137 static TSubstanceType* FindById(const SubstanceId Id);
00144 static TSubstanceType* FindByName(const string& Name);
00145
00155 virtual TSubstance* Create(const TOSVal& iAmount = 1);
00156
00172 virtual TOSVal Update(TSubstance* substance, const TOSVal& available_space);
00180 virtual bool load( TDataPackageList* in );
00189 virtual bool save( TDataPackageList* out ) const;
00190
00191 private:
00192 string fName;
00193 string fAbbrev;
00194
00195 SubstanceId fId;
00196 uint2 fCargoClass;
00197 int2 fUnitSize;
00198 int2 fUnitMass;
00199
00200
00201
00202
00203 bool fUpdatable;
00204
00205
00206
00207 static vector<TSubstanceType*> fSubstanceTable;
00208 static uint2 fCargoClasses;
00209
00210
00211 TSubstanceType(const TSubstanceType&);
00212 TSubstanceType& operator=(const TSubstanceType&);
00213 };
00214
00215
00216
00325 class TSubstance
00326 {
00327 public:
00331 virtual ~TSubstance(void);
00335 virtual TSubstance& operator=(const TSubstance& Subst2);
00336
00343 TSubstance* Clone(void) const;
00344
00350 TSubstanceType* Type(void) const;
00355 virtual const TOSVal& Amount(void) const;
00361 virtual TOSVal& Amount(void);
00367 virtual const TOSVal Size(void) const;
00373 virtual TOSVal Update(const TOSVal& available_space);
00383 bool load( TDataPackageList* in, const string& sIdentifier, bool bUnique=true );
00393 bool save( TDataPackageList* out, const string& sIdentifier, bool bUnique=true ) const;
00394
00395 private:
00396 TLink<TSubstanceType> fType;
00397 TOSVal fAmount;
00398
00399
00400
00401
00402
00403 friend TSubstance* TSubstanceType::Create(const TOSVal& iAmount);
00404 TSubstance(TSubstanceType* type, const TOSVal& iAmount = 1);
00405 TSubstance(void);
00406 TSubstance(const TSubstance& Subst2);
00407 };
00408
00417 ostream& operator<<(ostream& os, const TSubstance& Subst);
00418
00419
00420
00432 class TSubstanceSet
00433 {
00434 public:
00438 TSubstanceSet(void);
00444 ~TSubstanceSet(void);
00448 TSubstanceSet(const TSubstanceSet& Set2);
00452 bool operator==(const TSubstanceSet& Set2) const;
00453 bool operator!=(const TSubstanceSet& Set2) const;
00457 TSubstanceSet& operator=(const TSubstanceSet& Set2);
00458
00462 void Clear(void);
00463
00471 TOSVal TotalSpace(const uint2 uCClass) const;
00479 TOSVal AvailableSpace(const uint2 uCClass) const;
00487 TOSVal UsedSpace(const uint2 uCClass) const;
00488
00489
00500 bool HasEnough(const TSubstanceSet& Set2,
00501 const int4 iNum = 1, const int4 iDenom = 1) const;
00511 bool Add(const TSubstanceSet& Set2,
00512 const int4 iNum = 1, const int4 iDenom = 1);
00524 bool Remove(const TSubstanceSet& Set,
00525 const int4 iNum = 1, const int4 iDenom = 1);
00526
00527
00538 bool HasEnough(const TSubstance& Subst,
00539 const int4 iNum = 1, const int4 iDenom = 1) const;
00549 bool Add(const TSubstance& Subst,
00550 const int4 iNum = 1, const int4 iDenom = 1);
00562 bool Remove(const TSubstance& Subst,
00563 const int4 iNum = 1, const int4 iDenom = 1);
00564
00565
00566
00573 const TSubstance* operator[](const TSubstanceType* Type) const;
00574
00579 const TPEList<TSubstance>& Content(void) const;
00580
00589 friend ostream& operator<<(ostream& os, const TSubstanceSet& Set);
00590
00600 bool load( TDataPackageList* in, const string& sIdentifier, bool bUnique=true );
00610 bool save( TDataPackageList* out, const string& sIdentifier, bool bUnique=true ) const;
00611 protected:
00615 TSubstance* FindSubstance(const TSubstanceType* type) const;
00619 void DeleteSubstance(TSubstance* Subst);
00620
00621
00622
00623
00624 TPEList<TSubstance> fContains;
00625 };
00626
00627
00628
00629
00643 class TSubstanceHold : private TSubstanceSet
00644 {
00645 public:
00646 TSubstanceHold(void);
00647 ~TSubstanceHold(void);
00648 TSubstanceHold(const TSubstanceHold& Hold2);
00649 TSubstanceHold& operator=(const TSubstanceHold& Hold2);
00650
00651
00652
00653 TOSVal TotalSpace(const uint2 uCClass) const;
00654 TOSVal AvailableSpace(const uint2 uCClass) const;
00655 TOSVal UsedSpace(const uint2 uCClass) const;
00656
00657 void Clear(void);
00658
00659 void Empty(void);
00660
00661
00662 bool GetAllFrom(TSubstanceHold* Hold2);
00663 bool GetFrom(TSubstanceHold* Hold2, const TSubstanceSet& MaxAbsolute,
00664 const TSubstanceSet& MaxRelative);
00665 bool SplitOff(TSubstanceHold* Hold2);
00666
00667 bool CanAdd(const TSubstanceSet& Set) const;
00668 bool Add(const TSubstanceSet& Set2, TSubstanceSet* Added);
00669 bool CanRemove(const TSubstanceSet& Set,
00670 const int4 iNum = 1, const int4 iDenom = 1) const;
00671 bool Remove(const TSubstanceSet& Set, TSubstanceSet* Removed,
00672 const int4 iNum = 1, const int4 iDenom = 1);
00673
00674
00675 bool CanAdd(const TSubstance& Subst) const;
00676 bool Add(const TSubstance& Subst, TSubstance* Added);
00677 bool CanRemove(const TSubstance& Subst,
00678 const int4 iNum = 1, const int4 iDenom = 1) const;
00679 bool Remove(const TSubstance& Subst, TSubstance* Removed,
00680 const int4 iNum = 1, const int4 iDenom = 1);
00681
00682
00683 void UpdateCargo(void);
00684
00685 friend ostream& operator<<(ostream& os, const TSubstanceHold& Hold);
00686
00696 bool load( TDataPackageList* in, const string& sIdentifier, bool bUnique=true );
00706 bool save( TDataPackageList* out, const string& sIdentifier, bool bUnique=true ) const;
00707 private:
00708 vector<TOSVal> fTotalSpace;
00709 vector<TOSVal> fAvailSpace;
00710
00711
00712 void In(const TSubstance& s);
00713 void Out(const TSubstance& s, const int4 iNum, const int4 iDenom);
00714 };
00715
00716
00717
00718 #endif // __SUBSTANCE_INCLUDED