We are really grateful you're here, and just for how we do this information session, we're going to talk just for about a half hour. I want to hit some of the high level, really important things about Roger Williams University and about your time with us and where you guys are sort of in the admissions and financial aid process, answer some of those questions for you, where you are in that whole decisioning process, and we'll touch on that, and then get you on the tour. Tours that today are sort of the highlight. So we have four of our tour guides along the back, and they sit in and they'll chime in or I may call on them if there's some more student-focused questions you have, but really the tour is the great chance for you to talk with our current students, the majors, the things that they're interested in as we go. So we'll kind of work through some of those things as we're here. What I wanted to just kind of walk through for you all, and let's get this advanced so I can go here. Those slides that were just rotating when we started, where we really like to start is with the things you're probably not deeply thinking about right now, and that's the results of being here and being here for four years. These six factors, there was a study a couple of years ago by the Gallup organization that studied great jobs and great lives and what makes a good decision later in life and what makes a meaningful career for people. And these are the six factors they identified about the college experience that makes things great later in your life. So professors who make a difference, hands-on project opportunities, mentors on campus, being involved when you were on campus helps you later in life, opportunities for internships and preparation. What was sad about the national study is that only 3% of the people that completed the survey said they had all six in their college career. What we try to do is make sure that percentage is much higher. So the Roger Williams experience, what we do here is really focused on these things. We're an undergraduate experience, so when you're here, you're taught by our full faculty. There are no teaching assistants used. You're not in large lecture hall classes. You're in smaller classes, so those opportunities are there. And as I just talked through a couple of things, you'll see where hands-on projects and some of these things really matter and what we try to do here and how the whole experience is shaped for every single one of our students. So what I really want to do is make sure the things that I touch on are relevant to all of you. So some of the examples that I share and how much time we spend on these things. But this is what we're able to explore together today. Talking about who we are and understanding the school better. Talking about this commitment to student success that cuts through all that we do. And then admissions and aid process, fun. So what helps me with that is to get to know you just a little bit better. So yes, the students get to introduce themselves at this part. This is the audience participation part of the presentation. So just your name, where you're from, and then for the students, if you just share what things you're sort of interested in learning today in the session before the tour. So if there's a major that you're interested in or if you're exploring majors and undecided, just share that.  We'll talk very generally. If you're senior and really interested in one part of the process pieces, we'll just talk through those. And then that'll help me shape how much we spend on that. So we'll start with you, because you're giving me great eye contact and you're in the front row. So we'll start right here. My name is Sydney. I'm from St. Hampshire. And I'm interested in marine biology. Excellent. And then I can touch a little on marine for you, but anything from the laundry list here that? Definitely. OK, perfect. Good. Thanks. Hi. I'm Jersey. Great. I'm a senior. And I'm interested in engineering field. Excellent. And also about the admission process. OK, great. Hi. Welcome. I'm Brian. I'm a senior of local high school in Massachusetts. Yeah. I'm interested in either economics, accounting, or finance. Excellent. Good. And I definitely would like to know about the scholarships and financial aid. OK, perfect. Good. Hi. Welcome, guys. Yeah. Hello. Yeah, we're just quick introductions who you are, majors you might be considering and stuff that I can touch on before we get you on tour. Yeah, I'm Tyler. And I'm playing naked. And I want to go somewhere in the medical field. OK. Excellent. Good. Yeah. I'm Matt. I'm also from Clinton, Connecticut. But I'm on the Saturday right now. OK. Excellent. Thanks. Hey, how are you? I'm AJ. I'm from Massachusetts. And I'm a junior. And I'm interested in marine biology. Excellent. Couple marine biology. It's good. Hi. In the back. I'm James from New York. I'm a junior. OK, great. Thank you. And then we have you guys. Hi. Welcome. I'm Olivia. I'm from Waterford, Connecticut. Excellent. OK. Excellent. So one of the things about undecided here, and there's a couple. We tend to have a number of people on campus. We call that exploring. It's not that you don't know. It's that you have so many great options that you haven't narrowed them down yet. So we'll kind of work on that as we go. So that really helped me a lot. Thank you all. And I'll touch on a couple of things as I can as we go through. And that helps the tour guides also know which buildings to kind of focus on. And how we kind of sort you up for the tour based on your interest a little bit. Our mission is a university. This phrase really resonates with a lot of what we do. We're trying to build the university the world needs now. And what does that mean? It means the world's really changing. One of the things I really embrace is that there was a national statistic that said, you know, right now there are more majors that exist on college campuses now that didn't exist 10 years ago. And there are careers that exist now that didn't exist 10 years ago. You've probably seen there's a whole new iPhone 10 coming out for their 10-year anniversary and literally the iPhone did not exist 10 years ago. So majors like app development or things for social media and social media coordinators, web development. A lot of that trends now towards thinking about artificial intelligence and driverless cars. You're all thinking about a college degree in fields that you don't know what it's going to look like 10 years from now. For the marine biology interested students, what is going to happen with oceans and sea level rise over the next 10 years? There's lots of change that's constantly happening. And a university has an obligation to keep shifting and thinking about how we experiment with the majors we offer, the opportunities we provide, how we expose you to different careers across any of the majors you're interested in, is how we try to keep reminding ourselves, how do we need to change because you need to have an education that's going to help you for a world that's constantly changing. And I think we do that pretty well across how we're set up. As a university, we have two campuses. So you're here in Bristol with us today, but we have a campus in downtown Providence as well. So different things will bounce in and out of those two campuses. We offer law courses on both campuses. A lot of our students are interning or doing legal work. In the third year, the law school is fully delivered in downtown because you're in and practicing law and in Providence with the state capitol. But our MBA courses may also bounce between the two campuses, so you're working and interning and things like that. So across those two campuses, we're a total of just over 6,500 different types of students across our full university. Here in Bristol, it's 4,000 traditional undergraduate students, freshmen to senior year. So you start as a sort of medium-sized institution, but start getting these pockets that get smaller and smaller. So when you're thinking being in the school of engineering or different parts of the campus, you find these smaller personal connections that you're going to need to have a great education while you're here and with us. So that's really how we're broken out at sort of this high level. So the major six schools of the undergraduate experience, so business, humanities arts and education, social and natural science where marine bio will fall in the biology, justice studies, engineering, and architecture are the primary schools and add to that a school continuing studies in a law school and then the university division of university studies, which houses honors program, our underclared students and all of our advising that cuts across all of our students and all of our support. What is great about all of that and your interest is that with the size of a university like us, even though some of you have some really solid majors in mind, your experience will cut across all of these schools as you choose to navigate through and shape all the classes you take and what you're planning to do. We like to think of it very simply and very high level for you to think about a Roger Williams degree in thirds. You're pursuing a major or majors that you may be really passionate about. We have a core curriculum that all of our students take that all of you would share in common. And then a third of the curriculum is really for you to personalize. So it's a fairly lean liberal arts core where there's not a heavy lift of courses we're seeing. Here's all the courses you must take before you graduate. It's fairly nimble and I'll talk about that a little bit more, but you blend that all together. So coming in undecided is great. You may use these personalized courses to explore three or four majors on your way before you declare. For students that know what they want, they can really leverage thinking about majors and minors and bringing these things together in a couple of different ways. The one thing academically I really appreciate talking about is one facet of the core curriculum. So the core kind of gives you that widespread of different interests. If you're marine biology it exposes you to social science courses and writing and public speaking and such. But there's a core concentration here which may be different from some other schools that you might be looking at. We look for you to go deep into one area other than your major. So as a marine bio major you can do a core concentration. Think of that as sort of a mini-minor and a lot of our students will do a core concentration and turn it into a minor in their time that they're with us. So you find a complementary thing that may really extend your career and kind of map you in a really competitive place in the job market when you're looking to leave Roger Williams which we hope you never do. But that core concentration, so think of things like being a marine bio major but doing a photography minor. There was a student a couple years ago who got into underwater photography and thinking about photos for National Geographic and photojournalism and combining passion for marine in that way. Think about engineering and a minor in computer science if you're thinking about artificial intelligence and things like that. A bio major and a psych minor. So if you're thinking psychiatry and medical and not sure which paths you might go down. So there's lots of different ways that this core concentration there's ways to really be thoughtful and connect what you're doing and how the coursework blends together. I mean that's just one really interesting facet of the core that I wanted to touch on here. The key thing and this goes back to the Gallup study is every major has hands-on opportunities. It's a key part of the Roger Williams experience. So from the first year on you're out and doing fine-sine community engagement the first day you move on campus we have a freshman experience where the entire freshman class is across Rhode Island in Southern Massachusetts and doing projects in the community and giving back. And we kind of introduce you to that really on the first day you start here. The Community Partnership Center is really one I'll call out. We solve problems for the community around us. Town governments, different nonprofit agencies will come and say we're really grappling with something and we need help. And it's a problem-based solution where you'll work with a class or groups of students and work with a real-life, real-example situation and solve problems in sort of a group setting. My favorite one and there's a poster on it if you go through the wet labs on the tour are engineering students and our marine students got together and they did assessments of cranberry bogs. And they looked at a way for when the cranberry bog seasons go up and down that they could convert a cranberry bog to a fish hatchery and then raise fish and cultivate fish if the markets change and then shift it back to a cranberry bog. So this really practical, really pulling across the School of Engineering students and marine students who are passionate about that and trying to find some really interesting aquaculture experiments that really solved a problem for that community. But you go from that to health and medical-related CPC projects. Things building the emergency plan for the town of Bristol here in Rhode Island.  So really the top is your first two years and I look at the bottom here as then your junior and senior year. Our architecture students have some signature programs to study abroad. 70% of the students in our School of Architecture study either in Barcelona or Florence by the time they graduate. But overall 40% of our students have some sort of abroad experience by the time they graduate, whether it's an intensive trip or a semester or a year away somewhere. So it's really a part of what we do here in sort of connecting you globally. But these are the paths that really shape the major you're interested in, the internships and the experience you gain before you're moving on and heading to graduate school or into employment. So the four years experience is really a hands-on experience across all of the majors that you might have here in some meaningful ways. All along you're challenged and supported. So we have an amazing Center for Academic Success that does over 20,000 hours of tutoring and academic support, proofreading of paper, tutoring in a class you might be struggling in. And so the support is there and the challenge comes from all these opportunities to push yourself to do faculty research and partner with faculty or think about our honors program and other things like that. At a really high level, all those things are happening all around us. What I wanted to share, and it's one example just from a video, there's just a two-minute video to show you from start to finish just at one key example that we'll build on and then stop for questions related to our construction management program. And this will show you a couple key things that we'll talk about after. Folks from Roger Williams who have come here and work here really have fit in so well. They're both bright students and graduates but also practical, thoughtful and really well-equipped to join the working world, particularly in construction which is an intense business. Could it be more delighted to be here tonight? It really is an honor. Shaman Design & Construction has provided us with a relationship and been a partner to us throughout the last 17 years that I've been there. Roger Williams is a great technical program that balances your education with a liberal arts program which really gave me a well-rounded education. From day one was a very, very good balance of both work and hands-on. All the professors are clear that they have all worked in the industry. They know what they're talking about. You get to kind of see the holistic picture of what actually happens in the real world. The first step in preparation for careers is to ensure that we're teaching a curriculum that makes the needs of the industry which our graduates will serve. Roger Williams just has so many great relationships with companies like Shaman that there's so many opportunities for you as a student especially for internships. I remember my first internship. I had no prior experience in construction and I went for it and thanks to Roger Williams the relationship and who they know and the alumni. I got my first internship at a construction company and I knew nothing and that internship was definitely rough but you learn from it and you grow. You graduate, you get your diploma and you know a lot more than a competition. So although a lot of you are in different majors than was just really shown there what I would just call out for you is across all of them you leave prepared. The hands-on links of internships, learning by doing, getting out in an internship and making mistakes before it's your actual first job. All those projects, CPC projects across every major with the community partnerships we have in internships build a resume across all four years that you're here and bring you to some really wonderful places. What's not seen explicitly in that video but it just is a great thing I love to share one of our alums who is at Shaman that helped build that construction flew every Shaman Roger Williams alum to that event that we held at Shaman. So just the commitment and the passion of people who've come through Roger Williams then help that next generation of students and open up internships. So we have students who graduate and then work at the New England Aquarium. We have some great new internship opportunities with the New England Aquarium, with the Mystic Aquarium. And alumni will open those doors the way the doors were opened for them and some really powerful and meaningful ways for us here. So that's Roger Williams high level. As you go on tours you'll hear some real live student examples of their experiences here and they can answer some of those questions for you about sort of the out of classroom experience and kind of share their stories along these examples if you want to learn more there. But we'll stop there before we kind of dive into the admissions and aid process as the other rounding out part of this session. Any questions about what we've touched on so far, the academic experience or other things that I can answer just about the high level, the academics and such that we've talked about so far. Yeah, please. Can I just actually give a plug from the school? Please. My oldest son, Brian's brother just graduated from Roger Williams in May. He was an accounting major and his advisor was so great his freshman year he advised him to take extra classes so he could sit for the CTA exam. So he took six classes all the way through every semester. Got an internship at Ernst & Young every year and got offered a job at the end of that internship and he's now working at Ernst & Young in Boston. So it's a real life. He loved it here and I'm not a plant I'm not getting paid but it's great and his professors were fabulous. I think Brian's the only one in the room interested in that particular in the school of business. The example that you gave of helping a company they had, he was on a team that was helping a small business owner in the area. She was starting her own farming company or something and they analyzed her books and developed a business plan and that kind of thing. Thanks for sharing that. I just thought it was important to know it's not just on the video. You'll see school of business renovations from the last time you were here when you go through the cafe program and all the finance and investment work you'll see lots of construction in the school of business when you go through today. I hope you see that while you're here today and then beyond that this was one example in construction but across accounting and marine and medical you find these pathways through the engineering school and everywhere that really kind of bring those things together while you're here. So great. Then the joy of the admissions and aid process I think everyone was seniors and we had one junior right so we'll kind of talk through the process itself and then get you on the tour. So I want to keep this as simple as possible without sharing a lot of deep statistics if you have questions about the criteria I'm glad to share but at a very high level the admissions process here is one that's just really centered on two key deadlines in the senior year. So we have an early action process and we have the regular decision process and it's a mid-November February deadline. So based on as you're working on essays and all the things for applying to schools those are the two sort of deadlines to think about. Our best recommendation this is not a binding process with us so when you're applying for admission you either program you have until May 1st to make a choice about enrolling. At Roger Williams we want you to visit again and make sure you have time to make a good decision all the financial aid stuff is in order so this isn't a binding early November decision process where you have to commit to the institution. So those are the key deadlines on the admission side that you work with. Our review process you're sending us and choosing to send us the materials that you think are going to be helpful to us in the admissions process. So you're required to send the actual application we're on the common app so the common application just simplifies you applying to multiple schools with one application depending if you're transcript at least one letter of recommendation you can send more. And no one in the room mentioned any of these programs but architecture, arts, creative writing, dance have portfolio or audition requirements for those more specialized programs. I can talk about those if you have questions about those as we go. Beyond that test scores are optional so big red circle there. If you feel they're a good indication of your ability to process and if you don't it doesn't hamper the admissions process. We look more heavily at your high school transcript and how you've performed in review. We read by program so some of you thinking marine or medical we're going to look at your science and math grades in that context for engineering. We're looking for math and then for different programs we're really looking at the whole transcript of what you send. It is a very humid admissions process but admissions cutoffs in our work. Really if you think about how our admissions class breaks out this year's freshman class that's with us the middle 50% of the classes between a 3.0 and a 3.6 and that means 25% of the class was above that and 25% was below a 3.0. The students below a 3.0 or where you fall in that mix it's a very human process. We're looking at the strength of the courses someone took. Someone may be admitted with a 2.8 because they had a rough freshman year and have really progressed incredibly well since then. We don't hang ourselves up on one overall number and these pieces that you send us help tell that story. We encourage you to think about when you apply for admission we are reviewing very individually and we're making a decision about your ability to be at Roger Williams and succeed. We're proud of our four-year graduation rate. We help students from first year all the way through and so we know the level of support we provide but hopefully as we talk about the type of experience that's here that's a place that you want to be and then we'll work with you to help make that pathway through the institution really work well. So very high level, those are the key pieces of just what we do in the review process itself. One, just call out for students who are you know going to be competitive higher test taking if they're going to submit those you know 375 in higher high school GPA, good record of demanding curriculum. Our honors program is a great option. The honors program students tend to be very competitive in our merit scholarship program which I'll talk about in a minute. There's a different living opportunity and the academic experience is one that really comes through. So tour guides making sure they're paying attention. Are any of the four of you in honors? Okay, so when we think about lining up for tour groups anyone's interested in honors, we can kind of line them and they can talk about those opportunities as you're walking around a little bit. So that's super high level admissions process. Any questions that I can answer more deeply about admissions that that doesn't kind of cover I don't want, I know senior year's always overwhelming. So oh go, yeah please. So if you're interested in the honors program you specify that on the application? Yeah, the common app are institutional sort of supplement to the common app. Has a section where you say yes you're interested in honors and there's two additional statements that then, so you're basically writing the common app essay and then two additional statements that are included and when you indicate that on the common app that will route it through for the faculty review for the honors program in the review process itself. Yep. You hear about honors a little bit later. So at the time of admission when you're notified of admission you hear about admission and merit scholarship. Honors you'll hear about later when they do that review of all students and it's a different committee that will read those files. Okay. To put timelines on the rest of the process we'll do that in a second but other questions on criteria what we look for that I can answer. Okay. Did you? No? Okay. Typically from early action it's about a month that takes us to review all the early action applications and get those in the mail. So by early to mid December we are releasing all early action applications sort of at the same time and I mentioned just quickly there you hear about admissions as well as merit scholarship at that time and then for regular decision the deadline is February 1st but as we receive regular decision applications it is more of a rolling review process for students. Some students will apply in January or into February and that notification will be reviewing and releasing decisions once a week through the process of the spring and notifying students as we go. Okay. Financial aid affordability is a key thing we're mindful here at the institution from our president on down and a couple of things on the slide I'll just expand on for you but just to let you know that the admissions process is highly personalized. Your time as a student here is highly personalized and the financial aid process is highly personalized. We work very closely with every family to make a pathway through the institution for affordability. The key things to let you know Roger Williams is one of a few schools in the country where we freeze tuition for all students. We froze tuition in 2012 and now even through today the tuition you start with is a tuition that will stay with you for all four years. So as a family it helps you with planning, looking at your expenses over a four year period to know that the tuition you're working with is not going to go up three to five percent annually and that's sort of a national trend at a lot of universities. So we always encourage families looking at us in other schools to ask that question when you're on tours, you know, what is it going to look like? You know, we're not just trying to have you come and be part of the freshman class we want to build and help you understand financial aid for as a four year process and for your partnership working with us as you go through. So our eight opportunities cut across merit scholarships and cut across need based aid. I mentioned at the time of admission you hear about merit scholarships and so merit scholarships range from five to twenty thousand dollars at the time of admission. So we have a general university scholarship, deans and presidential scholarships that really range from five to ten, ten to fifteen and fifteen to twenty thousand that are used at the time of admission. Those come through the admissions process, the credentials that you're sending us are used to place students in that scholarship range accordingly and beyond that is our need based aid. So when you're filing the need based process we use the one federal financial aid form now. So the FAFSA is the one federal form. October first it becomes available and so basically we try to encourage families to have the FAFSA and the federal aid form completed really around the same time you're submitting your application for admission. We start releasing financial aid within a week to two weeks of hearing about admission to the university. So if a FAFSA is to us by November 15th, your admissions application is to us by November 15th by mid-December you're hearing about admission and then within a week to two weeks receiving your need based financial aid award and then still have until that May 1st universal senior deadline that a lot of schools follow to come back, visit us talk about the financial aid award sit in on classes, revisit the campus and go deeper to make sure you're making a good choice. We employ lots of students on off campus in pseudo internships through what's called our FIT program and lots of just different opportunities for students to work as part of a financial aid award and we're here to help through this whole process. So from financial aid and affordability perspective grants, scholarships student loan opportunities and work will come together differently for every family in the room and we try to really personalize how that's going to work and we want to know and understand your situation well and how we've awarded aid and we know family situations are going to change over time. The federal forms don't really help paint the picture to know if the student that's applying to Roger Williams this year and you have three younger siblings and it's good to right now but two years from now things are going to be different for your family so there's a lot of dialogue we hope to put into the financial aid process that kind of helps families with that as we go. The main introductory brochure is here on top and it has some of our general total cost and room and board and that information for you and we can talk through any parts of affordability that you want to talk about now but then also know there's a whole affordability brochure we encourage families on our website is a net price calculator sort of a financial aid estimate that any one of you can fill out at any time and get a sense for your family background and situation and scholarship you'll be competitive for and it's a good estimate of what the aid process might look like for you as you go through the process ahead. Questions about scholarships need-based aid, please. If you've done the FAFSA because you have a child who's in college at this point in time is it just adding Roger Williams as another college or is it another submission? It's another submission because the FAFSA is the combination of your parent information and the student information so if your other child works and you don't work or the other way around so it's the combination of the parent and the student income and when you file the FAFSA right now you filed it with one in college you'd be refiling it for next year with two in college so that changes what your parent contribution towards school looks like as well. So it is a submission per child per year because your situation, your income changes as you go through that. Yep. Good. Other questions on aid and affordability? Myself and we always have sort of a counselor of the day on duty after the tour if there are more specific individual questions you might have please come and find us. We can kind of talk about your own situation whether it's the admissions process, the aid process and be a little bit more personalized about it and help you with your specific questions. So that's really our really high level to just introduce you to the place and we want you to get out and see it. My last three things are there we want you to visit again you have great weather that phrase usually works well on a day that it's raining please come back when it's beautiful like today but as you go through the rest of the admissions process things are going to change people who are thinking marine biology may say I'm really interested in more things than that so I want to change my mind. People who are undecided now may find something they're interested in and we didn't touch on those things today so come back we have a shadow visit program where seniors can sit in on classes you can talk with coaches meet with staff across campus we want you as you go through this process to get your questions answered and as you go through now to the senior year and getting to May and making a decision that's going to be an investment of time and resources to be here we want to make sure it's right for you so those opportunities are there there's also opportunities we have an accepted student open house which is really detailed in March and April and we have four of those this year so that's opportunities to really come in see inside all of our residence halls talk with all of our student clubs and organizations really get a sense of the feel for the place deeper and remind yourself when you come back we ask you to keep in touch with us and we'll keep in touch with you I'm sure you're getting lots of mail but as you apply and do different things we'll help keep you on top of the application deadline the financial aid deadlines and we can help you through that process as much as possible and we really hope you'll feel today for being seniors and working on the application and getting your essays done and who's writing your letters or rec and all those fun things because that's what you do in September in your senior year so I hope this has been a good overview we have our tour guides and I'm going to call them up to the front and versus having you all in a larger group we're going to kind of divide and conquer and it looks like they've already kind of written some splits out with the groups and stuff so we're going to have them all introduce themselves to you and get a feel for them and then we'll get you guys out on your tour okay so more people have come in since we did this list so we're going to try to divide the rest of the people that came in so I'm Taylor I'm from New York I'm an architecture major and I'm also in the honors program like we've pointed out before so is anyone interested in either of those things I have James Montgomery on my list right now but I don't know if anyone wants to come with me they want to know more about architecture or honors I'm Melissa Rodriguez I'm an elementary education major with a dance minor I'm from Brewster, New York I'm a sophomore I'm also a transfer student so if anyone has any questions about that I can definitely let you know I'm taking these Colleen and Sydney and I think those are both ring bio but if anyone else is interested in elementary education or dance or anything else I can take them on my tour as well David My name is Mike I'm a junior finance major with the core concentration in political science I'm from Wayne with Massachusetts and on campus I'm a resident assistant as well as a tour guide and I'm taking Brian and if anyone is an additional business I'm Riley I'm a sophomore I'm from Danbury, Massachusetts my major is elementary education and I'm also a resident assistant on campus and I'm taking record so we'll head out on to the patio and try to separate so you guys can convene around us and then we'll head out on tour Thanks for being with us today


