www.pudn.com > SimpleMUD.rar > Entity.h


// MUD Programming 
// Ron Penton 
// (C)2003 
// Entity.h - This is a base class defining classes in SimpleMUD that may be 
//             matched by name either partially or fully, and have ID's 
//  
//  
 
 
#ifndef SIMPLEMUDENTITY_H 
#define SIMPLEMUDENTITY_H 
 
#include  
#include "BasicLib/BasicLib.h" 
 
 
namespace SimpleMUD 
{ 
 
typedef unsigned int entityid; 
using std::string; 
 
// -------------------------------------------------------------------- 
//  This class has a given name, and will allow you to match 
//  the name with any other names either partially or fully. 
//  It also has ID's 
// -------------------------------------------------------------------- 
class Entity 
{ 
public: 
 
 
    // -------------------------------------------------------------------- 
    //  Constructor 
    // -------------------------------------------------------------------- 
    inline Entity() 
    { 
        m_name = "UNDEFINED"; 
        m_id = 0; 
    } 
 
    // -------------------------------------------------------------------- 
    //  Retrieves a reference to the name, which is modifiable. 
    // -------------------------------------------------------------------- 
    inline string& Name()   { return m_name; } 
 
 
    // -------------------------------------------------------------------- 
    //  returns the "comparison name", which is lowercased. This is because 
    //  all comparisons are case-insensitive. 
    // -------------------------------------------------------------------- 
    inline string CompName() const 
    {  
        return BasicLib::LowerCase( m_name ); 
    } 
 
    // -------------------------------------------------------------------- 
    //  Compares the name with a full match. Names must be identical except 
    //  for case. 
    // -------------------------------------------------------------------- 
    inline bool MatchFull( const string& p_str ) const 
    { 
        return CompName() == BasicLib::LowerCase( p_str ); 
    } 
 
    // -------------------------------------------------------------------- 
    //  Performs a partial match on the name, where it will match the first 
    //  n characters from m_name with a n-character-long string p_name. 
    //  Case-insensitive. 
    //  IE: "J", "j", "JO" all match "John".  "o", "ohn" will not. 
    // -------------------------------------------------------------------- 
    inline bool Match( const string& p_str ) const 
    { 
        // match on empty strings 
        if( p_str.size() == 0 ) 
            return true; 
 
        // grab the comparison name 
        string name = CompName(); 
        string search = BasicLib::LowerCase( p_str ); 
 
        // find the position of a match 
        size_t pos = name.find( search ); 
 
        // perform as many search passes as needed 
        // for example, if the user types "st" when searching a "rusty stake", 
        // only one pass would find the 'st' in "rusty", and determine that 
        // there is no match. That's why more than one pass is needed. 
        while( pos != string::npos ) 
        { 
            // match found at beginning, or match found at beginning of a word,  
            // therefore, return true. 
            if( pos == 0 || m_name[pos-1] == ' ' ) 
                return true; 
 
            // perform another search, starting at where the last one left off 
            pos = name.find( search, pos + 1 ); 
        } 
 
        // no matches 
        return false; 
    } 
 
    // -------------------------------------------------------------------- 
    //  Returns the ID for the entity 
    // -------------------------------------------------------------------- 
    inline entityid& ID()    { return m_id; } 
 
 
protected: 
    string m_name; 
    entityid m_id; 
 
};  // end class Entity 
 
 
 
struct matchentityfull 
{  
    matchentityfull( const string& p_str ) 
        : m_str( p_str ) { /* do nothing */ } 
 
    bool operator() ( const Entity& p_entity ) 
    { 
        return p_entity.MatchFull( m_str ); 
    } 
 
    bool operator() ( Entity* p_entity ) 
    { 
        return p_entity != 0 && p_entity->MatchFull( m_str ); 
    } 
 
 
    string m_str; 
}; 
 
 
struct matchentity 
{  
    matchentity( const string& p_str ) 
        : m_str( p_str ) { /* do nothing */ } 
 
    bool operator() ( const Entity& p_entity ) 
    { 
        return p_entity.Match( m_str ); 
    } 
 
    bool operator() ( Entity* p_entity ) 
    { 
        return p_entity != 0 && p_entity->Match( m_str ); 
    } 
 
    string m_str; 
}; 
 
 
 
 
 
 
 
}   // end namespace SimpleMUD 
 
 
#endif