Skip to content

Commit 9ed1b81

Browse files
committed
[#671] Implement left shift operator by multiplication in C++
* extend language tests
1 parent 32d6a7c commit 9ed1b81

File tree

7 files changed

+196
-1
lines changed

7 files changed

+196
-1
lines changed

compiler/extensions/cpp/src/zserio/extension/cpp/CppExpressionFormattingPolicy.java

+23
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,29 @@ public BinaryExpressionFormatting getIsSet(Expression expr)
242242
return new BinaryExpressionFormatting("::zserio::builtin::isSet(", ", ", ")");
243243
}
244244

245+
@Override
246+
public BinaryExpressionFormatting getLeftShift(Expression expr)
247+
{
248+
if (expr.op1().getIntegerLowerBound() != null &&
249+
expr.op1().getIntegerLowerBound().compareTo(BigInteger.ZERO) >= 0)
250+
{
251+
return new BinaryExpressionFormatting("(", ") << (", ")");
252+
}
253+
else
254+
{
255+
// we know that left operand is a signed type
256+
if (expr.op2().getIntegerUpperBound() != null &&
257+
expr.op2().getIntegerUpperBound().compareTo(BigInteger.valueOf(32)) < 0)
258+
{
259+
return new BinaryExpressionFormatting("(", ") * (INT32_C(1) << (", "))");
260+
}
261+
else
262+
{
263+
return new BinaryExpressionFormatting("(", ") * (INT64_C(1) << (", "))");
264+
}
265+
}
266+
}
267+
245268
protected String getAccessPrefixForCompoundType()
246269
{
247270
return "";

test/extensions/language/expressions/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ add_custom_test(expressions
3232
${CMAKE_CURRENT_SOURCE_DIR}/cpp/FunctionTypeTest.cpp
3333
${CMAKE_CURRENT_SOURCE_DIR}/cpp/IndexOperatorTest.cpp
3434
${CMAKE_CURRENT_SOURCE_DIR}/cpp/IsSetOperatorTest.cpp
35+
${CMAKE_CURRENT_SOURCE_DIR}/cpp/LeftShiftOperatorTest.cpp
3536
${CMAKE_CURRENT_SOURCE_DIR}/cpp/LengthOfOperatorTest.cpp
3637
${CMAKE_CURRENT_SOURCE_DIR}/cpp/ModuloOperatorTest.cpp
3738
${CMAKE_CURRENT_SOURCE_DIR}/cpp/NegationOperatorTest.cpp

test/extensions/language/expressions/ClangTidySuppressions.txt

+2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ google-build-using-namespace:cpp/StringTypeTest.cpp
1515
google-explicit-constructor:gen/expressions/bitmask_type/Colors.h
1616
google-explicit-constructor:gen/expressions/isset_operator/TestBitmask.h
1717

18+
hicpp-signed-bitwise:gen/expressions/left_shift_operator/LeftShiftOperator.cpp
19+
1820
performance-move-const-arg:gen/expressions/field_type/FieldTypeExpression.cpp
1921
performance-move-const-arg:gen/expressions/field_type_with_clash/FieldTypeExpression.cpp
2022
performance-move-const-arg:gen/expressions/index_operator/ElementList.cpp
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
#include "expressions/left_shift_operator/LeftShiftOperator.h"
2+
#include "gtest/gtest.h"
3+
4+
namespace expressions
5+
{
6+
namespace left_shift_operator
7+
{
8+
9+
TEST(LeftShiftOperatorTest, defaultValues)
10+
{
11+
LeftShiftOperator leftShiftOperator;
12+
EXPECT_EQ(40, leftShiftOperator.getU32());
13+
EXPECT_EQ(-40, leftShiftOperator.getI32());
14+
EXPECT_EQ(32, leftShiftOperator.getU32Complex());
15+
EXPECT_EQ(-32, leftShiftOperator.getI32Complex());
16+
EXPECT_EQ(24, leftShiftOperator.getU32Plus());
17+
EXPECT_EQ(-64, leftShiftOperator.getI32Minus());
18+
EXPECT_EQ(12, leftShiftOperator.getU32PlusRhsExpr());
19+
EXPECT_EQ(-24, leftShiftOperator.getI32MinusRhsExpr());
20+
EXPECT_EQ(11534336, leftShiftOperator.getU63Complex());
21+
EXPECT_EQ(-9216, leftShiftOperator.getI64Complex());
22+
}
23+
24+
TEST(LeftShiftOperatorTest, getU63LShift3)
25+
{
26+
LeftShiftOperator leftShiftOperator;
27+
ASSERT_EQ(104, leftShiftOperator.funcGetU63LShift3());
28+
}
29+
30+
TEST(LeftShiftOperatorTest, getI64LShift4)
31+
{
32+
LeftShiftOperator leftShiftOperator;
33+
ASSERT_EQ(-208, leftShiftOperator.funcGetI64LShift4());
34+
}
35+
36+
TEST(LeftShiftOperatorTest, getU63LShift)
37+
{
38+
LeftShiftOperator leftShiftOperator;
39+
ASSERT_EQ(13312, leftShiftOperator.funcGetU63LShift());
40+
}
41+
42+
TEST(LeftShiftOperatorTest, getI64LShift)
43+
{
44+
LeftShiftOperator leftShiftOperator;
45+
ASSERT_EQ(-13312, leftShiftOperator.funcGetI64LShift());
46+
}
47+
48+
TEST(LeftShiftOperatorTest, getPositiveI32LShift)
49+
{
50+
LeftShiftOperator leftShiftOperator;
51+
ASSERT_EQ(13312, leftShiftOperator.funcGetPositiveI32LShift());
52+
}
53+
54+
TEST(LeftShiftOperatorTest, getI64ComplexLShift)
55+
{
56+
LeftShiftOperator leftShiftOperator;
57+
ASSERT_EQ(-3072, leftShiftOperator.funcGetI64ComplexLShift());
58+
}
59+
60+
} // namespace left_shift_operator
61+
} // namespace expressions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package expressions;
2+
3+
import static org.junit.jupiter.api.Assertions.*;
4+
5+
import org.junit.jupiter.api.Test;
6+
7+
import expressions.left_shift_operator.LeftShiftOperator;
8+
9+
public class LeftShiftOperatorTest
10+
{
11+
@Test
12+
public void defaultValues()
13+
{
14+
final LeftShiftOperator leftShiftOperator = new LeftShiftOperator();
15+
assertEquals(40, leftShiftOperator.getU32());
16+
assertEquals(-40, leftShiftOperator.getI32());
17+
assertEquals(32, leftShiftOperator.getU32Complex());
18+
assertEquals(-32, leftShiftOperator.getI32Complex());
19+
assertEquals(24, leftShiftOperator.getU32Plus());
20+
assertEquals(-64, leftShiftOperator.getI32Minus());
21+
assertEquals(12, leftShiftOperator.getU32PlusRhsExpr());
22+
assertEquals(-24, leftShiftOperator.getI32MinusRhsExpr());
23+
assertEquals(11534336, leftShiftOperator.getU63Complex());
24+
assertEquals(-9216, leftShiftOperator.getI64Complex());
25+
}
26+
27+
@Test
28+
public void getU63LShift3()
29+
{
30+
final LeftShiftOperator leftShiftOperator = new LeftShiftOperator();
31+
assertEquals(104, leftShiftOperator.funcGetU63LShift3());
32+
}
33+
34+
@Test
35+
public void getI64LShift4()
36+
{
37+
final LeftShiftOperator leftShiftOperator = new LeftShiftOperator();
38+
assertEquals(-208, leftShiftOperator.funcGetI64LShift4());
39+
}
40+
41+
@Test
42+
public void getU63LShift()
43+
{
44+
final LeftShiftOperator leftShiftOperator = new LeftShiftOperator();
45+
assertEquals(13312, leftShiftOperator.funcGetU63LShift());
46+
}
47+
48+
@Test
49+
public void getI64LShift()
50+
{
51+
final LeftShiftOperator leftShiftOperator = new LeftShiftOperator();
52+
assertEquals(-13312, leftShiftOperator.funcGetI64LShift());
53+
}
54+
55+
@Test
56+
public void getPositiveI32LShift()
57+
{
58+
final LeftShiftOperator leftShiftOperator = new LeftShiftOperator();
59+
assertEquals(13312, leftShiftOperator.funcGetPositiveI32LShift());
60+
}
61+
62+
@Test
63+
public void getI64ComplexLShift()
64+
{
65+
final LeftShiftOperator leftShiftOperator = new LeftShiftOperator();
66+
assertEquals(-3072, leftShiftOperator.funcGetI64ComplexLShift());
67+
}
68+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import Expressions
2+
3+
4+
class LeftShiftOperatorTest(Expressions.TestCase):
5+
def testDefaultValues(self):
6+
leftShiftOperator = self.api.LeftShiftOperator()
7+
self.assertEqual(40, leftShiftOperator.u32)
8+
self.assertEqual(-40, leftShiftOperator.i32)
9+
self.assertEqual(32, leftShiftOperator.u32_complex)
10+
self.assertEqual(-32, leftShiftOperator.i32_complex)
11+
self.assertEqual(24, leftShiftOperator.u32_plus)
12+
self.assertEqual(-64, leftShiftOperator.i32_minus)
13+
self.assertEqual(12, leftShiftOperator.u32_plus_rhs_expr)
14+
self.assertEqual(-24, leftShiftOperator.i32_minus_rhs_expr)
15+
self.assertEqual(11534336, leftShiftOperator.u63_complex)
16+
self.assertEqual(-9216, leftShiftOperator.i64_complex)
17+
18+
def testGetU63LShift3(self):
19+
leftShiftOperator = self.api.LeftShiftOperator()
20+
self.assertEqual(104, leftShiftOperator.get_u63l_shift3())
21+
22+
def testGetI64LShift4(self):
23+
leftShiftOperator = self.api.LeftShiftOperator()
24+
self.assertEqual(-208, leftShiftOperator.get_i64l_shift4())
25+
26+
def testGetU63LShift(self):
27+
leftShiftOperator = self.api.LeftShiftOperator()
28+
self.assertEqual(13312, leftShiftOperator.get_u63l_shift())
29+
30+
def testGetI64LShift(self):
31+
leftShiftOperator = self.api.LeftShiftOperator()
32+
self.assertEqual(-13312, leftShiftOperator.get_i64l_shift())
33+
34+
def testGetPositiveI32LShift(self):
35+
leftShiftOperator = self.api.LeftShiftOperator()
36+
self.assertEqual(13312, leftShiftOperator.get_positive_i32l_shift())
37+
38+
def testGetI64ComplexLShift(self):
39+
leftShiftOperator = self.api.LeftShiftOperator()
40+
self.assertEqual(-3072, leftShiftOperator.get_i64_complex_l_shift())

0 commit comments

Comments
 (0)