Skip to content

Instantly share code, notes, and snippets.

@Riey
Last active November 8, 2020 17:06
Show Gist options
  • Save Riey/9d562c29832a8fda0d807906fa88e20c to your computer and use it in GitHub Desktop.
Save Riey/9d562c29832a8fda0d807906fa88e20c to your computer and use it in GitHub Desktop.
주간문제 HashMap
use std::slice::SliceIndex;
use std::ptr::NonNull;
use std::ops::{Deref, DerefMut, Index, IndexMut};
use std::iter::FromIterator;
// 필드는 참고용이며 꼭 이렇게 안해도됨
pub struct Vec<T> {
ptr: NonNull<T>,
len: usize,
cap: usize,
}
// 필수 api
impl<T> Vec<T> {
pub fn new() -> Self;
pub fn with_capacity(capacity: usize) -> Self;
pub fn len(&self) -> usize;
pub fn get(&self) -> Option<&T>;
pub fn get_mut(&mut self) -> Option<&mut T>;
pub fn push(&mut self, val: T);
pub fn pop(&mut self) -> Option<T>;
pub fn clear(&mut self);
}
// 필수 trait 구현
impl<T, I> Index<I> for Vec<T> where I: SliceIndex<[T]> { type Output = T; }
impl<T, I> IndexMut<I> for Vec<T> where I: SliceIndex<[T]> {}
impl<T> Deref for Vec<T> { type Target = [T]; }
impl<T> DerefMut for Vec<T> {}
impl<T> Clone for Vec<T> where T: Clone {}
impl<T> IntoIterator for Vec<T> {}
impl<T> FromIterator<T> for Vec<T> {}
// 자동구현이 되는 경우엔 생략
unsafe impl<T> Send for Vec<T> where T: Send {}
unsafe impl<T> Sync for Vec<T> where T: Sync {}
// 통과해야할 테스트들
#[cfg(test)]
mod tests {
use super::Vec;
#[test]
#[should_panic]
fn out_of_bound() {
let v = Vec::<i32>::new();
v[123];
}
#[test]
fn make_vec() {
let v: Vec<usize> = (0..100).collect();
for i in 0..100 {
assert_eq!(v[i], i);
}
}
#[test]
fn push_test() {
let mut v = Vec::new();
v.push(1);
v.push(654);
v.push(123);
v.push(654);
v.pop();
assert_eq!(&v[..], &[1, 654, 123]);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment