Rewrite example for span/Slice. (#1203)

Co-authored-by: josh11b <josh11b@users.noreply.github.com>
Co-authored-by: Chandler Carruth <chandlerc@gmail.com>
This commit is contained in:
Jon Meow
2022-04-27 12:43:55 -07:00
committed by GitHub
co-authored by josh11b Chandler Carruth
parent d7a90609cc
commit 62c8821f20
5 changed files with 69 additions and 40 deletions
File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 147 KiB

After

Width:  |  Height:  |  Size: 280 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 168 KiB

After

Width:  |  Height:  |  Size: 278 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 249 KiB

After

Width:  |  Height:  |  Size: 406 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 231 KiB

After

Width:  |  Height:  |  Size: 216 KiB

+65 -36
View File
@@ -6,6 +6,11 @@ Exceptions. See /LICENSE for license information.
SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-->
## Images
Images are managed in
[Google Drive](https://drive.google.com/corp/drive/folders/1CsbHo3vamrxmBwHkoyz1kU0sGFqAh688).
## Quicksort
A sample of quicksort in Carbon.
@@ -13,20 +18,20 @@ A sample of quicksort in Carbon.
```cpp
package Sorting api;
fn Partition[T:! Comparable & Movable](s: Span(T))
fn Partition[T:! Comparable & Movable](s: Slice(T))
-> i64 {
var i: i64 = -1;
for (element: T in s) {
if (element <= s.Last()) {
for (e: T in s) {
if (e <= s.Last()) {
++i;
Swap(&s[i], &element);
Swap(&s[i], &e);
}
}
return i;
}
fn QuickSort[T:! Comparable & Movable](s: Span(T)) {
fn QuickSort[T:! Comparable & Movable](s: Slice(T)) {
if (s.Size() <= 1) {
return;
}
@@ -41,21 +46,28 @@ fn QuickSort[T:! Comparable & Movable](s: Span(T)) {
### C++
```cpp
// C++
// C++:
#include <math.h>
#include <iostream>
#include <span>
#include <vector>
void WriteWithTotal(const std::vector<uint64_t>& v) {
uint64_t sum = 0;
for (uint64_t e : v) {
sum += e;
std::cout << e << "\n";
struct Circle {
float r;
};
void WriteTotalArea(std::span<Circle> circles) {
float area = 0;
for (const Circle& c : circles) {
area += M_PI * c.r * c.r;
}
std::cout << "Total: " << sum << "\n";
std::cout << "Total area: " << area << "\n";
}
auto main(int argc, char** argv) -> int {
WriteWithTotal({1, 2, 3});
std::vector<Circle> circles = {{1.0}, {2.0}};
// Implicitly constructors `span` from `vector`.
WriteTotalArea(circles);
return 0;
}
```
@@ -63,20 +75,27 @@ auto main(int argc, char** argv) -> int {
### Carbon
```cpp
// Carbon
package Summing api;
// Carbon:
package Geometry api;
import Math;
fn WriteWithTotal(v: Vector(u64)) {
var sum: u64 = 0;
for (e: u64 in v) {
sum += e;
Console.WriteLine(e);
}
Console.WriteLine(f"Total: {0}", sum);
class Circle {
var r: f32;
}
fn Main() -> i64 {
WriteWithTotal((1, 2, 3));
fn WriteTotalArea(circles: Slice(Circle)) {
var area: f32 = 0;
for (c: Circle in circles) {
area += Math.Pi * c.r * c.r;
}
Console.WriteLine("Total area: {0}", area);
}
fn Main() -> i32 {
// A dynamically sized array, like `std::vector`.
var circles: Array(Circle) = ({.r = 1.0}, {.r = 2.0});
// Implicitly constructs `Slice` from `Array`.
WriteTotalArea(circles);
return 0;
}
```
@@ -84,24 +103,34 @@ fn Main() -> i64 {
### Mixed
```cpp
// Carbon using C++'s vector
package Summing api;
import Cpp library "<vector>";
// C++ code used in both Carbon and C++:
struct Circle {
float r;
};
fn WriteWithTotal(v: Cpp.std.vector(u64)) {
var sum: u64 = 0;
for (e: u64 in v) {
sum += e;
Console.WriteLine(e);
// Carbon exposing a function for C++:
package Geometry api;
import Cpp library "circle.h";
import Math;
fn WriteTotalArea(circles: Slice(Cpp.Circle)) {
var area: f32 = 0;
for (c: Cpp.Circle in circles) {
area += Math.Pi * c.r * c.r;
}
Console.WriteLine("Total: {0}", sum);
Console.WriteLine("Total area: {0}", area);
}
// C++ calling Carbon
#include "summing.carbon.h"
// C++ calling Carbon:
#include <vector>
#include "circle.h"
#include "geometry.carbon.h"
auto main(int argc, char** argv) -> int {
Summing::WriteWithTotal({1, 2, 3});
std::vector<Circle> circles = {{1.0}, {2.0}};
// Carbon's `Slice` supports implicit construction from `std::vector`,
// similar to `std::span`.
Geometry::WriteTotalArea(circles);
return 0;
}
```