lestes::lang::cplus::lex::macro_storage Class Reference

Storage of defined macros. More...

#include <macro_storage.hh>

Inheritance diagram for lestes::lang::cplus::lex::macro_storage:

lestes::std::object lestes::std::mem::keystone List of all members.

Public Member Functions

void define (const ptr< macro > &a_macro)
 Defines new macro.
void undef (const ptr< pp_token > &tok)
 Undefines macro.
bool defined (const ptr< pp_token > &tok)
 Tests whether a macro is defined.
ptr< macrolookup (const ptr< token_value > &a_name)
 Searches for a macro of given name.
void clear (void)
 Discards user defined macros.

Static Public Member Functions

static ptr< macro_storagecreate (void)
 Returns new storage.

Protected Member Functions

 macro_storage (void)
 Constructs empty object.
virtual void gc_mark (void)
 Marks the object.

Private Types

typedef map< srp< token_value >,
srp< macro > > 
storage_type
 Type of storage for macros.

Private Attributes

srp< storage_typestorage
 Storage for macros.

Detailed Description

Storage of defined macros.

Represents storage of defined macros. Handles definition, removal and lookup.

Definition at line 56 of file macro_storage.hh.


Member Typedef Documentation

typedef map< srp<token_value>, srp<macro> > lestes::lang::cplus::lex::macro_storage::storage_type [private]

Type of storage for macros.

Definition at line 77 of file macro_storage.hh.


Constructor & Destructor Documentation

lestes::lang::cplus::lex::macro_storage::macro_storage ( void   )  [protected]

Constructs empty object.

Constructs empty object.

Definition at line 53 of file macro_storage.cc.

Referenced by create().

00053                                 :
00054         storage(storage_type::create())
00055 {
00056         // TODO pt add predefined
00057 }


Member Function Documentation

void lestes::lang::cplus::lex::macro_storage::define ( const ptr< macro > &  a_macro  ) 

Defines new macro.

Defines new macro, checks for redefinition.

Precondition:
a_macro != NULL
Parameters:
a_macro The macro to be defined.

Definition at line 64 of file macro_storage.cc.

References lestes::is_equal(), lassert, lestes::lang::cplus::lex::macro_redefinition_different, lestes::lang::cplus::lex::predefined_macro_redefined, lestes::lang::cplus::lex::previous_definition, lestes::report, and storage.

00065 {
00066         lassert(a_macro);
00067         
00068         ptr<token_value> name = a_macro->name_get();
00069         
00070         storage_type::iterator it = storage->find(name);
00071         if (it == storage->end()) {
00072                 storage->insert(make_pair(name,a_macro));
00073                 return;
00074         }
00075         
00076         ptr<macro> orig = (*it).second;
00077         if (orig->predefined_get()) {
00078                 // redefinition of predefined internal macro
00079                 report << predefined_macro_redefined << name->content_get() << a_macro->location_get();
00080                 return;
00081         }
00082         
00083         // redefinition is equivalent, do nothing
00084         if (is_equal(a_macro,orig)) return;
00085 
00086         // macro redefinition is different
00087         report << macro_redefinition_different << name->content_get() << a_macro->location_get();
00088         // this is the location of the previous definition
00089         report << previous_definition << orig->location_get();
00090 }

void lestes::lang::cplus::lex::macro_storage::undef ( const ptr< pp_token > &  tok  ) 

Undefines macro.

Undefines macro, checks whether was defined.

Precondition:
tok != NULL
Parameters:
tok The token with name of macro to undefine.

Definition at line 98 of file macro_storage.cc.

References lestes::lang::cplus::lex::expected_macro_name, lassert, lestes::lang::cplus::lex::predefined_macro_undefined, lestes::report, and storage.

00099 {
00100         lassert(tok);
00101   
00102         if (!tok->is_name()) {
00103                 // expected name of macro to undefine
00104                 report << expected_macro_name << tok->location_get();
00105                 return;
00106         }
00107   
00108         ptr<token_value> name = tok->value_get();
00109 
00110         storage_type::iterator it = storage->find(name);
00111         if (it == storage->end()) return;
00112         
00113         ptr<macro> m = (*it).second;
00114         
00115         if (m->predefined_get()) {
00116                 // undefining predefined macro
00117                 report << predefined_macro_undefined << name->content_get() << tok->location_get();
00118                 return;
00119         }
00120 
00121         storage->erase(it);
00122 }

bool lestes::lang::cplus::lex::macro_storage::defined ( const ptr< pp_token > &  tok  ) 

Tests whether a macro is defined.

Tests whether macro of the given name is currently defined.

Precondition:
tok != NULL
Parameters:
tok The token containing macro name to test.
Returns:
true If the macro of this name is defined.

Definition at line 130 of file macro_storage.cc.

References lestes::lang::cplus::lex::expected_macro_name, lassert, lestes::report, and storage.

00131 {
00132         lassert(tok);
00133 
00134         if (!tok->is_name()) {
00135                 // expected name of macro
00136                 report << expected_macro_name << tok->location_get();
00137                 // such macro is not defined
00138                 return false;
00139         }
00140   
00141         ptr<token_value> name = tok->value_get();
00142 
00143         return storage->find(name) != storage->end();
00144 }

ptr< macro > lestes::lang::cplus::lex::macro_storage::lookup ( const ptr< token_value > &  name  ) 

Searches for a macro of given name.

Searches for macro of given name.

Todo:
pt return special values for __LINE__ etc
Precondition:
name != NULL
Parameters:
name The name of the searched macro.
Returns:
The macro of the given name, or NULL if such macro is not defined.

Definition at line 153 of file macro_storage.cc.

References lassert, and storage.

00154 {
00155         lassert(name);
00156 
00157         // TODO check special names (__LINE__) etc
00158         storage_type::iterator it = storage->find(name);
00159         if (it == storage->end()) return NULL;
00160         return (*it).second;
00161 }

void lestes::lang::cplus::lex::macro_storage::clear ( void   ) 

Discards user defined macros.

ptr< macro_storage > lestes::lang::cplus::lex::macro_storage::create ( void   )  [static]

Returns new storage.

Returns new instance of the class.

Returns:
The new storage.

Definition at line 176 of file macro_storage.cc.

References macro_storage().

00177 {
00178         return new macro_storage();
00179 }

void lestes::lang::cplus::lex::macro_storage::gc_mark ( void   )  [protected, virtual]

Marks the object.

Marks the object.

Reimplemented from lestes::std::mem::keystone.

Definition at line 166 of file macro_storage.cc.

References lestes::std::mem::keystone::gc_mark(), and storage.

00167 {
00168         storage.gc_mark();
00169 	::lestes::std::object::gc_mark();
00170 }


Member Data Documentation

srp<storage_type> lestes::lang::cplus::lex::macro_storage::storage [private]

Storage for macros.

Definition at line 79 of file macro_storage.hh.

Referenced by define(), defined(), gc_mark(), lookup(), and undef().


The documentation for this class was generated from the following files:
Generated on Mon Feb 12 18:24:18 2007 for lestes by doxygen 1.5.1-20070107