Skip to content

Commit 03a4068

Browse files
committed
Move MultiValue from value to multi module
1 parent 9f6c785 commit 03a4068

6 files changed

Lines changed: 96 additions & 90 deletions

File tree

src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ pub use crate::chunk::{AsChunk, Chunk, ChunkMode};
109109
pub use crate::error::{Error, ErrorContext, ExternalError, ExternalResult, Result};
110110
pub use crate::function::{Function, FunctionInfo};
111111
pub use crate::hook::{Debug, DebugEvent, DebugNames, DebugSource, DebugStack};
112-
pub use crate::multi::Variadic;
112+
pub use crate::multi::{MultiValue, Variadic};
113113
pub use crate::scope::Scope;
114114
pub use crate::state::{GCMode, Lua, LuaOptions};
115115
pub use crate::stdlib::StdLib;
@@ -126,7 +126,7 @@ pub use crate::userdata::{
126126
AnyUserData, MetaMethod, UserData, UserDataFields, UserDataMetatable, UserDataMethods, UserDataRef,
127127
UserDataRefMut, UserDataRegistry,
128128
};
129-
pub use crate::value::{MultiValue, Nil, Value};
129+
pub use crate::value::{Nil, Value};
130130

131131
#[cfg(not(feature = "luau"))]
132132
pub use crate::hook::HookTriggers;

src/multi.rs

Lines changed: 87 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
use std::collections::{vec_deque, VecDeque};
12
use std::iter::FromIterator;
3+
use std::mem;
24
use std::ops::{Deref, DerefMut};
35
use std::os::raw::c_int;
46
use std::result::Result as StdResult;
@@ -7,7 +9,7 @@ use crate::error::Result;
79
use crate::state::{Lua, RawLua};
810
use crate::traits::{FromLua, FromLuaMulti, IntoLua, IntoLuaMulti};
911
use crate::util::check_stack;
10-
use crate::value::{MultiValue, Nil};
12+
use crate::value::{Nil, Value};
1113

1214
/// Result is convertible to `MultiValue` following the common Lua idiom of returning the result
1315
/// on success, or in the case of an error, returning `nil` and an error message.
@@ -90,6 +92,80 @@ impl<T: FromLua> FromLuaMulti for T {
9092
}
9193
}
9294

