summaryrefslogtreecommitdiff
path: root/android_icu4j/src/main/java/android/icu/text/BidiRun.java
blob: 504e924a9c4de3e02ef641e6ee1a6d810a4b3bdf (plain)
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
136
137
138
139
140
141
142
143
144
145
146
/* GENERATED SOURCE. DO NOT MODIFY. */
/*
*******************************************************************************
*   Copyright (C) 2001-2016, International Business Machines
*   Corporation and others.  All Rights Reserved.
*******************************************************************************
*/
/* Written by Simon Montagu, Matitiahu Allouche
 * (ported from C code written by Markus W. Scherer)
 */

package android.icu.text;

/**
 * A BidiRun represents a sequence of characters at the same embedding level.
 * The Bidi algorithm decomposes a piece of text into sequences of characters
 * at the same embedding level, each such sequence is called a "run".
 *
 * <p>A BidiRun represents such a run by storing its essential properties,
 * but does not duplicate the characters which form the run.
 *
 * <p>The &quot;limit&quot; of the run is the position just after the
 * last character, i.e., one more than that position.
 *
 * <p>This class has no public constructor, and its members cannot be
 * modified by users.
 *
 * @see android.icu.text.Bidi
 * @hide Only a subset of ICU is exposed in Android
 */
public class BidiRun {

    int start;              /* first logical position of the run */
    int limit;              /* last visual position of the run +1 */
    int insertRemove;       /* if >0, flags for inserting LRM/RLM before/after run,
                               if <0, count of bidi controls within run            */
    byte level;

    /*
     * Default constructor
     *
     * Note that members start and limit of a run instance have different
     * meanings depending whether the run is part of the runs array of a Bidi
     * object, or if it is a reference returned by getVisualRun() or
     * getLogicalRun().
     * For a member of the runs array of a Bidi object,
     *   - start is the first logical position of the run in the source text.
     *   - limit is one after the last visual position of the run.
     * For a reference returned by getLogicalRun() or getVisualRun(),
     *   - start is the first logical position of the run in the source text.
     *   - limit is one after the last logical position of the run.
     */
    BidiRun()
    {
        this(0, 0, (byte)0);
    }

    /*
     * Constructor
     */
    BidiRun(int start, int limit, byte embeddingLevel)
    {
        this.start = start;
        this.limit = limit;
        this.level = embeddingLevel;
    }

    /*
     * Copy the content of a BidiRun instance
     */
    void copyFrom(BidiRun run)
    {
        this.start = run.start;
        this.limit = run.limit;
        this.level = run.level;
        this.insertRemove = run.insertRemove;
    }

    /**
     * Get the first logical position of the run in the source text
     */
    public int getStart()
    {
        return start;
    }

    /**
     * Get position of one character after the end of the run in the source text
     */
    public int getLimit()
    {
        return limit;
    }

    /**
     * Get length of run
     */
    public int getLength()
    {
        return limit - start;
    }

    /**
     * Get level of run
     */
    public byte getEmbeddingLevel()
    {
        return level;
    }

    /**
     * Check if run level is odd
     * @return true if the embedding level of this run is odd, i.e. it is a
     *  right-to-left run.
     */
    public boolean isOddRun()
    {
        return (level & 1) == 1;
    }

    /**
     * Check if run level is even
     * @return true if the embedding level of this run is even, i.e. it is a
     *  left-to-right run.
     */
    public boolean isEvenRun()
    {
        return (level & 1) == 0;
    }

    /**
     * Get direction of run
     */
    public byte getDirection()
    {
        return (byte)(level & 1);
    }

    /**
     * String to display run
     */
    public String toString()
    {
        return "BidiRun " + start + " - " + limit + " @ " + level;
    }
}