Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
//=======================================================================
//
// Copyright (c) 1998-1999 Microsoft Corporation. All Rights Reserved.
//
// File: wustl.h
//
// Owner:
//
// Description:
//
// Common definition and templates useful acros projects
//
//
//=======================================================================
#ifndef _WUSTL_H
#pragma warning(disable:4530) // C++ exception handler used, but unwind semantics are not enabled. Specify -GX
#include <vector>
#include <map>
#include <string>
using std::string; using std::wstring; using std::pair; using std::vector; using std::map; #include <ar.h>
//----------------------------------------------------------------------
//
// Common definitions...
//
//----------------------------------------------------------------------
#define sizeOfArray(a) (sizeof(a) / sizeof(a[0]))
#pragma intrinsic(memcmp)
#pragma intrinsic(memcpy)
#pragma intrinsic(memset)
#pragma intrinsic(strcat)
#pragma intrinsic(strcmp)
#pragma intrinsic(strcpy)
#pragma intrinsic(strlen)
//----------------------------------------------------------------------
//
// class frozen_array
// Resizable buffer
//
//----------------------------------------------------------------------
template< class _Ty > class frozen_array { public: typedef pair<_Ty, bool> _My_pair; typedef vector< _My_pair > _My_vector; frozen_array() : _cnFree(0) { } int add(const _Ty& x) { if (_cnFree > 0) { //Find spare handle or add one
int index = 0; while(_v[index].second) { // ASSERT(index < g_handleArray.size());
index ++; } _v[index].first = x; _v[index].second = true; _cnFree --; return index; } else { _v.push_back(_My_pair(x, true)); return _v.size() - 1; } } void remove(int index) { _v[index].second = false; _cnFree ++; } _Ty& operator[](int index) { return _v[index].first; } bool valid_index(int index) { return 0 <= index && index < _v.size() && _v[index].second; };
protected: _My_vector _v; int _cnFree; };
//----------------------------------------------------------------------
//
// class buffer
// Resizable buffer
//
//----------------------------------------------------------------------
template< class _Ty > class safe_buffer { public: safe_buffer(int cb = 0) : _cb(0), _pb(0) { if (cb) resize(cb); } safe_buffer(const safe_buffer& b) : _cb(0), _pb(0) { if (b._cb) resize(b._cb); // do copy if resize ok
if (_cb) memcpy(_pb, b._pb, _cb * sizeof(_Ty)); } int size() const { return _cb; } void resize(int cb) { _pb = (_Ty*)realloc(_pb, cb * sizeof(_Ty)); _cb = (0 != _pb) ? cb : 0; } bool valid() const { return _pb != 0; } operator _Ty*() const { return _pb; } operator const _Ty*() const { return _pb; } void operator <<(safe_buffer& b) { free(_pb); _cb = b._cb; _pb = b._pb; b._cb = 0; b._pb = 0; } void zero_buffer() { memset(_pb, '\0', _cb); } _Ty* detach() { _Ty* pb = _pb; _pb = 0; _cb = 0; return pb; } ~safe_buffer() { free(_pb); }
protected: _Ty* _pb; int _cb;
private: // forbid
operator bool() const {} bool operator !() const {} };
typedef safe_buffer< BYTE > byte_buffer; typedef safe_buffer< char > char_buffer; typedef safe_buffer< WCHAR > wchar_buffer; #ifdef _UNICODE
#define tchar_buffer wchar_buffer
#else
#define tchar_buffer char_buffer
#endif
#define _WUSTL_H
#endif
|