⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 array.h

📁 实现内存数据库的源代码
💻 H
字号:
//-< ARRAY.H >-------------------------------------------------------*--------*
// FastDB                    Version 1.0         (c) 1999  GARRET    *     ?  *
// (Main Memory Database Management System)                          *   /\|  *
//                                                                   *  /  \  *
//                          Created:     20-Nov-98    K.A. Knizhnik  * / [] \ *
//                          Last update: 20-Dec-98    K.A. Knizhnik  * GARRET *
//-------------------------------------------------------------------*--------*
// Array type for table record fields
//-------------------------------------------------------------------*--------*

#ifndef __ARRAY_H__
#define __ARRAY_H__

class FASTDB_DLL_ENTRY dbAnyArray { 
  protected:
    size_t len;
  public:
    size_t length() const { return len; }
    void const* base() const { return *(void**)(this+1); }
};    

template<class T>
class dbArray : public dbAnyArray { 
  protected:
    T*     data;
    size_t allocated;
    
    static void arrayAllocator(dbAnyArray* aArray, void* data, size_t length)
    {
	dbArray* array = (dbArray*)aArray;
	array->len = length;
	if (array->allocated) { 
	    delete[] array->data;
	}
	if (data != NULL || length == 0) { 
	    array->data = (T*)data;
	    array->allocated = 0;
	} else { 
	    array->data = new T[length];
	    array->allocated = length;
	}
    }

  public:
    dbFieldDescriptor* dbDescribeComponents(dbFieldDescriptor* fd) { 
	fd->type = fd->appType = dbField::tpArray;
	fd->dbsSize = sizeof(dbVarying);
	fd->alignment = 4;
	fd->arrayAllocator = arrayAllocator;
	return dbDescribeField(new dbFieldDescriptor("[]", 0, sizeof(T), 0),
			       *(T*)fd); 
    }

    dbArray() { 
	data = NULL; 
	len = 0;
	allocated = 0;
    }

    dbArray(size_t size) { 
	if (size != 0) { 
	    data = new T[size]; 
	}
	len = size;
	allocated = size;
    }

    dbArray(T const* ptr, size_t size, size_t allocate = 0) { 
	len = size;
	allocated = allocate;
	if (allocate != 0) { 
	    assert(allocate >= size);
	    data = new T[allocate];
	    memcpy(data, ptr, sizeof(T)*size);	
	} else { 
	    data = (T*)ptr;
	}
    }

    dbArray(dbArray const& arr) { // copy constructor 
	allocated = arr.allocated;
	len = arr.len;
	if (allocated) { 
	    data = new T[allocated];
	    memcpy(data, arr.data, sizeof(T)*len);	
	} else { 
	    data = arr.data;
	}
    }

    ~dbArray() { 
	if (allocated) { 
	    delete[] data;
	}
    }

    dbArray& operator = (dbArray const& arr) { 
	if (this == &arr) { 
	    return *this;
	}
	if (allocated) { 
	    delete[] data;
	}
	if ((len = arr.len) != 0) { 
	    data = new T[len];
	    memcpy(data, arr.data, sizeof(T)*len);
	}
	allocated = len;
	return *this;
    }

    T const& last() {
	assert(len > 0);
	return data[len-1];
    }

    void assign(T const* ptr, size_t size, bool copy = true) { 
	if (allocated) { 
	    delete[] data;
	}
	len = size;
	if (copy && size != 0) { 
	    data = new T[size];
	    memcpy(data, ptr, sizeof(T)*size);	
	    allocated = size;
	} else { 
	    data = (T*)ptr;
	    allocated = 0;
	}
    }

    T const& operator [](size_t index) const { 
	assert(index < len);
	return data[index];
    }

    void putat(size_t index, T const& value) { 
	assert(index < len);
	if (!allocated) { 
	    T* copy = new T[len];
	    memcpy(copy, data, sizeof(T)*len);
	    data = copy;
	    allocated = len;
	}
	data[index] = value;
    }

    T const& getat(size_t index) const {
	assert(index < len);
	return data[index];
    }

    void clear() { 
        if (allocated) {
            delete[] data;
        }
	data = NULL;
	len = 0;
	allocated = 0;
    }

    void resize(size_t size) { 
	if (size > len && size > allocated) { 
	    T* p = new T[size];
	    memcpy(p, data, sizeof(T)*len);
	    if (allocated) { 
		delete[] data;
	    }
	    data = p;
	    allocated = size;
	}
	len = size;
    }

    void append(T const& value) { 
        insert(value, len);
    }

    void insert(T const& value, size_t index = 0) { 
	assert(index <= len);
	if (len >= allocated) {
	    size_t newSize = len == 0 ? 8 : len*2;
	    T* p = new T[newSize];
	    memcpy(p, data, index*sizeof(T));
	    p[index] = value;
	    memcpy(p+index+1, data+index, (len-index)*sizeof(T));
	    if (allocated) { 
		delete[] data;
	    }
	    data = p;
	    allocated = newSize;
	} else { 
	    memmove(data+index+1, data+index, (len-index)*sizeof(T));
	    data[index] = value;
	}
	len += 1;
    }
    
    void remove(size_t index) { 
	assert(index < len);
	len -= 1;
	if (index != len && !allocated) { 
	    T* p = new T[len];
	    memcpy(p, data, index*sizeof(T));
	    memcpy(p+index, data+index+1, (len-index)*sizeof(T));
	    allocated = len;
	    data = p;
	} else { 
	    memmove(data+index, data+index+1, (len-index)*sizeof(T));
	}
    }
    
    T const* get() const { return data; }
};

template<class T>
int index(dbArray<T> const& a, T value) { 
    for (int i = 0, n = a.length(); i < n; i++) { 
      if (a[i] == value) { 
          return i;
      }
    }
    return -1;
}
    
template<class T>
int rindex(dbArray<T> const& a, T value) { 
    int i = a.length(); 
    while (--i >= 0 && a[i] != value);
    return i;
}

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -