1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#ifndef _IMPCONT_HXX
#define _IMPCONT_HXX
#include <tools/tools.h>
#include <tools/contnr.hxx>
typedef void* PVOID;
// ----------
// - CBlock -
// ----------
class CBlock
{
private:
CBlock* pPrev; // Vorheriger Block
CBlock* pNext; // Naechster Block
sal_uInt16 nSize; // Groesse des Blocks
sal_uInt16 nCount; // Anzahl Pointer
void** pNodes; // Pointer auf die Daten
#if defined DBG_UTIL
static char const * DbgCheckCBlock(void const *);
#endif
public:
// Fuer List-Container
CBlock( sal_uInt16 nSize, CBlock* pPrev, CBlock* pNext );
// Fuer Array-Container
CBlock( sal_uInt16 nSize, CBlock* pPrev );
// Copy-Ctor
CBlock( const CBlock& r, CBlock* pPrev );
~CBlock();
void Insert( void* p, sal_uInt16 nIndex, sal_uInt16 nReSize );
CBlock* Split( void* p, sal_uInt16 nIndex, sal_uInt16 nReSize );
void* Remove( sal_uInt16 nIndex, sal_uInt16 nReSize );
void* Replace( void* pNew, sal_uInt16 nIndex );
void** GetNodes() const { return pNodes; }
void** GetObjectPtr( sal_uInt16 nIndex );
void* GetObject( sal_uInt16 nIndex ) const;
void SetSize( sal_uInt16 nNewSize );
sal_uInt16 GetSize() const { return nCount; }
sal_uInt16 Count() const { return nCount; }
void SetPrevBlock( CBlock* p ) { pPrev = p; }
void SetNextBlock( CBlock* p ) { pNext = p; }
CBlock* GetPrevBlock() const { return pPrev; }
CBlock* GetNextBlock() const { return pNext; }
void Reset() { nCount = 0; }
private:
CBlock( const CBlock& r );
friend class Container;
};
/*************************************************************************
|*
|* CBlock::GetObject()
|*
|* Beschreibung Gibt einen Pointer aus dem Block zurueck
|*
*************************************************************************/
inline void* CBlock::GetObject( sal_uInt16 nIndex ) const
{
return pNodes[nIndex];
}
/*************************************************************************
|*
|* Container::ImpGetObject()
|*
|* Beschreibung Wir gehen davon aus, das Pointer in der Regel
|* sich im ersten Block befindet und schalten
|* deshalb eine Inline-Methode davor
|*
*************************************************************************/
inline void* Container::ImpGetObject( sal_uIntPtr nIndex ) const
{
if ( pFirstBlock && (nIndex < pFirstBlock->Count()) )
// Item innerhalb des gefundenen Blocks zurueckgeben
return pFirstBlock->GetObject( (sal_uInt16)nIndex );
else
return GetObject( nIndex );
}
/*************************************************************************
|*
|* Container::ImpGetOnlyNodes()
|*
|* Beschreibung Wenn es nur einen Block gibt, wird davon
|* das Daten-Array zurueckgegeben
|*
*************************************************************************/
// #i70651#: Prevent warnings on Mac OS X
#ifdef MACOSX
#pragma GCC system_header
#endif
inline void** Container::ImpGetOnlyNodes() const
{
if ( (pFirstBlock == pLastBlock) && pFirstBlock )
return pFirstBlock->GetNodes();
else
return NULL;
}
#endif // _IMPCONT_HXX
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|