五、實現

來源:互聯網
上載者:User

 #include "DynamicDLA.h"</p><p>#ifndef __cplusplus</p><p>#include <stdlib.h><br />#include <string.h></p><p>#else</p><p>#include <cstdlib><br />#include <cstring></p><p>namespace dynamic_dimensionality_length_array<br />{</p><p>#endif</p><p>struct arrayinfo<br />{<br /> struct arrayinfo *Next;<br /> char* ElementAddr;<br /> void** PtrBuffer;<br /> size_t ElementSize;<br /> size_t *DimenLength;<br /> size_t Dimen;<br />};</p><p>static struct arrayinfo *Head = NULL;</p><p>static void* newarray( size_t, size_t, size_t*, bool );<br />static struct arrayinfo* search( void *PtrBuffer );<br />static void** build( void **, char *, size_t, size_t*, size_t, size_t );<br />static void process( struct arrayinfo *, size_t, size_t*, void ( * )(void*, size_t* ) );<br />static void* address( void*, size_t, size_t* );<br />static size_t size( void*, size_t, size_t* );</p><p>void* new_a( size_t ElementSize, size_t Dimen, ... )<br />{<br /> return newarray( ElementSize, Dimen, &Dimen + 1, 1 );<br />}</p><p>void* new0_a( size_t ElementSize, size_t Dimen, ... )<br />{<br /> return newarray( ElementSize, Dimen, &Dimen + 1, 0 );<br />}</p><p> void* new_pa( size_t ElementSize, size_t Dimen, size_t *DimenLength )<br />{<br /> return newarray( ElementSize, Dimen, DimenLength, 1 );<br />}</p><p>void* resize_pa( void *PtrBuffer, size_t Dimen, size_t *DimenLength )<br />{<br />size_t i, Product = 1, Sum = 0;<br /> struct arrayinfo *TempArray, *TempSearch, **TempNext = &Head;<br /> char *TempElement;<br /> void ** TempBuffer;<br /> if( !PtrBuffer || !Dimen ) return NULL;<br /> for( i = 0; i < Dimen; ++i )<br /> if( !DimenLength[i] ) return NULL;<br />for( TempSearch = Head; TempSearch ; TempSearch = TempSearch->Next )<br />{<br />if( TempSearch->PtrBuffer == PtrBuffer ) break;<br />TempNext = &TempSearch->Next;<br />}<br />if( !TempSearch ) return NULL;<br />TempArray = ( struct arrayinfo * )malloc( sizeof( struct arrayinfo ) + Dimen * sizeof( size_t ) );<br />if( !TempArray ) return NULL;<br />for( i = 0; i < Dimen - 1; ++i )<br /> Sum += ( Product *= DimenLength[i] );<br /> Product *= DimenLength[Dimen-1] * TempSearch->ElementSize;<br /> TempBuffer = ( void** )malloc( Sum * sizeof( void* ) );<br /> if( !TempBuffer ) return NULL;<br /> TempElement = ( char* )realloc( TempSearch->ElementAddr, Product * sizeof( char ) );<br />if( !TempElement ) return NULL;<br />build( TempBuffer, TempElement, TempSearch->ElementSize, DimenLength, 0, Dimen );<br />TempArray->ElementAddr = TempElement;<br /> TempArray->PtrBuffer = TempBuffer;<br /> TempArray->ElementSize = TempSearch->ElementSize;<br /> TempArray->DimenLength = &TempArray->Dimen + 1;<br /> memcpy( TempArray->DimenLength, DimenLength, Dimen * sizeof( size_t ) );<br />TempArray->Dimen = Dimen;<br />TempArray->Next = TempSearch->Next;<br />free( TempSearch->PtrBuffer );<br />free( TempSearch );<br />*TempNext = TempArray;<br />return ( void* )TempBuffer;<br />}</p><p>void* resize_a( void *PtrBuffer, size_t Dimen, ... )<br />{<br />return resize_pa( PtrBuffer, Dimen, &Dimen + 1 );<br />}</p><p>bool assign_pa( void *PtrBuffer, void *Padding, size_t *DimenLength )<br />{<br />size_t i;<br />struct arrayinfo *TempArray;<br />if( !PtrBuffer || !Padding || !DimenLength || !( TempArray = search( PtrBuffer ) ) )<br />return false;<br />for( i = 0; i < TempArray->Dimen; ++i )<br />if( DimenLength[i] >= TempArray->DimenLength[i] ) return false;<br />memcpy( address_pa( PtrBuffer, TempArray->Dimen, DimenLength ), Padding, TempArray->ElementSize );<br />return true;<br />}</p><p>bool assign_va( void *PtrBuffer, void *Padding, ... )<br />{<br />return assign_pa( PtrBuffer, Padding, ( size_t* )( &Padding + 1 ) );<br />}</p><p>bool value_pa( void *PtrBuffer, void *Padding, size_t *DimenLength )<br />{<br />size_t i;<br />struct arrayinfo *TempArray;<br />if( !PtrBuffer || !Padding || !DimenLength || !( TempArray = search( PtrBuffer ) ) )<br />return false;<br />for( i = 0; i < TempArray->Dimen; ++i )<br />if( DimenLength[i] >= TempArray->DimenLength[i] ) return false;<br />memcpy( Padding, address_pa( PtrBuffer, TempArray->Dimen, DimenLength ), TempArray->ElementSize );<br />return true;<br />}</p><p>bool value_va( void *PtrBuffer, void *Padding, ... )<br />{<br />return value_pa( PtrBuffer, Padding, ( size_t* )( &Padding + 1 ) );<br />}</p><p>bool process_a( void *PtrBuffer, void ( *CallBack )(void*, size_t* ) )<br />{<br />size_t *DimenLength;<br />struct arrayinfo *TempArray;<br />if( !PtrBuffer || !CallBack || !( TempArray = search( PtrBuffer) ) ) return false;<br />DimenLength = ( size_t* )malloc( TempArray->Dimen * sizeof( size_t ) );<br />if( !DimenLength ) return false;<br />process( TempArray, 0, DimenLength, CallBack );<br />free( DimenLength );<br />return true;<br />}</p><p>void* address_va( void *PtrBuffer, size_t Dimen, ... )<br />{<br />return address( PtrBuffer, Dimen, &Dimen + 1 );<br />}</p><p>void* address_pa( void *PtrBuffer, size_t Dimen, size_t *DimenLength )<br />{<br />return address( PtrBuffer, Dimen, DimenLength );<br />}</p><p>size_t dimen_a( void *PtrBuffer )<br />{<br />struct arrayinfo *TempArray;<br />if( !PtrBuffer || !( TempArray = search( PtrBuffer ) ) ) return 0;<br />return TempArray->Dimen;<br />}</p><p>size_t sizeof_a( void *PtrBuffer )<br />{<br />struct arrayinfo *TempArray = Head;<br />size_t i;<br />if( !PtrBuffer ) return 0;<br />for( ; TempArray; TempArray = TempArray->Next )<br />{<br /> size_t Product = 1, Sum = 0;<br /> for( i = 0; i < TempArray->Dimen - 1; ++i )<br /> Sum += Product *= TempArray->DimenLength[i];<br /> Product *= TempArray->DimenLength[i];<br /> if( TempArray->PtrBuffer == ( void** )PtrBuffer )<br /> return Product * TempArray->ElementSize;<br /> for( i = 0; i < Sum; ++i )<br /> if( TempArray->PtrBuffer[i] == PtrBuffer )<br /> {<br /> size_t j;<br /> size_t TempSum = 0, TempPrdct = 1;<br /> for( j = 0; j < TempArray->Dimen - 1; ++j )<br /> {<br /> TempSum += TempPrdct *= TempArray->DimenLength[j];<br /> Product /= TempArray->DimenLength[j];<br /> if( TempSum > i ) return Product * TempArray->ElementSize;<br /> }<br /> }<br /> }<br />return 0;<br />}</p><p>size_t sizeof_pa( void *PtrBuffer, size_t Dimen, size_t *DimenLength )<br />{<br /> return size( PtrBuffer, Dimen, DimenLength );<br />}</p><p>size_t sizeof_va( void *PtrBuffer, size_t Dimen, ... )<br />{<br />return size( PtrBuffer, Dimen, &Dimen + 1 );<br />}</p><p>size_t* dimenlen_a( void *PtrBuffer, size_t *DimenLength )<br />{<br />struct arrayinfo *TempArray;<br />if( !PtrBuffer || !( TempArray = search( PtrBuffer ) ) ) return NULL;<br />memcpy( DimenLength, TempArray->DimenLength, TempArray->Dimen );<br />return DimenLength;<br />}</p><p>size_t elmntsize_a( void *PtrBuffer )<br />{<br />struct arrayinfo *TempArray;<br />if( !PtrBuffer || !( TempArray = search( PtrBuffer ) ) ) return 0;<br />return TempArray->ElementSize;<br />}</p><p>void delete_a( void *PtrBuffer )<br />{<br />struct arrayinfo *TempArray, **TempNext = &Head;<br /> if( !PtrBuffer ) return;<br /> for( TempArray = Head; TempArray ; TempArray = TempArray->Next )<br />{<br />if( TempArray->PtrBuffer == PtrBuffer ) break;<br />TempNext = &TempArray->Next;<br />}<br />if( !TempArray ) return;<br />free( TempArray->ElementAddr );<br />free( TempArray->PtrBuffer );<br />*TempNext = TempArray->Next;<br />free( TempArray );<br />return;<br />}</p><p>void delete_all()<br />{<br />struct arrayinfo *TempArray = Head, *TempNext;<br />for( ; TempArray; TempArray = TempNext )<br />{<br />TempNext = TempArray->Next;<br />free( TempArray->ElementAddr );<br />free( TempArray->PtrBuffer );<br />free( TempArray );<br />}<br />}</p><p>static void* newarray( size_t ElementSize, size_t Dimen, size_t *DimenLength, bool Flag )<br />{<br /> size_t i, Product = 1, Sum = 0;<br /> struct arrayinfo *TempArray;<br /> char *TempElement;<br /> void ** TempBuffer;<br /> if( !ElementSize || !Dimen ) return NULL;<br /> for( i = 0; i < Dimen; ++i )<br /> if( !DimenLength[i] ) return NULL;<br /> for( i = 0; i < Dimen - 1; ++i )<br /> Sum += Product *= DimenLength[i];<br /> Product *= DimenLength[Dimen-1] * ElementSize;<br /> if( Flag )<br /> TempElement = ( char* )malloc( Product * sizeof( char ) );<br /> else TempElement = ( char* )calloc( Product, sizeof( char ) );<br /> if( Dimen != 1 )<br /> TempBuffer = ( void** )malloc( Sum * sizeof( void* ) );<br /> else TempBuffer = ( void** )TempElement;<br /> TempArray = ( struct arrayinfo * )malloc( sizeof( struct arrayinfo ) + Dimen * sizeof( size_t ) );<br /> if( !TempElement || !TempBuffer || !TempArray )<br /> {<br /> free( TempElement );<br /> if( Dimen != 1 ) free( TempBuffer );<br /> free( TempArray );<br /> return NULL;<br /> }<br /> build( TempBuffer, TempElement, ElementSize, DimenLength, 0, Dimen );<br /> TempArray->ElementAddr = TempElement;<br /> TempArray->PtrBuffer = TempBuffer;<br /> TempArray->ElementSize = ElementSize;<br /> TempArray->DimenLength = &TempArray->Dimen + 1;<br /> memcpy( TempArray->DimenLength, DimenLength, Dimen * sizeof( size_t ) );<br /> TempArray->Dimen = Dimen;<br /> TempArray->Next = Head;<br /> Head = TempArray;<br /> return ( void* )TempBuffer;<br />}</p><p>static void** build( void **PtrBuffer, char *ElementAddr, size_t ElementSize,<br /> size_t *DimenLength, size_t CurDimen, size_t Dimen )<br />{<br /> size_t i;<br /> if( CurDimen == Dimen - 1 ) return ( void** )ElementAddr;<br /> for( i = 0; i < DimenLength[CurDimen]; ++i )<br /> {<br /> size_t j;<br /> size_t Product = 1;<br /> void **NextPtr;<br /> char *NextData;<br /> for( j = 0; j <= CurDimen; ++j )<br /> Product *= DimenLength[j];<br /> NextPtr = PtrBuffer + Product + i * DimenLength[CurDimen + 1];<br /> Product = 1;<br /> for( j = CurDimen + 1; j < Dimen; ++j )<br /> Product *= DimenLength[j];<br /> NextData = ElementAddr + i * Product * ElementSize;<br /> PtrBuffer[i] = ( void* )build( NextPtr, NextData, ElementSize,<br /> DimenLength, CurDimen + 1, Dimen );<br /> }<br /> return PtrBuffer;<br />}</p><p>static void process( struct arrayinfo *TempArray, size_t CurDimen,<br />size_t *DimenLength, void ( *CallBack )(void*, size_t* ) )<br />{<br />size_t i;<br />for( i = 0; i < TempArray->DimenLength[CurDimen]; ++i )<br />{<br />DimenLength[CurDimen] = i;<br />if( CurDimen == TempArray->Dimen - 1 )<br />CallBack( TempArray->PtrBuffer, DimenLength );<br />else process( TempArray, CurDimen + 1, DimenLength, CallBack );<br />}<br />return;<br />}</p><p>static struct arrayinfo* search( void *PtrBuffer )<br />{<br />struct arrayinfo *TempArray = Head;<br />for( ; TempArray; TempArray = TempArray->Next )<br />if( TempArray->PtrBuffer == PtrBuffer )<br />return TempArray;<br />return NULL;<br />}</p><p>static void* address( void *PtrBuffer, size_t Dimen, size_t *DimenLength )<br />{<br /> size_t i, Sum = 0, Product = 1;<br />struct arrayinfo *TempArray;<br />if( ( Dimen && !DimenLength )<br /> || !PtrBuffer<br /> || !( TempArray = search( PtrBuffer ) )<br /> || TempArray->Dimen < Dimen<br /> ) return NULL;<br />for( i = 0; i < Dimen; ++i )<br /> if( DimenLength[i] >= TempArray->DimenLength[i] ) return NULL;<br /> if( !Dimen ) return ( void* )TempArray->ElementAddr;<br />for( i = 0; i < TempArray->Dimen; ++i )<br />Product *= TempArray->DimenLength[i];<br />for( i = 0; i < Dimen; ++i )<br />Sum += DimenLength[i] * ( Product /= TempArray->DimenLength[i] );<br />return TempArray->ElementAddr + Sum * TempArray->ElementSize;<br />}</p><p>static size_t size( void *PtrBuffer, size_t Dimen, size_t *DimenLength )<br />{<br /> struct arrayinfo *TempArray;<br /> size_t i, Product = 1;<br /> if( ( Dimen && !DimenLength )<br /> || !PtrBuffer<br /> || !( TempArray = search( PtrBuffer ) )<br /> || TempArray->Dimen < Dimen<br /> ) return 0;<br /> for( i = 0; i < Dimen; ++i )<br /> if( DimenLength[i] >= TempArray->DimenLength[i] )<br /> return 0;<br /> if( !Dimen )<br /> {<br /> for( i = 0; i < TempArray->Dimen; ++i )<br /> Product *= TempArray->DimenLength[i];<br /> return Product * TempArray->ElementSize;<br /> }<br /> for( i = Dimen; i < TempArray->Dimen; ++i )<br />Product *= TempArray->DimenLength[i];<br />return Product * TempArray->ElementSize;<br />}</p><p>#ifdef __cplusplus</p><p>}</p><p>#endif</p><p>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.