versionidentifier.cpp

Go to the documentation of this file.
00001 /*
00002      This file is part of Advanced Strategic Command; http://www.asc-hq.de
00003      Copyright (C) 1994-2010  Martin Bickel  and  Marc Schellenberger
00004  
00005      This program is free software; you can redistribute it and/or modify
00006      it under the terms of the GNU General Public License as published by
00007      the Free Software Foundation; either version 2 of the License, or
00008      (at your option) any later version.
00009  
00010      This program is distributed in the hope that it will be useful,
00011      but WITHOUT ANY WARRANTY; without even the implied warranty of
00012      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013      GNU General Public License for more details.
00014  
00015      You should have received a copy of the GNU General Public License
00016      along with this program; see the file COPYING. If not, write to the 
00017      Free Software Foundation, Inc., 59 Temple Place, Suite 330, 
00018      Boston, MA  02111-1307  USA
00019 */
00020 
00021 #include "versionidentifier.h"
00022 
00023 #include <boost/regex.hpp>
00024 #include <boost/algorithm/string.hpp>
00025 #include <boost/algorithm/string/classification.hpp>
00026 
00027 #include "errors.h"
00028 #include "basestrm.h"
00029 
00030 VersionIdentifier::VersionIdentifier()
00031 {
00032 }
00033 
00034 VersionIdentifier :: VersionIdentifier( const ASCString& version )
00035 {
00036    fromString( version );
00037 }
00038 
00039 bool VersionIdentifier :: empty()
00040 {
00041    return versions.empty();
00042 }
00043 
00044 
00045 ASCString VersionIdentifier :: toString() const 
00046 {
00047    ASCString s;
00048    for ( int i = 0; i < versions.size(); ++i ) {
00049       if ( i >= 1 )
00050          s += ".";
00051       s += ASCString::toString( versions[i] );
00052    }
00053    return s;
00054 }
00055 
00056 void VersionIdentifier :: fromString( const ASCString& v )
00057 {
00058    versions.clear();
00059    
00060    boost::regex versionformat( "\\s*(\\d+)(\\.\\d+)*\\s*");
00061    boost::smatch what;
00062 
00063    if( !boost::regex_match( v, what, versionformat)) 
00064       throw ASCmsgException( v + " is not a valid version identifier");
00065    
00066    typedef std::vector< ASCString > Split_vector_type;
00067    Split_vector_type splitVector;
00068    split( splitVector, v, boost::is_any_of(".") );
00069    
00070    for ( vector<ASCString>::const_iterator i = splitVector.begin(); i != splitVector.end(); ++i ) {
00071       int num = atoi( i->c_str() );
00072       versions.push_back( num );
00073    }
00074 }
00075 
00076 
00077 VersionIdentifier :: VersionIdentifier( const VersionIdentifier& version )
00078 {
00079    versions = version.versions;
00080 }
00081       
00082 static const int versionIdentifierStreamVersion = 1;      
00083       
00084 void VersionIdentifier :: read ( tnstream& stream )
00085 {
00086    int version = stream.readInt();
00087    if ( version != versionIdentifierStreamVersion  )
00088       throw tinvalidversion ( "VersionIdentifier", versionIdentifierStreamVersion, version );
00089 
00090    readClassContainer( versions, stream );
00091 }
00092 
00093 
00094 void VersionIdentifier :: write ( tnstream& stream ) const
00095 {
00096    stream.writeInt( versionIdentifierStreamVersion  );
00097    writeClassContainer( versions, stream );
00098 }
00099 
00100 bool VersionIdentifier:: trailZero( int index ) const 
00101 {
00102    for ( int i = index; i < versions.size(); ++i )
00103       if ( versions[i] != 0 )
00104          return false;
00105    return true;
00106 }
00107 
00108 
00109 bool VersionIdentifier::operator<= ( const VersionIdentifier& v ) const 
00110 { 
00111    int m = min ( v.versions.size(), versions.size() );
00112    for ( int i = 0; i < m; ++i ) {
00113       if ( versions[i] > v.versions[i] )
00114          return false;
00115    }
00116    if ( versions.size() < v.versions.size() ) {
00117       return true;
00118    } else {
00119       if ( trailZero( v.versions.size() ))
00120          return true;
00121       else
00122          return false;
00123    }
00124 };
00125 
00126 
00127 bool VersionIdentifier::operator< ( const VersionIdentifier& v ) const 
00128 { 
00129    int m = min ( v.versions.size(), versions.size() );
00130    for ( int i = 0; i < m; ++i ) {
00131        if ( versions[i] < v.versions[i] )
00132           return true;
00133        if ( versions[i] > v.versions[i] )
00134           return false;
00135    }
00136    if ( versions.size() < v.versions.size() ) {
00137       if ( v.trailZero( versions.size() ))
00138          return false;
00139       else
00140          return true;
00141    } else {
00142        return false;
00143    }
00144 };
00145 
00146 bool VersionIdentifier::operator> ( const VersionIdentifier& v ) const 
00147 {
00148    return !operator<=(v);
00149 }
00150    
00151 bool VersionIdentifier::operator>= ( const VersionIdentifier& v ) const 
00152 {
00153    return !operator<(v);
00154 }
00155    
00156 
00157 
00158 bool VersionIdentifier::operator== ( const VersionIdentifier& v ) const
00159 { 
00160    int m = min ( v.versions.size(), versions.size() );
00161    for ( int i = 0; i < m; ++i ) {
00162       if ( versions[i] != v.versions[i] )
00163          return false;
00164    }
00165    if ( versions.size() < v.versions.size() ) {
00166       if ( v.trailZero( versions.size() ))
00167          return true;
00168       else
00169          return false;
00170    } else {
00171       if ( trailZero( v.versions.size() ))
00172          return true;
00173       else
00174          return false;
00175    }
00176 }
00177 
00178 bool VersionIdentifier::operator!= ( const VersionIdentifier& v ) const 
00179 {
00180    return !operator==(v);
00181 };
00182 

Generated on Mon May 21 01:26:39 2012 for Advanced Strategic Command by  doxygen 1.5.1