1f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius/*
2f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius******************************************************************************
3f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius* Copyright (C) 2014, International Business Machines
4f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius* Corporation and others.  All Rights Reserved.
5f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius******************************************************************************
6f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius* sharedbreakiterator.h
7f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius*/
8f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
9f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius#ifndef __SHARED_BREAKITERATOR_H__
10f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius#define __SHARED_BREAKITERATOR_H__
11f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
12f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius#include "unicode/utypes.h"
13f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius#include "sharedobject.h"
14f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
15f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius#if !UCONFIG_NO_BREAK_ITERATION
16f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
17f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_NAMESPACE_BEGIN
18f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
19f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusclass BreakIterator;
20f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
21f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius// SharedBreakIterator encapsulates a shared BreakIterator. Because
22f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius// BreakIterator has mutable semantics, clients must ensure that all uses
23f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius// of a particular shared BreakIterator is protected by the same mutex
24f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius// ensuring that only one thread at a time gets access to that shared
25f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius// BreakIterator. Clients can accomplish this by creating a mutex for all
26f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius// uses of break iterator within a particular class. Then objects of that
27f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius// class may then freely share break iterators among themselves. However,
28f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius// these shared break iterators must never be exposed outside of that class.
29f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusclass U_I18N_API SharedBreakIterator : public SharedObject {
30f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliuspublic:
31f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    SharedBreakIterator(BreakIterator *biToAdopt);
32f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    virtual ~SharedBreakIterator();
33f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
34f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    BreakIterator *get() const { return ptr; }
35f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    BreakIterator *operator->() const { return ptr; }
36f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    BreakIterator &operator*() const { return *ptr; }
37f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusprivate:
38f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    BreakIterator *ptr;
39f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    SharedBreakIterator(const SharedBreakIterator &);
40f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    SharedBreakIterator &operator=(const SharedBreakIterator &);
41f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius};
42f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
43f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_NAMESPACE_END
44f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
45f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius#endif
46f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
47f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius#endif
48