storbase.hxx 14.5 KB
Newer Older
1
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
Michael Meeks's avatar
Michael Meeks committed
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/*
 * 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 .
 */
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
19

20 21
#ifndef INCLUDED_STORE_SOURCE_STORBASE_HXX
#define INCLUDED_STORE_SOURCE_STORBASE_HXX
22

23 24
#include <sal/config.h>
#include <salhelper/simplereferenceobject.hxx>
25

26
#include <sal/types.h>
27

28 29
#include <rtl/crc.h>
#include <rtl/ref.hxx>
30

31 32
#include <osl/diagnose.h>
#include <osl/endian.h>
33

34
#include <store/types.h>
35

36
#include <memory>
37
#include <utility>
38

39 40
/** @file store common internals.
*/
41

42
namespace store
43 44
{

45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
#ifdef htons
#undef htons
#endif
#ifdef ntohs
#undef ntohs
#endif

#ifdef htonl
#undef htonl
#endif
#ifdef ntohl
#undef ntohl
#endif

#ifdef OSL_BIGENDIAN
inline sal_uInt16 htons (sal_uInt16 h) { return OSL_SWAPWORD(h); }
inline sal_uInt16 ntohs (sal_uInt16 n) { return OSL_SWAPWORD(n); }

inline sal_uInt32 htonl (sal_uInt32 h) { return OSL_SWAPDWORD(h); }
inline sal_uInt32 ntohl (sal_uInt32 n) { return OSL_SWAPDWORD(n); }
#else
66 67
inline sal_uInt16 htons (sal_uInt16 h) { return h; }
inline sal_uInt16 ntohs (sal_uInt16 n) { return n; }
68

69 70
inline sal_uInt32 htonl (sal_uInt32 h) { return h; }
inline sal_uInt32 ntohl (sal_uInt32 n) { return n; }
71 72
#endif /* OSL_BIGENDIAN */

Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
73 74 75 76 77 78 79 80 81
struct OStorePageGuard
{
    /** Representation.
     */
    sal_uInt32 m_nMagic;
    sal_uInt32 m_nCRC32;

    /** Construction.
     */
Noel Grandin's avatar
Noel Grandin committed
82
    explicit OStorePageGuard (sal_uInt32 nMagic = 0)
83
        : m_nMagic (store::htonl(nMagic)),
Noel Grandin's avatar
Noel Grandin committed
84
          m_nCRC32 (store::htonl(0))
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
85 86
    {}

87
    void swap (OStorePageGuard & rhs)
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
88
    {
89 90
        std::swap(m_nMagic, rhs.m_nMagic);
        std::swap(m_nCRC32, rhs.m_nCRC32);
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
91 92
    }

93 94 95 96
    OStorePageGuard (OStorePageGuard const & rhs)
        : m_nMagic (rhs.m_nMagic),
          m_nCRC32 (rhs.m_nCRC32)
    {}
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
97

98
    OStorePageGuard& operator= (const OStorePageGuard& rhs)
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
99
    {
100 101 102
        m_nMagic = rhs.m_nMagic;
        m_nCRC32 = rhs.m_nCRC32;
        return *this;
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
103 104
    }

105
    /** Comparison.
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
106
     */
107
    bool operator== (const OStorePageGuard& rhs) const
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
108
    {
109 110
        return ((m_nMagic == rhs.m_nMagic) &&
                (m_nCRC32 == rhs.m_nCRC32)    );
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
111 112 113
    }
};

114
#define STORE_PAGE_NULL (sal_uInt32(~0))
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
115 116 117 118 119 120 121 122 123 124 125

struct OStorePageDescriptor
{
    /** Representation.
     */
    sal_uInt32 m_nAddr;
    sal_uInt16 m_nSize;
    sal_uInt16 m_nUsed;

    /** Construction.
     */
126
    explicit OStorePageDescriptor (
127 128 129
        sal_uInt32 nAddr,
        sal_uInt16 nSize,
        sal_uInt16 nUsed)
130 131 132
        : m_nAddr (store::htonl(nAddr)),
          m_nSize (store::htons(nSize)),
          m_nUsed (store::htons(nUsed))
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
133 134
    {}

135 136
    void swap (OStorePageDescriptor & rhs)
    {
137 138 139
        std::swap(m_nAddr, rhs.m_nAddr);
        std::swap(m_nSize, rhs.m_nSize);
        std::swap(m_nUsed, rhs.m_nUsed);
140 141 142 143 144 145
    }

    OStorePageDescriptor (const OStorePageDescriptor & rhs)
        : m_nAddr (rhs.m_nAddr),
          m_nSize (rhs.m_nSize),
          m_nUsed (rhs.m_nUsed)
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
146 147
    {}

148
    OStorePageDescriptor & operator= (const OStorePageDescriptor & rhs)
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
149
    {
150 151 152
        m_nAddr = rhs.m_nAddr;
        m_nSize = rhs.m_nSize;
        m_nUsed = rhs.m_nUsed;
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
153 154 155 156 157
        return *this;
    }

    /** Comparison.
     */
158
    bool operator== (const OStorePageDescriptor & rhs) const
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
159
    {
160 161
        return ((m_nAddr == rhs.m_nAddr) &&
                (m_nSize == rhs.m_nSize)    );
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
162 163 164 165 166 167 168 169 170 171 172 173
    }
};

struct OStorePageKey
{
    /** Representation.
     */
    sal_uInt32 m_nLow;
    sal_uInt32 m_nHigh;

    /** Construction.
     */
174 175 176
    explicit OStorePageKey (sal_uInt32 nLow = 0, sal_uInt32 nHigh = 0)
        : m_nLow  (store::htonl(nLow)),
          m_nHigh (store::htonl(nHigh))
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
177 178 179 180
    {}

    /** Comparison.
     */
181
    bool operator== (const OStorePageKey & rhs) const
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
182
    {
183 184
        return ((m_nLow  == rhs.m_nLow ) &&
                (m_nHigh == rhs.m_nHigh)    );
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
185 186
    }

187
    bool operator< (const OStorePageKey & rhs) const
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
188
    {
189 190
        if (m_nHigh == rhs.m_nHigh)
            return (store::ntohl(m_nLow) < store::ntohl(rhs.m_nLow));
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
191
        else
192
            return (store::ntohl(m_nHigh) < store::ntohl(rhs.m_nHigh));
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
193 194 195 196 197 198 199 200 201 202 203
    }
};

struct OStorePageLink
{
    /** Representation.
     */
    sal_uInt32 m_nAddr;

    /** Construction.
     */
204 205
    explicit OStorePageLink (sal_uInt32 nAddr = STORE_PAGE_NULL)
        : m_nAddr (store::htonl(nAddr))
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
206 207
    {}

208 209
    void swap (OStorePageLink & rhs)
    {
210
        std::swap(m_nAddr, rhs.m_nAddr);
211 212 213 214 215
    }

    OStorePageLink & operator= (sal_uInt32 nAddr)
    {
        m_nAddr = store::htonl(nAddr);
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
216 217 218 219 220
        return *this;
    }

    /** Comparison.
     */
221
    bool operator== (const OStorePageLink & rhs) const
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
222
    {
223
        return (m_nAddr == rhs.m_nAddr);
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
224 225 226 227
    }

    /** Operation.
     */
228 229 230 231 232
    sal_uInt32 location() const
    {
        return store::ntohl(m_nAddr);
    }

Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
233 234
};

235
struct PageData
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
236
{
237 238 239
    typedef OStorePageGuard      G;
    typedef OStorePageDescriptor D;
    typedef OStorePageLink       L;
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
240 241

    /** Representation.
242 243 244 245 246
     */
    G m_aGuard;
    D m_aDescr;
    L m_aMarked;
    L m_aUnused;
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
247

248 249 250 251
    /** theSize.
     */
    static const size_t     theSize     = sizeof(G) + sizeof(D) + 2 * sizeof(L);
    static const sal_uInt16 thePageSize = theSize;
252
    static_assert(STORE_MINIMUM_PAGESIZE >= thePageSize, "must be at least thePageSize");
253 254 255 256 257 258 259 260

    /** location.
     */
    sal_uInt32 location() const
    {
        return store::ntohl(m_aDescr.m_nAddr);
    }
    void location (sal_uInt32 nAddr)
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
261
    {
262
        m_aDescr.m_nAddr = store::htonl(nAddr);
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
263 264
    }

265 266 267
    /** size.
     */
    sal_uInt16 size() const
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
268
    {
269
        return store::ntohs(m_aDescr.m_nSize);
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
270 271
    }

272 273 274
    /** type.
     */
    sal_uInt32 type() const
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
275
    {
276
        return store::ntohl(m_aGuard.m_nMagic);
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
277 278
    }

279 280 281
    /** Allocation.
     */
    class Allocator_Impl;
282
    class Allocator : public virtual salhelper::SimpleReferenceObject
283 284 285 286
    {
    public:
        template< class T > T * construct()
        {
287
            void * page = nullptr; sal_uInt16 size = 0;
288 289 290 291 292 293 294 295 296 297
            if (allocate (&page, &size))
            {
                return new(page) T(size);
            }
            return 0;
        }

        bool allocate (void ** ppPage, sal_uInt16 * pnSize)
        {
            allocate_Impl (ppPage, pnSize);
298
            return ((*ppPage != nullptr) && (*pnSize != 0));
299 300 301 302
        }

        void deallocate (void * pPage)
        {
303
            if (pPage != nullptr)
304 305 306 307 308 309
                deallocate_Impl (pPage);
        }

        static storeError createInstance (
            rtl::Reference< PageData::Allocator > & rxAllocator, sal_uInt16 nPageSize);

310
    protected:
311
        virtual ~Allocator() override {}
312

313 314 315 316 317 318 319
    private:
        /** Implementation (abstract).
         */
        virtual void allocate_Impl (void ** ppPage, sal_uInt16 * pnSize) = 0;
        virtual void deallocate_Impl (void * pPage) = 0;
    };

320 321 322 323 324 325 326 327 328 329 330
    class Deallocate {
    public:
        explicit Deallocate(rtl::Reference<Allocator> const & allocator):
            allocator_(allocator) {};

        void operator ()(void * page) const { allocator_->deallocate(page); }

    private:
        rtl::Reference<Allocator> allocator_;
    };

331 332 333 334 335 336 337 338 339 340 341 342 343
    static void* operator new (size_t, void * p) { return p; }
    static void  operator delete (void * , void *) {}

    /** Construction.
     */
    explicit PageData (sal_uInt16 nPageSize = thePageSize)
        : m_aGuard(),
          m_aDescr(STORE_PAGE_NULL, nPageSize, thePageSize),
          m_aMarked(),
          m_aUnused()
    {}

    void swap (PageData & rhs) // nothrow
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
344
    {
345 346 347 348
        m_aGuard.swap(rhs.m_aGuard);
        m_aDescr.swap(rhs.m_aDescr);
        m_aMarked.swap(rhs.m_aMarked);
        m_aUnused.swap(rhs.m_aUnused);
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
349 350
    }

351 352 353 354 355 356 357 358
    PageData (PageData const & rhs) // nothrow
        : m_aGuard (rhs.m_aGuard),
          m_aDescr (rhs.m_aDescr),
          m_aMarked(rhs.m_aMarked),
          m_aUnused(rhs.m_aUnused)
    {}

    PageData & operator= (PageData const & rhs) // nothrow
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
359
    {
360 361 362
        PageData tmp (rhs);
        swap (tmp);
        return *this;
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
363 364 365
    }

    /** guard (external representation).
366 367 368
     */
    void guard (sal_uInt32 nAddr)
    {
369
        sal_uInt32 nCRC32 = rtl_crc32 (0, &m_aGuard.m_nMagic, sizeof(sal_uInt32));
370
        m_aDescr.m_nAddr = store::htonl(nAddr);
371
        nCRC32 = rtl_crc32 (nCRC32, &m_aDescr, static_cast<sal_uInt32>(theSize - sizeof(G)));
372
        m_aGuard.m_nCRC32 = store::htonl(nCRC32);
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
373 374 375
    }

    /** verify (external representation).
376 377
     */
    storeError verify (sal_uInt32 nAddr) const
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
378
    {
379
        sal_uInt32 nCRC32 = rtl_crc32 (0, &m_aGuard.m_nMagic, sizeof(sal_uInt32));
380
        nCRC32 = rtl_crc32 (nCRC32, &m_aDescr, static_cast<sal_uInt32>(theSize - sizeof(G)));
381 382 383 384
        if (m_aGuard.m_nCRC32 != store::htonl(nCRC32))
            return store_E_InvalidChecksum;
        if (m_aDescr.m_nAddr != store::htonl(nAddr))
            return store_E_InvalidAccess;
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
385 386
        return store_E_None;
    }
387

Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
388 389
};

390 391 392 393
template< class T >
class PageHolderObject
{
    /** Representation.
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
394
     */
395
    std::shared_ptr<PageData> m_xPage;
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
396

397
    /** Checked cast.
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
398
     */
399 400
    template< class U >
    static bool isA (PageData const * p)
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
401
    {
402
        return ((p != nullptr) && (p->type() == U::theTypeId));
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
403 404
    }

405 406
    template< class U >
    static U * dynamic_page_cast (PageData * p)
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
407
    {
408
        return isA<U>(p) ? static_cast<U*>(p) : 0;
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
409 410
    }

411 412
    template< class U >
    static U const * dynamic_page_cast (PageData const * p)
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
413
    {
414
        return isA<U>(p) ? static_cast<U const *>(p) : 0;
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
415 416 417
    }

public:
418
    bool construct (rtl::Reference< PageData::Allocator > const & rxAllocator)
419
    {
420 421
        if ((m_xPage.get() == 0) && rxAllocator.is())
        {
422
            std::shared_ptr<PageData> tmp (rxAllocator->construct<T>(), PageData::Deallocate(rxAllocator));
423 424 425
            m_xPage.swap (tmp);
        }
        return (m_xPage.get() != 0);
426
    }
427

428
    explicit PageHolderObject (std::shared_ptr<PageData> const & rxPage = std::shared_ptr<PageData>())
429 430
        : m_xPage (rxPage)
    {}
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
431

432 433 434 435
    void swap (PageHolderObject<T> & rhs)
    {
        m_xPage.swap (rhs.m_xPage);
    }
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
436

437 438 439
    PageHolderObject (PageHolderObject<T> const & rhs)
        : m_xPage (rhs.m_xPage)
    {}
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
440

441 442 443 444 445 446
    PageHolderObject<T> & operator= (PageHolderObject<T> const & rhs)
    {
        PageHolderObject<T> tmp (rhs);
        this->swap (tmp);
        return *this;
    }
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
447

448 449 450 451
    bool is() const
    {
        return (m_xPage.get() != 0);
    }
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
452

453 454
    std::shared_ptr<PageData> & get() { return m_xPage; }
    std::shared_ptr<PageData> const & get() const { return m_xPage; }
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
455

456 457 458
    T * operator->()
    {
        T * pImpl = dynamic_page_cast<T>(m_xPage.get());
459
        OSL_PRECOND(pImpl != nullptr, "store::PageHolder<T>::operator*(): Null pointer");
460 461
        return pImpl;
    }
462

463 464 465
    T const * operator->() const
    {
        T const * pImpl = dynamic_page_cast<T>(m_xPage.get());
466
        OSL_PRECOND(pImpl != nullptr, "store::PageHolder<T>::operator*(): Null pointer");
467 468
        return pImpl;
    }
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
469

470 471 472
    T & operator*()
    {
        T * pImpl = dynamic_page_cast<T>(m_xPage.get());
473
        OSL_PRECOND(pImpl != nullptr, "store::PageHolder<T>::operator*(): Null pointer");
474 475
        return (*pImpl);
    }
476

477 478 479
    T const & operator*() const
    {
        T const * pImpl = dynamic_page_cast<T>(m_xPage.get());
480
        OSL_PRECOND(pImpl != nullptr, "store::PageHolder<T>::operator*(): Null pointer");
481 482
        return (*pImpl);
    }
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
483

484
    static storeError guard (std::shared_ptr<PageData> const & rxPage, sal_uInt32 nAddr)
485 486 487 488 489
    {
        PageData * pHead = rxPage.get();
        if (!pHead)
            return store_E_InvalidAccess;
        pHead->guard(nAddr);
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
490

491
        T * pImpl = dynamic_page_cast<T>(pHead);
492
        OSL_PRECOND(pImpl != nullptr, "store::PageHolder<T>::guard(): Null pointer");
493
        pImpl->guard();
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
494

495 496
        return store_E_None;
    }
497

498
    static storeError verify (std::shared_ptr<PageData> const & rxPage, sal_uInt32 nAddr)
499 500 501 502
    {
        PageData const * pHead = rxPage.get();
        if (!pHead)
            return store_E_InvalidAccess;
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
503

504 505 506
        storeError eErrCode = pHead->verify(nAddr);
        if (eErrCode != store_E_None)
            return eErrCode;
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
507

508 509 510
        T const * pImpl = dynamic_page_cast<T>(pHead);
        if (!pImpl)
            return store_E_WrongVersion;
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
511

512
        return pImpl->verify();
513 514
    }
};
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
515

516 517
class OStorePageObject
{
518
    typedef PageData       page;
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
519

520 521
public:
    /** Allocation.
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
522
     */
523
    static void * operator new (size_t n)
524
    {
525
        return std::malloc(sal_uInt32(n));
526
    }
527
    static void operator delete (void * p)
528
    {
529
        std::free (p);
530
    }
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
531

532
    /** State.
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
533
     */
534 535 536
    inline bool dirty() const;
    inline void clean();
    inline void touch();
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
537

538
    /** Location.
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
539
     */
540
    inline sal_uInt32 location() const;
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
541

542 543
protected:
    /** Representation.
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
544
     */
545
    std::shared_ptr<PageData> m_xPage;
546
    bool       m_bDirty;
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
547

548
    /** Construction.
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
549
     */
550
    explicit OStorePageObject (std::shared_ptr<PageData> const & rxPage)
551 552
        : m_xPage (rxPage), m_bDirty (false)
    {}
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
553

554
    /** Destruction.
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
555
     */
556
    virtual ~OStorePageObject();
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
557

558 559
public:
    template< class U >
560
    PageHolderObject<U> makeHolder() const
561 562 563
    {
        return PageHolderObject<U>(m_xPage);
    }
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
564

565 566 567 568 569
    template< class U >
    storeError construct (rtl::Reference< PageData::Allocator > const & rxAllocator)
    {
        if (!rxAllocator.is())
            return store_E_InvalidAccess;
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
570

571
        std::shared_ptr<PageData> tmp (rxAllocator->construct<U>(), PageData::Deallocate(rxAllocator));
572 573
        if (!tmp.get())
            return store_E_OutOfMemory;
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
574

575 576 577
        m_xPage.swap (tmp);
        return store_E_None;
    }
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
578

579
    std::shared_ptr<PageData> & get() { return m_xPage; }
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
580

581 582
    virtual storeError guard  (sal_uInt32 nAddr) = 0;
    virtual storeError verify (sal_uInt32 nAddr) const = 0;
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
583 584
};

585
inline bool OStorePageObject::dirty() const
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
586
{
587
    return m_bDirty;
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
588
}
589

590
inline void OStorePageObject::clean()
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
591
{
592
    m_bDirty = false;
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
593
}
594

595
inline void OStorePageObject::touch()
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
596
{
597
    m_bDirty = true;
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
598 599
}

600
inline sal_uInt32 OStorePageObject::location() const
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
601
{
602
    return m_xPage->location();
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
603
}
604

605
} // namespace store
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
606

607
#endif // INCLUDED_STORE_SOURCE_STORBASE_HXX
608 609

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */