Faits :
A.
Par jugement du 14 novembre 2018, modifié par prononcé du 7 février 2019, le Tribunal criminel de l'arrondissement de Lausanne a reconnu X._ coupable d'infraction grave à la loi fédérale sur les stupéfiants et de blanchiment d'argent et l'a condamné à une peine privative de liberté de 6 ans, ordonnant par ailleurs son expulsion du territoire suisse pour une durée de 10 ans.
B.
Statuant le 19 mars 2019, la Cour d'appel pénale du Tribunal cantonal vaudois a rejeté l'appel formé par X._ contre ce jugement, qu'elle a confirmé.
Les faits à l'origine de cette condamnation sont en substance les suivants.
B.a. X._ est né en 1968 à Labé, en République de Guinée. Il a quitté son pays très jeune pour chercher du travail, d'abord dans d'autres pays d'Afrique, puis en Europe, où il serait arrivé pour la première fois en 2000 par la France avant de se rendre en Espagne puis au Portugal, où sa situation a été légalisée en 2001. Il a néanmoins fait une demande d'asile en Suisse en 2002 sous une fausse identité. Sa demande ayant été rejetée, il est retourné au Portugal, Etat qui lui a octroyé un permis de résidence en 2006 et dont il a par la suite obtenu la nationalité. Il est marié avec une ressortissante portugaise dont il a fait la connaissance dans ce pays et père de trois enfants dont deux sont nés en Suisse, où il est arrivé en 2009.
B.b. Le 16 novembre 2017, X._ a été interpellé dans son ancien appartement, dont il continuait de payer une partie du loyer afin de pouvoir y loger des proches. Il était en possession de 87,34 g de cocaïne. Dans son nouveau logement ont en outre été trouvés 364,99 g de cocaïne. Une expertise a permis de déterminer que les quantités de drogue saisies lors des deux perquisitions représentaient 200,5 g de cocaïne pure.
A l'issue de l'enquête, il a été établi qu'X._ avait vendu, personnellement et directement, à des consommateurs plus de 640 boulettes représentant au minimum 243,11 g de cocaïne pure. Il a également été admis qu'il avait pris une part active à certaines transactions effectuées par un dénommé " A._ ", notamment en lui servant de chauffeur, favorisant ainsi l'écoulement de près de 500 boulettes contenant 164,74 g de cocaïne pure. La cour cantonale a en outre retenu que X._ était coauteur du trafic effectué par " A._ " auprès de certains consommateurs identifiés au moyen d'une liste trouvée au domicile de X._, contribuant depuis 2012 à écouler 1'530,5 boulettes représentant une quantité supplémentaire de 461,9 g de cocaïne pure. Par ailleurs, sur la base de contrôles téléphoniques, il a été établi que X._ avait approvisionné plusieurs dealers de rue, à qui il avait vendu, en 2017, au minimum 333,9 g de cocaïne pure.
Enfin, la cour cantonale a admis que le trafic de X._ avait généré un chiffre d'affaires de plus de 200'000 fr. par la vente directe aux consommateurs entre 2012 et 2017.
C.
X._ forme un recours en matière pénale au Tribunal fédéral contre le jugement de la Cour d'appel pénale. Il conclut, sous suite de frais et dépens, principalement à la réforme du jugement attaqué en ce sens que la durée de la peine privative de liberté est ramenée à 48 mois et qu'il est renoncé à prononcer son expulsion du territoire suisse. A titre subsidiaire, il conclut à l'annulation du jugement attaqué et au renvoi de la cause à la cour cantonale pour qu'elle statue à nouveau. Il sollicite par ailleurs l'assistance judiciaire.

