Показать сообщение отдельно
Старый 29.11.2005, 16:25   #8  
SolNik is offline
SolNik
Участник
 
58 / 36 (2) +++
Регистрация: 22.10.2003
Всем спасибо, но времени разбираться с недокументированными классами не было, а типы структур данных уже известны - решил сам набросать метод посчитывающий занимаемую память. Считает для::Container, Date, Integer, Real, String, Array, Struct, Map. Для остальных типов возвратит 0.
PHP код:
static int getMemSizeOfItem(anyType _item)
{
    
int         i;
    
int         result;
    Array       
arr;
    
Struct      struct;
    
Map         map;
    
MapIterator mi;
    ;

    switch (
typeOf(_item))
    {
        case 
types::Container :
            
result 0;
            for (
i=1i<=conLen(_item); i++)
            {
                
result+=RTRTimeAccountProcess::getMemSizeOfItem(conPeek(_itemi));
            }
        break;

        case 
types::Date result 4;
        break;

        case 
types::Integer result 4;
        break;

        case 
types::Real result 8;
        break;

        case 
types::String result strLen(_item);
        break;

        case 
types::Class :
            switch (
classIdGet(_item))
            {
                case 
classNum(Array) :
                    
arr _item;
                    for (
i=1i<=arr.lastIndex(); i++)
                    {
                        
result+=RTRTimeAccountProcess::getMemSizeOfItem(arr.value(i));
                    }
                break;

                case 
classNum(Struct) :
                    
struct _item;
                    for (
i=1i<=struct.fields(); i++)
                    {
                        
result+=RTRTimeAccountProcess::getMemSizeOfItem(struct.valueIndex(i));
                    }
                break;

                case 
classNum(Map) :
                    
map _item;
                    
mi  = new MapIterator(map);
                    while (
mi.more())
                    {
                        
result+=RTRTimeAccountProcess::getMemSizeOfItem(mi.key());
                        
result+=RTRTimeAccountProcess::getMemSizeOfItem(mi.value());
                        
mi.next();
                    }
                break;
            }
        break;
    }

    return 
result;