use super::compressor::Compressor;
use super::COMPRESSIONDEFAULT;
use snap;
use std::fmt;
use std::str;
use std::string::String;
use std::vec::Vec;
use str_util::to_bytes;
#[derive(Debug, Clone)]
pub struct PString {
pub compression: bool,
codepoints: Vec<u8>,
}
impl fmt::Display for PString {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.clone().to_string_backend())
}
}
impl PString {
#[inline]
pub fn new() -> PString {
PString {
compression: COMPRESSIONDEFAULT,
codepoints: Vec::new(),
}
}
#[inline]
pub fn char_at(&self, index: usize) -> char {
let bytes = self.decompress_to_bytes();
bytes[index] as char
}
#[inline]
pub fn with_capacity(capacity: usize) -> PString {
PString {
compression: COMPRESSIONDEFAULT,
codepoints: Vec::with_capacity(capacity),
}
}
#[inline]
pub fn from_bytes(codepoints: Vec<u8>) -> PString {
PString {
compression: COMPRESSIONDEFAULT,
codepoints: Compressor::compress_bytes(codepoints, COMPRESSIONDEFAULT),
}
}
#[inline]
pub fn set_bytes(&mut self, codepoints: Vec<u8>) {
self.codepoints = Compressor::compress_bytes(codepoints, self.compression);
}
#[inline]
pub fn set_str(&mut self, string: &'static str) {
self.codepoints = Compressor::compress_bytes(to_bytes::str_to_bytes(string), self.compression);
}
#[inline]
pub fn set_string(&mut self, string: String) {
self.codepoints = Compressor::compress_bytes(to_bytes::string_to_bytes(string), self.compression);
}
#[inline]
pub fn from_str(string: &'static str) -> PString {
let returnvalue: PString = PString::from_bytes(to_bytes::str_to_bytes(string));
returnvalue
}
#[inline]
pub fn from_string(string: String) -> PString {
let returnvalue: PString = PString::from_bytes(to_bytes::string_to_bytes(string));
returnvalue
}
#[inline]
fn to_string_backend(&mut self) -> String {
let bytes = Compressor::decompress_bytes(self.codepoints.clone(), self.compression);
String::from_utf8(bytes).unwrap()
}
#[inline]
pub fn as_bytes(&mut self) -> Vec<u8> {
self.decompress_to_bytes()
}
#[inline]
pub fn as_bytes_raw(&self) -> Vec<u8> {
self.codepoints.clone()
}
pub fn chars(&self) -> Vec<char> {
let mut chararray: Vec<char> = Vec::new();
for byte in self.decompress_to_bytes() {
chararray.push(byte as char);
}
chararray
}
pub fn compress(&mut self) {
if self.compression == false {
let mut encoder = snap::Encoder::new();
self.codepoints = encoder.compress_vec(&self.codepoints[..]).unwrap();
self.compression = true;
}
}
pub fn decompress(&mut self) {
if self.compression == true {
let mut decoder = snap::Decoder::new();
self.codepoints = decoder.decompress_vec(&self.codepoints[..]).unwrap();
self.compression = false;
}
}
#[allow(dead_code)]
#[inline(always)]
fn compress_to_bytes(&self) -> Vec<u8> {
if self.compression == true {
let mut encoder = snap::Encoder::new();
return encoder.compress_vec(&self.codepoints[..]).unwrap();
}
self.codepoints.clone()
}
#[allow(dead_code)]
#[inline(always)]
fn decompress_to_bytes(&self) -> Vec<u8> {
if self.compression == true {
let mut decoder = snap::Decoder::new();
return decoder.decompress_vec(&self.codepoints[..]).unwrap();
}
self.codepoints.clone()
}
#[allow(dead_code)]
#[inline(always)]
fn autocompress(&mut self) {
if self.compression {
let mut encoder = snap::Encoder::new();
self.codepoints = encoder.compress_vec(&self.codepoints[..]).unwrap();
}
}
#[allow(dead_code)]
#[inline(always)]
fn autodecompress(&mut self) {
if self.compression {
let mut decoder = snap::Decoder::new();
self.codepoints = decoder.decompress_vec(&self.codepoints[..]).unwrap();
}
}
}