Self::String(s) => VarWidth::String(s.len().try_into().unwrap()),
}
}
+
+ pub fn borrowed<'a>(&'a self) -> EncodedDatum<BorrowedEncodedString<'a>> {
+ match self {
+ EncodedDatum::Number(number) => EncodedDatum::Number(*number),
+ EncodedDatum::String(encoded_string) => EncodedDatum::String(encoded_string.borrowed()),
+ }
+ }
+
+ /// Compares this datum and `other` for equality, ignoring trailing ASCII
+ /// spaces in either, if they are both strings, for the purpose of
+ /// comparison.
+ pub fn eq_ignore_trailing_spaces<R2>(&self, other: &EncodedDatum<EncodedString<R2>>) -> bool
+ where
+ R2: Borrow<BorrowedRawString>,
+ {
+ match (self.borrowed(), other.borrowed()) {
+ (EncodedDatum::Number(lhs), EncodedDatum::Number(rhs)) => lhs == rhs,
+ (EncodedDatum::String(lhs), EncodedDatum::String(rhs)) => {
+ lhs.eq_ignore_trailing_spaces(&rhs)
+ }
+ _ => false,
+ }
+ }
}
impl<D> EncodedDatum<D> {
}
}
- /// Compares this datum and `other` for equality, ignoring trailing ASCII
- /// spaces in either, if they are both strings, for the purpose of
- /// comparison.
- pub fn eq_ignore_trailing_spaces<'a>(&self, other: impl Into<EncodedDat<'a>>) -> bool {
- self.borrowed().eq_ignore_trailing_spaces(other.into())
- }
-
/// Removes trailing ASCII spaces from this datum, if it is a string.
pub fn trim_end(&mut self) {
match self {
}
}
- pub fn borrowed<'a>(&'a self) -> EncodedDat<'a> {
- match self {
- EncodedDatum::Number(number) => EncodedDat::Number(*number),
- EncodedDatum::String(encoded_string) => EncodedDat::String(encoded_string.borrowed()),
- }
- }
-
- pub fn quoted(&self) -> QuotedEncodedDat<'_> {
- self.borrowed().quoted()
+ pub fn quoted(&self) -> QuotedEncodedDatum<'_> {
+ QuotedEncodedDatum(self.borrowed())
}
}
impl Display for EncodedDatum {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
- write!(f, "{}", self.borrowed())
+ match self {
+ Self::Number(None) => write!(f, "SYSMIS"),
+ Self::Number(Some(number)) => number.display_plain().fmt(f),
+ Self::String(string) => write!(f, "{string}"),
+ }
}
}
}
}
- pub fn quoted(&self) -> QuotedEncodedDat<'a> {
- QuotedEncodedDat(*self)
+ pub fn quoted(&self) -> QuotedEncodedDatum<'a> {
+ todo!()
}
}
-pub struct QuotedEncodedDat<'a>(EncodedDat<'a>);
+pub struct QuotedEncodedDatum<'a>(BorrowedEncodedDatum<'a>);
-impl Display for QuotedEncodedDat<'_> {
+impl Display for QuotedEncodedDatum<'_> {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match &self.0 {
- EncodedDat::Number(None) => write!(f, "SYSMIS"),
- EncodedDat::Number(Some(number)) => number.display_plain().fmt(f),
- EncodedDat::String(string) => write!(f, "\"{}\"", string.as_str()),
+ EncodedDatum::Number(None) => write!(f, "SYSMIS"),
+ EncodedDatum::Number(Some(number)) => number.display_plain().fmt(f),
+ EncodedDatum::String(string) => write!(f, "\"{}\"", string.as_str()),
}
}
}
}
}
- pub fn as_encoded<'a>(&'a self, encoding: &'static Encoding) -> EncodedDat<'a> {
+ pub fn as_encoded<'a>(&'a self, encoding: &'static Encoding) -> BorrowedEncodedDatum<'a> {
match self {
- Datum::Number(number) => EncodedDat::Number(*number),
- Datum::String(raw_string) => EncodedDat::String(EncodedString {
+ Datum::Number(number) => EncodedDatum::Number(*number),
+ Datum::String(raw_string) => EncodedDatum::String(EncodedString {
encoding,
raw: raw_string.borrow(),
}),
use unicase::UniCase;
use crate::{
- data::{Datum, EncodedDat, EncodedDatum, OwnedRawString},
+ data::{BorrowedEncodedDatum, Datum, EncodedDatum, OwnedRawString},
format::{DisplayPlain, Format},
identifier::{ByIdentifier, HasIdentifier, Identifier},
output::pivot::{
MultipleResponseType::MultipleDichotomy { datum, .. } => {
pt.insert(
&[row, 2],
- Value::new_datum(datum.as_encoded(self.dictionary.encoding)),
+ Value::new_datum(&datum.as_encoded(self.dictionary.encoding)),
);
"Dichotomies"
}
}
}
- pub fn contains(&self, value: EncodedDat) -> bool {
+ pub fn contains(&self, value: BorrowedEncodedDatum<'_>) -> bool {
if self
.values
.iter()
- .any(|datum| datum.eq_ignore_trailing_spaces(value))
+ .any(|datum| datum.eq_ignore_trailing_spaces(&value))
{
return true;
}
- if let EncodedDat::Number(Some(number)) = value
+ if let Some(Some(number)) = value.as_number()
&& let Some(range) = self.range
{
range.contains(number)
use crate::{
calendar::{calendar_offset_to_gregorian, day_of_year, month_name, short_month_name},
- data::{EncodedDat, EncodedDatum, QuotedEncodedDat},
+ data::{EncodedDat, EncodedDatum, QuotedEncodedDatum},
endian::{endian_to_smallvec, ToBytes},
format::{Category, DateTemplate, Decimal, Format, NumberStyle, Settings, TemplateItem, Type},
settings::{EndianSettings, Settings as PsppSettings},
DisplayDatum::new(format, *self)
}
- pub fn display_plain(&self) -> QuotedEncodedDat<'_> {
+ pub fn display_plain(&self) -> QuotedEncodedDatum<'_> {
self.quoted()
}
}
DisplayDatum::new(format, self.borrowed())
}
- pub fn display_plain(&self) -> QuotedEncodedDat<'_> {
+ pub fn display_plain(&self) -> QuotedEncodedDatum<'_> {
self.quoted()
}
}
//! could also be a variable name or an arbitrary text string.
use std::{
+ borrow::Borrow,
collections::HashMap,
fmt::{Debug, Display, Write},
io::Read,
use tlo::parse_tlo;
use crate::{
- data::{Datum, EncodedDat, OwnedRawString, },
+ data::{BorrowedRawString, Datum, EncodedDat, EncodedDatum, EncodedString, OwnedRawString},
dictionary::{VarType, Variable},
format::{Decimal, Format, Settings as FormatSettings, Type, UncheckedFormat},
settings::{Settings, Show},
variable_label: variable.label.clone(),
}))
}
- pub fn new_datum(value: EncodedDat) -> Self {
+ pub fn new_datum<R>(value: &EncodedDatum<EncodedString<R>>) -> Self
+ where
+ R: Borrow<BorrowedRawString>,
+ {
match value {
EncodedDat::Number(number) => Self::new_number(number),
EncodedDat::String(string) => Self::new_user_text(string.as_str()),