refactor StringFixedSize, auto str = String64()() use form was not doing copy elision

This commit is contained in:
Garux 2024-01-25 23:46:01 +06:00
parent f6a040c27b
commit b4e44bc8ed
8 changed files with 22 additions and 28 deletions

View File

@ -37,8 +37,11 @@ public:
StringFixedSize() { StringFixedSize() {
clear(); clear();
} }
explicit StringFixedSize( const char* string ){ template<typename ... Args, typename = std::enable_if_t<sizeof...(Args) != 1 || //prevent override of copy constructor
operator()( string ); !std::is_same_v<StringFixedSize,
std::decay_t<std::tuple_element_t<0, std::tuple<Args...>>>>>>
explicit StringFixedSize( Args&& ... args ){
operator()( std::forward<Args>( args ) ... );
} }
std::size_t write( const char* buffer, std::size_t length ) override { std::size_t write( const char* buffer, std::size_t length ) override {
if( m_length + length < SIZE ){ if( m_length + length < SIZE ){
@ -53,15 +56,14 @@ public:
return length; return length;
} }
StringFixedSize& operator=( const char* string ){ void operator=( const char* string ){
return operator()( string ); operator()( string );
} }
template<typename ... Args> template<typename ... Args>
StringFixedSize& operator()( Args&& ... args ){ void operator()( Args&& ... args ){
clear(); clear();
( *this << ... << std::forward<Args>( args ) ); ( *this << ... << std::forward<Args>( args ) );
return *this;
} }
operator const char*() const { operator const char*() const {

View File

@ -104,7 +104,7 @@ static void ProcessAdvertisements() {
bspAdvertisement_t& ad = bspAds.emplace_back(); bspAdvertisement_t& ad = bspAds.emplace_back();
ad.cellId = e.intForKey( "cellId" ); ad.cellId = e.intForKey( "cellId" );
// copy and clear the rest of memory // check for overflow by String64 // copy and clear the rest of memory // check for overflow by String64
const auto modelKey = String64()( e.valueForKey( "model" ) ); const String64 modelKey( e.valueForKey( "model" ) );
strncpy( ad.model, modelKey, sizeof( ad.model ) ); strncpy( ad.model, modelKey, sizeof( ad.model ) );
const bspModel_t& adModel = bspModels[atoi( modelKey.c_str() + 1 )]; const bspModel_t& adModel = bspModels[atoi( modelKey.c_str() + 1 )];
@ -396,8 +396,7 @@ static void ProcessWorldModel( entity_t& e ){
/* ydnar: fog hull */ /* ydnar: fog hull */
if ( e.read_keyvalue( value, "_foghull" ) ) { if ( e.read_keyvalue( value, "_foghull" ) ) {
const auto shader = String64()( "textures/", value ); MakeFogHullSurfs( String64( "textures/", value ) );
MakeFogHullSurfs( shader );
} }
/* ydnar: bug 645: do flares for lights */ /* ydnar: bug 645: do flares for lights */

View File

@ -100,7 +100,7 @@ static void SwapBSPFile(){
const shaderInfo_t *si = ShaderInfoForShader( shader.shader ); const shaderInfo_t *si = ShaderInfoForShader( shader.shader );
if ( !strEmptyOrNull( si->remapShader ) ) { if ( !strEmptyOrNull( si->remapShader ) ) {
// copy and clear the rest of memory // check for overflow by String64 // copy and clear the rest of memory // check for overflow by String64
const auto remap = String64()( si->remapShader ); const String64 remap( si->remapShader );
strncpy( shader.shader, remap, sizeof( shader.shader ) ); strncpy( shader.shader, remap, sizeof( shader.shader ) );
} }
} }

View File

@ -1002,7 +1002,7 @@ static void ParseRawBrush( bool onlyLights ){
/* read shader name */ /* read shader name */
GetToken( false ); GetToken( false );
const auto shader = String64()( "textures/", token ); const String64 shader( "textures/", token );
/* set default flags and values */ /* set default flags and values */
shaderInfo_t *si = onlyLights? &shaderInfo[ 0 ] shaderInfo_t *si = onlyLights? &shaderInfo[ 0 ]
@ -1440,7 +1440,7 @@ static void LoadEntityIndexMap( entity_t& e ){
if ( space == NULL ) { if ( space == NULL ) {
space = offset + strlen( offset ); space = offset + strlen( offset );
} }
im->offsets[ i ] = atof( String64()( StringRange( offset, space ) ) ); im->offsets[ i ] = atof( String64( StringRange( offset, space ) ) );
if ( space == NULL ) { if ( space == NULL ) {
break; break;
} }
@ -1576,7 +1576,7 @@ static bool ParseMapEntity( bool onlyLights, bool noCollapseGroups, int mapEntit
const char *value; const char *value;
if( mapEnt.read_keyvalue( value, "_celshader" ) || if( mapEnt.read_keyvalue( value, "_celshader" ) ||
entities[ 0 ].read_keyvalue( value, "_celshader" ) ){ entities[ 0 ].read_keyvalue( value, "_celshader" ) ){
celShader = ShaderInfoForShader( String64()( "textures/", value ) ); celShader = ShaderInfoForShader( String64( "textures/", value ) );
Sys_Printf( "Entity %d (%s) has cel shader %s\n", mapEnt.mapEntityNum, classname, celShader->shader.c_str() ); Sys_Printf( "Entity %d (%s) has cel shader %s\n", mapEnt.mapEntityNum, classname, celShader->shader.c_str() );
} }
else{ else{

View File

@ -1127,14 +1127,7 @@ void InsertModel( const char *name, const char *skin, int frame, const Matrix4&
/* shader renaming for sof2 */ /* shader renaming for sof2 */
if ( renameModelShaders ) { if ( renameModelShaders ) {
auto shaderName = String64()( PathExtensionless( picoShaderName ) ); si = ShaderInfoForShader( String64( PathExtensionless( picoShaderName ), ( spawnFlags & eRMG_BSP )? "_RMG_BSP" : "_BSP" ) );
if ( spawnFlags & eRMG_BSP ) {
shaderName << "_RMG_BSP";
}
else{
shaderName << "_BSP";
}
si = ShaderInfoForShader( shaderName );
} }
else{ else{
si = ShaderInfoForShader( picoShaderName ); si = ShaderInfoForShader( picoShaderName );
@ -1382,7 +1375,7 @@ void AddTriangleModels( entity_t& eparent ){
shaderInfo_t *celShader; shaderInfo_t *celShader;
if( const char *value; e.read_keyvalue( value, "_celshader" ) || if( const char *value; e.read_keyvalue( value, "_celshader" ) ||
entities[ 0 ].read_keyvalue( value, "_celshader" ) ){ entities[ 0 ].read_keyvalue( value, "_celshader" ) ){
celShader = ShaderInfoForShader( String64()( "textures/", value ) ); celShader = ShaderInfoForShader( String64( "textures/", value ) );
} }
else{ else{
celShader = globalCelShader.empty() ? NULL : ShaderInfoForShader( globalCelShader ); celShader = globalCelShader.empty() ? NULL : ShaderInfoForShader( globalCelShader );

View File

@ -206,7 +206,7 @@ void ParsePatch( bool onlyLights, entity_t& mapEnt, int mapPrimitiveNum ){
/* get shader name */ /* get shader name */
GetToken( true ); GetToken( true );
const auto shader = String64()( "textures/", token ); const String64 shader( "textures/", token );
Parse1DMatrix( 5, info ); Parse1DMatrix( 5, info );
m.width = info[0]; m.width = info[0];

View File

@ -759,7 +759,7 @@ shaderInfo_t *ShaderInfoForShader( const char *shaderName ){
} }
/* strip off extension */ /* strip off extension */
auto shader = String64()( PathExtensionless( shaderName ) ); String64 shader( PathExtensionless( shaderName ) );
/* search for it */ /* search for it */
deprecationDepth = 0; deprecationDepth = 0;

View File

@ -667,8 +667,8 @@ static shaderInfo_t *GetIndexedShader( const shaderInfo_t *parent, const indexMa
/* get the shader */ /* get the shader */
shaderInfo_t *si = ShaderInfoForShader( ( minShaderIndex == maxShaderIndex )? shaderInfo_t *si = ShaderInfoForShader( ( minShaderIndex == maxShaderIndex )?
String64()( "textures/", im->shader.c_str(), '_', int(maxShaderIndex) ): String64( "textures/", im->shader, '_', int(maxShaderIndex) ):
String64()( "textures/", im->shader.c_str(), '_', int(minShaderIndex), "to", int(maxShaderIndex) ) ); String64( "textures/", im->shader, '_', int(minShaderIndex), "to", int(maxShaderIndex) ) );
/* inherit a few things from parent shader */ /* inherit a few things from parent shader */
if ( parent->globalTexture ) { if ( parent->globalTexture ) {
@ -759,10 +759,10 @@ mapDrawSurface_t *DrawSurfaceForSide( const entity_t& e, const brush_t& b, const
} }
/* ydnar: sky hack/fix for GL_CLAMP borders on ati cards */ /* ydnar: sky hack/fix for GL_CLAMP borders on ati cards */
if ( skyFixHack && !strEmpty( si->skyParmsImageBase ) ) { if ( skyFixHack && !si->skyParmsImageBase.empty() ) {
//% Sys_FPrintf( SYS_VRB, "Enabling sky hack for shader %s using env %s\n", si->shader, si->skyParmsImageBase ); //% Sys_FPrintf( SYS_VRB, "Enabling sky hack for shader %s using env %s\n", si->shader, si->skyParmsImageBase );
for( const auto suffix : { "_lf", "_rt", "_ft", "_bk", "_up", "_dn" } ) for( const auto suffix : { "_lf", "_rt", "_ft", "_bk", "_up", "_dn" } )
DrawSurfaceForShader( String64()( si->skyParmsImageBase, suffix ) ); DrawSurfaceForShader( String64( si->skyParmsImageBase, suffix ) );
} }
/* ydnar: gs mods */ /* ydnar: gs mods */