95+
/// Multiple Lua values used for both argument passing and also for multiple return values.
96+
#[derive(Default, Debug, Clone)]
97+
pub struct MultiValue(VecDeque<Value>);
98+
99+
impl Deref for MultiValue {
100+
type Target = VecDeque<Value>;
101+
102+
#[inline]
103+
fn deref(&self) -> &Self::Target {
104+
&self.0
105+
}
106+
}
107+
108+
impl DerefMut for MultiValue {
109+
#[inline]
110+
fn deref_mut(&mut self) -> &mut Self::Target {
111+
&mut self.0
112+
}
113+
}
114+
115+
impl MultiValue {
116+
/// Creates an empty `MultiValue` containing no values.
117+
#[inline]
118+
pub const fn new() -> MultiValue {
119+
MultiValue(VecDeque::new())
120+
}
121+
122+
/// Creates an empty `MultiValue` container with space for at least `capacity` elements.
123+
pub fn with_capacity(capacity: usize) -> MultiValue {
124+
MultiValue(VecDeque::with_capacity(capacity))
125+
}
126+
127+
#[inline]
128+
pub(crate) fn from_lua_iter<T: IntoLua>(lua: &Lua, iter: impl IntoIterator<Item = T>) -> Result<Self> {
129+
let iter = iter.into_iter();
130+
let mut multi_value = MultiValue::with_capacity(iter.size_hint().0);
131+
for value in iter {
132+
multi_value.push_back(value.into_lua(lua)?);
133+
}
134+
Ok(multi_value)
135+
}
136+
}
137+
138+
impl FromIterator<Value> for MultiValue {
139+
#[inline]
140+
fn from_iter<I: IntoIterator<Item = Value>>(iter: I) -> Self {
141+
let mut multi_value = MultiValue::new();
142+
multi_value.extend(iter);
143+
multi_value
144+
}
145+
}
146+
147+
impl IntoIterator for MultiValue {
148+
type Item = Value;
149+
type IntoIter = vec_deque::IntoIter<Value>;
150+
151+
#[inline]
152+
fn into_iter(mut self) -> Self::IntoIter {
153+
let deque = mem::take(&mut self.0);
154+
mem::forget(self);
155+
deque.into_iter()
156+
}
157+
}
158+
159+
impl<'a> IntoIterator for &'a MultiValue {
160+
type Item = &'a Value;
161+
type IntoIter = vec_deque::Iter<'a, Value>;
162+
163+
#[inline]
164+
fn into_iter(self) -> Self::IntoIter {
165+
self.0.iter()
166+
}
167+
}
168+
93169
impl IntoLuaMulti for MultiValue {
94170
#[inline]
95171
fn into_lua_multi(self, _: &Lua) -> Result<MultiValue> {
@@ -343,3 +419,13 @@ impl_tuple!(A B C D E F G H I J K L M);
343419
impl_tuple!(A B C D E F G H I J K L M N);
344420
impl_tuple!(A B C D E F G H I J K L M N O);
345421
impl_tuple!(A B C D E F G H I J K L M N O P);
422+
423+
#[cfg(test)]
424+
mod assertions {
425+
use super::*;
426+
427+
#[cfg(not(feature = "send"))]
428+
static_assertions::assert_not_impl_any!(MultiValue: Send);
429+
#[cfg(feature = "send")]
430+
static_assertions::assert_impl_all!(MultiValue: Send, Sync);
431+
}

src/state.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ use crate::error::{Error, Result};
1212
use crate::function::Function;
1313
use crate::hook::Debug;
1414
use crate::memory::MemoryState;
15+
use crate::multi::MultiValue;
1516
use crate::scope::Scope;
1617
use crate::stdlib::StdLib;
1718
use crate::string::String;
@@ -26,7 +27,7 @@ use crate::userdata::{AnyUserData, UserData, UserDataProxy, UserDataRegistry, Us
2627
use crate::util::{
2728
assert_stack, check_stack, protect_lua_closure, push_string, push_table, rawset_field, StackGuard,
2829
};
29-
use crate::value::{MultiValue, Nil, Value};
30+
use crate::value::{Nil, Value};
3031

3132
#[cfg(not(feature = "luau"))]
3233
use crate::hook::HookTriggers;

src/state/raw.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,9 @@ use crate::hook::{Debug, HookTriggers};
3838

3939
#[cfg(feature = "async")]
4040
use {
41+
crate::multi::MultiValue,
4142
crate::traits::FromLuaMulti,
4243
crate::types::{AsyncCallback, AsyncCallbackUpvalue, AsyncPollUpvalue},
43-
crate::value::MultiValue,
4444
std::ptr::NonNull,
4545
std::task::{Context, Poll, Waker},
4646
};

src/traits.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@ use std::string::String as StdString;
33
use std::sync::Arc;
44

55
use crate::error::{Error, Result};
6+
use crate::multi::MultiValue;
67
use crate::private::Sealed;
78
use crate::state::{Lua, RawLua};
89
use crate::types::MaybeSend;
910
use crate::util::{check_stack, short_type_name};
10-
use crate::value::{MultiValue, Value};
11+
use crate::value::Value;
1112

1213
#[cfg(feature = "async")]
1314
use std::future::Future;

src/value.rs

Lines changed: 2 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,16 @@
11
use std::cmp::Ordering;
2-
use std::collections::{vec_deque, HashSet, VecDeque};
3-
use std::ops::{Deref, DerefMut};
2+
use std::collections::HashSet;
43
use std::os::raw::c_void;
54
use std::string::String as StdString;
6-
use std::{fmt, mem, ptr, str};
5+
use std::{fmt, ptr, str};
76

87
use num_traits::FromPrimitive;
98

109
use crate::error::{Error, Result};
1110
use crate::function::Function;
12-
use crate::state::Lua;
1311
use crate::string::{BorrowedStr, String};
1412
use crate::table::Table;
1513
use crate::thread::Thread;
16-
use crate::traits::IntoLua;
1714
use crate::types::{Integer, LightUserData, Number, ValueRef};
1815
use crate::userdata::AnyUserData;
1916
use crate::util::{check_stack, StackGuard};
@@ -735,91 +732,12 @@ impl<'a> Serialize for SerializableValue<'a> {
735732
}
736733
}
737734

738-
/// Multiple Lua values used for both argument passing and also for multiple return values.
739-
#[derive(Default, Debug, Clone)]
740-
pub struct MultiValue(VecDeque<Value>);
741-
742-
impl Deref for MultiValue {
743-
type Target = VecDeque<Value>;
744-
745-
#[inline]
746-
fn deref(&self) -> &Self::Target {
747-
&self.0
748-
}
749-
}
750-
751-
impl DerefMut for MultiValue {
752-
#[inline]
753-
fn deref_mut(&mut self) -> &mut Self::Target {
754-
&mut self.0
755-
}
756-
}
757-
758-
impl MultiValue {
759-
/// Creates an empty `MultiValue` containing no values.
760-
#[inline]
761-
pub const fn new() -> MultiValue {
762-
MultiValue(VecDeque::new())
763-
}
764-
765-
/// Creates an empty `MultiValue` container with space for at least `capacity` elements.
766-
pub fn with_capacity(capacity: usize) -> MultiValue {
767-
MultiValue(VecDeque::with_capacity(capacity))
768-
}
769-
770-
#[inline]
771-
pub(crate) fn from_lua_iter<T: IntoLua>(lua: &Lua, iter: impl IntoIterator<Item = T>) -> Result<Self> {
772-
let iter = iter.into_iter();
773-
let mut multi_value = MultiValue::with_capacity(iter.size_hint().0);
774-
for value in iter {
775-
multi_value.push_back(value.into_lua(lua)?);
776-
}
777-
Ok(multi_value)
778-
}
779-
}
780-
781-
impl FromIterator<Value> for MultiValue {
782-
#[inline]
783-
fn from_iter<I: IntoIterator<Item = Value>>(iter: I) -> Self {
784-
let mut multi_value = MultiValue::new();
785-
multi_value.extend(iter);
786-
multi_value
787-
}
788-
}
789-
790-
impl IntoIterator for MultiValue {
791-
type Item = Value;
792-
type IntoIter = vec_deque::IntoIter<Value>;
793-
794-
#[inline]
795-
fn into_iter(mut self) -> Self::IntoIter {
796-
let deque = mem::take(&mut self.0);
797-
mem::forget(self);
798-
deque.into_iter()
799-
}
800-
}
801-
802-
impl<'a> IntoIterator for &'a MultiValue {
803-
type Item = &'a Value;
804-
type IntoIter = vec_deque::Iter<'a, Value>;
805-
806-
#[inline]
807-
fn into_iter(self) -> Self::IntoIter {
808-
self.0.iter()
809-
}
810-
}
811-
812735
#[cfg(test)]
813736
mod assertions {
814737
use super::*;
815738

816739
#[cfg(not(feature = "send"))]
817740
static_assertions::assert_not_impl_any!(Value: Send);
818-
#[cfg(not(feature = "send"))]
819-
static_assertions::assert_not_impl_any!(MultiValue: Send);
820-
821741
#[cfg(feature = "send")]
822742
static_assertions::assert_impl_all!(Value: Send, Sync);
823-
#[cfg(feature = "send")]
824-
static_assertions::assert_impl_all!(MultiValue: Send, Sync);
825743
}

0 commit comments

Comments
 (0)