Changeset 0dd3a2f for translator/SynTree/Type.h
- Timestamp:
- May 18, 2015, 11:20:23 AM (9 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, ctor, deferred_resn, demangler, enum, forall-pointer-decay, gc_noraii, jacob/cs343-translation, jenkins-sandbox, master, memory, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, string, with_gc
- Children:
- 51587aa
- Parents:
- a32b204
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
translator/SynTree/Type.h
ra32b204 r0dd3a2f 1 // 2 // Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo 3 // 4 // The contents of this file are covered under the licence agreement in the 5 // file "LICENCE" distributed with Cforall. 6 // 7 // Type.h -- 8 // 9 // Author : Richard C. Bilson 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon May 18 11:01:40 2015 13 // Update Count : 1 14 // 15 1 16 #ifndef TYPE_H 2 17 #define TYPE_H … … 6 21 #include "Mutator.h" 7 22 8 9 23 class Type { 10 24 public: 11 12 13 14 15 Qualifiers &operator+=( const Qualifiers &other );16 Qualifiers &operator-=( const Qualifiers &other );17 Qualifiers operator+( const Type::Qualifiers &other );18 bool operator==( const Qualifiers &other );19 bool operator!=( const Qualifiers &other );20 bool operator<=( const Qualifiers &other );21 bool operator>=( const Qualifiers &other );22 bool operator<( const Qualifiers &other );23 bool operator>( const Qualifiers &other );24 25 bool isConst;26 bool isVolatile;27 bool isRestrict;28 bool isLvalue;29 bool isAtomic;30 bool isAttribute;31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 private: 57 58 25 struct Qualifiers { 26 Qualifiers(): isConst( false ), isVolatile( false ), isRestrict( false ), isLvalue( false ), isAtomic( false ), isAttribute( false ) {} 27 Qualifiers( bool isConst, bool isVolatile, bool isRestrict, bool isLvalue, bool isAtomic, bool isAttribute): isConst( isConst ), isVolatile( isVolatile ), isRestrict( isRestrict ), isLvalue( isLvalue ), isAtomic( isAtomic ), isAttribute( isAttribute ) {} 28 29 Qualifiers &operator+=( const Qualifiers &other ); 30 Qualifiers &operator-=( const Qualifiers &other ); 31 Qualifiers operator+( const Type::Qualifiers &other ); 32 bool operator==( const Qualifiers &other ); 33 bool operator!=( const Qualifiers &other ); 34 bool operator<=( const Qualifiers &other ); 35 bool operator>=( const Qualifiers &other ); 36 bool operator<( const Qualifiers &other ); 37 bool operator>( const Qualifiers &other ); 38 39 bool isConst; 40 bool isVolatile; 41 bool isRestrict; 42 bool isLvalue; 43 bool isAtomic; 44 bool isAttribute; 45 }; 46 47 Type( const Qualifiers &tq ); 48 Type( const Type &other ); 49 virtual ~Type(); 50 51 Qualifiers &get_qualifiers() { return tq; } 52 bool get_isConst() { return tq.isConst; } 53 bool get_isVolatile() { return tq.isVolatile; } 54 bool get_isRestrict() { return tq.isRestrict; } 55 bool get_isLvalue() { return tq.isLvalue; } 56 bool get_isAtomic() { return tq.isAtomic; } 57 bool get_isAttribute() { return tq.isAttribute; } 58 void set_isConst( bool newValue ) { tq.isConst = newValue; } 59 void set_iisVolatile( bool newValue ) { tq.isVolatile = newValue; } 60 void set_isRestrict( bool newValue ) { tq.isRestrict = newValue; } 61 void set_isLvalue( bool newValue ) { tq.isLvalue = newValue; } 62 void set_isAtomic( bool newValue ) { tq.isAtomic = newValue; } 63 void set_isAttribute( bool newValue ) { tq.isAttribute = newValue; } 64 std::list<TypeDecl*>& get_forall() { return forall; } 65 66 virtual Type *clone() const = 0; 67 virtual void accept( Visitor &v ) = 0; 68 virtual Type *acceptMutator( Mutator &m ) = 0; 69 virtual void print( std::ostream &os, int indent = 0 ) const; 70 private: 71 Qualifiers tq; 72 std::list<TypeDecl*> forall; 59 73 }; 60 74 61 75 class VoidType : public Type { 62 76 public: 63 64 65 66 67 68 77 VoidType( const Type::Qualifiers &tq ); 78 79 virtual VoidType *clone() const { return new VoidType( *this ); } 80 virtual void accept( Visitor &v ) { v.visit( this ); } 81 virtual Type *acceptMutator( Mutator &m ) { return m.mutate( this ); } 82 virtual void print( std::ostream &os, int indent = 0 ) const; 69 83 }; 70 84 71 85 class BasicType : public Type { 72 86 public: 73 74 Bool,75 Char,76 SignedChar,77 UnsignedChar,78 ShortSignedInt,79 ShortUnsignedInt,80 SignedInt,81 UnsignedInt,82 LongSignedInt,83 LongUnsignedInt,84 LongLongSignedInt,85 LongLongUnsignedInt,86 Float,87 Double,88 LongDouble,89 FloatComplex,90 DoubleComplex,91 LongDoubleComplex,92 FloatImaginary,93 DoubleImaginary,94 LongDoubleImaginary,95 NUMBER_OF_BASIC_TYPES96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 private: 112 87 enum Kind { 88 Bool, 89 Char, 90 SignedChar, 91 UnsignedChar, 92 ShortSignedInt, 93 ShortUnsignedInt, 94 SignedInt, 95 UnsignedInt, 96 LongSignedInt, 97 LongUnsignedInt, 98 LongLongSignedInt, 99 LongLongUnsignedInt, 100 Float, 101 Double, 102 LongDouble, 103 FloatComplex, 104 DoubleComplex, 105 LongDoubleComplex, 106 FloatImaginary, 107 DoubleImaginary, 108 LongDoubleImaginary, 109 NUMBER_OF_BASIC_TYPES 110 }; 111 112 static const char *typeNames[]; // string names for basic types, MUST MATCH with Kind 113 114 BasicType( const Type::Qualifiers &tq, Kind bt ); 115 116 Kind get_kind() { return kind; } 117 void set_kind( Kind newValue ) { kind = newValue; } 118 119 virtual BasicType *clone() const { return new BasicType( *this ); } 120 virtual void accept( Visitor &v ) { v.visit( this ); } 121 virtual Type *acceptMutator( Mutator &m ) { return m.mutate( this ); } 122 virtual void print( std::ostream &os, int indent = 0 ) const; 123 124 bool isInteger() const; 125 private: 126 Kind kind; 113 127 }; 114 128 115 129 class PointerType : public Type { 116 130 public: 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 private: 136 137 138 139 140 141 131 PointerType( const Type::Qualifiers &tq, Type *base ); 132 PointerType( const Type::Qualifiers &tq, Type *base, Expression *dimension, bool isVarLen, bool isStatic ); 133 PointerType( const PointerType& ); 134 virtual ~PointerType(); 135 136 Type *get_base() { return base; } 137 void set_base( Type *newValue ) { base = newValue; } 138 Expression *get_dimension() { return dimension; } 139 void set_dimension( Expression *newValue ) { dimension = newValue; } 140 bool get_isVarLen() { return isVarLen; } 141 void set_isVarLen( bool newValue ) { isVarLen = newValue; } 142 bool get_isStatic() { return isStatic; } 143 void set_isStatic( bool newValue ) { isStatic = newValue; } 144 145 virtual PointerType *clone() const { return new PointerType( *this ); } 146 virtual void accept( Visitor &v ) { v.visit( this ); } 147 virtual Type *acceptMutator( Mutator &m ) { return m.mutate( this ); } 148 virtual void print( std::ostream &os, int indent = 0 ) const; 149 private: 150 Type *base; 151 152 // In C99, pointer types can be qualified in many ways e.g., int f( int a[ static 3 ] ) 153 Expression *dimension; 154 bool isVarLen; 155 bool isStatic; 142 156 }; 143 157 144 158 class ArrayType : public Type { 145 159 public: 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 private: 164 165 166 167 160 ArrayType( const Type::Qualifiers &tq, Type *base, Expression *dimension, bool isVarLen, bool isStatic ); 161 ArrayType( const ArrayType& ); 162 virtual ~ArrayType(); 163 164 Type *get_base() { return base; } 165 void set_base( Type *newValue ) { base = newValue; } 166 Expression *get_dimension() { return dimension; } 167 void set_dimension( Expression *newValue ) { dimension = newValue; } 168 bool get_isVarLen() { return isVarLen; } 169 void set_isVarLen( bool newValue ) { isVarLen = newValue; } 170 bool get_isStatic() { return isStatic; } 171 void set_isStatic( bool newValue ) { isStatic = newValue; } 172 173 virtual ArrayType *clone() const { return new ArrayType( *this ); } 174 virtual void accept( Visitor &v ) { v.visit( this ); } 175 virtual Type *acceptMutator( Mutator &m ) { return m.mutate( this ); } 176 virtual void print( std::ostream &os, int indent = 0 ) const; 177 private: 178 Type *base; 179 Expression *dimension; 180 bool isVarLen; 181 bool isStatic; 168 182 }; 169 183 170 184 class FunctionType : public Type { 171 185 public: 172 173 174 175 176 177 178 179 180 181 182 183 184 185 private: 186 187 188 189 190 191 192 193 186 FunctionType( const Type::Qualifiers &tq, bool isVarArgs ); 187 FunctionType( const FunctionType& ); 188 virtual ~FunctionType(); 189 190 std::list<DeclarationWithType*>& get_returnVals() { return returnVals; } 191 std::list<DeclarationWithType*>& get_parameters() { return parameters; } 192 bool get_isVarArgs() { return isVarArgs; } 193 void set_isVarArgs( bool newValue ) { isVarArgs = newValue; } 194 195 virtual FunctionType *clone() const { return new FunctionType( *this ); } 196 virtual void accept( Visitor &v ) { v.visit( this ); } 197 virtual Type *acceptMutator( Mutator &m ) { return m.mutate( this ); } 198 virtual void print( std::ostream &os, int indent = 0 ) const; 199 private: 200 std::list<DeclarationWithType*> returnVals; 201 std::list<DeclarationWithType*> parameters; 202 203 // does the function accept a variable number of arguments following the arguments 204 // specified in the parameters list. This could be because of 205 // - an ellipsis in a prototype declaration 206 // - an unprototyped declaration 207 bool isVarArgs; 194 208 }; 195 209 196 210 class ReferenceToType : public Type { 197 211 public: 198 199 200 201 202 203 204 205 206 207 208 209 212 ReferenceToType( const Type::Qualifiers &tq, const std::string &name ); 213 ReferenceToType( const ReferenceToType &other ); 214 virtual ~ReferenceToType(); 215 216 std::string get_name() const { return name; } 217 void set_name( std::string newValue ) { name = newValue; } 218 std::list< Expression* >& get_parameters() { return parameters; } 219 220 virtual ReferenceToType *clone() const = 0; 221 virtual void accept( Visitor &v ) = 0; 222 virtual Type *acceptMutator( Mutator &m ) = 0; 223 virtual void print( std::ostream &os, int indent = 0 ) const; 210 224 protected: 211 212 213 private: 214 225 virtual std::string typeString() const = 0; 226 std::list< Expression* > parameters; 227 private: 228 std::string name; 215 229 }; 216 230 217 231 class StructInstType : public ReferenceToType { 218 typedef ReferenceToType Parent; 219 public: 220 StructInstType( const Type::Qualifiers &tq, const std::string &name ) : Parent( tq, name ), baseStruct( 0 ) {} 221 StructInstType( const StructInstType &other ) : Parent( other ), baseStruct( other.baseStruct ) {} 222 223 StructDecl *get_baseStruct() const { return baseStruct; } 224 void set_baseStruct( StructDecl *newValue ) { baseStruct = newValue; } 225 226 // a utility function 227 void lookup( const std::string &name, std::list< Declaration* > &foundDecls ) const; 228 229 virtual StructInstType *clone() const { return new StructInstType( *this ); } 230 virtual void accept( Visitor &v ) { v.visit( this ); } 231 virtual Type *acceptMutator( Mutator &m ) { return m.mutate( this ); } 232 233 private: 234 virtual std::string typeString() const; 235 236 // this decl is not "owned" by the struct inst; it is merely a pointer to elsewhere in the tree, 237 // where the structure used in this type is actually defined 238 StructDecl *baseStruct; 232 typedef ReferenceToType Parent; 233 public: 234 StructInstType( const Type::Qualifiers &tq, const std::string &name ) : Parent( tq, name ), baseStruct( 0 ) {} 235 StructInstType( const StructInstType &other ) : Parent( other ), baseStruct( other.baseStruct ) {} 236 237 StructDecl *get_baseStruct() const { return baseStruct; } 238 void set_baseStruct( StructDecl *newValue ) { baseStruct = newValue; } 239 240 // a utility function 241 void lookup( const std::string &name, std::list< Declaration* > &foundDecls ) const; 242 243 virtual StructInstType *clone() const { return new StructInstType( *this ); } 244 virtual void accept( Visitor &v ) { v.visit( this ); } 245 virtual Type *acceptMutator( Mutator &m ) { return m.mutate( this ); } 246 private: 247 virtual std::string typeString() const; 248 249 // this decl is not "owned" by the struct inst; it is merely a pointer to elsewhere in the tree, 250 // where the structure used in this type is actually defined 251 StructDecl *baseStruct; 239 252 }; 240 253 241 254 class UnionInstType : public ReferenceToType { 242 243 public: 244 245 246 247 248 249 250 251 252 253 254 255 256 private: 257 258 259 260 261 255 typedef ReferenceToType Parent; 256 public: 257 UnionInstType( const Type::Qualifiers &tq, const std::string &name ) : Parent( tq, name ), baseUnion( 0 ) {} 258 UnionInstType( const UnionInstType &other ) : Parent( other ), baseUnion( other.baseUnion ) {} 259 260 UnionDecl *get_baseUnion() const { return baseUnion; } 261 void set_baseUnion( UnionDecl *newValue ) { baseUnion = newValue; } 262 263 // a utility function 264 void lookup( const std::string &name, std::list< Declaration* > &foundDecls ) const; 265 266 virtual UnionInstType *clone() const { return new UnionInstType( *this ); } 267 virtual void accept( Visitor &v ) { v.visit( this ); } 268 virtual Type *acceptMutator( Mutator &m ) { return m.mutate( this ); } 269 private: 270 virtual std::string typeString() const; 271 272 // this decl is not "owned" by the union inst; it is merely a pointer to elsewhere in the tree, 273 // where the union used in this type is actually defined 274 UnionDecl *baseUnion; 262 275 }; 263 276 264 277 class EnumInstType : public ReferenceToType { 265 typedef ReferenceToType Parent; 266 public: 267 EnumInstType( const Type::Qualifiers &tq, const std::string &name ) : Parent( tq, name ) {} 268 EnumInstType( const EnumInstType &other ) : Parent( other ) {} 269 270 virtual EnumInstType *clone() const { return new EnumInstType( *this ); } 271 virtual void accept( Visitor &v ) { v.visit( this ); } 272 virtual Type *acceptMutator( Mutator &m ) { return m.mutate( this ); } 273 274 private: 275 virtual std::string typeString() const; 278 typedef ReferenceToType Parent; 279 public: 280 EnumInstType( const Type::Qualifiers &tq, const std::string &name ) : Parent( tq, name ) {} 281 EnumInstType( const EnumInstType &other ) : Parent( other ) {} 282 283 virtual EnumInstType *clone() const { return new EnumInstType( *this ); } 284 virtual void accept( Visitor &v ) { v.visit( this ); } 285 virtual Type *acceptMutator( Mutator &m ) { return m.mutate( this ); } 286 private: 287 virtual std::string typeString() const; 276 288 }; 277 289 278 290 class ContextInstType : public ReferenceToType { 279 280 public: 281 282 283 284 285 286 287 288 289 290 private: 291 292 293 294 295 291 typedef ReferenceToType Parent; 292 public: 293 ContextInstType( const Type::Qualifiers &tq, const std::string &name ) : Parent( tq, name ) {} 294 ContextInstType( const ContextInstType &other ); 295 ~ContextInstType(); 296 297 std::list< Declaration* >& get_members() { return members; } 298 299 virtual ContextInstType *clone() const { return new ContextInstType( *this ); } 300 virtual void accept( Visitor &v ) { v.visit( this ); } 301 virtual Type *acceptMutator( Mutator &m ) { return m.mutate( this ); } 302 private: 303 virtual std::string typeString() const; 304 305 // this member is filled in by the validate pass, which instantiates the members of the correponding 306 // aggregate with the actual type parameters specified for this use of the context 307 std::list< Declaration* > members; 296 308 }; 297 309 298 310 class TypeInstType : public ReferenceToType { 299 300 public: 301 302 303 304 305 306 307 308 309 310 311 312 313 314 private: 315 316 317 318 319 311 typedef ReferenceToType Parent; 312 public: 313 TypeInstType( const Type::Qualifiers &tq, const std::string &name, TypeDecl *baseType ); 314 TypeInstType( const Type::Qualifiers &tq, const std::string &name, bool isFtype ); 315 TypeInstType( const TypeInstType &other ) : Parent( other ), baseType( other.baseType ), isFtype( other.isFtype ) {} 316 317 TypeDecl *get_baseType() const { return baseType; } 318 void set_baseType( TypeDecl *newValue ); 319 bool get_isFtype() const { return isFtype; } 320 void set_isFtype( bool newValue ) { isFtype = newValue; } 321 322 virtual TypeInstType *clone() const { return new TypeInstType( *this ); } 323 virtual void accept( Visitor &v ) { v.visit( this ); } 324 virtual Type *acceptMutator( Mutator &m ) { return m.mutate( this ); } 325 virtual void print( std::ostream &os, int indent = 0 ) const; 326 private: 327 virtual std::string typeString() const; 328 // this decl is not "owned" by the type inst; it is merely a pointer to elsewhere in the tree, 329 // where the type used here is actually defined 330 TypeDecl *baseType; 331 bool isFtype; 320 332 }; 321 333 322 334 class TupleType : public Type { 323 335 public: 324 325 326 327 328 329 330 331 332 333 334 private: 335 336 TupleType( const Type::Qualifiers &tq ); 337 TupleType( const TupleType& ); 338 virtual ~TupleType(); 339 340 std::list<Type*>& get_types() { return types; } 341 342 virtual TupleType *clone() const { return new TupleType( *this ); } 343 virtual void accept( Visitor &v ) { v.visit( this ); } 344 virtual Type *acceptMutator( Mutator &m ) { return m.mutate( this ); } 345 virtual void print( std::ostream &os, int indent = 0 ) const; 346 private: 347 std::list<Type*> types; 336 348 }; 337 349 338 350 class TypeofType : public Type { 339 351 public: 340 341 342 343 344 345 346 347 348 349 350 351 private: 352 352 TypeofType( const Type::Qualifiers &tq, Expression *expr ); 353 TypeofType( const TypeofType& ); 354 virtual ~TypeofType(); 355 356 Expression *get_expr() const { return expr; } 357 void set_expr( Expression *newValue ) { expr = newValue; } 358 359 virtual TypeofType *clone() const { return new TypeofType( *this ); } 360 virtual void accept( Visitor &v ) { v.visit( this ); } 361 virtual Type *acceptMutator( Mutator &m ) { return m.mutate( this ); } 362 virtual void print( std::ostream &os, int indent = 0 ) const; 363 private: 364 Expression *expr; 353 365 }; 354 366 355 367 class AttrType : public Type { 356 368 public: 357 AttrType( const Type::Qualifiers &tq, const std::string &name, Expression *expr ); 358 AttrType( const Type::Qualifiers &tq, const std::string &name, Type *type ); 359 AttrType( const AttrType& ); 360 virtual ~AttrType(); 361 362 std::string get_name() const { return name; } 363 void set_name( const std::string &newValue ) { name = newValue; } 364 Expression *get_expr() const { return expr; } 365 void set_expr( Expression *newValue ) { expr = newValue; } 366 Type *get_type() const { return type; } 367 void set_type( Type *newValue ) { type = newValue; } 368 bool get_isType() const { return isType; } 369 void set_isType( bool newValue ) { isType = newValue; } 370 371 virtual AttrType *clone() const { return new AttrType( *this ); } 372 virtual void accept( Visitor &v ) { v.visit( this ); } 373 virtual Type *acceptMutator( Mutator &m ) { return m.mutate( this ); } 374 virtual void print( std::ostream &os, int indent = 0 ) const; 375 376 private: 377 std::string name; 378 Expression *expr; 379 Type *type; 380 bool isType; 369 AttrType( const Type::Qualifiers &tq, const std::string &name, Expression *expr ); 370 AttrType( const Type::Qualifiers &tq, const std::string &name, Type *type ); 371 AttrType( const AttrType& ); 372 virtual ~AttrType(); 373 374 std::string get_name() const { return name; } 375 void set_name( const std::string &newValue ) { name = newValue; } 376 Expression *get_expr() const { return expr; } 377 void set_expr( Expression *newValue ) { expr = newValue; } 378 Type *get_type() const { return type; } 379 void set_type( Type *newValue ) { type = newValue; } 380 bool get_isType() const { return isType; } 381 void set_isType( bool newValue ) { isType = newValue; } 382 383 virtual AttrType *clone() const { return new AttrType( *this ); } 384 virtual void accept( Visitor &v ) { v.visit( this ); } 385 virtual Type *acceptMutator( Mutator &m ) { return m.mutate( this ); } 386 virtual void print( std::ostream &os, int indent = 0 ) const; 387 private: 388 std::string name; 389 Expression *expr; 390 Type *type; 391 bool isType; 381 392 }; 382 393 383 394 inline Type::Qualifiers &Type::Qualifiers::operator+=( const Type::Qualifiers &other ) { 384 385 386 387 388 389 395 isConst |= other.isConst; 396 isVolatile |= other.isVolatile; 397 isRestrict |= other.isRestrict; 398 isLvalue |= other.isLvalue; 399 isAtomic |= other.isAtomic; 400 return *this; 390 401 } 391 402 392 403 inline Type::Qualifiers &Type::Qualifiers::operator-=( const Type::Qualifiers &other ) { 393 394 395 396 397 404 if ( other.isConst ) isConst = 0; 405 if ( other.isVolatile ) isVolatile = 0; 406 if ( other.isRestrict ) isRestrict = 0; 407 if ( other.isAtomic ) isAtomic = 0; 408 return *this; 398 409 } 399 410 400 411 inline Type::Qualifiers Type::Qualifiers::operator+( const Type::Qualifiers &other ) { 401 402 403 412 Qualifiers q = other; 413 q += *this; 414 return q; 404 415 } 405 416 406 417 inline bool Type::Qualifiers::operator==( const Qualifiers &other ) { 407 408 && isVolatile == other.isVolatile409 && isRestrict == other.isRestrict418 return isConst == other.isConst 419 && isVolatile == other.isVolatile 420 && isRestrict == other.isRestrict 410 421 // && isLvalue == other.isLvalue 411 && isAtomic == other.isAtomic;422 && isAtomic == other.isAtomic; 412 423 } 413 424 414 425 inline bool Type::Qualifiers::operator!=( const Qualifiers &other ) { 415 416 || isVolatile != other.isVolatile417 || isRestrict != other.isRestrict426 return isConst != other.isConst 427 || isVolatile != other.isVolatile 428 || isRestrict != other.isRestrict 418 429 // || isLvalue != other.isLvalue 419 || isAtomic != other.isAtomic;430 || isAtomic != other.isAtomic; 420 431 } 421 432 422 433 inline bool Type::Qualifiers::operator<=( const Type::Qualifiers &other ) { 423 424 && isVolatile <= other.isVolatile425 && isRestrict <= other.isRestrict434 return isConst <= other.isConst 435 && isVolatile <= other.isVolatile 436 && isRestrict <= other.isRestrict 426 437 // && isLvalue >= other.isLvalue 427 && isAtomic == other.isAtomic;438 && isAtomic == other.isAtomic; 428 439 } 429 440 430 441 inline bool Type::Qualifiers::operator>=( const Type::Qualifiers &other ) { 431 432 && isVolatile >= other.isVolatile433 && isRestrict >= other.isRestrict442 return isConst >= other.isConst 443 && isVolatile >= other.isVolatile 444 && isRestrict >= other.isRestrict 434 445 // && isLvalue <= other.isLvalue 435 && isAtomic == other.isAtomic;446 && isAtomic == other.isAtomic; 436 447 } 437 448 438 449 inline bool Type::Qualifiers::operator<( const Type::Qualifiers &other ) { 439 450 return operator!=( other ) && operator<=( other ); 440 451 } 441 452 442 453 inline bool Type::Qualifiers::operator>( const Type::Qualifiers &other ) { 443 454 return operator!=( other ) && operator>=( other ); 444 455 } 445 456 446 457 #endif // TYPE_H 458 459 // Local Variables: // 460 // tab-width: 4 // 461 // mode: c++ // 462 // compile-command: "make install" // 463 // End: //
Note: See TracChangeset
for help on using the changeset viewer.