- Timestamp:
- 04/29/15 18:46:16 (10 years ago)
- Location:
- trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/nv/lua/lua_path.hh
r345 r359 4 4 // This file is part of NV Libraries. 5 5 // For conditions of distribution and use, see copyright notice in nv.hh 6 // 7 // TODO : prepare tests: 8 // * correctness tests 9 // * compatibility tests 10 // * performance tests 11 // TODO : resolve should not take a lua_State 6 12 7 13 #ifndef NV_LUA_PATH_HH … … 10 16 #include <nv/core/common.hh> 11 17 #include <nv/core/string.hh> 18 #include <nv/core/string_ref.hh> 12 19 #include <cstring> 13 20 … … 21 28 class path 22 29 { 23 struct element 30 public: 31 template < typename... Args > 32 path( Args&&... args ) : m_count(0) 24 33 { 25 size_t value; 26 size_t length; 27 element() : value( 0 ), length( 0 ) {} 28 }; 29 30 31 public: 32 path( nv::string p ); 33 path( const char* p ); 34 path( unsigned i ); 35 36 template < typename T1, typename T2 > 37 path( const T1& p1, const T2& p2 ) : m_count( 0 ) 38 { 39 const size_t l1 = string_length<T1>::get( p1 ); 40 const size_t l2 = string_length<T2>::get( p2 ); 41 m_path.reserve( l1 + l2 + 1 ); 42 push( p1, l1 ); 43 push( p2, l2 ); 44 } 45 46 template < typename T1, typename T2, typename T3 > 47 path( const T1& p1, const T2& p2, const T3& p3 ) : m_count( 0 ) 48 { 49 const size_t l1 = string_length<T1>::get( p1 ); 50 const size_t l2 = string_length<T2>::get( p2 ); 51 const size_t l3 = string_length<T3>::get( p3 ); 52 m_path.reserve( l1 + l2 + l3 + 1 ); 53 push( p1, l1 ); 54 push( p2, l2 ); 55 push( p3, l3 ); 56 } 57 58 template < typename T1, typename T2, typename T3, typename T4 > 59 path( const T1& p1, const T2& p2, const T3& p3, const T4& p4 ) : m_count( 0 ) 60 { 61 const size_t l1 = string_length<T1>::get( p1 ); 62 const size_t l2 = string_length<T2>::get( p2 ); 63 const size_t l3 = string_length<T3>::get( p3 ); 64 const size_t l4 = string_length<T4>::get( p4 ); 65 m_path.reserve( l1 + l2 + l3 + l4 + 1 ); 66 push( p1, l1 ); 67 push( p2, l2 ); 68 push( p3, l3 ); 69 push( p4, l4 ); 70 } 71 72 template < typename T1, typename T2, typename T3, typename T4, typename T5 > 73 path( const T1& p1, const T2& p2, const T3& p3, const T4& p4, const T5& p5 ) : m_count( 0 ) 74 { 75 const size_t l1 = string_length<T1>::get( p1 ); 76 const size_t l2 = string_length<T2>::get( p2 ); 77 const size_t l3 = string_length<T3>::get( p3 ); 78 const size_t l4 = string_length<T4>::get( p4 ); 79 const size_t l5 = string_length<T5>::get( p5 ); 80 m_path.reserve( l1 + l2 + l3 + l4 + l5 + 1 ); 81 push( p1, l1 ); 82 push( p2, l2 ); 83 push( p3, l3 ); 84 push( p4, l4 ); 85 push( p4, l5 ); 34 static_assert( sizeof...( Args ) < 8, "Path can only take up to 8 arguments!" ); 35 initialize( std::forward<Args>( args )... ); 86 36 } 87 37 88 38 std::string to_string() const; 89 39 bool resolve( lua_State* L, bool global = true ) const; 40 90 41 private: 42 template < typename T > 43 void initialize( T&& arg ) 44 { 45 push( std::forward<T>( arg ) ); 46 if ( m_count == 1 && m_elements[0].length ) parse(); 47 } 48 49 template < typename T, typename... Args > 50 void initialize( T&& arg, Args&&... args ) 51 { 52 push( std::forward<T>( arg ) ); 53 initialize( std::forward<Args>( args )... ); 54 } 91 55 92 56 void parse(); 93 void push( size_t start, size_t length ); 94 void push( size_t e ); 95 void push( const nv::string& p, size_t lenght ); 96 void push( const char* s, size_t length ); 57 void push( size_t value ); 58 void push( string_ref p ); 59 97 60 private: 98 element m_elements[8]; 99 sint32 m_count; 100 std::string m_path; 61 struct element 62 { 63 union 64 { 65 size_t value; 66 const char* str; 67 }; 68 size_t length; 69 }; 70 71 element m_elements[8]; 72 sint32 m_count; 101 73 }; 102 74 -
trunk/src/lua/lua_path.cc
r319 r359 11 11 using namespace nv; 12 12 13 lua::path::path( nv::string p ) 14 : m_count(0), m_path( std::move( p ) ) 13 void lua::path::parse() 15 14 { 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++; 17 32 } 18 33 19 lua::path::path( const char* p ) 20 : m_count(0), m_path( p ) 34 void lua::path::push( size_t value ) 21 35 { 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; 49 37 m_elements[ m_count ].length = 0; 50 38 m_count++; 51 39 } 52 40 53 void lua::path::push( size_t start, size_t length)41 void nv::lua::path::push( string_ref p ) 54 42 { 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(); 73 45 m_count++; 74 46 } … … 84 56 if ( m_elements[i].length > 0 ) 85 57 { 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 ); 87 59 } 88 60 else … … 105 77 { 106 78 std::string result; 107 result.reserve( 2 * m_path.length());79 result.reserve( 64 ); 108 80 bool dot = false; 109 81 for ( const element& e : m_elements ) … … 117 89 else 118 90 { 119 result.append( m_path, e.value, e.length );91 result.append( e.str, e.length ); 120 92 dot = true; 121 93 }
Note: See TracChangeset
for help on using the changeset viewer.