Last active
November 8, 2020 17:06
-
-
Save Riey/9d562c29832a8fda0d807906fa88e20c to your computer and use it in GitHub Desktop.
주간문제 HashMap
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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