Considérant en droit :
1.
Le recourant reproche à la cour cantonale d'avoir violé la présomption d'innocence et d'avoir établi certains faits de manière arbitraire.
1.1. Le Tribunal fédéral n'est pas une autorité d'appel, auprès de laquelle les faits pourraient être rediscutés librement. Il est lié par les faits établis par l'autorité précédente (<ref-law>), à moins qu'ils n'aient été constatés en violation du droit ou de manière manifestement inexacte au sens des art. 97 al. 1 et 105 al. 2 LTF, à savoir, pour l'essentiel, de façon arbitraire au sens de l'art. 9 Cst. Une décision n'est pas arbitraire du seul fait qu'elle apparaît discutable ou même critiquable; il faut qu'elle soit manifestement insoutenable et cela non seulement dans sa motivation mais aussi dans son résultat (<ref-ruling> consid. 1.1 p. 155 s.; <ref-ruling> consid. 2.3.1 p. 244). En matière d'appréciation des preuves et d'établissement des faits, il n'y a arbitraire que lorsque l'autorité ne prend pas en compte, sans aucune raison sérieuse, un élément de preuve propre à modifier la décision, lorsqu'elle se trompe manifestement sur son sens et sa portée, ou encore lorsque, en se fondant sur les éléments recueillis, elle en tire des conclusions insoutenables (<ref-ruling> consid. 3.6.2 p. 287 et les références citées). Le Tribunal fédéral n'entre en matière sur les moyens fondés sur la violation de droits fondamentaux que s'ils ont été invoqués et motivés de manière précise (<ref-law>; <ref-ruling> consid. 1.1 p. 503); il n'entre pas en matière sur les critiques de nature appellatoire (<ref-ruling> consid. 1.1 p. 156; <ref-ruling> consid. 2.4 p. 368).
La présomption d'innocence, garantie par les <ref-law>, 32 al. 1 Cst., 14 par. 2 Pacte ONU II et 6 par. 2 CEDH, ainsi que son corollaire, le principe " in dubio pro reo ", concernent tant le fardeau de la preuve que l'appréciation des preuves au sens large (<ref-ruling> consid. 1.1 p. 156 et les arrêts cités). En tant que règle sur le fardeau de la preuve, elle signifie, au stade du jugement, que le fardeau de la preuve incombe à l'accusation et que le doute doit profiter au prévenu. Comme règle d'appréciation des preuves (sur la portée et le sens précis de la règle sous cet angle, cf. <ref-ruling> consid. 2.2.3.3 p. 351 s.), la présomption d'innocence signifie que le juge ne doit pas se déclarer convaincu de l'existence d'un fait défavorable à l'accusé si, d'un point de vue objectif, il existe des doutes quant à l'existence de ce fait. Il importe peu qu'il subsiste des doutes seulement abstraits et théoriques, qui sont toujours possibles, une certitude absolue ne pouvant être exigée. Il doit s'agir de doutes sérieux et irréductibles, c'est-à-dire de doutes qui s'imposent à l'esprit en fonction de la situation objective. Lorsque l'appréciation des preuves et la constatation des faits sont critiquées en référence au principe " in dubio pro reo ", celui-ci n'a pas de portée plus large que l'interdiction de l'arbitraire (<ref-ruling> consid. 1.1 p. 156 et les arrêts cités).
1.2. Le recourant conteste son implication dans le trafic effectué par le dénommé " A._ ".
La cour cantonale a relevé que lors de la perquisition effectuée au domicile du recourant a été trouvé un papier comportant des inscriptions manuscrites et des numéros de téléphone qui ont permis de remonter jusqu'à des toxicomanes. Par ailleurs, des contrôles téléphoniques actifs et rétroactifs ont permis d'identifier d'autres consommateurs avec lesquels il a été en contact. Vingt-neuf de ces toxicomanes ont été entendus; certains d'entre eux ont mis en cause le recourant pour leur avoir personnellement et directement fourni de la drogue dès 2013 et pour avoir joué un rôle actif au côté du dénommé " A._ ". Par ailleurs, certains consommateurs figurant sur cette liste ont déclaré avoir été fournis par ce dernier et avoir eu des contacts téléphoniques avec le recourant. D'autres ont affirmé avoir eu affaire aux deux à la même période, l'un répondant au téléphone de l'autre ou le remplaçant en son absence.
Dans ces circonstances, peu importe qu'une grande majorité des consommateurs impliqués n'ait pas reconnu le recourant sur les planches photographiques puisque ceux-ci ont principalement eu des contacts téléphoniques avec lui. C'est par ailleurs en vain que le recourant fait valoir que le simple fait qu'une liste téléphonique ait été trouvée chez lui ne suffit pas pour établir qu'il a été impliqué dans le trafic en tant que coauteur. En effet, comme cela ressort du paragraphe précédent, la cour cantonale ne s'est pas fondée sur ce seul élément, mais aussi sur les auditions des consommateurs figurant sur cette liste, auditions dont le recourant ne conteste pas la validité au moyen d'une argumentation satisfaisant aux exigences de l'<ref-law>. Il n'y a par ailleurs aucune raison de douter des déclarations de ces témoins qui n'ont aucun intérêt à incriminer le recourant et leur seule contestation par le recourant ne suffit pas à les remettre en question. Mal fondé, ce grief doit être rejeté.
1.3. Le recourant conteste avoir approvisionné des dealers de rue en leur vendant des fingers de 10 g de cocaïne et soutient que les quantités retenues à son encontre ne reposent que sur des extrapolations sans fondement objectif.
Les constatations de la cour cantonale reposent sur des contrôles téléphoniques effectués sur deux raccordements. Les conversations du recourant montrent que celui-ci approvisionnait ses interlocuteurs en " cartes ". La cour cantonale a admis que ces " cartes " étaient en réalité des fingers de 10 g nets de cocaïne. Par ailleurs, 4 fingers de cocaïne d'une masse nette de 19,46 g, 15 fingers de cocaïne d'une masse nette de 147,41 g, ainsi que 20 fingers de cocaïne d'une masse nette de 198,12 g, ont été trouvés dans le logement du recourant, drogue dont ce dernier a admis avoir été le possesseur. Pour le surplus, il ressort du jugement attaqué que le recourant a admis que le mot " carte " utilisé dans ses conversations téléphoniques signifiait bien finger et qu'il a soutenu que les quantités retenues sur la base des contrôles téléphoniques étaient déjà comprises dans celles retrouvées à son domicile et/ou vendues aux toxicomanes. Le recourant n'a en revanche contesté ni le poids contenu dans les fingers livrés à des revendeurs ni la pureté de la drogue en question. Dans ces circonstances, la cour cantonale pouvait sans arbitraire considérer ces éléments comme établis.
Dans ce contexte, le recourant conteste en outre le montant du profit réalisé par son activité délictueuse. Sur ce point son argumentation, de nature appellatoire, ne satisfait pas aux exigences de motivation de l'<ref-law> et n'est pas conséquent pas recevable. Mal fondé, le grief doit être rejeté dans la mesure où il est recevable.
2.
Le recourant soutient que la peine qui lui a été infligée viole l'<ref-law>.
2.1. Aux termes de l'<ref-law>, le juge fixe la peine d'après la culpabilité de l'auteur. Il prend en considération les antécédents et la situation personnelle de ce dernier ainsi que l'effet de la peine sur son avenir (al. 1). La culpabilité est déterminée par la gravité de la lésion ou de la mise en danger du bien juridique concerné, par le caractère répréhensible de l'acte, par les motivations et les buts de l'auteur et par la mesure dans laquelle celui-ci aurait pu éviter la mise en danger ou la lésion, compte tenu de sa situation personnelle et des circonstances extérieures (al. 2).
La culpabilité de l'auteur doit être évaluée en fonction de tous les éléments objectifs pertinents, qui ont trait à l'acte lui-même, à savoir notamment la gravité de la lésion, le caractère répréhensible de l'acte et son mode d'exécution. Du point de vue subjectif, sont pris en compte l'intensité de la volonté délictuelle ainsi que les motivations et les buts de l'auteur. A ces composantes de la culpabilité, il faut ajouter les facteurs liés à l'auteur lui-même, à savoir les antécédents, la réputation, la situation personnelle (état de santé, âge, obligations familiales, situation professionnelle, risque de récidive, etc.), la vulnérabilité face à la peine, de même que le comportement après l'acte et au cours de la procédure pénale (<ref-ruling> consid. 9.1 p. 147; <ref-ruling> consid. 6.1.1 p. 66 s.).
Le juge dispose d'un large pouvoir d'appréciation dans la fixation de la peine. Le Tribunal fédéral n'intervient que lorsque l'autorité cantonale a fixé une peine en dehors du cadre légal, si elle s'est fondée sur des critères étrangers à l'<ref-law>, si des éléments d'appréciation importants n'ont pas été pris en compte ou, enfin, si la peine prononcée est exagérément sévère ou clémente au point de constituer un abus du pouvoir d'appréciation (<ref-ruling> consid. 1.2 p. 319). L'exercice de ce contrôle suppose que le juge exprime, dans sa décision, les éléments essentiels relatifs à l'acte ou à l'auteur dont il tient compte, de manière à ce que l'on puisse constater que tous les aspects pertinents ont été pris en considération et comment ils ont été appréciés, que ce soit dans un sens aggravant ou atténuant (<ref-law>; <ref-ruling> consid. 2.1 p. 20 et les références citées; cf. récemment: arrêt 6B_675/2019 du 17 juillet 2019 consid. 1.2). Le juge peut passer sous silence les éléments qui, sans abus du pouvoir d'appréciation, lui apparaissent non pertinents ou d'une importance mineure. La motivation doit justifier la peine prononcée, en permettant de suivre le raisonnement adopté. Un recours ne saurait toutefois être admis simplement pour améliorer ou compléter un considérant lorsque la décision rendue apparaît conforme au droit (<ref-ruling> consid. 1.2 p. 319; <ref-ruling> consid. 5.6 p. 61; arrêt 6B_675/2019 précité consid. 1.2).
2.2. Le recourant soutient que la cour cantonale n'a pas pris en considération ses aveux et sa bonne collaboration aux débats d'appel.
La cour cantonale a expressément relevé que le recourant n'avait pas collaboré à l'enquête. Avoir admis certains faits en instance d'appel, c'est-à-dire à un stade très avancé de la procédure et en présence d'éléments de preuve difficilement contestables, ne saurait être considéré comme un élément particulièrement favorable, d'autant que le recourant s'est limité à reconnaître une partie des actes qui lui sont imputés, en contestant d'autres jusque devant l'autorité de céans.
2.3. Le recourant reproche à la cour cantonale de n'avoir absolument pas tenu compte des effets de l'exécution de la peine sur son avenir.
Dans la mesure où il se prévaut de son statut de délinquant primaire et de son bon comportement en détention, il invoque des circonstances qui ont un effet neutre sur la peine et n'ont donc pas à être prises en considération dans sens atténuant (ATF <ref-ruling> consid. 6.3.2 p. 70; arrêt 6B_560/2018 du 13 août 2018 consid. 3.6 et les arrêts cités).
Pour le surplus, le recourant, père de trois enfants, invoque sa situation familiale, sur laquelle l'exécution d'une peine privative de liberté de 6 ans aurait un effet dramatique.
L'exécution d'une peine privative de liberté d'une certaine durée a inévitablement des répercussions sur la vie professionnelle et familiale du condamné. Ces conséquences ne peuvent conduire à une réduction de la peine qu'en présence de circonstances extraordinaires (arrêt 6B_375/2019 du 12 juin 2019 consid. 3.2 et les arrêts cités). Le fait que le recourant soit père de trois enfants et s'en occupe bien ne saurait être considéré comme suffisamment extraordinaire pour justifier une réduction de peine.
Par ailleurs, la cour cantonale a qualifié à juste titre de lourde la culpabilité du recourant qui s'est livré, par appât du gain, à un trafic intense et durable qui n'a pris fin qu'à la suite de son interpellation. Sa reconnaissance, au demeurant fort tardive, d'une partie seulement des faits qui lui sont imputés montre une faible prise de conscience de la gravité de ses actes. En outre, la cour cantonale n'a pas méconnu sa situation familiale puisqu'elle a relevé qu'il était un bon mari et un excellent père. Dans ces circonstances, il n'apparaît pas que la cour cantonale aurait méconnu des éléments déterminants, pas plus qu'elle en aurait négligé certains ou aurait accordé une importance excessive à d'autres. La peine privative de liberté de 6 ans infligée au recourant ne procède en définitive pas d'un abus du pouvoir d'appréciation dont disposait la cour cantonale.
3.
Le recourant soutient que son expulsion du territoire suisse viole le principe de proportionnalité.
3.1. Aux termes de l'art. 66a al. 1 let. o CP, le juge expulse de Suisse l'étranger qui est notamment condamné pour infraction à l'<ref-law>, quelle que soit la quotité de la peine prononcée à son encontre, pour une durée de cinq à quinze ans. Selon l'<ref-law>, le juge peut exceptionnellement renoncer à une expulsion lorsque celle-ci mettrait l'étranger dans une situation personnelle grave et que les intérêts publics à l'expulsion ne l'emportent pas sur l'intérêt privé de l'étranger à demeurer en Suisse. A cet égard, il tiendra compte de la situation particulière de l'étranger qui est né ou qui a grandi en Suisse.
En l'espèce, le recourant a été reconnu coupable d'infraction grave à la LStup, qui tombe sous le coup de l'art. 66a al. 1 let. o CP. Il remplit donc a priori les conditions d'une expulsion, sous la réserve d'une application de l'<ref-law>, voire également des normes de droit international.
3.2. Les conditions pour appliquer l'<ref-law> sont cumulatives. Afin de pouvoir renoncer à une expulsion prévue par l'<ref-law>, il faut, d'une part, que cette mesure mette l'étranger dans une situation personnelle grave et, d'autre part, que les intérêts publics à l'expulsion ne l'emportent pas sur l'intérêt privé de l'étranger à demeurer en Suisse. Le juge doit faire usage du pouvoir d'appréciation qui lui est conféré par une norme potestative dans le respect des principes constitutionnels. S'il devait refuser de renoncer à l'expulsion alors que les conditions de la clause de rigueur sont remplies, le principe de proportionnalité ancré à l'art. 5 al. 2 Cst. serait violé. Le juge doit ainsi, conformément à ce principe, renoncer à l'expulsion lorsque les conditions de l'<ref-law> sont réunies (<ref-ruling> consid. 3.3 p. 339 s.).
3.3.
3.3.1. La loi ne définit pas ce qu'il faut entendre par une " situation personnelle grave " (première condition cumulative) ni n'indique les critères à prendre en compte dans la pesée des intérêts (seconde condition cumulative).
En recourant à la notion de cas de rigueur dans le cadre de l'<ref-law>, le législateur a fait usage d'un concept ancré depuis longtemps dans le droit des étrangers. Compte tenu également du lien étroit entre l'expulsion pénale et les mesures du droit des étrangers, il est justifié de s'inspirer, de manière générale, des critères prévus par l'art. 31 al. 1 de l'ordonnance relative à l'admission, au séjour et à l'exercice d'une activité lucrative (OASA; RS 142.201) et de la jurisprudence y relative, dans le cadre de l'application de l'<ref-law>. L'art. 31 al. 1 OASA prévoit qu'une autorisation de séjour peut être octroyée dans les cas individuels d'extrême gravité. Elle commande de tenir compte notamment de l'intégration du requérant, du respect de l'ordre juridique suisse par le requérant, de la situation familiale, particulièrement de la période de scolarisation et de la durée de la scolarité des enfants, de la situation financière ainsi que de la volonté de prendre part à la vie économique et d'acquérir une formation, de la durée de la présence en Suisse, de l'état de santé ainsi que des possibilités de réintégration dans l'Etat de provenance. Comme la liste de l'art. 31 al. 1 OASA n'est pas exhaustive et que l'expulsion relève du droit pénal, le juge devra également, dans l'examen du cas de rigueur, tenir compte des perspectives de réinsertion sociale du condamné (<ref-ruling> consid. 3.3.2 p. 340 s.; arrêt 6B_639/2019 du 20 août 2019 consid. 1.3.1). En règle générale, il convient d'admettre l'existence d'un cas de rigueur au sens de l'<ref-law> lorsque l'expulsion constituerait, pour l'intéressé, une ingérence d'une certaine importance dans son droit au respect de sa vie privée et familiale garanti par la Constitution fédérale (art. 13 Cst.) et par le droit international, en particulier l'art. 8 CEDH (arrêts 6B_639/2019 précité consid. 1.3.1; 6B_143/2019 du 6 mars 2019 consid. 3.3.1 et les arrêts cités).
La jurisprudence rendue en droit des étrangers retient que la révocation de l'autorisation d'établissement d'un étranger qui séjourne depuis longtemps en Suisse doit se faire avec une retenue particulière, mais n'est pas exclue en cas d'infractions graves ou répétées, même s'agissant d'un étranger né en Suisse et qui y a passé l'entier de sa vie. On tiendra alors particulièrement compte de l'intensité des liens de l'étranger avec la Suisse et des difficultés de réintégration dans son pays d'origine (<ref-ruling> consid. 3.3.3 p. 341 et les arrêts cités).
3.3.2. Selon la jurisprudence, pour se prévaloir d'un droit au respect de sa vie privée, l'étranger doit établir l'existence de liens sociaux et professionnels spécialement intenses avec la Suisse, notablement supérieurs à ceux qui résultent d'une intégration ordinaire. Le Tribunal fédéral n'adopte pas une approche schématique qui consisterait à présumer, à partir d'une certaine durée de séjour en Suisse, que l'étranger y est enraciné et dispose de ce fait d'un droit de présence dans notre pays. Il procède plutôt à une pesée des intérêts en présence, en considérant la durée du séjour en Suisse comme un élément parmi d'autres et en n'accordant qu'un faible poids aux années passées en Suisse dans l'illégalité, en prison ou au bénéfice d'une simple tolérance (cf. <ref-ruling> consid. 4.3 p. 24; arrêt 6B_639/2019 précité consid. 1.3.2).
3.4. Le recourant invoque la présence en Suisse de ses trois enfants, tous scolarisés dans notre pays, ainsi que de son épouse, avec lesquels il a des liens très étroits et qui constituent la totalité de ses attaches familiales. Il se prévaut par ailleurs de sa bonne intégration en Suisse ainsi que de son statut de délinquant primaire et soutient que son intérêt privé à demeurer en Suisse est supérieur à l'intérêt public à son expulsion.
3.5. La cour cantonale n'a pas méconnu la situation personnelle du recourant puisqu'elle a relevé qu'il avait d'importantes attaches en Suisse, son épouse et ses trois enfants résidant dans ce pays. Elle a en revanche admis qu'à supposer qu'il puisse se prévaloir d'un droit découlant de l'art. 8 par. 1 CEDH l'intérêt public à son éloignement l'emportait sur son intérêt privé à rester en Suisse.
3.6. Les intérêts présidant à l'expulsion du recourant sont importants. Celui-ci s'est livré pendant la majeure partie de son séjour en Suisse à un trafic ayant porté sur largement plus d'un kilo de cocaïne pure. Il y a lieu de relever à cet égard que la Cour européenne des droits de l'Homme estime que, compte tenu des ravages de la drogue dans la population, les autorités sont fondées à faire preuve d'une grande fermeté à l'encontre de ceux qui contribuent à la propagation de ce fléau (cf. arrêts CourEDH K.M. c. Suisse du 2 juin 2015 [requête n° 6009/10] § 55; Dalia c. France du 19 février 1998, Recueil CourEDH 1998-I 76 § 54; cf. aussi arrêt 6B_143/2019 précité consid. 3.4.2). Par ailleurs, la peine privative de liberté à laquelle a été condamné le recourant dépasse largement une année, ce qui pourrait permettre une révocation de son autorisation de séjour sur la base de l'art. 62 al. 1 let. b LEI (cf. <ref-ruling> consid. 2.1 p. 147, selon lequel constitue une " peine privative de liberté de longue durée " au sens de l'art. 62 al. 1 let. b LEtr [depuis le 1er janvier 2019: LEI] toute peine dépassant un an d'emprisonnement).
S'agissant de l'intérêt du recourant à pouvoir demeurer en Suisse, la cour cantonale a retenu les éléments pertinents, à savoir que son intégration est bonne, qu'il parle le français, avait un casier judiciaire vierge avant les faits à l'origine de la présente condamnation et avait travaillé plusieurs années avant de connaître des problèmes de santé et le chômage. Elle a par ailleurs noté qu'il avait passé davantage d'années de sa vie d'adulte en Afrique, continent qu'il n'a quitté que vers l'âge de 32 ans, et au Portugal qu'en Suisse. Elle a de plus relevé qu'il avait la nationalité du Portugal, Etat qui était par ailleurs celui d'origine de son épouse et dont ses enfants sont tous les trois également ressortissants, et qu'il y avait déjà travaillé par le passé. Elle en a conclu que rien n'empêchait la famille de s'installer dans ce pays, où le recourant n'aurait pas plus de difficultés à se réintégrer qu'en Suisse.
L'appréciation de la cour cantonale ne prête pas le flanc à la critique et c'est sans violer le principe de la proportionnalité que cette dernière a considéré que compte tenu de la gravité des infractions commises par le recourant l'intérêt public à son expulsion l'emporte sur son intérêt privé à demeurer en Suisse, même compte tenu de son degré d'intégration.
Ainsi, la seconde condition pour l'application de l'<ref-law> n'étant pas réalisée, la cour cantonale n'a pas violé le droit fédéral, constitutionnel ou international en ordonnant l'expulsion du recourant pour une durée de dix ans.
4.
Le recours doit être rejeté dans la mesure où il est recevable. Comme il était dénué de chances de succès, la demande d'assistance judiciaire doit être rejetée (<ref-law>). Le recourant, qui succombe, supportera les frais judiciaires (<ref-law>), dont le montant sera fixé en tenant compte de sa situation financière, qui n'apparaît pas favorable.

Par ces motifs, le Tribunal fédéral prononce :
1.
Le recours est rejeté dans la mesure où il est recevable.
2.
La demande d'assistance judiciaire est rejetée.
3.
Les frais judiciaires, arrêtés à 1'200 fr., sont mis à la charge du recourant.
4.
Le présent arrêt est communiqué aux parties et à la Cour d'appel pénale du Tribunal cantonal vaudois.
Lausanne, le 12 septembre 2019
Au nom de la Cour de droit pénal
du Tribunal fédéral suisse
Le Président : Denys
La Greffière : Paquier-Boinay