Imported Upstream version 3.8.0
[platform/upstream/protobuf.git] / java / core / src / main / java / com / google / protobuf / ByteOutput.java
1 // Protocol Buffers - Google's data interchange format
2 // Copyright 2008 Google Inc.  All rights reserved.
3 // https://developers.google.com/protocol-buffers/
4 //
5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are
7 // met:
8 //
9 //     * Redistributions of source code must retain the above copyright
10 // notice, this list of conditions and the following disclaimer.
11 //     * Redistributions in binary form must reproduce the above
12 // copyright notice, this list of conditions and the following disclaimer
13 // in the documentation and/or other materials provided with the
14 // distribution.
15 //     * Neither the name of Google Inc. nor the names of its
16 // contributors may be used to endorse or promote products derived from
17 // this software without specific prior written permission.
18 //
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
31 package com.google.protobuf;
32
33 import java.io.IOException;
34 import java.nio.ByteBuffer;
35
36 /**
37  * An output target for raw bytes. This interface provides semantics that support two types of
38  * writing:
39  *
40  * <p><b>Traditional write operations:</b> (as defined by {@link java.io.OutputStream}) where the
41  * target method is responsible for either copying the data or completing the write before returning
42  * from the method call.
43  *
44  * <p><b>Lazy write operations:</b> where the caller guarantees that it will never modify the
45  * provided buffer and it can therefore be considered immutable. The target method is free to
46  * maintain a reference to the buffer beyond the scope of the method call (e.g. until the write
47  * operation completes).
48  */
49 @ExperimentalApi
50 public abstract class ByteOutput {
51   /**
52    * Writes a single byte.
53    *
54    * @param value the byte to be written
55    * @throws IOException thrown if an error occurred while writing
56    */
57   public abstract void write(byte value) throws IOException;
58
59   /**
60    * Writes a sequence of bytes. The {@link ByteOutput} must copy {@code value} if it will not be
61    * processed prior to the return of this method call, since {@code value} may be reused/altered by
62    * the caller.
63    *
64    * <p>NOTE: This method <strong>MUST NOT</strong> modify the {@code value}. Doing so is a
65    * programming error and will lead to data corruption which will be difficult to debug.
66    *
67    * @param value the bytes to be written
68    * @param offset the offset of the start of the writable range
69    * @param length the number of bytes to write starting from {@code offset}
70    * @throws IOException thrown if an error occurred while writing
71    */
72   public abstract void write(byte[] value, int offset, int length) throws IOException;
73
74   /**
75    * Writes a sequence of bytes. The {@link ByteOutput} is free to retain a reference to the value
76    * beyond the scope of this method call (e.g. write later) since it is considered immutable and is
77    * guaranteed not to change by the caller.
78    *
79    * <p>NOTE: This method <strong>MUST NOT</strong> modify the {@code value}. Doing so is a
80    * programming error and will lead to data corruption which will be difficult to debug.
81    *
82    * @param value the bytes to be written
83    * @param offset the offset of the start of the writable range
84    * @param length the number of bytes to write starting from {@code offset}
85    * @throws IOException thrown if an error occurred while writing
86    */
87   public abstract void writeLazy(byte[] value, int offset, int length) throws IOException;
88
89   /**
90    * Writes a sequence of bytes. The {@link ByteOutput} must copy {@code value} if it will not be
91    * processed prior to the return of this method call, since {@code value} may be reused/altered by
92    * the caller.
93    *
94    * <p>NOTE: This method <strong>MUST NOT</strong> modify the {@code value}. Doing so is a
95    * programming error and will lead to data corruption which will be difficult to debug.
96    *
97    * @param value the bytes to be written. Upon returning from this call, the {@code position} of
98    *     this buffer will be set to the {@code limit}
99    * @throws IOException thrown if an error occurred while writing
100    */
101   public abstract void write(ByteBuffer value) throws IOException;
102
103   /**
104    * Writes a sequence of bytes. The {@link ByteOutput} is free to retain a reference to the value
105    * beyond the scope of this method call (e.g. write later) since it is considered immutable and is
106    * guaranteed not to change by the caller.
107    *
108    * <p>NOTE: This method <strong>MUST NOT</strong> modify the {@code value}. Doing so is a
109    * programming error and will lead to data corruption which will be difficult to debug.
110    *
111    * @param value the bytes to be written. Upon returning from this call, the {@code position} of
112    *     this buffer will be set to the {@code limit}
113    * @throws IOException thrown if an error occurred while writing
114    */
115   public abstract void writeLazy(ByteBuffer value) throws IOException;
116 }