1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23 #ifndef _TOOLS_TABLE_HXX
24 #define _TOOLS_TABLE_HXX
25
26 #include "tools/toolsdllapi.h"
27 #include <tools/solar.h>
28 #include <tools/contnr.hxx>
29
30 // ---------
31 // - Table -
32 // ---------
33
34 #define TABLE_ENTRY_NOTFOUND CONTAINER_ENTRY_NOTFOUND
35
36 class TOOLS_DLLPUBLIC Table : private Container
37 {
38 private:
39 sal_uIntPtr nCount;
40 //#if 0 // _SOLAR__PRIVATE
41 TOOLS_DLLPRIVATE sal_uIntPtr ImplGetIndex( sal_uIntPtr nKey, sal_uIntPtr* pIndex = NULL ) const;
42 //#endif
43 public:
44 Table( sal_uInt16 nInitSize = 16, sal_uInt16 nReSize = 16 );
Table(const Table & rTable)45 Table( const Table& rTable ) : Container( rTable )
46 { nCount = rTable.nCount; }
47
48 sal_Bool Insert( sal_uIntPtr nKey, void* p );
49 void* Remove( sal_uIntPtr nKey );
50 void* Replace( sal_uIntPtr nKey, void* p );
51 void* Get( sal_uIntPtr nKey ) const;
52
Clear()53 void Clear() { Container::Clear(); nCount = 0; }
Count() const54 sal_uIntPtr Count() const { return( nCount ); }
55
56 void* GetCurObject() const;
GetCurKey() const57 sal_uIntPtr GetCurKey() const { return (sal_uIntPtr)Container::GetCurObject(); }
58 sal_uIntPtr GetKey( const void* p ) const;
59 sal_Bool IsKeyValid( sal_uIntPtr nKey ) const;
60
GetObject(sal_uIntPtr nPos) const61 void* GetObject( sal_uIntPtr nPos ) const
62 { return Container::GetObject( (nPos*2)+1 ); }
GetObjectKey(sal_uIntPtr nPos) const63 sal_uIntPtr GetObjectKey( sal_uIntPtr nPos ) const
64 { return (sal_uIntPtr)Container::GetObject( nPos*2 ); }
65 sal_uIntPtr GetUniqueKey( sal_uIntPtr nStartKey = 1 ) const;
66 sal_uIntPtr SearchKey( sal_uIntPtr nKey, sal_uIntPtr* pPos = NULL ) const;
67
68 void* Seek( sal_uIntPtr nKey );
69 void* Seek( void* p );
70 void* First();
71 void* Last();
72 void* Next();
73 void* Prev();
74
75 Table& operator =( const Table& rTable );
76
operator ==(const Table & rTable) const77 sal_Bool operator ==( const Table& rTable ) const
78 { return Container::operator ==( rTable ); }
operator !=(const Table & rTable) const79 sal_Bool operator !=( const Table& rTable ) const
80 { return Container::operator !=( rTable ); }
81 };
82
operator =(const Table & r)83 inline Table& Table::operator =( const Table& r )
84 {
85 Container::operator =( r );
86 nCount = r.nCount;
87 return *this;
88 }
89
90 // -----------------
91 // - DECLARE_TABLE -
92 // -----------------
93
94 #define DECLARE_TABLE( ClassName, Type ) \
95 class ClassName : private Table \
96 { \
97 public: \
98 using Table::Clear; \
99 using Table::Count; \
100 using Table::GetCurKey; \
101 using Table::GetObjectKey; \
102 using Table::GetUniqueKey; \
103 using Table::SearchKey; \
104 using Table::IsKeyValid; \
105 \
106 ClassName( sal_uInt16 _nInitSize = 16, \
107 sal_uInt16 _nReSize = 16 ) : \
108 Table( _nInitSize, _nReSize ) {} \
109 ClassName( const ClassName& rClassName ) : \
110 Table( rClassName ) {} \
111 \
112 sal_Bool Insert( sal_uIntPtr nKey, Type p ) \
113 { return Table::Insert( nKey, (void*)p ); } \
114 Type Remove( sal_uIntPtr nKey ) \
115 { return (Type)Table::Remove( nKey ); } \
116 Type Replace( sal_uIntPtr nKey, Type p ) \
117 { return (Type)Table::Replace( nKey, (void*)p ); } \
118 Type Get( sal_uIntPtr nKey ) const \
119 { return (Type)Table::Get( nKey ); } \
120 \
121 Type GetCurObject() const \
122 { return (Type)Table::GetCurObject(); } \
123 sal_uIntPtr GetKey( const Type p ) const \
124 { return Table::GetKey( (const void*)p ); } \
125 \
126 Type GetObject( sal_uIntPtr nPos ) const \
127 { return (Type)Table::GetObject( nPos ); } \
128 \
129 Type Seek( sal_uIntPtr nKey ) \
130 { return (Type)Table::Seek( nKey ); } \
131 Type Seek( Type p ) \
132 { return (Type)Table::Seek( (void*)p ); } \
133 Type First() { return (Type)Table::First(); } \
134 Type Last() { return (Type)Table::Last(); } \
135 Type Next() { return (Type)Table::Next(); } \
136 Type Prev() { return (Type)Table::Prev(); } \
137 \
138 ClassName& operator =( const ClassName& rClassName ) \
139 { Table::operator =( rClassName ); \
140 return *this; } \
141 \
142 sal_Bool operator ==( const ClassName& rTable ) const \
143 { return Table::operator ==( rTable ); } \
144 sal_Bool operator !=( const ClassName& rTable ) const \
145 { return Table::operator !=( rTable ); } \
146 };
147
148 #endif // _TOOLS_TABLE_HXX
149