1464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com/*
2464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * Copyright 2011 Google Inc. All Rights Reserved.
3464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com *
4464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * Licensed under the Apache License, Version 2.0 (the "License");
5464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * you may not use this file except in compliance with the License.
6464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * You may obtain a copy of the License at
7464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com *
8464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com *      http://www.apache.org/licenses/LICENSE-2.0
9464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com *
10464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * Unless required by applicable law or agreed to in writing, software
11464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * distributed under the License is distributed on an "AS IS" BASIS,
12464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * See the License for the specific language governing permissions and
14464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com * limitations under the License.
15464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com */
16464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com
17464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com#include "sfntly/port/memory_output_stream.h"
18464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com
19464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.comnamespace sfntly {
20464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com
21464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.comMemoryOutputStream::MemoryOutputStream() {
22464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com}
23464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com
24464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.comMemoryOutputStream::~MemoryOutputStream() {
25464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com}
26464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com
27246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.comvoid MemoryOutputStream::Write(ByteVector* buffer) {
28464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com  store_.insert(store_.end(), buffer->begin(), buffer->end());
29464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com}
30464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com
31246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.comvoid MemoryOutputStream::Write(ByteVector* buffer,
32246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com                               int32_t offset,
33464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com                               int32_t length) {
3432a01c7c6e7be46dda9bfc78de9ce32d99e4c8b7arthurhsu@google.com  assert(buffer);
3532a01c7c6e7be46dda9bfc78de9ce32d99e4c8b7arthurhsu@google.com  if (offset >= 0 && length > 0) {
3632a01c7c6e7be46dda9bfc78de9ce32d99e4c8b7arthurhsu@google.com    store_.insert(store_.end(),
3732a01c7c6e7be46dda9bfc78de9ce32d99e4c8b7arthurhsu@google.com                  buffer->begin() + offset,
3832a01c7c6e7be46dda9bfc78de9ce32d99e4c8b7arthurhsu@google.com                  buffer->begin() + offset + length);
3932a01c7c6e7be46dda9bfc78de9ce32d99e4c8b7arthurhsu@google.com  } else {
4032a01c7c6e7be46dda9bfc78de9ce32d99e4c8b7arthurhsu@google.com#if !defined(SFNTLY_NO_EXCEPTION)
4132a01c7c6e7be46dda9bfc78de9ce32d99e4c8b7arthurhsu@google.com    throw IndexOutOfBoundException();
4232a01c7c6e7be46dda9bfc78de9ce32d99e4c8b7arthurhsu@google.com#endif
4332a01c7c6e7be46dda9bfc78de9ce32d99e4c8b7arthurhsu@google.com  }
4432a01c7c6e7be46dda9bfc78de9ce32d99e4c8b7arthurhsu@google.com}
4532a01c7c6e7be46dda9bfc78de9ce32d99e4c8b7arthurhsu@google.com
4632a01c7c6e7be46dda9bfc78de9ce32d99e4c8b7arthurhsu@google.comvoid MemoryOutputStream::Write(byte_t* buffer, int32_t offset, int32_t length) {
4732a01c7c6e7be46dda9bfc78de9ce32d99e4c8b7arthurhsu@google.com  assert(buffer);
4832a01c7c6e7be46dda9bfc78de9ce32d99e4c8b7arthurhsu@google.com  if (offset >= 0 && length > 0) {
4932a01c7c6e7be46dda9bfc78de9ce32d99e4c8b7arthurhsu@google.com    store_.insert(store_.end(), buffer + offset, buffer + offset + length);
5032a01c7c6e7be46dda9bfc78de9ce32d99e4c8b7arthurhsu@google.com  } else {
5132a01c7c6e7be46dda9bfc78de9ce32d99e4c8b7arthurhsu@google.com#if !defined(SFNTLY_NO_EXCEPTION)
5232a01c7c6e7be46dda9bfc78de9ce32d99e4c8b7arthurhsu@google.com    throw IndexOutOfBoundException();
5332a01c7c6e7be46dda9bfc78de9ce32d99e4c8b7arthurhsu@google.com#endif
5432a01c7c6e7be46dda9bfc78de9ce32d99e4c8b7arthurhsu@google.com  }
55464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com}
56464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com
57246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.comvoid MemoryOutputStream::Write(byte_t b) {
58464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com  store_.push_back(b);
59464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com}
60464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com
61246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.combyte_t* MemoryOutputStream::Get() {
6232a01c7c6e7be46dda9bfc78de9ce32d99e4c8b7arthurhsu@google.com  if (store_.empty()) {
6332a01c7c6e7be46dda9bfc78de9ce32d99e4c8b7arthurhsu@google.com    return NULL;
6432a01c7c6e7be46dda9bfc78de9ce32d99e4c8b7arthurhsu@google.com  }
65464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com  return &(store_[0]);
66464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com}
67464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com
68246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.comsize_t MemoryOutputStream::Size() {
69464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com  return store_.size();
70464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com}
71464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com
72464987db923362e596195f9eebd34fc508c9a41arthurhsu@google.com}  // namespace sfntly
73