use std::default::Default;
use std::hash::Hash;
use std::ops::Deref;
use std::option;
use crate::Message;
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
pub struct MessageField<T>(pub Option<Box<T>>);
impl<T> MessageField<T> {
#[inline]
pub fn some(value: T) -> MessageField<T> {
MessageField(Some(Box::new(value)))
}
#[inline]
pub const fn none() -> MessageField<T> {
MessageField(None)
}
#[inline]
pub fn from_option(option: Option<T>) -> MessageField<T> {
match option {
Some(x) => MessageField::some(x),
None => MessageField::none(),
}
}
#[inline]
pub fn is_some(&self) -> bool {
self.0.is_some()
}
#[inline]
pub fn is_none(&self) -> bool {
self.0.is_none()
}
#[inline]
pub fn into_option(self) -> Option<T> {
self.0.map(|v| *v)
}
#[inline]
pub fn as_ref(&self) -> Option<&T> {
self.0.as_ref().map(|v| &**v)
}
#[inline]
pub fn as_mut(&mut self) -> Option<&mut T> {
self.0.as_mut().map(|v| &mut **v)
}
#[inline]
pub fn unwrap(self) -> T {
*self.0.unwrap()
}
#[inline]
pub fn unwrap_or(self, def: T) -> T {
self.0.map(|v| *v).unwrap_or(def)
}
#[inline]
pub fn unwrap_or_else<F>(self, f: F) -> T
where
F: FnOnce() -> T,
{
self.0.map(|v| *v).unwrap_or_else(f)
}
#[inline]
pub fn map<U, F>(self, f: F) -> MessageField<U>
where
F: FnOnce(T) -> U,
{
MessageField::from_option(self.into_option().map(f))
}
#[inline]
pub fn iter(&self) -> option::IntoIter<&T> {
self.as_ref().into_iter()
}
#[inline]
pub fn mut_iter(&mut self) -> option::IntoIter<&mut T> {
self.as_mut().into_iter()
}
#[inline]
pub fn take(&mut self) -> Option<T> {
self.0.take().map(|v| *v)
}
#[inline]
pub fn clear(&mut self) {
self.0 = None;
}
}
impl<T: Default> MessageField<T> {
#[inline]
pub fn unwrap_or_default(self) -> T {
*self.0.unwrap_or_default()
}
}
impl<M: Message> MessageField<M> {
pub fn get_or_default(&self) -> &M {
self.as_ref().unwrap_or_else(|| M::default_instance())
}
pub fn mut_or_insert_default(&mut self) -> &mut M {
if self.is_none() {
*self = MessageField::some(Default::default());
}
self.as_mut().unwrap()
}
}
impl<M: Message> Deref for MessageField<M> {
type Target = M;
fn deref(&self) -> &Self::Target {
self.get_or_default()
}
}
#[cfg(no)]
impl<M: Message> DerefMut for MessageField<M> {
fn deref_mut(&mut self) -> &mut Self::Target {
self.mut_or_insert_default()
}
}
impl<T> Default for MessageField<T> {
#[inline]
fn default() -> MessageField<T> {
MessageField::none()
}
}
impl<T> From<Option<T>> for MessageField<T> {
fn from(o: Option<T>) -> Self {
MessageField::from_option(o)
}
}
impl<'a, T> IntoIterator for &'a MessageField<T> {
type Item = &'a T;
type IntoIter = option::IntoIter<&'a T>;
fn into_iter(self) -> option::IntoIter<&'a T> {
self.iter()
}
}