Okay, it's time. So, now I'd like to introduce our next guest, Dan Vatil. So, let me give him a big round of applause. Dan's been a maintainer in KD for ages working on Akinadi, Permanent, all sorts of places throughout the stack. And now he's going to talk to us about C++ code routines and Qt. So, hello. Thank you for the introduction, David. So, my name is Daniel. I've been working on the C++ and KD for almost over a decade now. And, well, lately I found interest in being into interesting new features in the C++ language. So, that's why I'm here today talking about coroutines and about Qt. Word of warning before I begin. Coroutines are a bit of a complex topic to explain. So, there's a lot of things to talk about and not enough time. And also, there is a lot of code in this presentation. So, you have been warned. I'm not kidding. The first slide already, if I can switch. Yes, I can switch. The first slide already is a piece of code because I think that's the best way how to explain what coroutines actually give us and what they are useful for. So, let's get into it. What do we have here? So, we have a simple regular function as you know. It's a member function called getTitle that returns a Q string. What does the function do? Well, it creates a D-Bus interface. So, let's talk to some remote service somewhere else. Well, also in your computer, but it's also D-Bus. Anyway, so, we have the interface. Now, what we do is we call player.call. So, we call some remote function called title in the remote service. Then, we just convert the response to Q D-Bus reply because that's how we can extract the response, which is type of type Q string. And then, well, then there is this thing, right? So, one thing is we have Q D-Bus reply on one side and then we have Q string on the other. How does the conversion happen? Well, Q D-Bus reply does this magically. But the thing is now, I just said, well, we just did a remote call to a remote service. So, we can't possibly have the Q string already available, right? It's a D-Bus, right? That thing does lots of things. So, if you do a D-Bus call here in the player.call, what happens is your applications needs to create a message, send it to the D-Bus D-Bus. The D-Bus D-Bus must forward it to the actual service that you want to talk to. The service must process the request, calculate the response, send the response back to the D-Bus. The D-Bus must forward the response back to you. You need to process it. And then finally, you might have the Q string that you want it, right? This all takes time. In most cases, you will just get away with doing this blocking call because what this equal sign does, well, in this case, the operation behind that is when extracting the string from the D-Bus reply, it will have to wait blocking, it will have to block the main thread and wait for the response to arrive so that we can extract the Q string and store it in the arrival, right? So, in most cases, this will work just fine, right? It will take just a split of a second. The users will not notice that you just did a blocking call in your main thread. The application will still seem responsive.  And now your application is doing a blocking call, so it's blocked. It's waiting for the D-Bus timeout to kick in and return an error instead of title. So, you see, doing blocking calls in the main thread is not a good idea. So, how can we fix this? Well, one option is we could do player.callwithcallback which would actually allow us to pass a callback that Q2 would eventually call when it receives the response. This is a problem, though. The callback, in order to be able, then we would need to change the signature of the getTitle function, right? It would no longer return Q string. It would be void. And instead, we would have to take some probably another callback from the caller that we would then call with the actual Q string that we got from the remote service. But unlikely, the caller might need to adjust their signature as well to take a callback from their caller so that they can propagate the response, right? So, using callwithcallback or Q D-Bus pending callwatcher which is a really long name for a really simple class that also does just waiting for a D-Bus reply, in both those cases, you would need to fundamentally change your API, change your design, and it would propagate to more layers of your application, probably. So, that's not really cool, right? Just because of this simple D-Bus call, we don't want to have to range in here or enter API. So, what are your options? Well, one thing that you could do is you could create a nested Q event loop inside this function and wait for the reply to arrive, then you stop the event loop and you return. So, the signature of the function doesn't change. The function still looks like it's not blocking. It actually doesn't block your UI thread because the event loop will be running nested but then using nested event loops, that's not a good idea really, right? Don't run nested event loops, especially if you're writing libraries. So, what are the options? Well, let's see if coroutines can help. So, this is the same function, except it's a coroutine now. Let's see what has changed. So, there are three things that have changed from the previous version. First is the return type. The return type now is Q Coral Task, Q String. Let's not bother ourselves with what the Q Coral is or what the task is. Just think that it's a return type that represents some sort of a asynchronous or pending operation, right? Then we have the call wait keyword, which is the main thing here. The call wait keyword, what it does, it, and then I'll get to that later. And we have call return as well. We have call wait and call return, call wait will wait for the reply to arrive. I'll dig into that later. And call return, that's basically just like return except for coroutines. The reason we cannot use regular return is because title is Q String but the return type of our function is something else. So, that wouldn't match. So, in fact, what the call return does is it sort of calls something like task.set return value or something like that and passes it the title. Anyway, look at the call wait keyword. So, in this case, what we do is we do the regular D-Bus call like we did before. We convert it to Q D-Bus reply and then we pass the Q D-Bus reply to the call wait keyword. Now, what does the call wait keyword do? The call wait keyword will trigger a bunch of code that's hidden behind that partially generated by compiler, partially provided by the coroutine library developer. In this case, me. So, what the call wait keyword, it will look at the Q D-Bus reply and it will say, huh, the Q D-Bus reply is not finished yet. I don't have the result yet. So, what it will do is it will suspend the coroutine. Suspending the coroutine means that it will take snapshot of all the local states. So, all the local variables and an instruction pointer and some other stuff. It will take the snapshot and save it somewhere in the memory. And then it will return to the caller of this function. So, even though the function has not finished yet, it hasn't reached the end, we are already returning to the caller and saving the intermediate state somewhere in the memory. So, now let's look at what the caller might look like. You might have a caller that looks like this. It's a simple function called player widget update and the player widget update, what it does, it calls the remote player, gets title, and which should get the title using the coroutine form. It's a coroutine, right? And we know that it's a coroutine. So, it might return early, right? We know that it might return early because the D-Bus response is not ready. But then we want the response here. We want the title. So, we need to await again for that coroutine to finish. So, we have like two nested coroutines. So, what happens when we call remote player get title? It will get suspended, it will return the task, the key corout task in some unfinished state, and the co-await keyword here, this co-await keyword, will look at the task and will say, well, the task is not finished. So, I will just suspend this coroutine and return to the caller. And then the caller might be co-awaiting this coroutine and so on and so on. They will be chaining up until it reaches a point where either someone blocks and waits until it is finished, or they don't care that it's a coroutine and it will just continue doing something else. So, and this is important, this fact that it always returns to the caller means that we can have this executed from the event loop. And whenever the coroutine is suspended itself, it means that the execution will return back into the event loop. So, as long, so while the coroutine is being suspended, waiting for a network reply or D-Bus reply, we can have our event loop perfectly looping. Let's look at this diagram. This is state-of-the-art presentation painting. Event loop, let's say it's cute event loop. It can be an event loop, but let's assume it's cute event loop. And this blue bar indicates that the event loop is running, right? It's doing its stuff, it's event looping. And now at some point, for some reason, it decides to call the player widget update function. It could be a timer or any other reason. Simply it calls player widget update. So player widget update starts running, right? And the event loop is blocked, it's not running. That's why it's lighter, right here. We can't have both things running at the same time. One function called another function, so the execution is now here. And if you remember, the function update called the getTitle function. So the execution moves forward further down here. And then if you remember the function getTitle, it called D-Bus call. So that sends some D-Bus message out and almost immediately returned back. So we are back in getTitle. Now what's next in getTitle was the co-wait keyword, right? So we are now in the co-wait keyword that the red box down there. And the co-wait keyword looks at the D-Bus response and says, well, the response is not ready yet. So I will suspend getTitle and I will return execution to my caller, which was player widget update. So now the execution is back in player widget update. If you remember, player widget update was co-waiting on the getTitle coroutine as well. So here we have the co-wait again. The co-wait looks at the getTitle and it says, well, the getTitle task is not finished yet. So I will suspend myself as well and return to my caller. So now the player widget update is suspended as well and the execution is back in the event loop. And now the event loop is happily running, processing your events, your UI is reacting to user input and so on. While these two functions are suspended, right? They are saved somewhere in the memory. They are not actually being executed. It's the event loop that's running. And now suddenly, let's not go into details how that happens, but let's assume that when the D-Bus reply arrives finally to your application, it somehow gets triggered from the event loop, goes into some magical D-Bus handler and the D-Bus handler sets the response as finished. And remember, there is a coroutine that is bound to that response. So what happens? The coroutine is awakened. So the coroutine is awakened. We are now in the getTitle coroutine which was waiting for the D-Bus response. The coroutine does something, whatever was after the co-wait keyword. So that was assigning into queueString and then co-returning that queueString back to its caller. So the next step, it returns the title to its caller which was playerRigetUpdate. PlayerRigetUpdate might do some other stuff with that title, you know, set it as a title on some label or whatnot and then it reaches its end and it finishes. So the execution now, this is weird. It doesn't necessarily return to the event loop because playerRigetUpdate was called from the event loop. It returns back to getTitle and then from getTitle, it returns back to the D-Bus handler because the D-Bus handler is the one who actually resumed the coroutine. Right, so the execution after resuming follows from the one who resumed them. Finally, the D-Bus handler is finished and it returns back to the event loop and the event loop continues event looping happily. So this is somewhat what happens when you use coroutines, right? When you find a place where you sort of want to wait for approach for some operation asynchronously, but you don't want to rewrite your entire code base to be asynchronous, you can just use code wait. And it's not that simple, but we'll get to that later. Here is the same graph only if the D-Bus call was blocking. Right, if we did the right, basically the thing that we had in the original snippet which was waiting in a blocking manner for the response to arrive. If you compare that, when we are waiting in a blocking manner, the event loop is not running at all the whole time. While with coroutines, the event loop is executing most of the time. Those blocks are actually not proportional to the actual execution time. So in reality, it would be mostly dark blue and a very little, very small, you know, the times when the event loop is not running or is blocked would be much smaller than this even. So here we can see that by using coroutines without actually changing the code, right? We just throw in a few keywords and magically our code does not block the event anymore. So now let's look at coroutines a bit more in general. You may have heard about coroutines before if you use some other languages. Coroutines are common in Python, JavaScript, Kotlin, Go, Rust, they seem all to have coroutines. It almost sounds like C++ is last to the party, but it's not. Anyway, coroutines is a function. It can be suspended at any point and then resumed again from that point where it was suspended. When the coroutine is suspended, the execution returns to its color, which we just shown. And when the coroutine is resumed, it's resumed as if it was called from the function that has resumed it. We've shown that as well with the weird debuts handler sort of calling the function, right, suspended function. What's the most important for me about coroutines is that coroutines allow you to write asynchronous code in synchronous manner. That means no, you don't need call back hell. You don't need, you know, 15 different sling those slots and then lots of connections between them. It allows you to write a code as if it was synchronous and then you just throw a code weight keyword here and there and magically your code doesn't block the event loop and it's asynchronous. What's the warning though? It does not mean that it will improve your performance. It will not make your application faster. It might help make your application more responsive, but coroutines will not make your application faster. The reason is that not necessarily, of course, but in most cases, the overhead of suspending and resuming coroutines is small, but there is some, right? So, you know, if you co-wait for a network reply here and there and then, you know, you co-wait some debuts requests here and there, it's not measurable. The impact is not measurable, but, you know, if you would do this in a tight loop, then yeah, that there would be a measurable slowdown because of the overhead of suspending and resuming the coroutines. So, coroutines in C++ and the C++ coroutines were introduced in C++ 20. So in the last version, it's perfectly fine supported by GCC and MSVC in latest versions. Clank is a bit problematic. So it's in a way supported for a long time since Clank 5, but Clank still supports only the technical specification. They still consider their implementation of coroutines to be experimental. So that makes it kind of difficult because if you write your code to be portable to both our compilers, then for GCC, everything is in the namespace stud, in the stud namespace, while then in Clank, everything is in the stud experimental namespace. So you need to do some magic with macros usually to get it working. The biggest disadvantage is that because it's experimental in Clank, it only works with the LLVM lib C++ standard library. You can't use Clank and the standard GNU lib STD C++ and coroutines that doesn't fly. And this becomes problematic when you try to use coroutines with some distribution provided packages because distributions, Linux distributions usually use the GCC standard library, like the lib STD C++. While if you try to use Clank and you build your application with coroutines and lib C++, there might be a simple problems because lib C++ and still lib C++ are not compatible on the ABI level. What's interesting is that in the C++ 20, they, the committee, they actually introduce mostly just the language extension. They introduce the keywords and describe the machinery that's supposed to be hidden behind those keywords. And the, but what they did is they only specify the bare minimum tools in the standard library that are needed by compiler developers to be able to implement coroutines and compilers. And for library writers, you want to write coroutine libraries, right? It's not like there are no ready-made, you know, thing like tasks, for instance, that you see the core of the task return type. There is no such thing in the standard library that you could just start using immediately as a programmer. The reason is that the idea was that the committee introduced all the tooling that's necessary to write coroutine libraries. And then they led the wider community to actually come up with some implementation so that we can see how coroutines are used in the real world in production, how, what is the best approach. And then hopefully the next version of C++ or version after, there will be some proposals to standardize one or two different approaches to coroutine so that after then, regular developers can just come, include the coroutines header and start using coroutines out of the box with the standard library. For now, that's not possible. You need to write lots of the machinery or you need to write the glue that can be used with the user code and the machinery for the machinery of coroutines in the language. So what has been introduced into C++ really? There are three new keywords, co-weight, co-return, and co-yield. The co-underscore prefix is there to avoid conflict with some other libraries that even before there were official coroutines in C++, there were various implementations using threads and light threads. In, for instance, in boost or other libraries and they have created macros called evade and yield, for instance. So that this was, this would clash. So they decided instead to use the co-underscore prefix to make sure that this doesn't clash with some existing implementations of coroutines in C++. The keywords, what they do, co-weight, we already saw, co-weight, suspends the coroutine and returns execution to the caller. Co-return allows us to return a value from a coroutine. It's basically like return, just for coroutines. And then the interesting thing that I haven't dug very deep into yet, but that's co-yield, which basically allows us to return repeatedly values from a function without the function actually ending, right? Normally when you return a value from a function, the function ends, but with co-yield, you can actually return the value repeatedly whenever someone asks for it without ending the function. This is useful for writing generators. In the standard library, we have a few things. This is not exhaustive, but there are like one or two more things that I didn't mention here. First is the stdcoroutine handle, which is a class that is a handle for coroutine, really, as the name says. It allows resuming the coroutine and internally, it holds pointers to where the stack is saved and where the instruction pointer and some other stuff. And then there are suspend, never suspend, always helpers which allow the coroutine to indicate whether it should or should not suspend and when it should not suspend. This is customizable, so coroutine, for instance, can decide when it's called, it can decide to immediately suspend itself and then only start executing the user code at the moment that someone starts co-weighting that coroutine, right? Other coroutines can decide to start immediately executing the user code and then they run, run, run. And, well, when someone co-weighs them, they might already get the result. So, and the suspend, never suspend, always allows to control this behavior. So how do you make a coroutine in C++? Well, first, you must use one of the keywords co-weight or co-healed. If you read the C++ standard, just adding one of those two keywords into the code magically makes it coroutine by definition, though it will not compile yet. The coroutine must have a special return type. The special return type or the return type is special because it must have a type def called promise underscore type, which, well, is a type def to some particular class, to some class which must implement some sort of a promise interface. This has nothing to do with stood promise or stood future, right? It's just the naming is similar, the idea is the same. So there must be some promise type. Usually the return type looks something like, you know, this task T, where T is the actual type of the value you want to return, so Q string or integer. And the way I think about is the task is like the interface for the color. That's what the color of the coroutine sees, while the promise type is what is used internally within the coroutine. The problem is that that's what I mentioned initially is that there is no such return type already defined in the standard library, right? So you need to write it yourself first. And in order to be able to write this return type, you need to understand coroutines a bit more in depth before you can just start using them, which is why it's not so easy to get into coroutines immediately. And of course, you must use coroutines or returns when you have a coroutine. So now, one thing that you might be wondering is this is back to one of slide five or six. When we had this code and I said, well, we have the QD bus reply and then we pass it to Co-wait. And Co-wait looks at the D-Bus reply and it says, well, the D-Bus reply is not finished. I will suspend the coroutine. And I said, what does C++ magically know about Qt? Does C++ understand QD bus reply? No, it's not like that. It's not that easy. There has to be some point, some integration point, right? Someone must have told how to figure out that QD bus reply is finished or not. And that someone is the coroutine library developer. In this case, the library that I use is, oh, well, I will get to that. But the way it works is basically the Co-wait keyword requires an argument, which is of a particular type. And the type must either already implement an interface which is called available or it's like a concept runner. So having a few functions that the Co-wait keyword will use to figure out, okay, is it finished yet or not? Or should I suspend? And how should I suspend? Or if you remember promise type from the return, from the previous slide, from the return type of the coroutine, if there is a function called evade transform, overloaded on that promise type for that particular type T. So for instance, in our case for the QD bus reply, then the Co-wait will call this away transport function and it expects that in return, it will get some sort of an awaitable again, right? So this basically, since the promise type is bound to the return type, it's bound to the return type of the coroutine. So task in this case. This means that if you pick the right return type, so you can provide the await transform overload for any type you want to support. So in this case, I have a little library that provides QCRO task as a class that implements the available interface. And internally it has the promise type defined to some custom class. And this class has a await transform overload specified for all different QS types, including QD bus reply. So that's how Co-wait learns about QD bus reply, how it is able to determine that whether QD bus reply is finished or not. The library is surprise, surprise, I call it QCRO. And it's a small library, which provides custom awaitable return type for coroutines, which that's the QCRO task. This QCRO task has the await transform implementation for various QS types where it makes sense to have some, which have some asynchronous implement, some asynchronous operation that makes sense to wait for. And it also provides some syn wrappers that provide various asynchronous operations for different types as well. I'll explain that in an example. So here for some types, I call these types like explicitly available. Those are types that they really have only one thing that makes sense to be awaited, which for instance, we have QFuture here. QFuture really has only one thing that you may want to asynchronously wait for, and that's the QFuture finishing, right? So in this case, what we have here is a Qth concurrent run. Qth concurrent run is basically what it does. It starts this lambda in a thread. Immediately returns to QFuture, and then eventually when the thread finishes, the QFuture will be finished, and it will provide the results to the caller. When you use QCoro, so if the coroutine returns QCoro task, you can just put co-wait in there, and magically the co-wait will know how to deal with QFuture, and it will be able to wait asynchronously again for the QFuture to finish. And while it's waiting, the coroutine suspended and you are possibly running in an event loop. So you can have this nice asynchronous code, sorry, synchronous-like looking code written in asynchronous way. You don't need to use QFuture watcher and this kind of stuff. Same goes with Qnetwork reply. Really Qnetwork reply has just one thing that you usually want to wait for, and that's the reply being finished. Although Qnetwork reply is also a QIO device, which on its own has some interesting things, some interesting asynchronous operations. I'll show that later. So here we create a network access manager, we call get, and because again QCoro task has an overload for Qnetwork reply pointer, you can just shove co-wait in here and magically, this will suspend your coroutine and asynchronously resume when the reply is finished and it will return the reply again. Of course you don't have to always just put co-wait immediately before the operation. What you could do here, you could take the reply pointer and then you could do some more stuff like query your database and then do some computation and then finally when you reach the point where you really already need the response from the server, that's where you start co-waiting. So you can also use it the way that you fire off an asynchronous request, then you do some processing and then when you reach a point where you need the data from the response, then you start co-waiting this. So it also allows for some level of parallelism, which is nice. Here is more complex example with Q-process. Q-process has multiple things that make sense to be co-awaited. It has multiple asynchronous operations. For this case, Q-Coro has a simple wrapper function called Q-Coro where you just put a positive Q-process and it returns a thin wrapper class called Q-Coro process. And this class implements part of the interface of Q-process, but it implements it in a way that you can again use co-wait with it. So in this case, you just start some process and then you asynchronous the wait for the process to start, then you write something in it and then again you asynchronous the wait for the process to finish. So you have a beautiful block of code in a single place that's easier to read, easier to navigate. You don't have to do any mental exercises about jumping through different functions or having nested lambda and stuff. And, but just by using coroutines, this allows you to actually not block your main thread. I think this is the ultimate example that I have where that's all the support for QTCP server, QTCP socket where we have a wrapper for QTCP server where we can co-await new connection. So this will suspend the coroutine until a new connection is available. And then again, when the connection comes, it resumes the coroutine and then again waits until the socket has anything to read. And then ultimately it just reads the data and sends them back with punk before it. So it's a simple punk server. The thing is that this is a while loop, right? It's sort of a basically an endless while loop. And it seems like there's a lot of blocking by in fact, you could just put this code into your main thread and your application would not get blocked, right? Because whenever this needs to wait, the co-await will just suspend the coroutine and eventually chain up all the way to your event loop. All right, this is a list of all the classes that are supported right now. I showed some of them. There is also Q timer support so you can co-await the timer to timeout. You can co-await any arbitrary signal emission and there's a general support for QIO device as well. So that's that, that was a quick introduction to coroutines and Q Coro. If you are interested more in the Q Coro library, there is a github repository, github.com, slash that, or you can read the documentation here. Or if you have any questions about coroutines or the library, just hit me and email Twitter or matrix. Thank you. Let's all give Daniel a big round of applause. I see everyone's gonna be clapping in the chat. So going through some questions. Jan asks, have you tried debugging and reading stack traces of coroutines? So did you have a crash? What happened in GDB? Yes, it's horribly annoying because the support in the tooling is not there yet. So you see a random, there is a lot of generated code and generated frames and these are really hard to debug. Yeah, so debugging crashes are debugging crashes and memory leaks, especially that's annoying. Yeah. Okay, so annoying is the answer. So the next question, which I think you've just touched on at the end, is does this work out of the box for code is based on signals and slots like K-Job or do we need to do anything there to make it correlate compatible? You don't need to make, you don't need to modify the classes to make them compatible with coroutines. I did not patch anything in Qt. What you need to do is you need to introduce a wrapper and into the QCoro library possibly that can handle K-Job and then tell the coroutines machinery when to suspend, when to resume. The QCoro is written in a way that it should be possible to even add support for things like K-Job without having to patch QCoro even. You just need to provide some template specializations and it should work. So I haven't tried yet, but it should work. That sounds amazing. David is just writing my plan out. So I'll ask one more question. One of the biggest challenges of asynchronous code is managing a lifespan of all the objects that you're going to use in your callbacks and in your lambda and all your examples you used earlier like Python and Dart, they just represent everything. So it's a big problem with C++. How do you resolve this nicely in C++ and Qt? Well, this is what the coroutines really solve for you, because whenever you suspend the coroutine, the whole stack is saved to memory. So you don't need to, and then it's resumed, everything is restored, and then you use the regular, like whenever you return from the function, it destroys everything, right? So you suddenly can start allocating many things on stack because you don't have to bother, you don't have to be worried that your function will finish and then you need to capture everything into lambda, connect it to some signal or passing it to another function, right? So this actually, I think makes things not only much easier, but it also allows us to write much safer code because you can allocate everything on stack, so no memory leaks. Maybe user interfaces where people are closing things. Okay, we've got one more question and we've got time for it. Ingo asks, is it possible to cancel that update e.g. if the next title is needed from your Nougat or Debus? You can, well, if you have some other code that's executing that would cancel Debus message, then the message would be, the reply would finish and the coroutine would be resumed and then you would have to have some error handling. So in a way, yes, yes. So it's not a straight forward this code, the code I showed that doesn't really bother with error checking because errors don't happen, right? Okay, and how did this interact with a CPP-Coro compatibility or extension? I haven't tried. The problem is that I found a lot of inspiration in CPP-Coro, but the thing is it depends on the return type, right? So you cannot mix things from CPP-Coro and CPP-Coro in a single coroutine. So this will become a bit tricky, which is one of the weaknesses, I think, of the current approach to coroutines that you have to pick one library and then basically stick to it throughout your code base. Okay, one more question, I do keep coming in. And that's how did this relate to standard future and standard promise? I think you're touching this a little bit in your slides. Not at all, not at all. There is no threading involved, right? You can use threads, but you can call away the thread, but there is no threading in coroutines. Cool. And I assume you're on for our Academy to answer questions as they come in? Sure. Cool. Okay, and next talk is in three minutes. I will pass off to even to be a next session host. But please stay in room two. Thank you, bye. Unless you want to see a talk in room one, of course.