Skip to content

Commit 957afc1

Browse files
Added non-dynamic event generation to conduits
1 parent fa8ca68 commit 957afc1

File tree

3 files changed

+60
-17
lines changed

3 files changed

+60
-17
lines changed

src/main/java/com/vizor/unreal/convert/ClientGenerator.java

Lines changed: 38 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import com.vizor.unreal.util.Tuple;
2929

3030
import java.util.ArrayList;
31+
import java.util.Arrays;
3132
import java.util.HashMap;
3233
import java.util.List;
3334
import java.util.Map;
@@ -151,19 +152,32 @@ private List<Tuple<CppDelegate, CppField>> genDelegates()
151152
final CppArgument statusArg = new CppArgument(plain("FGrpcStatus", Struct), "Status");
152153

153154
return requestsResponses.entrySet().stream()
154-
.map(e -> {
155+
.flatMap(e -> {
155156
final CppArgument responseArg = e.getValue().reduce(($, rsp) -> new CppArgument(rsp.makeRef(), "Response"));
157+
final CppType dynamicEventType = plain(eventTypePrefix + e.getKey() + service.name() + "_Dynamic", Struct);
156158
final CppType eventType = plain(eventTypePrefix + e.getKey() + service.name(), Struct);
157159

158-
return Tuple.of(
159-
new CppDelegate(eventType, asList(dispatcherArg, responseArg, statusArg)),
160-
new CppField(eventType, eventPrefix + e.getKey())
161-
);
160+
ArrayList<Tuple<CppDelegate, CppField>> array = new ArrayList<>();
161+
array.add(Tuple.of(
162+
new CppDelegate(dynamicEventType, asList(dispatcherArg, responseArg, statusArg), true),
163+
new CppField(dynamicEventType, eventPrefix + e.getKey() + "Dynamic")
164+
));
165+
166+
CppField field = new CppField(eventType, eventPrefix + e.getKey());
167+
field.enableAnnotations(false);
168+
array.add(Tuple.of(
169+
new CppDelegate(eventType, asList(dispatcherArg, responseArg, statusArg), false),
170+
field
171+
));
172+
return array.stream();
162173
})
163174
.peek(t -> {
164-
// should add an UE-specific annotations to these events
165-
t.second().addAnnotation(BlueprintAssignable);
166-
t.second().addAnnotation(Category, rpcResponsesCategory + service.name());
175+
// should add an UE-specific annotations to these events if it's a dynamic event
176+
if (t.first().isDynamic())
177+
{
178+
t.second().addAnnotation(BlueprintAssignable);
179+
t.second().addAnnotation(Category, rpcResponsesCategory + service.name());
180+
}
167181
})
168182
.collect(toList());
169183
}
@@ -206,25 +220,36 @@ private CppFunction genUpdate()
206220
"'{'",
207221
" {1} ResponseWithStatus;",
208222
" while ({0}.Dequeue(ResponseWithStatus))",
223+
" '{'",
209224
" {2}.Broadcast(",
210225
" this,",
211226
" ResponseWithStatus.Response,",
212227
" ResponseWithStatus.Status",
213228
" );",
229+
" {3}.Broadcast(",
230+
" this,",
231+
" ResponseWithStatus.Response,",
232+
" ResponseWithStatus.Status",
233+
" );",
234+
" '}'",
214235
"'}'"
215236
));
216237

217238
final StringBuilder sb = new StringBuilder(supressSuperString(updateFunctionName));
218239
for (int i = 0; i < conduits.size(); i++)
219240
{
220-
final Tuple<CppDelegate, CppField> delegate = delegates.get(i);
241+
// Each conduit is "paired" to 2 delegates
242+
final Tuple<CppDelegate, CppField> delegate = delegates.get(i * 2);
243+
final Tuple<CppDelegate, CppField> delegate2 = delegates.get(i * 2 + 1);
221244
final CppField conduit = conduits.get(i);
222245

223246
final String dequeue = delegate.reduce((d, f) -> {
224-
final List<CppType> genericParams = conduit.getType().getGenericParams();
225-
final CppType requestWithContext = genericParams.get(1);
226-
227-
return format(dequeuePattern, conduit.getName(), requestWithContext.toString(), f.getName());
247+
return delegate2.reduce((d2, f2) -> {
248+
final List<CppType> genericParams = conduit.getType().getGenericParams();
249+
final CppType requestWithContext = genericParams.get(1);
250+
251+
return format(dequeuePattern, conduit.getName(), requestWithContext.toString(), f2.getName(), f.getName());
252+
});
228253
});
229254

230255
sb.append(dequeue).append(lineSeparator()).append(lineSeparator());

src/main/java/com/vizor/unreal/tree/CppDelegate.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,13 @@ public final class CppDelegate implements CtLeaf
2525
{
2626
private final CppType type;
2727
private final List<CppArgument> arguments;
28+
private final boolean dynamic;
2829

29-
public CppDelegate(final CppType type, final List<CppArgument> arguments)
30+
public CppDelegate(final CppType type, final List<CppArgument> arguments, final boolean dynamic)
3031
{
3132
this.type = type;
3233
this.arguments = unmodifiableList(arguments);
34+
this.dynamic = dynamic;
3335
}
3436

3537
public String getTense()
@@ -61,6 +63,11 @@ public final CppType getType()
6163
return type;
6264
}
6365

66+
public final boolean isDynamic()
67+
{
68+
return dynamic;
69+
}
70+
6471
@Override
6572
public CppPrinter accept(CppPrinter printer)
6673
{

src/main/java/com/vizor/unreal/writer/CppPrinter.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -448,7 +448,15 @@ public void visit(CppNamespace namespace)
448448

449449
public void visit(final CppDelegate delegate)
450450
{
451-
write("DECLARE_DYNAMIC_MULTICAST_DELEGATE");
451+
// First we declare a dynamic event
452+
if (delegate.isDynamic())
453+
{
454+
write("DECLARE_DYNAMIC_MULTICAST_DELEGATE");
455+
}
456+
else
457+
{
458+
write("DECLARE_MULTICAST_DELEGATE");
459+
}
452460

453461
final String tense = delegate.getTense();
454462
if (!tense.isEmpty())
@@ -469,8 +477,11 @@ public void visit(final CppDelegate delegate)
469477

470478
argType.accept(this);
471479

472-
write(", ");
473-
write(a.getName());
480+
if (delegate.isDynamic())
481+
{
482+
write(", ");
483+
write(a.getName());
484+
}
474485
}
475486
write(");");
476487
}

0 commit comments

Comments
 (0)