samply 0.13.1

A command line profiler for macOS and Linux.
use std::ops::Deref;
use std::sync::Arc;

use memmap2::Mmap;

#[derive(Clone)]
pub enum MmapRangeOrVec {
    MmapRange(Arc<Mmap>, (usize, usize)),
    Vec(Arc<Vec<u8>>),
}

impl MmapRangeOrVec {
    pub fn new_mmap_range(mmap: Arc<Mmap>, start: u64, size: u64) -> Option<MmapRangeOrVec> {
        let start = usize::try_from(start).ok()?;
        let size = usize::try_from(size).ok()?;
        let end = start.checked_add(size)?;
        if end <= mmap.len() {
            Some(Self::MmapRange(mmap, (start, size)))
        } else {
            None
        }
    }
}

impl Deref for MmapRangeOrVec {
    type Target = [u8];

    fn deref(&self) -> &Self::Target {
        match self {
            MmapRangeOrVec::MmapRange(mmap, (start, size)) => &mmap[*start..][..*size],
            MmapRangeOrVec::Vec(vec) => &vec[..],
        }
    }
}