Ignore:
Timestamp:
04/29/15 18:46:16 (10 years ago)
Author:
epyon
Message:
  • rewrite of lua_path: doesn't use dynamic memory anymore variadic constructor and perfect forwarding leverages string_ref general cleanup
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/lua/lua_path.cc

    r319 r359  
    1111using namespace nv;
    1212
    13 lua::path::path( nv::string p )
    14         : m_count(0), m_path( std::move( p ) )
     13void lua::path::parse()
    1514{
    16         parse();
     15        if ( m_elements[0].length == 0 || m_elements[0].str == nullptr ) return;
     16        string_ref spath( m_elements[0].str, m_elements[0].length );
     17        m_count = 0;
     18        size_t point = spath.find( '.' );
     19
     20        while ( point != std::string::npos )
     21        {
     22                m_elements[m_count].str    = spath.data();
     23                m_elements[m_count].length = point;
     24                m_count++;
     25                spath.remove_prefix( point + 1 );
     26                point = spath.find( '.' );
     27        }
     28
     29        m_elements[m_count].str    = spath.data();
     30        m_elements[m_count].length = spath.length();
     31        m_count++;
    1732}
    1833
    19 lua::path::path( const char* p )
    20         : m_count(0), m_path( p )
     34void lua::path::push( size_t value )
    2135{
    22         parse();
    23 }
    24 
    25 lua::path::path( unsigned i )
    26         : m_count(0)
    27 {
    28         push( i );
    29 }
    30 
    31 void lua::path::parse()
    32 {
    33         size_t start = 0;
    34         size_t point = m_path.find('.');
    35 
    36         while( point != std::string::npos )
    37         {
    38                 push( start, point-start );
    39                 start = point+1;
    40                 point = m_path.find( '.', start );
    41         }
    42 
    43         push( start, m_path.length() - start );
    44 }
    45 
    46 void lua::path::push( size_t e )
    47 {
    48         m_elements[ m_count ].value  = e;
     36        m_elements[ m_count ].value  = value;
    4937        m_elements[ m_count ].length = 0;
    5038        m_count++;
    5139}
    5240
    53 void lua::path::push( size_t start, size_t length )
     41void nv::lua::path::push( string_ref p )
    5442{
    55         m_elements[ m_count ].value  = start;
    56         m_elements[ m_count ].length = length;
    57         m_count++;
    58 }
    59 
    60 void lua::path::push( const char* p, size_t length )
    61 {
    62         m_elements[ m_count ].value  = m_path.length();
    63         m_elements[ m_count ].length = length;
    64         m_path.append( p, length );
    65         m_count++;
    66 }
    67 
    68 void lua::path::push( const std::string& s, size_t length )
    69 {
    70         m_elements[ m_count ].value  = m_path.length();
    71         m_elements[ m_count ].length = length;
    72         m_path.append( s, 0, length );
     43        m_elements[ m_count ].str    = p.data();
     44        m_elements[ m_count ].length = p.length();
    7345        m_count++;
    7446}
     
    8456                        if ( m_elements[i].length > 0 )
    8557                        {
    86                                 lua_pushlstring( L, m_path.c_str() + m_elements[i].value, m_elements[i].length );
     58                                lua_pushlstring( L, m_elements[i].str, m_elements[i].length );
    8759                        }
    8860                        else
     
    10577{
    10678        std::string result;
    107         result.reserve( 2 * m_path.length() );
     79        result.reserve( 64 );
    10880        bool dot = false;
    10981        for ( const element& e : m_elements )
     
    11789                else
    11890                {
    119                         result.append( m_path, e.value, e.length );
     91                        result.append( e.str, e.length );
    12092                        dot = true;
    12193                }
Note: See TracChangeset for help on using the changeset viewer.