Main Page   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members  

substance.h

00001 // $Id: substance_8h-source.html,v 1.2 2002/06/20 17:09:51 mkrohn5 Exp $
00002 //
00003 // Substance Header File
00004 // Written by: Alberto Barsella
00005 //
00006 // Copyright (C) 1999, 2000, Alberto Barsella <Alberto.Barsella@univ-lille1.fr>
00007 //
00008 // This program is free software; you can redistribute it and/or modify
00009 // it under the terms of the GNU General Public License as published by
00010 // the Free Software Foundation; either version 1, or (at your option)
00011 // any later version.
00012 //
00013 // This program is distributed in the hope that it will be useful,
00014 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00015 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00016 // GNU General Public License for more details.
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     // accessors
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;        // name of the substance
00193     string fAbbrev;      // abbreviation of name, language independent,
00194                          // used in the creation of ASCII files
00195     SubstanceId fId;     // Id of the substance
00196     uint2  fCargoClass;  // type of cargo space used by the substance
00197     int2   fUnitSize;    // size (cargo space) of a unit
00198     int2   fUnitMass;    // mass (kT) of a unit
00199     // the above values are stored as int2 as they'll not be big
00200 
00201     // this one is needed to speed things up. Since update needs the
00202     // available cargo space we compute it ONLY for substances needing updates
00203     bool   fUpdatable;
00204 
00205     // global list of substances, indexed by Id,
00206     // and max # for cargo class
00207     static vector<TSubstanceType*> fSubstanceTable;
00208     static uint2 fCargoClasses;
00209 
00210     // disallow duplication of object
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;    // link to the type of the substance
00397     TOSVal fAmount;               // amount of the specified substance
00398 
00399     // creation occurs through TSubstanceType, constructor is then
00400     // private and the class is friendly
00401 
00402     // iAmount = 0
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     // accessor to subs
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     // substances contained, a list of TSubstance objects
00622     // the Infinity and Maximum are acceptable values
00623     // to identify an infinite supply or an unlimited storage space
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     // TSubstanceHold overloads the Set functions to incorporate
00652     // cargo space checks
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     // as clear, but only eliminates positive-size items
00659     void Empty(void);
00660 
00661     // Hold-specific manipulations (substance transfers, split, merge is Set::Add)
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     // Single substance manipulation
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     // update stuff inside the Hold
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     // low-level insert/remove functions
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

Generated on Thu Jun 20 18:13:16 2002 for Stellar Legacy by doxygen1.2.13.1 written by Dimitri van Heesch, © 1997-2001