Initial release
This commit is contained in:
@@ -0,0 +1,208 @@
|
||||
// Copyright (c) 2016 The WebM project authors. All Rights Reserved.
|
||||
//
|
||||
// Use of this source code is governed by a BSD-style license
|
||||
// that can be found in the LICENSE file in the root of the source
|
||||
// tree. An additional intellectual property rights grant can be found
|
||||
// in the file PATENTS. All contributing project authors may
|
||||
// be found in the AUTHORS file in the root of the source tree.
|
||||
#ifndef INCLUDE_WEBM_ELEMENT_H_
|
||||
#define INCLUDE_WEBM_ELEMENT_H_
|
||||
|
||||
#include <cstdint>
|
||||
#include <limits>
|
||||
#include <utility>
|
||||
|
||||
#include "./id.h"
|
||||
|
||||
/**
|
||||
\file
|
||||
A wrapper around an object that represents a WebM element, including its parsed
|
||||
metadata.
|
||||
*/
|
||||
|
||||
namespace webm {
|
||||
|
||||
/**
|
||||
\addtogroup PUBLIC_API
|
||||
@{
|
||||
*/
|
||||
|
||||
/**
|
||||
A wrapper around an object that represents a WebM element.
|
||||
|
||||
Since some elements may be absent, this wrapper is used to indicate the
|
||||
presence (or lack thereof) of an element in a WebM document. If the element is
|
||||
encoded in the file and it has been parsed, `is_present()` will return true.
|
||||
Otherwise it will return false since the element was ommitted or skipped when
|
||||
parsing.
|
||||
*/
|
||||
template <typename T>
|
||||
class Element {
|
||||
public:
|
||||
/**
|
||||
Value-initializes the element's value and makes `is_present()` false.
|
||||
*/
|
||||
constexpr Element() = default;
|
||||
|
||||
/**
|
||||
Creates an element with the given value and makes `is_present()` false.
|
||||
|
||||
\param value The value of the element.
|
||||
*/
|
||||
explicit constexpr Element(const T& value) : value_(value) {}
|
||||
|
||||
/**
|
||||
Creates an element with the given value and makes `is_present()` false.
|
||||
|
||||
\param value The value of the element.
|
||||
*/
|
||||
explicit constexpr Element(T&& value) : value_(std::move(value)) {}
|
||||
|
||||
/**
|
||||
Creates an element with the given value and presence state.
|
||||
|
||||
\param value The value of the element.
|
||||
\param is_present True if the element is present, false if it is absent.
|
||||
*/
|
||||
constexpr Element(const T& value, bool is_present)
|
||||
: value_(value), is_present_(is_present) {}
|
||||
|
||||
/**
|
||||
Creates an element with the given value and presence state.
|
||||
|
||||
\param value The value of the element.
|
||||
\param is_present True if the element is present, false if it is absent.
|
||||
*/
|
||||
constexpr Element(T&& value, bool is_present)
|
||||
: value_(std::move(value)), is_present_(is_present) {}
|
||||
|
||||
constexpr Element(const Element<T>& other) = default;
|
||||
constexpr Element(Element<T>&& other) = default;
|
||||
|
||||
~Element() = default;
|
||||
|
||||
Element<T>& operator=(const Element<T>& other) = default;
|
||||
Element<T>& operator=(Element<T>&& other) = default;
|
||||
|
||||
/**
|
||||
Sets the element's value and state.
|
||||
|
||||
\param value The new value for the element.
|
||||
\param is_present The new presence state for the element.
|
||||
*/
|
||||
void Set(const T& value, bool is_present) {
|
||||
value_ = value;
|
||||
is_present_ = is_present;
|
||||
}
|
||||
|
||||
/**
|
||||
Sets the element's value and state.
|
||||
|
||||
\param value The new value for the element.
|
||||
\param is_present The new presence state for the element.
|
||||
*/
|
||||
void Set(T&& value, bool is_present) {
|
||||
value_ = std::move(value);
|
||||
is_present_ = is_present;
|
||||
}
|
||||
|
||||
/**
|
||||
Gets the element's value.
|
||||
*/
|
||||
constexpr const T& value() const { return value_; }
|
||||
|
||||
/**
|
||||
Gets a mutuable pointer to the element's value (will never be null).
|
||||
*/
|
||||
T* mutable_value() { return &value_; }
|
||||
|
||||
/**
|
||||
Returns true if the element is present, false otherwise.
|
||||
*/
|
||||
constexpr bool is_present() const { return is_present_; }
|
||||
|
||||
bool operator==(const Element<T>& other) const {
|
||||
return is_present_ == other.is_present_ && value_ == other.value_;
|
||||
}
|
||||
|
||||
private:
|
||||
T value_{};
|
||||
bool is_present_ = false;
|
||||
};
|
||||
|
||||
/**
|
||||
Metadata for WebM elements that are encountered when parsing.
|
||||
*/
|
||||
struct ElementMetadata {
|
||||
/**
|
||||
The EBML ID of the element.
|
||||
*/
|
||||
Id id;
|
||||
|
||||
/**
|
||||
The number of bytes that were used to encode the EBML ID and element size.
|
||||
|
||||
If the size of the header is unknown (which is only the case if a seek was
|
||||
performed to the middle of an element, so its header was not parsed), this
|
||||
will be the value `kUnknownHeaderSize`.
|
||||
*/
|
||||
std::uint32_t header_size;
|
||||
|
||||
/**
|
||||
The size of the element.
|
||||
|
||||
This is number of bytes in the element's body, which excludes the header
|
||||
bytes.
|
||||
|
||||
If the size of the element's body is unknown, this will be the value
|
||||
`kUnknownElementSize`.
|
||||
*/
|
||||
std::uint64_t size;
|
||||
|
||||
/**
|
||||
The absolute byte position of the element, starting at the first byte of the
|
||||
element's header.
|
||||
|
||||
If the position of the element is unknown (which is only the case if a seek
|
||||
was performed to the middle of an element), this will be the value
|
||||
`kUnknownElementPosition`.
|
||||
*/
|
||||
std::uint64_t position;
|
||||
|
||||
/**
|
||||
Returns true if every member within the two objects are equal.
|
||||
*/
|
||||
bool operator==(const ElementMetadata& other) const {
|
||||
return id == other.id && header_size == other.header_size &&
|
||||
size == other.size && position == other.position;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
A special value for `ElementMetadata::header_size` indicating the header size
|
||||
is not known.
|
||||
*/
|
||||
constexpr std::uint64_t kUnknownHeaderSize =
|
||||
std::numeric_limits<std::uint32_t>::max();
|
||||
|
||||
/**
|
||||
A special value for `ElementMetadata::size` indicating the element's size is
|
||||
not known.
|
||||
*/
|
||||
constexpr std::uint64_t kUnknownElementSize =
|
||||
std::numeric_limits<std::uint64_t>::max();
|
||||
|
||||
/**
|
||||
A special value for `ElementMetadata::position` indicating the element's
|
||||
position is not known.
|
||||
*/
|
||||
constexpr std::uint64_t kUnknownElementPosition =
|
||||
std::numeric_limits<std::uint64_t>::max();
|
||||
|
||||
/**
|
||||
@}
|
||||
*/
|
||||
|
||||
} // namespace webm
|
||||
|
||||
#endif // INCLUDE_WEBM_ELEMENT_H_
|
||||
Reference in New Issue
Block a user