aboutsummaryrefslogtreecommitdiff
path: root/project/QBarInterpreter/src/com/modulus/qbar/integration/QBWrappedObject.java
blob: 29a564136b84b16ba2e87711a3d04c5f24089ffd (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
package com.modulus.qbar.integration;

import java.util.Arrays;
import java.util.List;

import com.modulus.common.collections.MArrays;
import com.modulus.qbar.core.QBObject;
import com.modulus.qbar.core.interpreter.QBInterpreter;
import com.modulus.qbar.core.primitive.QBChar;
import com.modulus.qbar.core.primitive.QBDouble;
import com.modulus.qbar.core.primitive.QBInt;
import com.modulus.qbar.lang.QBArrayList;
import com.modulus.qbar.lang.QBList;
import com.modulus.qbar.lang.QBMaybe;
public class QBWrappedObject extends QBObject{
	/**
	 * 
	 */
	private static final long serialVersionUID = 400259956418357800L;
	private Object wrapped;
	
	private QBWrappedObject(Object wrapped) {
		super( QBWrappedClass.wrapClass(wrapped.getClass(), QBInterpreter.instance().getGlobalNamespace()) );
		this.wrapped = wrapped;
	}
	
	public Object getWrapped(){
		return wrapped;
	}

	public static QBObject wrap(Object invoke) {
		if(invoke == null){
			return new QBMaybe.Maybe(null);
		}
		
		if(invoke instanceof QBObject) {
			return (QBObject) invoke;
		}
		
		if ( invoke instanceof Object[] ){
			return fromList(
					Arrays.asList((Object[]) invoke)
			);
		}
		
		if ( invoke instanceof byte[] ){
			List<Byte> lst = MArrays.asList((byte[]) invoke);
			return fromList(
					lst
			);
		}
		
		if ( invoke instanceof int[] ){
			return fromList(
					MArrays.asList((int[]) invoke)
			);
		}
		
		if ( invoke instanceof short[] ){
			return fromList(
					MArrays.asList((short[]) invoke)
			);
		}
		
		if ( invoke instanceof long[] ){
			return fromList(
					MArrays.asList((long[]) invoke)
			);
		}
		
		if ( invoke instanceof boolean[] ){
			return fromList(
					MArrays.asList((boolean[]) invoke)
			);
		}
		
		if ( invoke instanceof char[] ){
			return fromList(
					MArrays.asList((char[]) invoke)
			);
		}
		
		if ( invoke instanceof double[] ){
			return fromList(
					MArrays.asList((double[]) invoke)
			);
		}
		
		if ( invoke instanceof float[] ){
			return fromList(
					MArrays.asList((float[]) invoke)
			);
		}
		
		if( invoke instanceof List<?> ){
			return fromList( (List<?>) invoke );
		}
		
		if(invoke instanceof Double || invoke instanceof Float){
			return new QBDouble(((Number) invoke).doubleValue());
		}
		
		if(invoke instanceof Number){
			return new QBInt(((Number) invoke).intValue());
		}
		
		if(invoke instanceof Boolean){
			return new QBInt(((Boolean) invoke) ? 1 : 0);
		}
		
		if(invoke instanceof Character){
			return new QBChar((Character)invoke);
		}
		
		return new QBWrappedObject(invoke);
	}
	
	public static long timeSpent = 0;
	private static QBObject fromList(final List<?> invoke) {
		QBList tmp = new QBList() {
			
			@Override
			public double size() {
				return invoke.size();
			}
			
			@Override
			public void remove(QBObject obj) {
				invoke.remove(obj);
			}
			
			@Override
			public QBList realSubList(int off, int len) {
				return (QBList) QBWrappedObject.wrap( invoke.subList(off, off+len) );
			}
			
			@Override
			public void insert(int idx, QBObject obj) {
			}
			
			@Override
			public QBObject get(int idx) {
				return QBWrappedObject.wrap( invoke.get(idx) );
			}
			
			@Override
			public QBObject add(QBObject obj) {
				// TODO Auto-generated method stub
				return null;
			}
		};
	//	timeSpent += (t2 - t1);
		return tmp;
	}

	public String toString(){
		return wrapped.toString();
	}

}